--- /dev/null
+; Main ReactOS package
+
+.Set DiskLabelTemplate="ReactOS" ; Label of disk
+.Set CabinetNameTemplate="reactos.cab" ; reactos.cab
+.Set InfFileName="reactos.inf" ; reactos.inf
+
+
+;.Set Cabinet=on
+;.Set Compress=on
+
+.InfBegin
+[Version]
+Signature = "$ReactOS$"
+
+[Directories]
+1 = system32
+2 = system32\drivers
+3 = Fonts
+4 =
+5 = system32\drivers\etc
+6 = inf
+7 = bin
+8 = media
+
+.InfEnd
+
+; Contents of disk
+.InfBegin
+[SourceFiles]
+.InfEnd
+
+
+; Base files
+base\applications\cacls\cacls.exe 1
+base\applications\calc\calc.exe 1
+base\applications\charmap\charmap.exe 1
+base\applications\cmdutils\dbgprint\dbgprint.exe 1
+base\applications\cmdutils\doskey\doskey.exe 1
+base\applications\cmdutils\find\find.exe 1
+base\applications\cmdutils\hostname\hostname.exe 1
+base\applications\cmdutils\lodctr\lodctr.exe 1
+base\applications\cmdutils\more\more.exe 1
+base\applications\cmdutils\reg\reg.exe 1
+base\applications\cmdutils\xcopy\xcopy.exe 1
+base\applications\control\control.exe 1
+base\applications\dxdiag\dxdiag.exe 1
+base\applications\fontview\fontview.exe 1
+base\applications\mscutils\devmgmt\devmgmt.exe 1
+base\applications\mscutils\eventvwr\eventvwr.exe 1
+base\applications\games\solitaire\sol.exe 1
+base\applications\games\spider\spider.exe 1
+base\applications\games\winemine\winemine.exe 1
+base\applications\hh\hh.exe 4
+base\applications\kbswitch\kbswitch.exe 1
+base\applications\kbswitch\kbsdll\kbsdll.dll 1
+base\applications\logoff\logoff.exe 1
+base\applications\magnify\magnify.exe 1
+base\applications\mplay32\mplay32.exe 1
+base\applications\msconfig\msconfig.exe 1
+base\applications\mstsc\mstsc.exe 1
+base\applications\network\arp\arp.exe 1
+base\applications\network\dwnl\dwnl.exe 1
+base\applications\network\route\route.exe 1
+base\applications\network\finger\finger.exe 1
+base\applications\network\ftp\ftp.exe 1
+base\applications\network\ipconfig\ipconfig.exe 1
+base\applications\network\netstat\netstat.exe 1
+base\applications\network\nslookup\nslookup.exe 1
+base\applications\network\ping\ping.exe 1
+base\applications\network\telnet\telnet.exe 1
+base\applications\network\tracert\tracert.exe 1
+base\applications\network\whois\whois.exe 1
+base\applications\notepad\notepad.exe 1
+base\applications\paint\paint.exe 1
+base\applications\rapps\rapps.exe 1
+base\applications\regedit\regedit.exe 4
+base\applications\regedit\clb\clb.dll 1
+base\applications\regedt32\regedt32.exe 1
+base\applications\sc\sc.exe 1
+base\applications\screensavers\3dtext\3dtext.scr 1
+base\applications\screensavers\logon\logon.scr 1
+base\applications\mscutils\servman\servman.exe 1
+base\applications\shutdown\shutdown.exe 1
+base\applications\sndrec32\sndrec32.exe 1
+base\applications\sndvol32\sndvol32.exe 1
+base\applications\taskmgr\taskmgr.exe 1
+base\applications\winhlp32\winhlp32.exe 4
+base\applications\winver\winver.exe 1
+base\applications\wordpad\wordpad.exe 1
+base\applications\write\write.exe 1
+
+base\services\audiosrv\audiosrv.exe 1
+base\services\dhcp\dhcp.exe 1
+base\services\eventlog\eventlog.exe 1
+base\services\rpcss\rpcss.exe 1
+base\services\spoolsv\spoolsv.exe 1
+base\services\tcpsvcs\tcpsvcs.exe 1
+base\services\telnetd\telnetd.exe 1
+base\services\tcpsvcs\quotes 5
+base\services\umpnpmgr\umpnpmgr.exe 1
+base\services\wlansvc\wlansvc.exe 1
+base\services\svchost\svchost.exe 1
+
+base\setup\setup\setup.exe 1
+base\setup\vmwinst\vmwinst.exe 1
+
+base\shell\cmd\cmd.exe 1
+base\shell\explorer\explorer.exe 4
+base\shell\explorer\explorer-cfg-template.xml 4
+base\shell\explorer\notifyhook\notifyhook.dll 1
+base\shell\explorer-new\explorer_new.exe 4 optional
+
+base\system\autochk\autochk.exe 1
+base\system\bootok\bootok.exe 1
+base\system\format\format.exe 1
+base\system\lsass\lsass.exe 1
+base\system\msiexec\msiexec.exe 1
+base\system\regsvr32\regsvr32.exe 1
+base\system\rundll32\rundll32.exe 1
+base\system\runonce\runonce.exe 1
+base\system\services\services.exe 1
+base\system\userinit\userinit.exe 1
+base\system\winlogon\winlogon.exe 1
+base\system\expand\expand.exe 1
+base\system\smss\smss.exe 1
+
+
+; Dynamic Link Libraries
+dll\3rdparty\mesa32\mesa32.dll 1
+dll\3rdparty\libjpeg\libjpeg.dll 1
+dll\3rdparty\libxslt\libxslt.dll 1
+dll\3rdparty\dxtn\dxtn.dll 1 optional
+
+dll\cpl\access\access.cpl 1
+dll\cpl\appwiz\appwiz.cpl 1
+dll\cpl\console\console.dll 1
+dll\cpl\desk\desk.cpl 1
+dll\cpl\hdwwiz\hdwwiz.cpl 1
+dll\cpl\input\input.dll 1
+dll\cpl\intl\intl.cpl 1
+dll\cpl\joy\joy.cpl 1
+;dll\cpl\liccpa\liccpa.cpl 1
+dll\cpl\main\main.cpl 1
+dll\cpl\mmsys\mmsys.cpl 1
+dll\cpl\ncpa\ncpa.cpl 1
+;dll\cpl\odbccp32\odbccp32.cpl 1
+dll\cpl\powercfg\powercfg.cpl 1
+dll\cpl\sysdm\sysdm.cpl 1
+;dll\cpl\telephon\telephon.cpl 1
+dll\cpl\timedate\timedate.cpl 1
+;dll\cpl\usrmgr\usrmgr.cpl 1
+
+dll\directx\amstream\amstream.dll 1
+dll\directx\bdaplgin\bdaplgin.ax 1
+dll\directx\dinput\dinput.dll 1
+dll\directx\dinput8\dinput8.dll 1
+dll\directx\dmusic\dmusic.dll 1
+dll\directx\dplay\dplay.dll 1
+dll\directx\dplayx\dplayx.dll 1
+dll\directx\dsound\dsound.dll 1
+dll\directx\dxdiagn\dxdiagn.dll 1
+dll\directx\wine\ddraw\ddraw.dll 1
+dll\directx\d3d8thk\d3d8thk.dll 1
+dll\directx\devenum\devenum.dll 1
+dll\directx\ksproxy\ksproxy.ax 1
+dll\directx\ksuser\ksuser.dll 1
+dll\directx\msdmo\msdmo.dll 1
+dll\directx\msdvbnp\msdvbnp.ax 1
+dll\directx\msvidctl\msvidctl.dll 1
+dll\directx\quartz\quartz.dll 1
+dll\directx\qedit\qedit.dll 1
+dll\directx\wine\d3d8\d3d8.dll 1
+dll\directx\wine\wined3d\wined3d.dll 1
+dll\directx\wine\d3d9\d3d9.dll 1
+
+dll\keyboard\kbda1\kbda1.dll 1
+dll\keyboard\kbda2\kbda2.dll 1
+dll\keyboard\kbda3\kbda3.dll 1
+dll\keyboard\kbdal\kbdal.dll 1
+dll\keyboard\kbdarme\kbdarme.dll 1
+dll\keyboard\kbdarmw\kbdarmw.dll 1
+dll\keyboard\kbdaze\kbdaze.dll 1
+dll\keyboard\kbdazel\kbdazel.dll 1
+dll\keyboard\kbdbgm\kbdbgm.dll 1
+dll\keyboard\kbdbgt\kbdbgt.dll 1
+dll\keyboard\kbdblr\kbdblr.dll 1
+dll\keyboard\kbdbr\kbdbr.dll 1
+dll\keyboard\kbdbga\kbdbga.dll 1
+dll\keyboard\kbdbe\kbdbe.dll 1
+dll\keyboard\kbdbur\kbdbur.dll 1
+dll\keyboard\kbdcan\kbdcan.dll 1
+dll\keyboard\kbdcr\kbdcr.dll 1
+dll\keyboard\kbdcz\kbdcz.dll 1
+dll\keyboard\kbdcz1\kbdcz1.dll 1
+dll\keyboard\kbdda\kbdda.dll 1
+dll\keyboard\kbddv\kbddv.dll 1
+dll\keyboard\kbdes\kbdes.dll 1
+dll\keyboard\kbdest\kbdest.dll 1
+dll\keyboard\kbdfc\kbdfc.dll 1
+dll\keyboard\kbdfi\kbdfi.dll 1
+dll\keyboard\kbdfr\kbdfr.dll 1
+dll\keyboard\kbdgeo\kbdgeo.dll 1
+dll\keyboard\kbdgerg\kbdgerg.dll 1
+dll\keyboard\kbdgneo\kbdgneo.dll 1
+dll\keyboard\kbdgrist\kbdgrist.dll 1
+dll\keyboard\kbdgr\kbdgr.dll 1
+dll\keyboard\kbdhe\kbdhe.dll 1
+dll\keyboard\kbdheb\kbdheb.dll 1
+dll\keyboard\kbdhu\kbdhu.dll 1
+dll\keyboard\kbdic\kbdic.dll 1
+dll\keyboard\kbdinasa\kbdinasa.dll 1
+dll\keyboard\kbdinben\kbdinben.dll 1
+dll\keyboard\kbdindev\kbdindev.dll 1
+dll\keyboard\kbdinguj\kbdinguj.dll 1
+dll\keyboard\kbdinmal\kbdinmal.dll 1
+dll\keyboard\kbdir\kbdir.dll 1
+dll\keyboard\kbdit\kbdit.dll 1
+dll\keyboard\kbdja\kbdja.dll 1
+dll\keyboard\kbdkaz\kbdkaz.dll 1
+dll\keyboard\kbdla\kbdla.dll 1
+dll\keyboard\kbdlt1\kbdlt1.dll 1
+dll\keyboard\kbdlv\kbdlv.dll 1
+dll\keyboard\kbdmac\kbdmac.dll 1
+dll\keyboard\kbdne\kbdne.dll 1
+dll\keyboard\kbdno\kbdno.dll 1
+dll\keyboard\kbdpl1\kbdpl1.dll 1
+dll\keyboard\kbdpo\kbdpo.dll 1
+dll\keyboard\kbdro\kbdro.dll 1
+dll\keyboard\kbdru\kbdru.dll 1
+dll\keyboard\kbdru1\kbdru1.dll 1
+dll\keyboard\kbdsg\kbdsg.dll 1
+dll\keyboard\kbdsk\kbdsk.dll 1
+dll\keyboard\kbdsk1\kbdsk1.dll 1
+dll\keyboard\kbdsw\kbdsw.dll 1
+dll\keyboard\kbdtat\kbdtat.dll 1
+dll\keyboard\kbdth0\kbdth0.dll 1
+dll\keyboard\kbdth1\kbdth1.dll 1
+dll\keyboard\kbdth2\kbdth2.dll 1
+dll\keyboard\kbdth3\kbdth3.dll 1
+dll\keyboard\kbdtuf\kbdtuf.dll 1
+dll\keyboard\kbdtuq\kbdtuq.dll 1
+dll\keyboard\kbduk\kbduk.dll 1
+dll\keyboard\kbdur\kbdur.dll 1
+dll\keyboard\kbdurs\kbdurs.dll 1
+dll\keyboard\kbdus\kbdus.dll 1
+dll\keyboard\kbdusa\kbdusa.dll 1
+dll\keyboard\kbdusl\kbdusl.dll 1
+dll\keyboard\kbdusr\kbdusr.dll 1
+dll\keyboard\kbdusx\kbdusx.dll 1
+dll\keyboard\kbduzb\kbduzb.dll 1
+dll\keyboard\kbdvntc\kbdvntc.dll 1
+dll\keyboard\kbdycc\kbdycc.dll 1
+dll\keyboard\kbdycl\kbdycl.dll 1
+dll\keyboard\kbdko\kbdko.dll 1
+
+dll\ntdll\ntdll.dll 1
+
+dll\win32\acledit\acledit.dll 1
+dll\win32\aclui\aclui.dll 1
+dll\win32\activeds\activeds.dll 1
+dll\win32\advapi32\advapi32.dll 1
+dll\win32\advpack\advpack.dll 1
+dll\win32\actxprxy\actxprxy.dll 1
+dll\win32\atl\atl.dll 1
+dll\win32\authz\authz.dll 1
+dll\win32\avicap32\avicap32.dll 1
+dll\win32\avifil32\avifil32.dll 1
+dll\win32\batt\batt.dll 1
+dll\win32\bcrypt\bcrypt.dll 1
+dll\win32\beepmidi\beepmidi.dll 1
+dll\win32\browseui\browseui.dll 1
+dll\win32\cabinet\cabinet.dll 1
+dll\win32\cards\cards.dll 1
+dll\win32\cfgmgr32\cfgmgr32.dll 1
+dll\win32\clusapi\clusapi.dll 1
+dll\win32\comcat\comcat.dll 1
+dll\win32\comctl32\comctl32.dll 1
+dll\win32\comdlg32\comdlg32.dll 1
+dll\win32\compstui\compstui.dll 1
+dll\win32\credui\credui.dll 1
+dll\win32\crtdll\crtdll.dll 1
+dll\win32\crypt32\crypt32.dll 1
+dll\win32\cryptdlg\cryptdlg.dll 1
+dll\win32\cryptdll\cryptdll.dll 1
+dll\win32\cryptnet\cryptnet.dll 1
+dll\win32\cryptui\cryptui.dll 1
+dll\win32\dbghelp\dbghelp.dll 1
+dll\win32\dciman32\dciman32.dll 1
+dll\win32\dwmapi\dwmapi.dll 1
+dll\win32\devmgr\devmgr.dll 1
+dll\win32\dhcpcsvc\dhcpcsvc.dll 1
+dll\win32\dnsapi\dnsapi.dll 1
+dll\win32\faultrep\faultrep.dll 1
+dll\win32\fmifs\fmifs.dll 1
+dll\win32\fusion\fusion.dll 1
+dll\win32\gdi32\gdi32.dll 1
+dll\win32\gdiplus\gdiplus.dll 1
+dll\win32\getuname\getuname.dll 1
+dll\win32\glu32\glu32.dll 1
+dll\win32\hhctrl.ocx\hhctrl.ocx 1
+dll\win32\hid\hid.dll 1
+dll\win32\hlink\hlink.dll 1
+dll\win32\hnetcfg\hnetcfg.dll 1
+dll\win32\httpapi\httpapi.dll 1
+dll\win32\iccvid\iccvid.dll 1
+dll\win32\icmp\icmp.dll 1
+dll\win32\imaadp32.acm\imaadp32.acm 1
+dll\win32\imagehlp\imagehlp.dll 1
+dll\win32\imm32\imm32.dll 1
+dll\win32\inetcomm\inetcomm.dll 1
+dll\win32\inetmib1\inetmib1.dll 1
+dll\win32\initpki\initpki.dll 1
+dll\win32\inseng\inseng.dll 1
+dll\win32\iphlpapi\iphlpapi.dll 1
+dll\win32\itircl\itircl.dll 1
+dll\win32\itss\itss.dll 1
+dll\win32\jscript\jscript.dll 1
+dll\win32\kernel32\kernel32.dll 1
+dll\win32\loadperf\loadperf.dll 1
+dll\win32\localspl\localspl.dll 1
+dll\win32\localui\localui.dll 1
+dll\win32\lsasrv\lsasrv.dll 1
+dll\win32\lz32\lz32.dll 1
+dll\win32\mapi32\mapi32.dll 1
+dll\win32\mciavi32\mciavi32.dll 1
+dll\win32\mcicda\mcicda.dll 1
+dll\win32\mciqtz32\mciqtz32.dll 1
+dll\win32\mciseq\mciseq.dll 1
+dll\win32\mciwave\mciwave.dll 1
+dll\win32\mlang\mlang.dll 1
+dll\win32\mmdrv\mmdrv.dll 1
+dll\win32\modemui\modemui.dll 1
+dll\win32\mpr\mpr.dll 1
+dll\win32\mprapi\mprapi.dll 1
+dll\win32\msacm32\msacm32.dll 1
+dll\win32\msacm32\msacm32.drv\msacm32.drv 1
+dll\win32\msadp32.acm\msadp32.acm 1
+dll\win32\msafd\msafd.dll 1
+dll\win32\mscat32\mscat32.dll 1
+dll\win32\mscms\mscms.dll 1
+dll\win32\mscoree\mscoree.dll 1
+dll\win32\msctf\msctf.dll 1
+dll\win32\msftedit\msftedit.dll 1
+dll\win32\msg711.acm\msg711.acm 1
+dll\win32\msgina\msgina.dll 1
+dll\win32\msgsm32.acm\msgsm32.acm 1
+dll\win32\mshtml\mshtml.dll 1
+dll\win32\mshtml.tlb\mshtml.tlb 1
+dll\win32\msi\msi.dll 1
+dll\win32\msimg32\msimg32.dll 1
+dll\win32\msimtf\msimtf.dll 1
+dll\win32\msisip\msisip.dll 1
+dll\win32\msisys.ocx\msisys.ocx 1
+dll\win32\msnet32\msnet32.dll 1
+dll\win32\msrle32\msrle32.dll 1
+dll\win32\mssign32\mssign32.dll 1
+dll\win32\mssip32\mssip32.dll 1
+dll\win32\mstask\mstask.dll 1
+dll\win32\msvcrt\msvcrt.dll 1
+dll\win32\msvcrt20\msvcrt20.dll 1
+dll\win32\msvcrt40\msvcrt40.dll 1
+dll\win32\msvfw32\msvfw32.dll 1
+dll\win32\msvidc32\msvidc32.dll 1
+dll\win32\mswsock\mswsock.dll 1
+dll\win32\msxml3\msxml3.dll 1
+dll\win32\nddeapi\nddeapi.dll 1
+dll\win32\netapi32\netapi32.dll 1
+dll\win32\netcfgx\netcfgx.dll 1
+dll\win32\netid\netid.dll 1
+dll\win32\netshell\netshell.dll 1
+dll\win32\newdev\newdev.dll 1
+dll\win32\ntdsapi\ntdsapi.dll 1
+dll\win32\ntlanman\ntlanman.dll 1
+dll\win32\ntmarta\ntmarta.dll 1
+dll\win32\ntprint\ntprint.dll 1
+dll\win32\objsel\objsel.dll 1
+dll\win32\odbc32\odbc32.dll 1
+dll\win32\odbccp32\odbccp32.dll 1
+dll\win32\ole32\ole32.dll 1
+dll\win32\oleacc\oleacc.dll 1
+dll\win32\oleaut32\oleaut32.dll 1
+dll\win32\olecli32\olecli32.dll 1
+dll\win32\oledlg\oledlg.dll 1
+dll\win32\olepro32\olepro32.dll 1
+dll\win32\olesvr32\olesvr32.dll 1
+dll\win32\olethk32\olethk32.dll 1
+dll\win32\opengl32\opengl32.dll 1
+dll\win32\pdh\pdh.dll 1
+dll\win32\pidgen\pidgen.dll 1
+dll\win32\powrprof\powrprof.dll 1
+dll\win32\printui\printui.dll 1
+dll\win32\psapi\psapi.dll 1
+dll\win32\pstorec\pstorec.dll 1
+dll\win32\qmgr\qmgr.dll 1
+dll\win32\qmgrprxy\qmgrprxy.dll 1
+dll\win32\query\query.dll 1
+dll\win32\rasadhlp\rasadhlp.dll 1
+dll\win32\rasapi32\rasapi32.dll 1
+dll\win32\rasdlg\rasdlg.dll 1
+dll\win32\resutils\resutils.dll 1
+dll\win32\rasman\rasman.dll 1
+dll\win32\riched20\riched20.dll 1
+dll\win32\riched32\riched32.dll 1
+dll\win32\rpcrt4\rpcrt4.dll 1
+dll\win32\rsabase\rsabase.dll 1
+dll\win32\rsaenh\rsaenh.dll 1
+dll\win32\samlib\samlib.dll 1
+dll\win32\samsrv\samsrv.dll 1
+dll\win32\sccbase\sccbase.dll 1
+dll\win32\schannel\schannel.dll 1
+dll\win32\secur32\secur32.dll 1
+dll\win32\security\security.dll 1
+dll\win32\sensapi\sensapi.dll 1
+dll\win32\serialui\serialui.dll 1
+dll\win32\setupapi\setupapi.dll 1
+dll\win32\sfc\sfc.dll 1
+dll\win32\sfc_os\sfc_os.dll 1
+dll\win32\shdoclc\shdoclc.dll 1
+dll\win32\shdocvw\shdocvw.dll 1
+dll\win32\shell32\shell32.dll 1
+dll\win32\shfolder\shfolder.dll 1
+dll\win32\shimgvw\shimgvw.dll 1
+dll\win32\shlwapi\shlwapi.dll 1
+dll\win32\slbcsp\slbcsp.dll 1
+dll\win32\smdll\smdll.dll 1
+dll\win32\snmpapi\snmpapi.dll 1
+dll\win32\softpub\softpub.dll 1
+dll\win32\spoolss\spoolss.dll 1
+dll\win32\srclient\srclient.dll 1
+dll\win32\stdole2.tlb\stdole2.tlb 1
+dll\win32\stdole32.tlb\stdole32.tlb 1
+dll\win32\sti\sti.dll 1
+dll\win32\sxs\sxs.dll 1
+dll\win32\syssetup\syssetup.dll 1
+dll\win32\t2embed\t2embed.dll 1
+dll\win32\tapi32\tapi32.dll 1
+dll\win32\tapiui\tapiui.dll 1
+dll\win32\traffic\traffic.dll 1
+dll\win32\twain_32\twain_32.dll 1
+dll\win32\uext2\uext2.dll 1
+dll\win32\ufat\ufat.dll 1
+dll\win32\ufatx\ufatx.dll 1 optional
+dll\win32\untfs\untfs.dll 1
+dll\win32\updspapi\updspapi.dll 1
+dll\win32\url\url.dll 1
+dll\win32\urlmon\urlmon.dll 1
+dll\win32\user32\user32.dll 1
+dll\win32\userenv\userenv.dll 1
+dll\win32\usp10\usp10.dll 1
+dll\win32\uxtheme\uxtheme.dll 1
+dll\win32\vdmdbg\vdmdbg.dll 1
+dll\win32\version\version.dll 1
+dll\win32\windowscodecs\windowscodecs.dll 1
+dll\win32\winemp3.acm\winemp3.acm 1
+dll\win32\winfax\winfax.dll 1
+dll\win32\winhttp\winhttp.dll 1
+dll\win32\wininet\wininet.dll 1
+dll\win32\winmm\winmm.dll 1
+dll\win32\winspool\winspool.drv 1
+dll\win32\winsta\winsta.dll 1
+dll\win32\wlanapi\wlanapi.dll 1
+dll\win32\wintrust\wintrust.dll 1
+dll\win32\wldap32\wldap32.dll 1
+dll\win32\wmi\wmi.dll 1
+dll\win32\ws2_32\ws2_32.dll 1
+dll\win32\ws2help\ws2help.dll 1
+dll\win32\wshirda\wshirda.dll 1
+dll\win32\wshtcpip\wshtcpip.dll 1
+dll\win32\wsock32\wsock32.dll 1
+dll\win32\wtsapi32\wtsapi32.dll 1
+dll\win32\wuapi\wuapi.dll 1
+dll\win32\xinput1_1\xinput1_1.dll 1
+dll\win32\xinput1_2\xinput1_2.dll 1
+dll\win32\xinput1_3\xinput1_3.dll 1
+dll\win32\xinput9_1_0\xinput9_1_0.dll 1
+dll\win32\xmllite\xmllite.dll 1
+dll\win32\winmm\midimap\midimap.dll 1
+dll\win32\wdmaud.drv\wdmaud.drv 1
+
+; Shell Extensions
+dll\shellext\deskadp\deskadp.dll 1
+dll\shellext\deskmon\deskmon.dll 1
+
+; Drivers
+drivers\base\bootvid\bootvid.dll 1
+drivers\base\beep\beep.sys 2
+drivers\base\null\null.sys 2
+drivers\base\nmidebug\nmidebug.sys 2
+
+drivers\battery\battc\battc.sys 2
+
+drivers\bus\acpi\cmbatt\cmbatt.sys 2
+drivers\bus\acpi\compbatt\compbatt.sys 2
+
+drivers\directx\dxapi\dxapi.sys 2
+drivers\directx\dxg\dxg.sys 2
+drivers\directx\dxgthk\dxgthk.sys 2
+
+drivers\filesystems\fs_rec\fs_rec.sys 2
+drivers\filesystems\msfs\msfs.sys 2
+drivers\filesystems\mup\mup.sys 2
+drivers\filesystems\npfs\npfs.sys 2
+
+drivers\input\mouclass\mouclass.sys 2
+drivers\input\sermouse\sermouse.sys 2
+
+drivers\ksfilter\ks\ks.sys 2
+drivers\multimedia\bdasup\bdasup.sys 2
+
+drivers\network\afd\afd.sys 2
+drivers\network\ndis\ndis.sys 2
+drivers\network\tcpip\tcpip.sys 2
+drivers\network\tdi\tdi.sys 2
+drivers\network\dd\ne2000\ne2000.sys 2
+drivers\network\dd\pcnet\pcnet.sys 2
+
+drivers\serial\serenum\serenum.sys 2
+drivers\serial\serial\serial.sys 2
+
+drivers\storage\ide\pciide\pciide.sys 2
+drivers\storage\ide\pciidex\pciidex.sys 2
+
+;drivers\usb\miniport\usbohci\usbohci.sys 2
+;drivers\usb\miniport\usbuhci\usbuhci.sys 2
+;drivers\usb\usbhub\usbhub.sys 2
+;drivers\usb\usbport\usbport.sys 2
+drivers\usb\nt4compat\usbdriver\usbdriver.sys 2
+
+drivers\video\displays\vga\vgaddi.dll 1
+drivers\video\displays\framebuf\framebuf.dll 1
+drivers\video\miniport\vga\vgamp.sys 2
+drivers\video\miniport\vbe\vbemp.sys 2
+drivers\video\videoprt\videoprt.sys 2
+drivers\video\font\ftfd\ftfd.dll 1
+
+drivers\wdm\audio\filters\kmixer\kmixer.sys 2
+drivers\wdm\audio\sysaudio\sysaudio.sys 2
+drivers\wdm\audio\legacy\wdmaud\wdmaud.sys 2
+drivers\wdm\audio\backpln\portcls\portcls.sys 2
+drivers\wdm\audio\drm\drmk\drmk.sys 2
+drivers\wmi\wmilib.sys 2
+
+; Media
+media\fonts\DejaVuSans.ttf 3
+media\fonts\DejaVuSans-Bold.ttf 3
+media\fonts\DejaVuSans-BoldOblique.ttf 3
+media\fonts\DejaVuSansMono.ttf 3
+media\fonts\DejaVuSansMono-Bold.ttf 3
+media\fonts\DejaVuSansMono-BoldOblique.ttf 3
+media\fonts\DejaVuSansMono-Oblique.ttf 3
+media\fonts\DejaVuSans-Oblique.ttf 3
+media\fonts\DejaVuSerif.ttf 3
+media\fonts\DejaVuSerif-Bold.ttf 3
+media\fonts\DejaVuSerif-BoldItalic.ttf 3
+media\fonts\DejaVuSerif-Italic.ttf 3
+
+media\fonts\FreeMono.ttf 3
+media\fonts\FreeMonoBold.ttf 3
+media\fonts\FreeMonoBoldOblique.ttf 3
+media\fonts\FreeMonoOblique.ttf 3
+
+media\fonts\LiberationMono-Bold.ttf 3
+media\fonts\LiberationMono-BoldItalic.ttf 3
+media\fonts\LiberationMono-Italic.ttf 3
+media\fonts\LiberationMono-Regular.ttf 3
+media\fonts\LiberationSans-Bold.ttf 3
+media\fonts\LiberationSans-BoldItalic.ttf 3
+media\fonts\LiberationSans-Italic.ttf 3
+media\fonts\LiberationSans-Regular.ttf 3
+media\fonts\LiberationSerif-Bold.ttf 3
+media\fonts\LiberationSerif-BoldItalic.ttf 3
+media\fonts\LiberationSerif-Italic.ttf 3
+media\fonts\LiberationSerif-Regular.ttf 3
+
+media\fonts\Marlett.ttf 3
+media\fonts\symbol.ttf 3
+media\fonts\tahoma.ttf 3
+media\fonts\tahomabd.ttf 3
+
+media\vgafonts\vgafonts.cab 4
+
+media\nls\c_037.nls 1
+media\nls\c_424.nls 1
+media\nls\c_500.nls 1
+media\nls\c_737.nls 1
+media\nls\c_775.nls 1
+media\nls\c_850.nls 1
+media\nls\c_852.nls 1
+media\nls\c_855.nls 1
+media\nls\c_856.nls 1
+media\nls\c_857.nls 1
+media\nls\c_860.nls 1
+media\nls\c_861.nls 1
+media\nls\c_862.nls 1
+media\nls\c_863.nls 1
+media\nls\c_864.nls 1
+media\nls\c_865.nls 1
+media\nls\c_866.nls 1
+media\nls\c_869.nls 1
+media\nls\c_874.nls 1
+media\nls\c_875.nls 1
+media\nls\c_878.nls 1
+media\nls\c_932.nls 1
+media\nls\c_936.nls 1
+media\nls\c_949.nls 1
+media\nls\c_950.nls 1
+media\nls\c_1006.nls 1
+media\nls\c_1026.nls 1
+media\nls\c_1250.nls 1
+media\nls\c_1251.nls 1
+media\nls\c_1253.nls 1
+media\nls\c_1254.nls 1
+media\nls\c_1255.nls 1
+media\nls\c_1256.nls 1
+media\nls\c_1257.nls 1
+media\nls\c_1258.nls 1
+media\nls\c_10000.nls 1
+media\nls\c_10006.nls 1
+media\nls\c_10007.nls 1
+media\nls\c_10029.nls 1
+media\nls\c_10079.nls 1
+media\nls\c_10081.nls 1
+media\nls\c_20866.nls 1
+media\nls\c_21866.nls 1
+media\nls\c_28591.nls 1
+media\nls\c_28592.nls 1
+media\nls\c_28593.nls 1
+media\nls\c_28594.nls 1
+media\nls\c_28595.nls 1
+media\nls\c_28596.nls 1
+media\nls\c_28597.nls 1
+media\nls\c_28598.nls 1
+media\nls\c_28599.nls 1
+media\nls\c_28600.nls 1
+media\nls\c_28603.nls 1
+media\nls\c_28604.nls 1
+media\nls\c_28605.nls 1
+media\nls\c_28606.nls 1
++media\drivers\etc\hosts 5
+media\drivers\etc\services 5
+media\inf\audio.inf 6
+media\inf\acpi.inf 6
+media\inf\battery.inf 6
+media\inf\cdrom.inf 6
+media\inf\cpu.inf 6
+media\inf\display.inf 6
+media\inf\font.inf 6
+media\inf\fdc.inf 6
+media\inf\hdc.inf 6
+media\inf\intl.inf 6
+media\inf\layout.inf 6
+media\inf\machine.inf 6
+media\inf\msmouse.inf 6
+media\inf\keyboard.inf 6
+media\inf\ks.inf 6
+media\inf\NET_NIC.inf 6
+media\inf\netamd.inf 6
+media\inf\netisa.inf 6
+media\inf\netrtpnt.inf 6
+media\inf\nettcpip.inf 6
+media\inf\ports.inf 6
+media\inf\scsi.inf 6
+media\inf\syssetup.inf 6
+media\inf\usbport.inf 6
+media\inf\usb.inf 6
+media\inf\usbstor.inf 6
+media\inf\xboxdisp.inf 6
+
+
+; Media Files
+media\sounds\ReactOS_LogOn.wav 8
+
+; Ini Files
+boot\bootdata\system.ini 4
+
+; Regression Testing
+boot\bootdata\bootcdregtest\regtest.cmd 7 optional
+
+; Subsystems
+subsystems\win32\csrss\csrss.exe 1
+subsystems\win32\csrss\win32csr\win32csr.dll 1
+subsystems\win32\csrss\csrsrv\csrsrv.dll 1
+subsystems\ntvdm\ntvdm.exe 1
+subsystems\win32\win32k\win32k.sys 1
+
+; Optional/proprietary files
+modules\optional\DroidSansFallback.ttf 3 optional
+modules\optional\NOTICE_for_Droid_Font.txt 4 optional
+modules\optional\netkvm2k.inf 6 optional
+modules\optional\netkvm2k.cat 6 optional
+modules\optional\netkvm.sys 2 optional
+modules\optional\alcxwdm.inf 6 optional
+modules\optional\alcxwdm.sys 2 optional
+modules\optional\mfc42.dll 1 optional
+modules\optional\mfc42u.dll 1 optional
+modules\optional\mfc71.dll 1 optional
+modules\optional\mfc71u.dll 1 optional
+modules\optional\msvbvm50.dll 1 optional
+modules\optional\msvbvm60.dll 1 optional
+modules\optional\msvcirt.dll 1 optional
+modules\optional\msvcp71.dll 1 optional
+modules\optional\msvcr71.dll 1 optional
+modules\optional\vmx_fb.dll 1 optional
+modules\optional\vmx_mode.dll 1 optional
+modules\optional\vmx_svga.inf 6 optional
+modules\optional\vmx_svga.sys 2 optional
+modules\optional\wine_gecko-1.0.0-x86.cab 4 optional
+
+; Rosapps
+modules\rosapps\applications\screensavers\cylfrac\cylfrac.scr 1 optional
+modules\rosapps\applications\screensavers\matrix\matrix.scr 1 optional
+modules\rosapps\applications\screensavers\blankscr\scrnsave.scr 1 optional
+modules\rosapps\applications\screensavers\starfield\starfield.scr 1 optional
+modules\rosapps\applications\screensavers\mazescr\mazescr.scr 1 optional
+modules\rosapps\applications\screensavers\butterflies\butterflies.scr 1 optional
+modules\rosapps\applications\cmdutils\comp\comp.exe 1 optional
+modules\rosapps\applications\cmdutils\mode\mode.exe 1 optional
+modules\rosapps\applications\cmdutils\sort\sort.exe 1 optional
+modules\rosapps\applications\cmdutils\tee\tee.exe 1 optional
+modules\rosapps\applications\cmdutils\touch\touch.exe 1 optional
+modules\rosapps\applications\cmdutils\uptime\uptime.exe 1 optional
+modules\rosapps\applications\cmdutils\y\y.exe 1 optional
+modules\rosapps\applications\devutils\gdb2\gdb2.exe 1 optional
+modules\rosapps\applications\devutils\gdihv\gdihv.exe 1 optional
+modules\rosapps\applications\devutils\genguid\genguid.exe 1 optional
+modules\rosapps\applications\sysutils\gettype\gettype.exe 1 optional
+modules\rosapps\applications\net\ncftp\ncftp.exe 1 optional
+modules\rosapps\applications\net\netreg\netreg.exe 1 optional
+modules\rosapps\applications\net\niclist\niclist.exe 1 optional
+modules\rosapps\applications\net\roshttpd\roshttpd.exe 1 optional
+modules\rosapps\applications\notevil\notevil.exe 1 optional
+modules\rosapps\applications\sysutils\chkdsk\chkdsk.exe 1 optional
+modules\rosapps\applications\sysutils\systeminfo\systeminfo.exe 1 optional
+modules\rosapps\applications\sysutils\chklib\chklib.exe 1 optional
+modules\rosapps\applications\sysutils\ctm\ctm.exe 1 optional
+modules\rosapps\applications\sysutils\kill\kill.exe 1 optional
+modules\rosapps\applications\sysutils\lsdd\lsdd.exe 1 optional
+modules\rosapps\applications\sysutils\man\man.exe 1 optional
+modules\rosapps\applications\sysutils\pedump\pedump.exe 1 optional
+modules\rosapps\applications\sysutils\regexpl\regexpl.exe 1 optional
+modules\rosapps\applications\sysutils\tcat\tcat.exe 1 optional
+modules\rosapps\applications\sysutils\tlist\tlist.exe 1 optional
+modules\rosapps\applications\sysutils\screenshot\screenshot.exe 1 optional
+modules\rosapps\applications\sysutils\utils\binpatch\binpatch.exe 1 optional
+modules\rosapps\applications\sysutils\utils\cat\cat.exe 1 optional
+modules\rosapps\applications\sysutils\utils\driver\load\load.exe 1 optional
+modules\rosapps\applications\sysutils\utils\driver\unload\unload.exe 1 optional
+modules\rosapps\applications\sysutils\utils\infinst\infinst.exe 1 optional
+modules\rosapps\applications\sysutils\utils\nts2w32err\nts2w32err.exe 1 optional
+modules\rosapps\applications\sysutils\utils\objdir\objdir.exe 1 optional
+modules\rosapps\applications\sysutils\utils\partinfo\partinfo.exe 1 optional
+modules\rosapps\applications\sysutils\utils\ps\ps.exe 1 optional
+modules\rosapps\applications\sysutils\utils\rosperf\rosperf.exe 1 optional
+modules\rosapps\applications\sysutils\utils\stats\stats.exe 1 optional
+modules\rosapps\applications\sysutils\utils\tickcount\tickcount.exe 1 optional
+modules\rosapps\applications\winfile\winfile.exe 1 optional
+modules\rosapps\demos\maze\maze.exe 1 optional
+modules\rosapps\drivers\green\green.sys 2 optional
+
+; Rostests
+modules\rostests\rosautotest\rosautotest.exe 1 optional
+modules\rostests\tests\pseh2\pseh2_test.exe 7 optional
+modules\rostests\winetests\advapi32\advapi32_winetest.exe 7 optional
+modules\rostests\winetests\advpack\advpack_winetest.exe 7 optional
+modules\rostests\winetests\browseui\browseui_winetest.exe 7 optional
+modules\rostests\winetests\cabinet\cabinet_winetest.exe 7 optional
+modules\rostests\winetests\comcat\comcat_winetest.exe 7 optional
+modules\rostests\winetests\comctl32\comctl32_winetest.exe 7 optional
+modules\rostests\winetests\comdlg32\comdlg32_winetest.exe 7 optional
+modules\rostests\winetests\crypt32\crypt32_winetest.exe 7 optional
+modules\rostests\winetests\cryptnet\cryptnet_winetest.exe 7 optional
+modules\rostests\winetests\dsound\dsound_winetest.exe 7 optional
+modules\rostests\winetests\gdi32\gdi32_winetest.exe 7 optional
+modules\rostests\winetests\gdiplus\gdiplus_winetest.exe 7 optional
+modules\rostests\winetests\hlink\hlink_winetest.exe 7 optional
+modules\rostests\winetests\icmp\icmp_winetest.exe 7 optional
+modules\rostests\winetests\iphlpapi\iphlpapi_winetest.exe 7 optional
+modules\rostests\winetests\jscript\jscript_winetest.exe 7 optional
+modules\rostests\winetests\kernel32\kernel32_winetest.exe 7 optional
+modules\rostests\winetests\lz32\lz32_winetest.exe 7 optional
+modules\rostests\winetests\mapi32\mapi32_winetest.exe 7 optional
+modules\rostests\winetests\mlang\mlang_winetest.exe 7 optional
+modules\rostests\winetests\mshtml\mshtml_winetest.exe 7 optional
+modules\rostests\winetests\msi\msi_winetest.exe 7 optional
+modules\rostests\winetests\mstask\mstask_winetest.exe 7 optional
+modules\rostests\winetests\msvcrt\msvcrt_winetest.exe 7 optional
+modules\rostests\winetests\msxml3\msxml3_winetest.exe 7 optional
+modules\rostests\winetests\netapi32\netapi32_winetest.exe 7 optional
+modules\rostests\winetests\ntdll\ntdll_winetest.exe 7 optional
+modules\rostests\winetests\odbccp32\odbccp32_winetest.exe 7 optional
+modules\rostests\winetests\ole32\ole32_winetest.exe 7 optional
+modules\rostests\winetests\oleaut32\oleaut32_winetest.exe 7 optional
+modules\rostests\winetests\powrprof\powrprof_winetest.exe 7 optional
+modules\rostests\winetests\psapi\psapi_winetest.exe 7 optional
+modules\rostests\winetests\riched20\riched20_winetest.exe 7 optional
+modules\rostests\winetests\rpcrt4\rpcrt4_winetest.exe 7 optional
+modules\rostests\winetests\rsabase\rsabase_winetest.exe 7 optional
+modules\rostests\winetests\rsaenh\rsaenh_winetest.exe 7 optional
+modules\rostests\winetests\schannel\schannel_winetest.exe 7 optional
+modules\rostests\winetests\secur32\secur32_winetest.exe 7 optional
+modules\rostests\winetests\setupapi\setupapi_winetest.exe 7 optional
+modules\rostests\winetests\shdocvw\shdocvw_winetest.exe 7 optional
+modules\rostests\winetests\shell32\shell32_winetest.exe 7 optional
+modules\rostests\winetests\shlwapi\shlwapi_winetest.exe 7 optional
+modules\rostests\winetests\urlmon\urlmon_winetest.exe 7 optional
+modules\rostests\winetests\user32\user32_winetest.exe 7 optional
+modules\rostests\winetests\usp10\usp10_winetest.exe 7 optional
+modules\rostests\winetests\uxtheme\uxtheme_winetest.exe 7 optional
+modules\rostests\winetests\version\version_winetest.exe 7 optional
+modules\rostests\winetests\winhttp\winhttp_winetest.exe 7 optional
+modules\rostests\winetests\wininet\wininet_winetest.exe 7 optional
+modules\rostests\winetests\winmm\winmm_winetest.exe 7 optional
+modules\rostests\winetests\wintrust\wintrust_winetest.exe 7 optional
+modules\rostests\winetests\wlanapi\wlanapi_winetest.exe 7 optional
+modules\rostests\winetests\ws2_32\ws2_32_winetest.exe 7 optional
+modules\rostests\winetests\xmllite\xmllite_winetest.exe 7 optional
+
+
+modules\wallpaper\Angelus_02_ROSWP.bmp 4 optional
--- /dev/null
- PTEB pTeb;
+#include "precomp.h"
+
+#define NDEBUG
+#include <debug.h>
+
+HGDIOBJ stock_objects[NB_STOCK_OBJECTS]; // temp location.
+
+HDC
+FASTCALL
+IntCreateDICW ( LPCWSTR lpwszDriver,
+ LPCWSTR lpwszDevice,
+ LPCWSTR lpwszOutput,
+ PDEVMODEW lpInitData,
+ ULONG iType )
+{
+ UNICODE_STRING Device, Output;
+ HDC hDC = NULL;
+ BOOL Display = FALSE, Default = FALSE;
+ ULONG UMdhpdev = 0;
+
+ HANDLE hspool = NULL;
+
+ if ( !ghSpooler && !LoadTheSpoolerDrv())
+ {
+ DPRINT1("WinSpooler.Drv Did not load!\n");
+ }
+ else
+ {
+ DPRINT("WinSpooler.Drv Loaded! hMod -> 0x%x\n", ghSpooler);
+ }
+
+ if ((!lpwszDevice) && (!lpwszDriver))
+ {
+ Default = TRUE; // Ask Win32k to set Default device.
+ Display = TRUE; // Most likely to be DISPLAY.
+ }
+ else
+ {
+ if ((lpwszDevice) && (wcslen(lpwszDevice) != 0)) // First
+ {
+ if (!_wcsnicmp(lpwszDevice, L"\\\\.\\DISPLAY",11)) Display = TRUE;
+ RtlInitUnicodeString(&Device, lpwszDevice);
+ }
+ else
+ {
+ if (lpwszDriver) // Second
+ {
+ if ((!_wcsnicmp(lpwszDriver, L"DISPLAY",7)) ||
+ (!_wcsnicmp(lpwszDriver, L"\\\\.\\DISPLAY",11))) Display = TRUE;
+ RtlInitUnicodeString(&Device, lpwszDriver);
+ }
+ }
+ }
+
+ if (lpwszOutput) RtlInitUnicodeString(&Output, lpwszOutput);
+
+ if (!Display)
+ {
+ //Handle Print device or something else.
+ DPRINT1("Not a DISPLAY device! %wZ\n", &Device);
+ }
+
+ hDC = NtGdiOpenDCW( (Default ? NULL : &Device),
+ (PDEVMODEW) lpInitData,
+ (lpwszOutput ? &Output : NULL),
+ iType, // DCW 0 and ICW 1.
+ Display,
+ hspool,
+ (PVOID) NULL, // NULL for now.
+ (PVOID) &UMdhpdev );
+#if 0
+// Handle something other than a normal dc object.
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ PDC_ATTR Dc_Attr;
+ PLDC pLDC;
+
+ GdiGetHandleUserData((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr);
+
+ pLDC = LocalAlloc(LMEM_ZEROINIT, sizeof(LDC));
+
+ Dc_Attr->pvLDC = pLDC;
+ pLDC->hDC = hDC;
+ pLDC->iType = LDC_LDC; // 1 (init) local DC, 2 EMF LDC
+ DbgPrint("DC_ATTR Allocated -> 0x%x\n",Dc_Attr);
+ }
+#endif
+ return hDC;
+}
+
+
+/*
+ * @implemented
+ */
+HDC
+WINAPI
+CreateCompatibleDC ( HDC hdc)
+{
+ HDC rhDC;
+// PDC_ATTR Dc_Attr;
+
+ rhDC = NtGdiCreateCompatibleDC(hdc);
+#if 0
+ if ( hdc && rhDC)
+ {
+ if (GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr))
+ {
+ if ( Dc_Attr->pvLIcm ) IcmCompatibleDC(rhDC, hdc, Dc_Attr);
+ }
+ }
+#endif
+ return rhDC;
+}
+
+/*
+ * @implemented
+ */
+HDC
+WINAPI
+CreateDCA (
+ LPCSTR lpszDriver,
+ LPCSTR lpszDevice,
+ LPCSTR lpszOutput,
+ CONST DEVMODEA * lpdvmInit
+ )
+{
+ ANSI_STRING DriverA, DeviceA, OutputA;
+ UNICODE_STRING DriverU, DeviceU, OutputU;
+ LPDEVMODEW dvmInitW = NULL;
+ HDC hDC;
+
+/*
+ * If needed, convert to Unicode
+ * any string parameter.
+ */
+
+ if (NULL != lpszDriver)
+ {
+ RtlInitAnsiString(&DriverA, (LPSTR)lpszDriver);
+ RtlAnsiStringToUnicodeString(&DriverU, &DriverA, TRUE);
+ } else
+ DriverU.Buffer = NULL;
+ if (NULL != lpszDevice)
+ {
+ RtlInitAnsiString(&DeviceA, (LPSTR)lpszDevice);
+ RtlAnsiStringToUnicodeString(&DeviceU, &DeviceA, TRUE);
+ } else
+ DeviceU.Buffer = NULL;
+ if (NULL != lpszOutput)
+ {
+ RtlInitAnsiString(&OutputA, (LPSTR)lpszOutput);
+ RtlAnsiStringToUnicodeString(&OutputU, &OutputA, TRUE);
+ } else
+ OutputU.Buffer = NULL;
+
+ if ( lpdvmInit )
+ dvmInitW = GdiConvertToDevmodeW((LPDEVMODEA)lpdvmInit);
+
+ hDC = IntCreateDICW ( DriverU.Buffer,
+ DeviceU.Buffer,
+ OutputU.Buffer,
+ lpdvmInit ? dvmInitW : NULL,
+ 0 );
+ HEAP_free (dvmInitW);
+/*
+ * Free Unicode parameters.
+ */
+ RtlFreeUnicodeString(&DriverU);
+ RtlFreeUnicodeString(&DeviceU);
+ RtlFreeUnicodeString(&OutputU);
+
+/*
+ * Return the possible DC handle.
+ */
+ return hDC;
+}
+
+
+/*
+ * @implemented
+ */
+HDC
+WINAPI
+CreateDCW (
+ LPCWSTR lpwszDriver,
+ LPCWSTR lpwszDevice,
+ LPCWSTR lpwszOutput,
+ CONST DEVMODEW *lpInitData
+ )
+{
+
+ return IntCreateDICW ( lpwszDriver,
+ lpwszDevice,
+ lpwszOutput,
+ (PDEVMODEW) lpInitData,
+ 0 );
+}
+
+
+/*
+ * @implemented
+ */
+HDC
+WINAPI
+CreateICW(
+ LPCWSTR lpszDriver,
+ LPCWSTR lpszDevice,
+ LPCWSTR lpszOutput,
+ CONST DEVMODEW *lpdvmInit
+ )
+{
+ return IntCreateDICW ( lpszDriver,
+ lpszDevice,
+ lpszOutput,
+ (PDEVMODEW) lpdvmInit,
+ 1 );
+}
+
+
+/*
+ * @implemented
+ */
+HDC
+WINAPI
+CreateICA(
+ LPCSTR lpszDriver,
+ LPCSTR lpszDevice,
+ LPCSTR lpszOutput,
+ CONST DEVMODEA *lpdvmInit
+ )
+{
+ NTSTATUS Status;
+ LPWSTR lpszDriverW, lpszDeviceW, lpszOutputW;
+ LPDEVMODEW dvmInitW = NULL;
+ HDC rc = 0;
+
+ Status = HEAP_strdupA2W ( &lpszDriverW, lpszDriver );
+ if (!NT_SUCCESS (Status))
+ SetLastError (RtlNtStatusToDosError(Status));
+ else
+ {
+ Status = HEAP_strdupA2W ( &lpszDeviceW, lpszDevice );
+ if (!NT_SUCCESS (Status))
+ SetLastError (RtlNtStatusToDosError(Status));
+ else
+ {
+ Status = HEAP_strdupA2W ( &lpszOutputW, lpszOutput );
+ if (!NT_SUCCESS (Status))
+ SetLastError (RtlNtStatusToDosError(Status));
+ else
+ {
+ if ( lpdvmInit )
+ dvmInitW = GdiConvertToDevmodeW((LPDEVMODEA)lpdvmInit);
+
+ rc = IntCreateDICW ( lpszDriverW,
+ lpszDeviceW,
+ lpszOutputW,
+ lpdvmInit ? dvmInitW : NULL,
+ 1 );
+ HEAP_free (dvmInitW);
+ HEAP_free ( lpszOutputW );
+ }
+ HEAP_free ( lpszDeviceW );
+ }
+ HEAP_free ( lpszDriverW );
+ }
+ return rc;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+DeleteDC(HDC hDC)
+{
+ BOOL Ret = TRUE;
+ PLDC pLDC = NULL;
+ HANDLE hPrinter = NULL;
+ ULONG hType = GDI_HANDLE_GET_TYPE(hDC);
+
+ pLDC = GdiGetLDC(hDC);
+
+ if (hType != GDILoObjType_LO_DC_TYPE)
+ {
+
+ if ( !pLDC || hType == GDILoObjType_LO_METADC16_TYPE)
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+ if (pLDC->Flags & LDC_INIT_DOCUMENT) AbortDoc(hDC);
+ if (pLDC->hPrinter)
+ {
+ DocumentEventEx(NULL, pLDC->hPrinter, hDC, DOCUMENTEVENT_DELETEDC, 0, NULL, 0, NULL);
+ hPrinter = pLDC->hPrinter;
+ pLDC->hPrinter = NULL;
+ }
+ }
+
+ Ret = NtGdiDeleteObjectApp(hDC);
+
+ if (Ret && pLDC )
+ {
+ DPRINT1("Delete the Local DC structure\n");
+ LocalFree( pLDC );
+ }
+ if (hPrinter) fpClosePrinter(hPrinter);
+ return Ret;
+}
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+DeleteObject(HGDIOBJ hObject)
+{
+ UINT Type = 0;
+
+ /* From Wine: DeleteObject does not SetLastError() on a null object */
+ if(!hObject) return FALSE;
+
+ if (0 != ((DWORD) hObject & GDI_HANDLE_STOCK_MASK))
+ { // Relax! This is a normal return!
+ DPRINT("Trying to delete system object 0x%x\n", hObject);
+ return TRUE;
+ }
+ // If you dont own it?! Get OUT!
+ if(!GdiIsHandleValid(hObject)) return FALSE;
+
+ Type = GDI_HANDLE_GET_TYPE(hObject);
+
+ if ((Type == GDI_OBJECT_TYPE_METAFILE) ||
+ (Type == GDI_OBJECT_TYPE_ENHMETAFILE))
+ return FALSE;
+
+ switch (Type)
+ {
+ case GDI_OBJECT_TYPE_DC:
+ return DeleteDC((HDC) hObject);
+ case GDI_OBJECT_TYPE_COLORSPACE:
+ return NtGdiDeleteColorSpace((HCOLORSPACE) hObject);
+ case GDI_OBJECT_TYPE_REGION:
+ return DeleteRegion((HRGN) hObject);
+#if 0
+ case GDI_OBJECT_TYPE_METADC:
+ return MFDRV_DeleteObject( hObject );
+ case GDI_OBJECT_TYPE_EMF:
+ {
+ PLDC pLDC = GdiGetLDC(hObject);
+ if ( !pLDC ) return FALSE;
+ return EMFDRV_DeleteObject( hObject );
+ }
+#endif
+ case GDI_OBJECT_TYPE_FONT:
+ break;
+
+ case GDI_OBJECT_TYPE_BRUSH:
+ case GDI_OBJECT_TYPE_EXTPEN:
+ case GDI_OBJECT_TYPE_PEN:
+ {
+ PBRUSH_ATTR Brh_Attr;
+ PTEB pTeb;
+
+ if ((!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &Brh_Attr)) ||
+ (Brh_Attr == NULL) ) break;
+
+ pTeb = NtCurrentTeb();
+
+ if (pTeb->Win32ThreadInfo == NULL) break;
+
+ if ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE)
+ {
+ PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] +
+ pTeb->GdiTebBatch.Offset);
+ pgO->gbHdr.Cmd = GdiBCDelObj;
+ pgO->gbHdr.Size = sizeof(GDIBSOBJECT);
+ pgO->hgdiobj = hObject;
+
+ pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
+ pTeb->GdiBatchCount++;
+ if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
+ return TRUE;
+ }
+ break;
+ }
+ case GDI_OBJECT_TYPE_BITMAP:
+ default:
+ break;
+ }
+ return NtGdiDeleteObjectApp(hObject);
+}
+
+INT
+WINAPI
+GetArcDirection( HDC hdc )
+{
+ return GetDCDWord( hdc, GdiGetArcDirection, 0);
+}
+
+
+INT
+WINAPI
+SetArcDirection( HDC hdc, INT nDirection )
+{
+ return GetAndSetDCDWord( hdc, GdiGetSetArcDirection, nDirection, 0, 0, 0 );
+}
+
+
+HGDIOBJ
+WINAPI
+GetDCObject( HDC hDC, INT iType)
+{
+ if((iType == GDI_OBJECT_TYPE_BRUSH) ||
+ (iType == GDI_OBJECT_TYPE_EXTPEN)||
+ (iType == GDI_OBJECT_TYPE_PEN) ||
+ (iType == GDI_OBJECT_TYPE_COLORSPACE))
+ {
+ HGDIOBJ hGO = NULL;
+ PDC_ATTR Dc_Attr;
+
+ if (!hDC) return hGO;
+
+ if (!GdiGetHandleUserData((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return NULL;
+
+ switch (iType)
+ {
+ case GDI_OBJECT_TYPE_BRUSH:
+ hGO = Dc_Attr->hbrush;
+ break;
+
+ case GDI_OBJECT_TYPE_EXTPEN:
+ case GDI_OBJECT_TYPE_PEN:
+ hGO = Dc_Attr->hpen;
+ break;
+
+ case GDI_OBJECT_TYPE_COLORSPACE:
+ hGO = Dc_Attr->hColorSpace;
+ break;
+ }
+ return hGO;
+ }
+ return NtGdiGetDCObject( hDC, iType );
+}
+
+
+/*
+ * @implemented
+ *
+ */
+HGDIOBJ
+WINAPI
+GetCurrentObject(HDC hdc,
+ UINT uObjectType)
+{
+ switch(uObjectType)
+ {
+ case OBJ_EXTPEN:
+ case OBJ_PEN:
+ uObjectType = GDI_OBJECT_TYPE_PEN;
+ break;
+ case OBJ_BRUSH:
+ uObjectType = GDI_OBJECT_TYPE_BRUSH;
+ break;
+ case OBJ_PAL:
+ uObjectType = GDI_OBJECT_TYPE_PALETTE;
+ break;
+ case OBJ_FONT:
+ uObjectType = GDI_OBJECT_TYPE_FONT;
+ break;
+ case OBJ_BITMAP:
+ uObjectType = GDI_OBJECT_TYPE_BITMAP;
+ break;
+ case OBJ_COLORSPACE:
+ uObjectType = GDI_OBJECT_TYPE_COLORSPACE;
+ break;
+ /* tests show that OBJ_REGION is explicitly ignored */
+ case OBJ_REGION:
+ return NULL;
+ /* the SDK only mentions those above */
+ default:
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return NULL;
+ }
+ return GetDCObject(hdc, uObjectType);
+}
+
+/*
+ * @implemented
+ *
+ */
+int
+WINAPI
+GetDeviceCaps(HDC hDC,
+ int i)
+{
+ PDC_ATTR Dc_Attr;
+ PLDC pLDC;
+ PDEVCAPS pDevCaps = GdiDevCaps; // Primary display device capabilities.
+ DPRINT("Device CAPS1\n");
+
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+ {
+ if ( i == TECHNOLOGY) return DT_METAFILE;
+ return 0;
+ }
+ else
+ {
+ pLDC = GdiGetLDC(hDC);
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return 0;
+ }
+ if (!(pLDC->Flags & LDC_DEVCAPS))
+ {
+ if (!NtGdiGetDeviceCapsAll(hDC, &pLDC->DevCaps))
+ SetLastError(ERROR_INVALID_PARAMETER);
+ pLDC->Flags |= LDC_DEVCAPS;
+ }
+ pDevCaps = &pLDC->DevCaps;
+ }
+ }
+ else
+ {
+ if (!GdiGetHandleUserData((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr))
+ return 0;
+ if (!(Dc_Attr->ulDirty_ & DC_PRIMARY_DISPLAY) )
+ return NtGdiGetDeviceCaps(hDC,i);
+ }
+ DPRINT("Device CAPS2\n");
+
+ switch (i)
+ {
+ case DRIVERVERSION:
+ return pDevCaps->ulVersion;
+
+ case TECHNOLOGY:
+ return pDevCaps->ulTechnology;
+
+ case HORZSIZE:
+ return pDevCaps->ulHorzSize;
+
+ case VERTSIZE:
+ return pDevCaps->ulVertSize;
+
+ case HORZRES:
+ return pDevCaps->ulHorzRes;
+
+ case VERTRES:
+ return pDevCaps->ulVertRes;
+
+ case LOGPIXELSX:
+ return pDevCaps->ulLogPixelsX;
+
+ case LOGPIXELSY:
+ return pDevCaps->ulLogPixelsY;
+
+ case BITSPIXEL:
+ return pDevCaps->ulBitsPixel;
+
+ case PLANES:
+ return pDevCaps->ulPlanes;
+
+ case NUMBRUSHES:
+ return -1;
+
+ case NUMPENS:
+ return pDevCaps->ulNumPens;
+
+ case NUMFONTS:
+ return pDevCaps->ulNumFonts;
+
+ case NUMCOLORS:
+ return pDevCaps->ulNumColors;
+
+ case ASPECTX:
+ return pDevCaps->ulAspectX;
+
+ case ASPECTY:
+ return pDevCaps->ulAspectY;
+
+ case ASPECTXY:
+ return pDevCaps->ulAspectXY;
+
+ case CLIPCAPS:
+ return CP_RECTANGLE;
+
+ case SIZEPALETTE:
+ return pDevCaps->ulSizePalette;
+
+ case NUMRESERVED:
+ return 20;
+
+ case COLORRES:
+ return pDevCaps->ulColorRes;
+
+ case DESKTOPVERTRES:
+ return pDevCaps->ulVertRes;
+
+ case DESKTOPHORZRES:
+ return pDevCaps->ulHorzRes;
+
+ case BLTALIGNMENT:
+ return pDevCaps->ulBltAlignment;
+
+ case SHADEBLENDCAPS:
+ return pDevCaps->ulShadeBlend;
+
+ case COLORMGMTCAPS:
+ return pDevCaps->ulColorMgmtCaps;
+
+ case PHYSICALWIDTH:
+ return pDevCaps->ulPhysicalWidth;
+
+ case PHYSICALHEIGHT:
+ return pDevCaps->ulPhysicalHeight;
+
+ case PHYSICALOFFSETX:
+ return pDevCaps->ulPhysicalOffsetX;
+
+ case PHYSICALOFFSETY:
+ return pDevCaps->ulPhysicalOffsetY;
+
+ case VREFRESH:
+ return pDevCaps->ulVRefresh;
+
+ case RASTERCAPS:
+ return pDevCaps->ulRasterCaps;
+
+ case CURVECAPS:
+ return (CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES | CC_WIDE |
+ CC_STYLED | CC_WIDESTYLED | CC_INTERIORS | CC_ROUNDRECT);
+
+ case LINECAPS:
+ return (LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE |
+ LC_STYLED | LC_WIDESTYLED | LC_INTERIORS);
+
+ case POLYGONALCAPS:
+ return (PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON | PC_SCANLINE |
+ PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS);
+
+ case TEXTCAPS:
+ return pDevCaps->ulTextCaps;
+
+ case PDEVICESIZE:
+ case SCALINGFACTORX:
+ case SCALINGFACTORY:
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+DWORD
+WINAPI
+GetRelAbs(
+ HDC hdc,
+ DWORD dwIgnore
+ )
+{
+ return GetDCDWord( hdc, GdiGetRelAbs, 0);
+}
+
+
+/*
+ * @implemented
+ */
+INT
+WINAPI
+SetRelAbs(
+ HDC hdc,
+ INT Mode
+ )
+{
+ return GetAndSetDCDWord( hdc, GdiGetSetRelAbs, Mode, 0, 0, 0 );
+}
+
+
+/*
+ * @implemented
+ */
+DWORD
+WINAPI
+GetAndSetDCDWord( HDC hDC, INT u, DWORD dwIn, DWORD Unk1, DWORD Unk2, DWORD Unk3 )
+{
+ BOOL Ret = TRUE;
+// Handle something other than a normal dc object.
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+ return 0; //call MFDRV
+ else
+ {
+ PLDC pLDC = GdiGetLDC(hDC);
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return 0;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+ Ret = TRUE; //call EMFDRV
+ if (Ret)
+ return u;
+ return 0;
+ }
+ }
+ }
+ Ret = NtGdiGetAndSetDCDword( hDC, u, dwIn, (DWORD*) &u );
+ if (Ret)
+ return u;
+ else
+ SetLastError(ERROR_INVALID_HANDLE);
+ return 0;
+}
+
+
+/*
+ * @implemented
+ */
+DWORD
+WINAPI
+GetDCDWord( HDC hDC, INT u, DWORD Result )
+{
+ BOOL Ret = NtGdiGetDCDword( hDC, u, (DWORD*) &u );
+ if (!Ret) return Result;
+ else return u;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+GetAspectRatioFilterEx(
+ HDC hdc,
+ LPSIZE lpAspectRatio
+ )
+{
+ return NtGdiGetDCPoint( hdc, GdiGetAspectRatioFilter, (LPPOINT) lpAspectRatio );
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+GetDCOrgEx(
+ HDC hdc,
+ LPPOINT lpPoint
+ )
+{
+ return NtGdiGetDCPoint( hdc, GdiGetDCOrg, lpPoint );
+}
+
+
+/*
+ * @implemented
+ */
+LONG
+WINAPI
+GetDCOrg(
+ HDC hdc
+ )
+{
+ // Officially obsolete by Microsoft
+ POINT Pt;
+ if (!GetDCOrgEx(hdc, &Pt))
+ return 0;
+ return(MAKELONG(Pt.x, Pt.y));
+}
+
+
+int
+GetNonFontObject(HGDIOBJ hGdiObj, int cbSize, LPVOID lpBuffer)
+{
+ INT dwType;
+
+ hGdiObj = (HANDLE)GdiFixUpHandle(hGdiObj);
+ dwType = GDI_HANDLE_GET_TYPE(hGdiObj);
+
+ if (!lpBuffer) // Should pass it all to Win32k and let god sort it out. ;^)
+ {
+ switch(dwType)
+ {
+ case GDI_OBJECT_TYPE_PEN:
+ return sizeof(LOGPEN);
+ case GDI_OBJECT_TYPE_BRUSH:
+ return sizeof(LOGBRUSH);
+ case GDI_OBJECT_TYPE_BITMAP:
+ return sizeof(BITMAP);
+ case GDI_OBJECT_TYPE_PALETTE:
+ return sizeof(WORD);
+ case GDI_OBJECT_TYPE_EXTPEN: /* we don't know the size, ask win32k */
+ break;
+ }
+ }
+
+ switch(dwType)
+ {
+ case GDI_OBJECT_TYPE_PEN: //Check the structures and see if A & W are the same.
+ case GDI_OBJECT_TYPE_EXTPEN:
+ case GDI_OBJECT_TYPE_BRUSH: // Mixing Apples and Oranges?
+ case GDI_OBJECT_TYPE_BITMAP:
+ case GDI_OBJECT_TYPE_PALETTE:
+ return NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer);
+
+ case GDI_OBJECT_TYPE_DC:
+ case GDI_OBJECT_TYPE_REGION:
+ case GDI_OBJECT_TYPE_METAFILE:
+ case GDI_OBJECT_TYPE_ENHMETAFILE:
+ case GDI_OBJECT_TYPE_EMF:
+ SetLastError(ERROR_INVALID_HANDLE);
+ }
+ return 0;
+}
+
+
+/*
+ * @implemented
+ */
+int
+WINAPI
+GetObjectA(HGDIOBJ hGdiObj, int cbSize, LPVOID lpBuffer)
+{
+ ENUMLOGFONTEXDVW LogFont;
+ DWORD dwType;
+ INT Result = 0;
+
+ dwType = GDI_HANDLE_GET_TYPE(hGdiObj);
+
+ if(dwType == GDI_OBJECT_TYPE_COLORSPACE) //Stays here, processes struct A
+ {
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return 0;
+ }
+
+ if (dwType == GDI_OBJECT_TYPE_FONT)
+ {
+ if (!lpBuffer)
+ {
+ return sizeof(LOGFONTA);
+ }
+ if (cbSize == 0)
+ {
+ /* Windows does not SetLastError() */
+ return 0;
+ }
+ // ENUMLOGFONTEXDVW is the default size and should be the structure for
+ // Entry->KernelData for Font objects.
+ Result = NtGdiExtGetObjectW(hGdiObj, sizeof(ENUMLOGFONTEXDVW), &LogFont);
+
+ if (0 == Result)
+ {
+ return 0;
+ }
+
+ switch (cbSize)
+ {
+ case sizeof(ENUMLOGFONTEXDVA):
+ // need to move more here.
+ case sizeof(ENUMLOGFONTEXA):
+ EnumLogFontExW2A( (LPENUMLOGFONTEXA) lpBuffer, &LogFont.elfEnumLogfontEx );
+ break;
+
+ case sizeof(ENUMLOGFONTA):
+ // Same here, maybe? Check the structures.
+ case sizeof(EXTLOGFONTA):
+ // Same here
+ case sizeof(LOGFONTA):
+ LogFontW2A((LPLOGFONTA) lpBuffer, &LogFont.elfEnumLogfontEx.elfLogFont);
+ break;
+
+ default:
+ SetLastError(ERROR_BUFFER_OVERFLOW);
+ return 0;
+ }
+ return cbSize;
+ }
+
+ return GetNonFontObject(hGdiObj, cbSize, lpBuffer);
+}
+
+
+/*
+ * @implemented
+ */
+int
+WINAPI
+GetObjectW(HGDIOBJ hGdiObj, int cbSize, LPVOID lpBuffer)
+{
+ DWORD dwType = GDI_HANDLE_GET_TYPE(hGdiObj);
+ INT Result = 0;
+
+/*
+ Check List:
+ MSDN, "This can be a handle to one of the following: logical bitmap, a brush,
+ a font, a palette, a pen, or a device independent bitmap created by calling
+ the CreateDIBSection function."
+ */
+ if(dwType == GDI_OBJECT_TYPE_COLORSPACE) //Stays here, processes struct W
+ {
+ SetLastError(ERROR_NOT_SUPPORTED); // Not supported yet.
+ return 0;
+ }
+
+ if (dwType == GDI_OBJECT_TYPE_FONT)
+ {
+ if (!lpBuffer)
+ {
+ return sizeof(LOGFONTW);
+ }
+
+ if (cbSize == 0)
+ {
+ /* Windows does not SetLastError() */
+ return 0;
+ }
+ // Poorly written apps are not ReactOS problem!
+ // We fix it here if the size is larger than the default size.
+ if( cbSize > (int)sizeof(ENUMLOGFONTEXDVW) ) cbSize = sizeof(ENUMLOGFONTEXDVW);
+
+ Result = NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer); // Should handle the copy.
+
+ if (0 == Result)
+ {
+ return 0;
+ }
+ return cbSize;
+ }
+
+ return GetNonFontObject(hGdiObj, cbSize, lpBuffer);
+}
+
+
+/*
+ * @implemented
+ */
+COLORREF
+WINAPI
+GetDCBrushColor(
+ HDC hdc
+)
+{
+ PDC_ATTR Dc_Attr;
+
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return CLR_INVALID;
+ return (COLORREF) Dc_Attr->ulBrushClr;
+}
+
+/*
+ * @implemented
+ */
+COLORREF
+WINAPI
+GetDCPenColor(
+ HDC hdc
+)
+{
+ PDC_ATTR Dc_Attr;
+
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return CLR_INVALID;
+ return (COLORREF) Dc_Attr->ulPenClr;
+}
+
+/*
+ * @implemented
+ */
+COLORREF
+WINAPI
+SetDCBrushColor(
+ HDC hdc,
+ COLORREF crColor
+)
+{
+ PDC_ATTR Dc_Attr;
+ COLORREF OldColor = CLR_INVALID;
+
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return OldColor;
+ else
+ {
+ OldColor = (COLORREF) Dc_Attr->ulBrushClr;
+ Dc_Attr->ulBrushClr = (ULONG) crColor;
+
+ if ( Dc_Attr->crBrushClr != crColor ) // if same, don't force a copy.
+ {
+ Dc_Attr->ulDirty_ |= DIRTY_FILL;
+ Dc_Attr->crBrushClr = crColor;
+ }
+ }
+ return OldColor;
+}
+
+/*
+ * @implemented
+ */
+COLORREF
+WINAPI
+SetDCPenColor(
+ HDC hdc,
+ COLORREF crColor
+)
+{
+ PDC_ATTR Dc_Attr;
+ COLORREF OldColor = CLR_INVALID;
+
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return OldColor;
+ else
+ {
+ OldColor = (COLORREF) Dc_Attr->ulPenClr;
+ Dc_Attr->ulPenClr = (ULONG) crColor;
+
+ if ( Dc_Attr->crPenClr != crColor )
+ {
+ Dc_Attr->ulDirty_ |= DIRTY_LINE;
+ Dc_Attr->crPenClr = crColor;
+ }
+ }
+ return OldColor;
+}
+
+/*
+ * @implemented
+ *
+ */
+COLORREF
+WINAPI
+GetBkColor(HDC hdc)
+{
+ PDC_ATTR Dc_Attr;
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+ return Dc_Attr->ulBackgroundClr;
+}
+
+/*
+ * @implemented
+ */
+COLORREF
+WINAPI
+SetBkColor(
+ HDC hdc,
+ COLORREF crColor
+)
+{
+ PDC_ATTR Dc_Attr;
+ COLORREF OldColor = CLR_INVALID;
+
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return OldColor;
+#if 0
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+ return MFDRV_SetBkColor( hDC, crColor );
+ else
+ {
+ PLDC pLDC = Dc_Attr->pvLDC;
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+ return EMFDRV_SetBkColor( hDC, crColor );
+ }
+ }
+ }
+#endif
+ OldColor = (COLORREF) Dc_Attr->ulBackgroundClr;
+ Dc_Attr->ulBackgroundClr = (ULONG) crColor;
+
+ if ( Dc_Attr->crBackgroundClr != crColor )
+ {
+ Dc_Attr->ulDirty_ |= (DIRTY_BACKGROUND|DIRTY_LINE|DIRTY_FILL);
+ Dc_Attr->crBackgroundClr = crColor;
+ }
+ return OldColor;
+}
+
+/*
+ * @implemented
+ *
+ */
+int
+WINAPI
+GetBkMode(HDC hdc)
+{
+ PDC_ATTR Dc_Attr;
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+ return Dc_Attr->lBkMode;
+}
+
+/*
+ * @implemented
+ *
+ */
+int
+WINAPI
+SetBkMode(HDC hdc,
+ int iBkMode)
+{
+ PDC_ATTR Dc_Attr;
+ INT OldMode = 0;
+
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return OldMode;
+#if 0
+ if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC)
+ return MFDRV_SetBkMode( hdc, iBkMode )
+ else
+ {
+ PLDC pLDC = Dc_Attr->pvLDC;
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+ return EMFDRV_SetBkMode( hdc, iBkMode )
+ }
+ }
+ }
+#endif
+ OldMode = Dc_Attr->lBkMode;
+ Dc_Attr->jBkMode = iBkMode; // Processed
+ Dc_Attr->lBkMode = iBkMode; // Raw
+ return OldMode;
+}
+
+/*
+ * @implemented
+ *
+ */
+int
+WINAPI
+GetPolyFillMode(HDC hdc)
+{
+ PDC_ATTR Dc_Attr;
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+ return Dc_Attr->lFillMode;
+}
+
+/*
+ * @unimplemented
+ */
+int
+WINAPI
+SetPolyFillMode(HDC hdc,
+ int iPolyFillMode)
+{
+ INT fmode;
+ PDC_ATTR Dc_Attr;
+#if 0
+ if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC)
+ return MFDRV_SetPolyFillMode( hdc, iPolyFillMode )
+ else
+ {
+ PLDC pLDC = GdiGetLDC(hdc);
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+ return EMFDRV_SetPolyFillMode( hdc, iPolyFillMode )
+ }
+ }
+ }
+#endif
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+
+ if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
+ {
+ if (Dc_Attr->ulDirty_ & DC_MODE_DIRTY)
+ {
+ NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
+ Dc_Attr->ulDirty_ &= ~(DC_MODE_DIRTY|DC_FONTTEXT_DIRTY);
+ }
+ }
+
+ fmode = Dc_Attr->lFillMode;
+ Dc_Attr->lFillMode = iPolyFillMode;
+
+ return fmode;
+}
+
+/*
+ * @implemented
+ *
+ */
+int
+WINAPI
+GetGraphicsMode(HDC hdc)
+{
+ PDC_ATTR Dc_Attr;
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+ return Dc_Attr->iGraphicsMode;
+}
+
+/*
+ * @unimplemented
+ */
+int
+WINAPI
+SetGraphicsMode(HDC hdc,
+ int iMode)
+{
+ INT oMode;
+ PDC_ATTR Dc_Attr;
+ if ((iMode < GM_COMPATIBLE) || (iMode > GM_ADVANCED))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+
+ if (iMode == Dc_Attr->iGraphicsMode) return iMode;
+
+ if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
+ {
+ if (Dc_Attr->ulDirty_ & DC_MODE_DIRTY)
+ {
+ NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
+ Dc_Attr->ulDirty_ &= ~(DC_MODE_DIRTY|DC_FONTTEXT_DIRTY);
+ }
+ }
+/* One would think that setting the graphics mode to GM_COMPATIBLE
+ * would also reset the world transformation matrix to the unity
+ * matrix. However, in Windows, this is not the case. This doesn't
+ * make a lot of sense to me, but that's the way it is.
+ */
+ oMode = Dc_Attr->iGraphicsMode;
+ Dc_Attr->iGraphicsMode = iMode;
+
+ return oMode;
+}
+
+/*
+ * @implemented
+ */
+HDC
+WINAPI
+ResetDCW(
+ HDC hdc,
+ CONST DEVMODEW *lpInitData
+ )
+{
+ NtGdiResetDC ( hdc, (PDEVMODEW)lpInitData, NULL, NULL, NULL);
+ return hdc;
+}
+
+
+/*
+ * @implemented
+ */
+HDC
+WINAPI
+ResetDCA(
+ HDC hdc,
+ CONST DEVMODEA *lpInitData
+ )
+{
+ LPDEVMODEW InitDataW;
+
+ InitDataW = GdiConvertToDevmodeW((LPDEVMODEA)lpInitData);
+
+ NtGdiResetDC ( hdc, InitDataW, NULL, NULL, NULL);
+ HEAP_free(InitDataW);
+ return hdc;
+}
+
+
+/*
+ * @implemented
+ */
+DWORD
+WINAPI
+GetObjectType(
+ HGDIOBJ h
+ )
+{
+ DWORD Ret = 0;
+
+ if(GdiIsHandleValid(h))
+ {
+ LONG Type = GDI_HANDLE_GET_TYPE(h);
+ switch(Type)
+ {
+ case GDI_OBJECT_TYPE_PEN:
+ Ret = OBJ_PEN;
+ break;
+ case GDI_OBJECT_TYPE_BRUSH:
+ Ret = OBJ_BRUSH;
+ break;
+ case GDI_OBJECT_TYPE_BITMAP:
+ Ret = OBJ_BITMAP;
+ break;
+ case GDI_OBJECT_TYPE_FONT:
+ Ret = OBJ_FONT;
+ break;
+ case GDI_OBJECT_TYPE_PALETTE:
+ Ret = OBJ_PAL;
+ break;
+ case GDI_OBJECT_TYPE_REGION:
+ Ret = OBJ_REGION;
+ break;
+ case GDI_OBJECT_TYPE_DC:
+ if ( GetDCDWord( h, GdiGetIsMemDc, 0))
+ {
+ Ret = OBJ_MEMDC;
+ }
+ else
+ Ret = OBJ_DC;
+ break;
+ case GDI_OBJECT_TYPE_COLORSPACE:
+ Ret = OBJ_COLORSPACE;
+ break;
+ case GDI_OBJECT_TYPE_METAFILE:
+ Ret = OBJ_METAFILE;
+ break;
+ case GDI_OBJECT_TYPE_ENHMETAFILE:
+ Ret = OBJ_ENHMETAFILE;
+ break;
+ case GDI_OBJECT_TYPE_METADC:
+ Ret = OBJ_METADC;
+ break;
+ case GDI_OBJECT_TYPE_EXTPEN:
+ Ret = OBJ_EXTPEN;
+ break;
+
+ default:
+ DPRINT1("GetObjectType: Magic 0x%08x not implemented\n", Type);
+ break;
+ }
+ }
+ else
+ /* From Wine: GetObjectType does SetLastError() on a null object */
+ SetLastError(ERROR_INVALID_HANDLE);
+ return Ret;
+}
+
+
+/*
+ * @implemented
+ */
+HGDIOBJ
+WINAPI
+GetStockObject(
+ INT h
+ )
+{
+ HGDIOBJ Ret = NULL;
+ if ((h < 0) || (h >= NB_STOCK_OBJECTS)) return Ret;
+ Ret = stock_objects[h];
+ if (!Ret)
+ {
+ HGDIOBJ Obj = NtGdiGetStockObject( h );
+
+ if (GdiIsHandleValid(Obj))
+ {
+ stock_objects[h] = Obj;
+ return Obj;
+ }// Returns Null anyway.
+ }
+ return Ret;
+}
+
+/* FIXME: include correct header */
+HPALETTE WINAPI NtUserSelectPalette(HDC hDC,
+ HPALETTE hpal,
+ BOOL ForceBackground);
+
+HPALETTE
+WINAPI
+SelectPalette(
+ HDC hDC,
+ HPALETTE hPal,
+ BOOL bForceBackground)
+{
+#if 0
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+ return MFDRV_SelectPalette( hDC, hPal, bForceBackground);
+ else
+ {
+ PLDC pLDC = GdiGetLDC(hDC);
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return NULL;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+ if return EMFDRV_SelectPalette( hDC, hPal, bForceBackground);
+ }
+ }
+ }
+#endif
+ return NtUserSelectPalette(hDC, hPal, bForceBackground);
+}
+
+/*
+ * @implemented
+ *
+ */
+int
+WINAPI
+GetMapMode(HDC hdc)
+{
+ PDC_ATTR Dc_Attr;
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+ return Dc_Attr->iMapMode;
+}
+
+/*
+ * @implemented
+ */
+INT
+WINAPI
+SetMapMode(
+ HDC hdc,
+ INT Mode
+ )
+{
+ PDC_ATTR Dc_Attr;
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+#if 0
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+ return MFDRV_SetMapMode(hdc, Mode);
+ else
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return 0;
+ }
+#endif
+ // Force change if Isotropic is set for recompute.
+ if ((Mode != Dc_Attr->iMapMode) || (Mode == MM_ISOTROPIC))
+ {
+ Dc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
+ return GetAndSetDCDWord( hdc, GdiGetSetMapMode, Mode, 0, 0, 0 );
+ }
+ return Dc_Attr->iMapMode;
+}
+
+/*
+ * @implemented
+ *
+ */
+int
+WINAPI
+GetStretchBltMode(HDC hdc)
+{
+ PDC_ATTR Dc_Attr;
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+ return Dc_Attr->lStretchBltMode;
+}
+
+/*
+ * @implemented
+ */
+int
+WINAPI
+SetStretchBltMode(HDC hdc, int iStretchMode)
+{
+ INT oSMode;
+ PDC_ATTR Dc_Attr;
+#if 0
+ if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC)
+ return MFDRV_SetStretchBltMode( hdc, iStretchMode);
+ else
+ {
+ PLDC pLDC = GdiGetLDC(hdc);
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return 0;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+ return EMFDRV_SetStretchBltMode( hdc, iStretchMode);
+ }
+ }
+ }
+#endif
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return 0;
+
+ oSMode = Dc_Attr->lStretchBltMode;
+ Dc_Attr->lStretchBltMode = iStretchMode;
+
+ // Wine returns an error here. We set the default.
+ if ((iStretchMode <= 0) || (iStretchMode > MAXSTRETCHBLTMODE)) iStretchMode = WHITEONBLACK;
+
+ Dc_Attr->jStretchBltMode = iStretchMode;
+
+ return oSMode;
+}
+
+/*
+ * @implemented
+ */
+HFONT
+WINAPI
+GetHFONT(HDC hdc)
+{
+ PDC_ATTR Dc_Attr;
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return NULL;
+ return Dc_Attr->hlfntNew;
+}
+
+
+/*
+ * @implemented
+ *
+ */
+HGDIOBJ
+WINAPI
+SelectObject(HDC hDC,
+ HGDIOBJ hGdiObj)
+{
+ PDC_ATTR pDc_Attr;
+ HGDIOBJ hOldObj = NULL;
+ UINT uType;
- pTeb = NtCurrentTeb();
- if (((pTeb->GdiTebBatch.HDC == 0) ||
- (pTeb->GdiTebBatch.HDC == hDC)) &&
- ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) &&
- (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)))
+
+ if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return NULL;
+ }
+
+ hGdiObj = GdiFixUpHandle(hGdiObj);
+ if (!GdiIsHandleValid(hGdiObj))
+ {
+ return NULL;
+ }
+
+ uType = GDI_HANDLE_GET_TYPE(hGdiObj);
+
+ switch (uType)
+ {
+ case GDI_OBJECT_TYPE_REGION:
+ return (HGDIOBJ)ExtSelectClipRgn(hDC, hGdiObj, RGN_COPY);
+
+ case GDI_OBJECT_TYPE_BITMAP:
+ return NtGdiSelectBitmap(hDC, hGdiObj);
+
+ case GDI_OBJECT_TYPE_BRUSH:
+ hOldObj = pDc_Attr->hbrush;
+ pDc_Attr->ulDirty_ |= DC_BRUSH_DIRTY;
+ pDc_Attr->hbrush = hGdiObj;
+ return hOldObj;
+// return NtGdiSelectBrush(hDC, hGdiObj);
+
+ case GDI_OBJECT_TYPE_PEN:
+ case GDI_OBJECT_TYPE_EXTPEN:
+ hOldObj = pDc_Attr->hpen;
+ pDc_Attr->ulDirty_ |= DC_PEN_DIRTY;
+ pDc_Attr->hpen = hGdiObj;
+ return hOldObj;
+// return NtGdiSelectPen(hDC, hGdiObj);
+
+ case GDI_OBJECT_TYPE_FONT:
+ hOldObj = pDc_Attr->hlfntNew;
+ if (hOldObj == hGdiObj) return hOldObj;
++
+ pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
+ pDc_Attr->ulDirty_ |= DIRTY_CHARSET;
+ pDc_Attr->hlfntNew = hGdiObj;
- PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] +
- pTeb->GdiTebBatch.Offset);
- pgO->gbHdr.Cmd = GdiBCSelObj;
- pgO->gbHdr.Size = sizeof(GDIBSOBJECT);
- pgO->hgdiobj = hGdiObj;
-
- pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
- pTeb->GdiTebBatch.HDC = hDC;
- pTeb->GdiBatchCount++;
- if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
- return hOldObj;
++
++ if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION))
+ {
++ PGDIBSOBJECT pgO;
++
++ pgO = GdiAllocBatchCommand(hDC, GdiBCSelObj);
++ if (pgO)
++ {
++ pgO->hgdiobj = hGdiObj;
++ return hOldObj;
++ }
+ }
++
+ // default for select object font
+ return NtGdiSelectFont(hDC, hGdiObj);
+
+#if 0
+ case GDI_OBJECT_TYPE_METADC:
+ return MFDRV_SelectObject( hDC, hGdiObj);
+ case GDI_OBJECT_TYPE_EMF:
+ PLDC pLDC = GdiGetLDC(hDC);
+ if ( !pLDC ) return NULL;
+ return EMFDRV_SelectObject( hDC, hGdiObj);
+#endif
+ case GDI_OBJECT_TYPE_COLORSPACE:
+ SetColorSpace(hDC, (HCOLORSPACE) hGdiObj);
+ return NULL;
+
+ case GDI_OBJECT_TYPE_PALETTE:
+ default:
+ SetLastError(ERROR_INVALID_FUNCTION);
+ return NULL;
+ }
+
+ return NULL;
+}
--- /dev/null
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
+<module name="win32csr" type="win32dll" installbase="system32" installname="win32csr.dll">
+ <importlibrary definition="win32csr.spec" />
+ <include base="win32csr">.</include>
+ <include base="csrss">include</include>
+ <include base="ReactOS">include/reactos/subsys</include>
+ <include base="ReactOS">include/reactos/drivers</include>
+ <include base="console">.</include>
+ <compilerflag compilerset="gcc">-fms-extensions</compilerflag>
+ <library>ntdll</library>
+ <library delayimport="true">user32</library>
+ <library delayimport="true">gdi32</library>
+ <library delayimport="true">advapi32</library>
+ <library>delayimp</library>
+ <library>win32ksys</library>
+ <library>psapi</library>
++ <library>pseh</library>
+ <pch>w32csr.h</pch>
+ <file>alias.c</file>
+ <file>conio.c</file>
+ <file>desktopbg.c</file>
+ <file>dllmain.c</file>
+ <file>exitros.c</file>
+ <file>guiconsole.c</file>
++ <file>harderror.c</file>
+ <file>tuiconsole.c</file>
+ <file>appswitch.c</file>
+ <file>win32csr.rc</file>
+</module>
--- /dev/null
- #include <w32k.h>
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * PURPOSE: GDI alpha blending functions
+ * FILE: subsystems/win32/win32k/eng/alphablend.c
+ * PROGRAMER: Jason Filby
+ */
+
++#include <win32k.h>
+
+#define NDEBUG
+#include <debug.h>
+
+
+/*
+ * @implemented
+ */
+BOOL
+APIENTRY
+EngAlphaBlend(IN SURFOBJ *psoDest,
+ IN SURFOBJ *psoSource,
+ IN CLIPOBJ *ClipRegion,
+ IN XLATEOBJ *ColorTranslation,
+ IN PRECTL DestRect,
+ IN PRECTL SourceRect,
+ IN BLENDOBJ *BlendObj)
+{
+ RECTL SourceStretchedRect;
+ SIZEL SourceStretchedSize;
+ HBITMAP SourceStretchedBitmap = 0;
+ SURFOBJ* SourceStretchedObj = NULL;
+ RECTL InputRect;
+ RECTL OutputRect;
+ RECTL ClipRect;
+ RECTL CombinedRect;
+ RECTL Rect;
+ POINTL Translate;
+ INTENG_ENTER_LEAVE EnterLeaveSource;
+ INTENG_ENTER_LEAVE EnterLeaveDest;
+ SURFOBJ* InputObj;
+ SURFOBJ* OutputObj;
+ LONG Width;
+ LONG ClippingType;
+ RECT_ENUM RectEnum;
+ BOOL EnumMore;
+ INT i;
+ BOOLEAN Ret;
+
+ DPRINT("EngAlphaBlend(psoDest:0x%p, psoSource:0x%p, ClipRegion:0x%p, ColorTranslation:0x%p,\n", psoDest, psoSource, ClipRegion, ColorTranslation);
+ DPRINT(" DestRect:{0x%x, 0x%x, 0x%x, 0x%x}, SourceRect:{0x%x, 0x%x, 0x%x, 0x%x},\n",
+ DestRect->left, DestRect->top, DestRect->right, DestRect->bottom,
+ SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom);
+ DPRINT(" BlendObj:{0x%x, 0x%x, 0x%x, 0x%x}\n", BlendObj->BlendFunction.BlendOp,
+ BlendObj->BlendFunction.BlendFlags, BlendObj->BlendFunction.SourceConstantAlpha,
+ BlendObj->BlendFunction.AlphaFormat);
+
+ /* Validate output */
+ OutputRect = *DestRect;
+ if (OutputRect.right < OutputRect.left)
+ {
+ OutputRect.left = DestRect->right;
+ OutputRect.right = DestRect->left;
+ }
+ if (OutputRect.bottom < OutputRect.top)
+ {
+ OutputRect.left = DestRect->right;
+ OutputRect.right = DestRect->left;
+ }
+
+ /* Validate input */
+ InputRect = *SourceRect;
+ if ( (InputRect.top < 0) || (InputRect.bottom < 0) ||
+ (InputRect.left < 0) || (InputRect.right < 0) ||
+ InputRect.right > psoSource->sizlBitmap.cx ||
+ InputRect.bottom > psoSource->sizlBitmap.cy )
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ if (psoDest == psoSource &&
+ !(OutputRect.left >= SourceRect->right || InputRect.left >= OutputRect.right ||
+ OutputRect.top >= SourceRect->bottom || InputRect.top >= OutputRect.bottom))
+ {
+ DPRINT1("Source and destination rectangles overlap!\n");
+ return FALSE;
+ }
+
+ if (BlendObj->BlendFunction.BlendOp != AC_SRC_OVER)
+ {
+ DPRINT1("BlendOp != AC_SRC_OVER (0x%x)\n", BlendObj->BlendFunction.BlendOp);
+ return FALSE;
+ }
+ if (BlendObj->BlendFunction.BlendFlags != 0)
+ {
+ DPRINT1("BlendFlags != 0 (0x%x)\n", BlendObj->BlendFunction.BlendFlags);
+ return FALSE;
+ }
+ if ((BlendObj->BlendFunction.AlphaFormat & ~AC_SRC_ALPHA) != 0)
+ {
+ DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendObj->BlendFunction.AlphaFormat);
+ return FALSE;
+ }
+
+ /* Check if there is anything to draw */
+ if (ClipRegion != NULL &&
+ (ClipRegion->rclBounds.left >= ClipRegion->rclBounds.right ||
+ ClipRegion->rclBounds.top >= ClipRegion->rclBounds.bottom))
+ {
+ /* Nothing to do */
+ return TRUE;
+ }
+
+ /* Stretch source if needed */
+ if (OutputRect.right - OutputRect.left != InputRect.right - InputRect.left ||
+ OutputRect.bottom - OutputRect.top != InputRect.bottom - InputRect.top)
+ {
+ SourceStretchedSize.cx = OutputRect.right - OutputRect.left;
+ SourceStretchedSize.cy = OutputRect.bottom - OutputRect.top;
+ Width = DIB_GetDIBWidthBytes(SourceStretchedSize.cx, BitsPerFormat(psoSource->iBitmapFormat));
+ /* FIXME: Maybe it is a good idea to use EngCreateDeviceBitmap and IntEngStretchBlt
+ if possible to get a HW accelerated stretch. */
+ SourceStretchedBitmap = EngCreateBitmap(SourceStretchedSize, Width, psoSource->iBitmapFormat,
+ BMF_TOPDOWN | BMF_NOZEROINIT, NULL);
+ if (SourceStretchedBitmap == 0)
+ {
+ DPRINT1("EngCreateBitmap failed!\n");
+ return FALSE;
+ }
+ SourceStretchedObj = EngLockSurface((HSURF)SourceStretchedBitmap);
+ if (SourceStretchedObj == NULL)
+ {
+ DPRINT1("EngLockSurface failed!\n");
+ EngDeleteSurface((HSURF)SourceStretchedBitmap);
+ return FALSE;
+ }
+
+ SourceStretchedRect.left = 0;
+ SourceStretchedRect.right = SourceStretchedSize.cx;
+ SourceStretchedRect.top = 0;
+ SourceStretchedRect.bottom = SourceStretchedSize.cy;
+ if (!IntEngStretchBlt(SourceStretchedObj, psoSource, NULL, NULL, NULL,
+ &SourceStretchedRect, SourceRect,
+ NULL, NULL, NULL, ROP3_TO_ROP4(SRCCOPY)))
+ {
+ DPRINT1("EngStretchBlt failed!\n");
+ EngFreeMem(SourceStretchedObj->pvBits);
+ EngUnlockSurface(SourceStretchedObj);
+ EngDeleteSurface((HSURF)SourceStretchedBitmap);
+ return FALSE;
+ }
+ InputRect.top = SourceStretchedRect.top;
+ InputRect.bottom = SourceStretchedRect.bottom;
+ InputRect.left = SourceStretchedRect.left;
+ InputRect.right = SourceStretchedRect.right;
+ psoSource = SourceStretchedObj;
+ }
+
+ /* Now call the DIB function */
+ if (!IntEngEnter(&EnterLeaveSource, psoSource, &InputRect, TRUE, &Translate, &InputObj))
+ {
+ if (SourceStretchedObj != NULL)
+ {
+ EngFreeMem(SourceStretchedObj->pvBits);
+ EngUnlockSurface(SourceStretchedObj);
+ }
+ if (SourceStretchedBitmap != 0)
+ {
+ EngDeleteSurface((HSURF)SourceStretchedBitmap);
+ }
+ return FALSE;
+ }
+ InputRect.left += Translate.x;
+ InputRect.right += Translate.x;
+ InputRect.top += Translate.y;
+ InputRect.bottom += Translate.y;
+
+ &nbs