From: Jérôme Gardou Date: Sat, 27 Mar 2010 20:19:56 +0000 (+0000) Subject: sync with trunk r46493 X-Git-Tag: backups/reactos-yarotows@57446~216 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=b6edb50eb1a2311af040aadeec7791efa270a72e;hp=-c sync with trunk r46493 svn path=/branches/reactos-yarotows/; revision=46494 --- b6edb50eb1a2311af040aadeec7791efa270a72e diff --combined ReactOS-amd64.rbuild index 9d299caafb8,0da944fd749..0da944fd749 --- a/ReactOS-amd64.rbuild +++ b/ReactOS-amd64.rbuild @@@ -42,6 -42,9 +42,9 @@@ -section-alignment=0x1000 --unique=.eh_frame -static + -fno-leading-underscore + -shared + --exclude-all-symbols diff --combined ReactOS-i386.rbuild index 44e3511c28a,5bfd52a6177..5bfd52a6177 --- a/ReactOS-i386.rbuild +++ b/ReactOS-i386.rbuild @@@ -28,6 -28,8 +28,8 @@@ -mpreferred-stack-boundary=2 -m32 --win32 -gstabs+ + -fno-set-stack-executable + -fno-optimize-sibling-calls -gstabs+ diff --combined base/applications/paint/rsrc.rc index 49b981acd2f,a1e776d6720..a1e776d6720 --- a/base/applications/paint/rsrc.rc +++ b/base/applications/paint/rsrc.rc @@@ -42,4 -42,9 +42,9 @@@ // THIS WILL MAKE THE PROGRAM USE THE COMMON CONTROLS // LIBRARY VERSION 6.0 (IF IT IS AVAILABLE) // + #ifdef _AMD64_ + 1 24 "paint.exe.amd64.manifest" + #elif _X86_ 1 24 "paint.exe.manifest" + #endif + diff --combined base/applications/rapps/rapps/firefox3.txt index 072eee6407b,e6051802e00..e6051802e00 --- a/base/applications/rapps/rapps/firefox3.txt +++ b/base/applications/rapps/rapps/firefox3.txt @@@ -2,10 -2,10 +2,10 @@@ [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.18.exe @@@ -13,7 -13,7 +13,7 @@@ CDPath = non [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.18.exe diff --combined base/applications/rapps/rapps/mirandaim.txt index 5b817e16f37,0fff6a4ea04..0fff6a4ea04 --- a/base/applications/rapps/rapps/mirandaim.txt +++ b/base/applications/rapps/rapps/mirandaim.txt @@@ -2,13 -2,13 +2,13 @@@ [Section] Name = Miranda IM - Version = 0.8.13 + 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.13-unicode.exe + URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.18-unicode.exe CDPath = none [Section.0407] diff --combined base/applications/rapps/rapps/openttd.txt index 6220e8ada93,dfc94a95e43..dfc94a95e43 --- a/base/applications/rapps/rapps/openttd.txt +++ b/base/applications/rapps/rapps/openttd.txt @@@ -2,13 -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] diff --combined base/applications/rapps/rapps/opera.txt index 148e79bc9e4,44e49cc61ac..44e49cc61ac --- a/base/applications/rapps/rapps/opera.txt +++ b/base/applications/rapps/rapps/opera.txt @@@ -2,13 -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] diff --combined base/applications/rapps/rapps/sambatng.txt index 4377863c7ac,6cf579a9372..6cf579a9372 --- a/base/applications/rapps/rapps/sambatng.txt +++ b/base/applications/rapps/rapps/sambatng.txt @@@ -2,10 -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 diff --combined base/applications/rapps/rapps/seamonkey.txt index 69a43d51e90,9c980d30b65..9c980d30b65 --- a/base/applications/rapps/rapps/seamonkey.txt +++ b/base/applications/rapps/rapps/seamonkey.txt @@@ -2,31 -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 diff --combined base/applications/rapps/rapps/smplayer.txt index b3071703a1e,a2e47d3acff..a2e47d3acff --- a/base/applications/rapps/rapps/smplayer.txt +++ b/base/applications/rapps/rapps/smplayer.txt @@@ -2,13 -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] diff --combined base/applications/rapps/rapps/thunderbird.txt index ca8fd86bdf9,9f0cd328d89..9f0cd328d89 --- a/base/applications/rapps/rapps/thunderbird.txt +++ b/base/applications/rapps/rapps/thunderbird.txt @@@ -2,35 -2,35 +2,35 @@@ [Section] Name = Mozilla Thunderbird - Version = 3.0.1 + Version = 3.0.3 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Mail Clients out there. Size = 8.6M Category = 5 URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ - URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/en-US/Thunderbird%20Setup%203.0.1.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/3.0.1/win32/de/Thunderbird%20Setup%203.0.1.exe + URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/de/Thunderbird%20Setup%203.0.3.exe [Section.040a] Description = El más popular y uno de los mejores clientes mail que hay. Size = 8.4M URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ - URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/es-ES/Thunderbird%20Setup%203.0.1.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/3.0.1/win32/pl/Thunderbird%20Setup%203.0.1.exe + URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/pl/Thunderbird%20Setup%203.0.3.exe [Section.0419] Description = Один из самых популярных и лучших бесплатных почтовых клиентов. Size = 8.8M URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ - URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/ru/Thunderbird%20Setup%203.0.1.exe + URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/ru/Thunderbird%20Setup%203.0.3.exe diff --combined base/applications/sndrec32/audio_wavein.hpp index 0288ea6824e,7f9285b6b65..7f9285b6b65 --- a/base/applications/sndrec32/audio_wavein.hpp +++ b/base/applications/sndrec32/audio_wavein.hpp @@@ -305,7 -305,7 +305,7 @@@ class audio_wavei if ( aud_info.bits() == 16 ) svalue = ( unsigned int ) abs( *(( short * ) (main_buffer + aud_info.bytes_in_samples( nsamp )))); else if ( aud_info.bits() == 8 ) - svalue = (unsigned int)(( unsigned char * ) *(main_buffer + aud_info.bytes_in_samples( nsamp ))); + svalue = (unsigned int)(( ptrdiff_t ) *(main_buffer + aud_info.bytes_in_samples( nsamp ))); else svalue = 0; diff --combined base/applications/sndrec32/audio_waveout.hpp index a36518dc3f3,0e22afdad7e..0e22afdad7e --- a/base/applications/sndrec32/audio_waveout.hpp +++ b/base/applications/sndrec32/audio_waveout.hpp @@@ -229,7 -229,7 +229,7 @@@ class audio_waveou if ( aud_info.bits() == 16 ) svalue = ( unsigned int ) abs( *(( short * ) (main_buffer + aud_info.bytes_in_samples( nsamp )))); else if ( aud_info.bits() == 8 ) - svalue = (unsigned int)(( unsigned char * ) *(main_buffer + aud_info.bytes_in_samples( nsamp ))); + svalue = (unsigned int)(( ptrdiff_t ) *(main_buffer + aud_info.bytes_in_samples( nsamp ))); else svalue = 0; diff --combined base/setup/usetup/partlist.c index ca0bdf7ae6a,5c553c2f537..5c553c2f537 --- a/base/setup/usetup/partlist.c +++ b/base/setup/usetup/partlist.c @@@ -846,10 -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 * diff --combined base/shell/cmd/cmd.c index 233cffa8931,59f00eada0a..59f00eada0a --- a/base/shell/cmd/cmd.c +++ b/base/shell/cmd/cmd.c @@@ -244,7 -244,7 +244,7 @@@ static BOOL IsConsoleProcess(HANDLE Pro return TRUE; } - return IMAGE_SUBSYSTEM_WINDOWS_CUI == ProcessPeb.ImageSubSystem; + return IMAGE_SUBSYSTEM_WINDOWS_CUI == ProcessPeb.ImageSubsystem; } diff --combined baseaddress.rbuild index cacc80f77f3,80401c1db46..80401c1db46 --- a/baseaddress.rbuild +++ b/baseaddress.rbuild @@@ -118,6 -118,7 +118,7 @@@ + diff --combined boot/bootdata/bootcd/bootcd.rbuild index 0cadb1b56a9,471a7f4863e..471a7f4863e --- a/boot/bootdata/bootcd/bootcd.rbuild +++ b/boot/bootdata/bootcd/bootcd.rbuild @@@ -1,5 -1,12 +1,12 @@@ - - isoboot - + + isoboot + + + + isoboot + + diff --combined boot/bootdata/livecd/livecd.rbuild index 9c95cc54d56,e92deca42ce..e92deca42ce --- a/boot/bootdata/livecd/livecd.rbuild +++ b/boot/bootdata/livecd/livecd.rbuild @@@ -1,5 -1,12 +1,12 @@@ - - isoboot - + + isoboot + + + + isoboot + + diff --combined boot/bootdata/packages/reactos.dff index 71f53defee6,00000000000..1a37bcc6c45 mode 100644,000000..100644 --- a/boot/bootdata/packages/reactos.dff +++ b/boot/bootdata/packages/reactos.dff @@@ -1,813 -1,0 +1,814 @@@ +; 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\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\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\cmbatt\cmbatt.sys 2 +drivers\battery\battc\battc.sys 2 + +drivers\bus\isapnp\isapnp.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\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\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 diff --combined boot/freeldr/freeldr/debug.c index 0de49f52320,4ab90966192..4ab90966192 --- a/boot/freeldr/freeldr/debug.c +++ b/boot/freeldr/freeldr/debug.c @@@ -351,7 -351,7 +351,7 @@@ KeBugCheckEx IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4) { - char Buffer[64]; + char Buffer[70]; sprintf(Buffer, "*** STOP: 0x%08lX (0x%08lX, 0x%08lX, 0x%08lX, 0x%08lX)", BugCheckCode, BugCheckParameter1, BugCheckParameter2, BugCheckParameter3, BugCheckParameter4); diff --combined dll/cpl/sysdm/general.c index 7c2eea6ff69,72b87de1154..72b87de1154 --- a/dll/cpl/sysdm/general.c +++ b/dll/cpl/sysdm/general.c @@@ -96,7 -96,16 +96,16 @@@ LRESULT CALLBACK RosImageProc(HWND hwnd // build new bitmap GetObject(pImgInfo->hBitmap, sizeof(BITMAP), &bitmap); dc = CreateCompatibleDC(GetDC(NULL)); + if (dc == NULL) + { + break; + } sdc = CreateCompatibleDC(dc); + if (sdc == NULL) + { + DeleteDC(dc); + break; + } ncm.cbSize = sizeof(NONCLIENTMETRICS); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0); diff --combined dll/cpl/usrmgr/lang/de-DE.rc index c8fa221989d,e3c7c31959c..e3c7c31959c --- a/dll/cpl/usrmgr/lang/de-DE.rc +++ b/dll/cpl/usrmgr/lang/de-DE.rc @@@ -46,9 -46,9 +46,9 @@@ BEGI 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 "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_GENERAL_FORCE_CHANGE,7,82,230,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 @@@ -106,7 -106,7 +106,7 @@@ EN IDD_CHANGE_PASSWORD DIALOGEX DISCARDABLE 0, 0, 267, 74 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT - CAPTION "Passwort ändern" + CAPTION "Passwort ändern" FONT 8, "MS Shell Dlg" BEGIN EDITTEXT IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL | ES_PASSWORD @@@ -126,16 -126,16 +126,16 @@@ BEGI 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 + 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 "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_NEW_FORCE_CHANGE,7,109,230,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 @@@ -179,9 -179,9 +179,9 @@@ BEGI END POPUP "" BEGIN - MENUITEM "Mitglied hinzufügen", IDM_GROUP_ADD_MEMBER, GRAYED + MENUITEM "Mitglied hinzufügen", IDM_GROUP_ADD_MEMBER, GRAYED MENUITEM SEPARATOR - MENUITEM "Löschen", IDM_GROUP_DELETE + MENUITEM "Löschen", IDM_GROUP_DELETE MENUITEM "Umbenennen", IDM_GROUP_RENAME MENUITEM SEPARATOR MENUITEM "Eigenschaften", IDM_GROUP_PROPERTIES @@@ -197,9 -197,9 +197,9 @@@ BEGI END POPUP "" BEGIN - MENUITEM "Passwort ändern", IDM_USER_CHANGE_PASSWORD + MENUITEM "Passwort ändern", IDM_USER_CHANGE_PASSWORD MENUITEM SEPARATOR - MENUITEM "Löschen", IDM_USER_DELETE + MENUITEM "Löschen", IDM_USER_DELETE MENUITEM "Umbenennen", IDM_USER_RENAME MENUITEM SEPARATOR MENUITEM "Eigenschaften", IDM_USER_PROPERTIES diff --combined dll/directx/bdaplgin/controlnode.cpp index 5cd98ccbdcb,40ec853ee3d..40ec853ee3d --- a/dll/directx/bdaplgin/controlnode.cpp +++ b/dll/directx/bdaplgin/controlnode.cpp @@@ -9,7 -9,9 +9,9 @@@ #include "precomp.h" + #ifndef _MSC_VER const GUID IID_IKsPropertySet = {0x31efac30, 0x515c, 0x11d0, {0xa9,0xaa, 0x00,0xaa,0x00,0x61,0xbe,0x93}}; + #endif class CControlNode : public IUnknown { @@@ -32,12 -34,12 +34,12 @@@ public return m_Ref; } - CControlNode(HANDLE hFile, ULONG NodeType, ULONG PinId) : m_Ref(0), m_hFile(hFile), m_NodeType(NodeType), m_PinId(PinId){}; + CControlNode(IKsPropertySet * pProperty, ULONG NodeType, ULONG PinId) : m_Ref(0), m_pKsProperty(pProperty), m_NodeType(NodeType), m_PinId(PinId){}; virtual ~CControlNode(){}; protected: LONG m_Ref; - HANDLE m_hFile; + IKsPropertySet * m_pKsProperty; ULONG m_NodeType; ULONG m_PinId; }; @@@ -58,19 -60,19 +60,19 @@@ CControlNode::QueryInterface } else if(IsEqualGUID(refiid, IID_IBDA_FrequencyFilter)) { - return CBDAFrequencyFilter_fnConstructor(m_hFile, m_NodeType, refiid, Output); + return CBDAFrequencyFilter_fnConstructor(m_pKsProperty, m_NodeType, refiid, Output); } else if(IsEqualGUID(refiid, IID_IBDA_SignalStatistics)) { - return CBDASignalStatistics_fnConstructor(m_hFile, m_NodeType, refiid, Output); + return CBDASignalStatistics_fnConstructor(m_pKsProperty, m_NodeType, refiid, Output); } else if(IsEqualGUID(refiid, IID_IBDA_LNBInfo)) { - return CBDALNBInfo_fnConstructor(m_hFile, m_NodeType, refiid, Output); + return CBDALNBInfo_fnConstructor(m_pKsProperty, m_NodeType, refiid, Output); } else if(IsEqualGUID(refiid, IID_IBDA_DigitalDemodulator)) { - return CBDADigitalDemodulator_fnConstructor(m_hFile, m_NodeType, refiid, Output); + return CBDADigitalDemodulator_fnConstructor(m_pKsProperty, m_NodeType, refiid, Output); } #ifdef BDAPLGIN_TRACE WCHAR Buffer[MAX_PATH]; @@@ -88,7 -90,6 +90,6 @@@ HRESULT WINAPI CControlNode_fnConstructor( - HANDLE hFile, IBaseFilter * pFilter, ULONG NodeType, ULONG PinId, @@@ -98,7 -99,7 +99,7 @@@ WCHAR Buffer[100]; HRESULT hr; IPin * pPin = NULL; - IKsObject * pObject = NULL; + IKsPropertySet * pProperty; // store pin id swprintf(Buffer, L"%u", PinId); @@@ -115,26 -116,21 +116,21 @@@ return hr; } - // query IKsObject interface - hr = pPin->QueryInterface(IID_IKsObject, (void**)&pObject); + // query for IKsPropertySet interface + hr = pPin->QueryInterface(IID_IKsPropertySet, (void**)&pProperty); + if (FAILED(hr)) + return hr; #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); + CControlNode * handler = new CControlNode(pProperty, NodeType, PinId); #ifdef BDAPLGIN_TRACE OutputDebugStringW(L"CControlNode_fnConstructor\n"); diff --combined dll/directx/bdaplgin/devicecontrol.cpp index 661eba547a0,5d0e50121d2..5d0e50121d2 --- a/dll/directx/bdaplgin/devicecontrol.cpp +++ b/dll/directx/bdaplgin/devicecontrol.cpp @@@ -9,20 -9,24 +9,24 @@@ #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}}; + + #ifndef _MSC_VER + const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}}; + 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}}; + const GUID IID_IBaseFilter = {0x56a86895, 0x0ad4, 0x11ce, {0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70}}; + const GUID IID_IAsyncReader = {0x56A868AA, 0x0AD4, 0x11CE, {0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}}; + const GUID IID_IAMOpenProgress = {0x8E1C39A1, 0xDE53, 0x11cf, {0xAA, 0x63, 0x00, 0x80, 0xC7, 0x44, 0x52, 0x8D}}; + const GUID IID_IBDA_Topology = {0x79B56888, 0x7FEA, 0x4690, {0xB4, 0x5D, 0x38, 0xFD, 0x3C, 0x78, 0x49, 0xBE}}; + const GUID IID_IBDA_NetworkProvider = {0xfd501041, 0x8ebe, 0x11ce, {0x81, 0x83, 0x00, 0xaa, 0x00, 0x57, 0x7d, 0xa2}}; + const GUID IID_IBDA_DeviceControl = {0xFD0A5AF3, 0xB41D, 0x11d2, {0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0}}; + + const GUID IID_IDistributorNotify = {0x56a868af, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}}; + + #endif class CBDADeviceControl : public IBDA_DeviceControl, public IBDA_Topology @@@ -468,15 -472,15 +472,15 @@@ CBDADeviceControl::GetControlNode(ULON 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); + WCHAR Buffer[200]; + swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx, BytesReturned %lu PinId %lu ulInputPinId %lu ulOutputPinId %lu ulNodeType %lu\n", hr, BytesReturned, PinId, ulInputPinId, ulOutputPinId, ulNodeType); OutputDebugStringW(Buffer); #endif if (FAILED(hr)) return hr; - hr = CControlNode_fnConstructor(m_Handle, m_pFilter, ulNodeType, PinId, IID_IUnknown, (LPVOID*)ppControlNode); + hr = CControlNode_fnConstructor(m_pFilter, ulNodeType, PinId, IID_IUnknown, (LPVOID*)ppControlNode); #ifdef BDAPLGIN_TRACE swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx\n", hr); diff --combined dll/directx/bdaplgin/digitaldemo.cpp index 2d1b7ed62d6,311ddeeb47b..311ddeeb47b --- a/dll/directx/bdaplgin/digitaldemo.cpp +++ b/dll/directx/bdaplgin/digitaldemo.cpp @@@ -9,8 -9,10 +9,10 @@@ #include "precomp.h" + #ifndef _MSC_VER 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}}; + #endif class CBDADigitalDemodulator : public IBDA_DigitalDemodulator { @@@ -48,12 -50,12 +50,12 @@@ public 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(IKsPropertySet * pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){}; ~CBDADigitalDemodulator(){}; protected: LONG m_Ref; - HANDLE m_hFile; + IKsPropertySet * m_pProperty; ULONG m_NodeId; }; @@@ -86,6 -88,7 +88,7 @@@ CBDADigitalDemodulator::QueryInterface swprintf(Buffer, L"CBDADigitalDemodulator::QueryInterface: NoInterface for %s", lpstr); OutputDebugStringW(Buffer); CoTaskMemFree(lpstr); + DebugBreak(); #endif return E_NOINTERFACE; @@@ -98,20 -101,17 +101,17 @@@ CBDADigitalDemodulator::put_ModulationT 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pModulationType, sizeof(ModulationType), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_MODULATION_TYPE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pModulationType, sizeof(ModulationType)); + #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDADigitalDemodulator::put_ModulationType: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + swprintf(Buffer, L"CBDADigitalDemodulator::put_ModulationType: pModulationType %lu hr %lx\n", *pModulationType, hr); OutputDebugStringW(Buffer); #endif @@@ -131,20 -131,18 +131,18 @@@ CBDADigitalDemodulator::put_InnerFECMet { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_INNER_FEC_TYPE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECMethod, sizeof(FECMethod)); + #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECMethod: pFECMethod %lu hr %lx\n", *pFECMethod, hr); OutputDebugStringW(Buffer); #endif @@@ -165,20 -163,16 +163,16 @@@ CBDADigitalDemodulator::put_InnerFECRat 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_INNER_FEC_RATE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECRate, sizeof(BinaryConvolutionCodeRate)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECRate: pFECRate %lu hr %lx\n", *pFECRate, hr); OutputDebugStringW(Buffer); #endif @@@ -198,20 -192,17 +192,17 @@@ CBDADigitalDemodulator::put_OuterFECMet { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_OUTER_FEC_TYPE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECMethod, sizeof(FECMethod)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECMethod: pFECMethod %lu hr %lx\n", *pFECMethod, hr); OutputDebugStringW(Buffer); #endif @@@ -232,20 -223,16 +223,16 @@@ CBDADigitalDemodulator::put_OuterFECRat 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_OUTER_FEC_RATE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECRate, sizeof(BinaryConvolutionCodeRate)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECRate: pFECRate %lu hr %lx\n", *pFECRate, hr); OutputDebugStringW(Buffer); #endif @@@ -265,20 -252,17 +252,17 @@@ CBDADigitalDemodulator::put_SymbolRate( { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSymbolRate, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_SYMBOL_RATE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pSymbolRate, sizeof(ULONG)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDADigitalDemodulator::put_SymbolRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + swprintf(Buffer, L"CBDADigitalDemodulator::put_SymbolRate: pSymbolRate %lu hr %lx\n", *pSymbolRate, hr); OutputDebugStringW(Buffer); #endif @@@ -298,20 -282,17 +282,17 @@@ CBDADigitalDemodulator::put_SpectralInv { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSpectralInversion, sizeof(SpectralInversion), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_SPECTRAL_INVERSION, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pSpectralInversion, sizeof(SpectralInversion)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDADigitalDemodulator::put_SpectralInversion: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + swprintf(Buffer, L"CBDADigitalDemodulator::put_SpectralInversion: pSpectralInversion %lu hr %lx\n", *pSpectralInversion, hr); OutputDebugStringW(Buffer); #endif @@@ -329,13 -310,13 +310,13 @@@ CBDADigitalDemodulator::get_SpectralInv HRESULT WINAPI CBDADigitalDemodulator_fnConstructor( - HANDLE hFile, + IKsPropertySet * pProperty, ULONG NodeId, REFIID riid, LPVOID * ppv) { // construct device control - CBDADigitalDemodulator * handler = new CBDADigitalDemodulator(hFile, NodeId); + CBDADigitalDemodulator * handler = new CBDADigitalDemodulator(pProperty, NodeId); #ifdef BDAPLGIN_TRACE OutputDebugStringW(L"CBDADigitalDemodulator_fnConstructor\n"); diff --combined dll/directx/bdaplgin/frequencyfilter.cpp index 90d1e6a24fa,ca3bc46282f..ca3bc46282f --- a/dll/directx/bdaplgin/frequencyfilter.cpp +++ b/dll/directx/bdaplgin/frequencyfilter.cpp @@@ -9,8 -9,10 +9,10 @@@ #include "precomp.h" + #ifndef _MSC_VER 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}}; + #endif class CBDAFrequencyFilter : public IBDA_FrequencyFilter { @@@ -46,12 -48,12 +48,12 @@@ public 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){}; + CBDAFrequencyFilter(IKsPropertySet * pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){}; virtual ~CBDAFrequencyFilter(){}; protected: LONG m_Ref; - HANDLE m_hFile; + IKsPropertySet * m_pProperty; ULONG m_NodeId; }; @@@ -84,6 -86,7 +86,7 @@@ CBDAFrequencyFilter::QueryInterface swprintf(Buffer, L"CControlNode::QueryInterface: NoInterface for %s", lpstr); OutputDebugStringW(Buffer); CoTaskMemFree(lpstr); + DebugBreak(); #endif return E_NOINTERFACE; @@@ -110,20 -113,16 +113,16 @@@ CBDAFrequencyFilter::put_Frequency(ULON 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulFrequency, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_FREQUENCY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulFrequency, sizeof(ULONG)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDAFrequencyFilter::put_Frequency: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + swprintf(Buffer, L"CBDAFrequencyFilter::put_Frequency: m_NodeId %lu ulFrequency %lu hr %lx\n", m_NodeId, ulFrequency, hr); OutputDebugStringW(Buffer); #endif @@@ -143,20 -142,17 +142,17 @@@ CBDAFrequencyFilter::put_Polarity(Polar { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Polarity, sizeof(Polarisation), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_POLARITY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &Polarity, sizeof(Polarisation)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu Polarity %lu hr %lx\n", m_NodeId, Polarity, hr); OutputDebugStringW(Buffer); #endif @@@ -176,20 -172,17 +172,17 @@@ CBDAFrequencyFilter::put_Range(ULONG ul { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulRange, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_RANGE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulRange, sizeof(ULONG)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + swprintf(Buffer, L"CBDAFrequencyFilter::put_Range: m_NodeId %lu ulRange %lu hr %lx\n", m_NodeId, ulRange, hr); OutputDebugStringW(Buffer); #endif @@@ -209,20 -202,17 +202,17 @@@ CBDAFrequencyFilter::put_Bandwidth(ULON { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulBandwidth, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_BANDWIDTH, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulBandwidth, sizeof(ULONG)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDAFrequencyFilter::put_Bandwidth: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + swprintf(Buffer, L"CBDAFrequencyFilter::put_Bandwidth: m_NodeId %lu ulBandwidth %lu hr %lx\n", m_NodeId, ulBandwidth, hr); OutputDebugStringW(Buffer); #endif @@@ -241,20 -231,17 +231,17 @@@ CBDAFrequencyFilter::put_FrequencyMulti { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulMultiplier, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulMultiplier, sizeof(ULONG)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDAFrequencyFilter::put_FrequencyMultiplier: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + swprintf(Buffer, L"CBDAFrequencyFilter::put_FrequencyMultiplier: m_NodeId %lu ulMultiplier %lu hr %lx\n", m_NodeId, ulMultiplier, hr); OutputDebugStringW(Buffer); #endif @@@ -271,13 -258,13 +258,13 @@@ CBDAFrequencyFilter::get_FrequencyMulti HRESULT WINAPI CBDAFrequencyFilter_fnConstructor( - HANDLE hFile, + IKsPropertySet* pProperty, ULONG NodeId, REFIID riid, LPVOID * ppv) { // construct device control - CBDAFrequencyFilter * handler = new CBDAFrequencyFilter(hFile, NodeId); + CBDAFrequencyFilter * handler = new CBDAFrequencyFilter(pProperty, NodeId); #ifdef BDAPLGIN_TRACE OutputDebugStringW(L"CBDAFrequencyFilter_fnConstructor\n"); diff --combined dll/directx/bdaplgin/lnbinfo.cpp index a6638839289,689443d43cd..689443d43cd --- a/dll/directx/bdaplgin/lnbinfo.cpp +++ b/dll/directx/bdaplgin/lnbinfo.cpp @@@ -9,8 -9,10 +9,10 @@@ #include "precomp.h" + #ifndef _MSC_VER 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}}; + #endif class CBDALNBInfo : public IBDA_LNBInfo { @@@ -41,12 -43,12 +43,12 @@@ public 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(IKsPropertySet *pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){}; ~CBDALNBInfo(){}; protected: LONG m_Ref; - HANDLE m_hFile; + IKsPropertySet * m_pProperty; ULONG m_NodeId; }; @@@ -90,20 -92,17 +92,17 @@@ CBDALNBInfo::put_LocalOscilatorFrequenc { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFLow, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaLNBInfo, KSPROPERTY_BDA_LNB_LOF_LOW_BAND, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulLOFLow, sizeof(LONG)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyLowBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyLowBand: m_NodeId %lu ulLOFLow %lu hr %lx\n", m_NodeId, ulLOFLow, hr); OutputDebugStringW(Buffer); #endif @@@ -123,20 -122,17 +122,17 @@@ CBDALNBInfo::put_LocalOscilatorFrequenc { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFHigh, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaLNBInfo, KSPROPERTY_BDA_LNB_LOF_HIGH_BAND, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulLOFHigh, sizeof(ULONG)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyHighBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyHighBand: m_NodeId %lu ulLOFHigh %lu hr %lx\n", m_NodeId, ulLOFHigh, hr); OutputDebugStringW(Buffer); #endif @@@ -156,20 -152,17 +152,17 @@@ CBDALNBInfo::put_HighLowSwitchFrequency { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulSwitchFrequency, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaLNBInfo, KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulSwitchFrequency, sizeof(ULONG)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDALNBInfo::put_HighLowSwitchFrequency: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + swprintf(Buffer, L"CBDALNBInfo::put_HighLowSwitchFrequency: m_NodeId %lu ulSwitchFrequency %lu hr %lx\n", m_NodeId, ulSwitchFrequency, hr); OutputDebugStringW(Buffer); #endif @@@ -186,13 -179,13 +179,13 @@@ CBDALNBInfo::get_HighLowSwitchFrequency HRESULT WINAPI CBDALNBInfo_fnConstructor( - HANDLE hFile, + IKsPropertySet *pProperty, ULONG NodeId, REFIID riid, LPVOID * ppv) { // construct device control - CBDALNBInfo * handler = new CBDALNBInfo(hFile, NodeId); + CBDALNBInfo * handler = new CBDALNBInfo(pProperty, NodeId); #ifdef BDAPLGIN_TRACE OutputDebugStringW(L"CBDALNBInfo_fnConstructor\n"); diff --combined dll/directx/bdaplgin/pincontrol.cpp index a5b99128b16,4420b76e16b..4420b76e16b --- a/dll/directx/bdaplgin/pincontrol.cpp +++ b/dll/directx/bdaplgin/pincontrol.cpp @@@ -9,9 -9,12 +9,12 @@@ #include "precomp.h" - const GUID IID_IBDA_PinControl = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}}; + #ifndef _MSC_VER const GUID KSPROPSETID_BdaPinControl = {0x0ded49d5, 0xa8b7, 0x4d5d, {0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d}}; + const GUID IID_IBDA_PinControl = {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}}; + #endif + class CBDAPinControl : public IBDA_PinControl { @@@ -39,7 -42,7 +42,7 @@@ public 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){}; + CBDAPinControl(HANDLE hFile, IBDA_NetworkProvider * pProvider, IPin * pConnectedPin, ULONG RegistrationCtx) : m_Ref(0), m_Handle(hFile), m_pProvider(pProvider), m_pConnectedPin(pConnectedPin), m_RegistrationCtx(RegistrationCtx){}; virtual ~CBDAPinControl() { //m_pConnectedPin->Release(); @@@ -51,6 -54,7 +54,7 @@@ protected HANDLE m_Handle; IBDA_NetworkProvider * m_pProvider; IPin * m_pConnectedPin; + ULONG m_RegistrationCtx; }; HRESULT @@@ -72,16 -76,7 +76,7 @@@ CBDAPinControl::QueryInterface reinterpret_cast(*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 - + DebugBreak(); return E_NOINTERFACE; } //------------------------------------------------------------------- @@@ -142,46 -137,124 +137,124 @@@ STDMETHODCALLTYP CBDAPinControl::RegistrationContext(ULONG *pulRegistrationCtx) { #ifdef BDAPLGIN_TRACE - OutputDebugStringW(L"CBDAPinControl::RegistrationContext: NotImplemented\n"); + OutputDebugStringW(L"CBDAPinControl::RegistrationContext\n"); #endif - return E_NOTIMPL; + if (!pulRegistrationCtx) + { + // invalid argument + return E_POINTER; + } + + if (m_RegistrationCtx) + { + // is registered + *pulRegistrationCtx = m_RegistrationCtx; + return NOERROR; + } + + //pin not registered + return E_FAIL; } + //------------------------------------------------------------------- HRESULT - WINAPI - CBDAPinControl_fnConstructor( + GetNetworkProviderFromGraph( + IFilterGraph * pGraph, + IBDA_NetworkProvider ** pOutNetworkProvider) + { + IEnumFilters *pEnumFilters = NULL; + IBaseFilter * ppFilter[1]; + IBDA_NetworkProvider * pNetworkProvider = NULL; + HRESULT hr; + + // get IEnumFilters interface + hr = pGraph->EnumFilters(&pEnumFilters); + + if (FAILED(hr)) + { + //clean up + *pOutNetworkProvider = NULL; + 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(); + + //store result + *pOutNetworkProvider = pNetworkProvider; + + if (pNetworkProvider) + return S_OK; + else + return E_FAIL; + } + + HRESULT + CBDAPinControl_RealConstructor( + HANDLE hPin, + IBDA_NetworkProvider *pNetworkProvider, + IPin * pConnectedPin, + ULONG RegistrationCtx, IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) { - IPin * pConnectedPin = NULL; - IBDA_NetworkProvider * pNetworkProvider = NULL; - HANDLE hFile = INVALID_HANDLE_VALUE; + CBDAPinControl * handler = new CBDAPinControl(hPin, pNetworkProvider, pConnectedPin, RegistrationCtx); - #if 0 - if (!IsEqualGUID(riid, IID_IUnknown)) - { #ifdef BDAPLGIN_TRACE - OutputDebugStringW(L"CBDAPinControl_fnConstructor: Expected IUnknown\n"); + OutputDebugStringW(L"CBDAPinControl_fnConstructor\n"); #endif - return REGDB_E_CLASSNOTREG; + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; } + return NOERROR; + } + HRESULT + WINAPI + CBDAPinControl_fnConstructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) + { + IPin * pConnectedPin = NULL; + IBDA_NetworkProvider * pNetworkProvider = NULL; + HANDLE hFile = INVALID_HANDLE_VALUE; HRESULT hr; IKsObject * pObject = NULL; IPin * pPin = NULL; - IEnumFilters *pEnumFilters = NULL; - - IBaseFilter * ppFilter[1]; + IUnknown * pUnknown = NULL; PIN_INFO PinInfo; FILTER_INFO FilterInfo; - + ULONG RegistrationCtx = 0; if (!pUnkOuter) return E_POINTER; + OutputDebugStringW(L"CBDAPinControl_fnConstructor\n"); + //DebugBreak(); + // query for IKsObject interface hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject); @@@ -209,8 -282,15 +282,15 @@@ return hr; } + if (!PinInfo.pFilter) + { + //clean up + pObject->Release(); + pPin->Release(); + return hr; + } + // sanity checks - assert(PinInfo.dir == PINDIR_OUTPUT); assert(PinInfo.pFilter != NULL); // query filter info @@@ -219,57 -299,80 +299,80 @@@ // 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; - } + // get network provider interface + hr = GetNetworkProviderFromGraph(FilterInfo.pGraph, &pNetworkProvider); - while(pEnumFilters->Next(1, ppFilter, NULL) == S_OK) + if (SUCCEEDED(hr)) { - // 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; + if (PinInfo.dir == PINDIR_OUTPUT) + { + // get connected pin handle + hr = pPin->ConnectedTo(&pConnectedPin); + if (SUCCEEDED(hr)) + { + // get file handle + hFile = pObject->KsGetObjectHandle(); + if (hFile) + { + hr = CBDAPinControl_RealConstructor(hFile, pNetworkProvider, pConnectedPin, 0, pUnkOuter, riid, ppv); + if (SUCCEEDED(hr)) + { + // set to null to prevent releasing + pNetworkProvider = NULL; + pConnectedPin = NULL; + } + } + else + { + // expected file handle + hr = E_UNEXPECTED; + } + } + } + else + { + // get IUnknown from base filter + hr = PinInfo.pFilter->QueryInterface(IID_IUnknown, (void**)&pUnknown); + if (SUCCEEDED(hr)) + { + // register device filter + hr = pNetworkProvider->RegisterDeviceFilter(pUnknown, &RegistrationCtx); + if (SUCCEEDED(hr)) + { + // get file handle + hFile = pObject->KsGetObjectHandle(); + if (hFile) + { + hr = CBDAPinControl_RealConstructor(hFile, pNetworkProvider, NULL, RegistrationCtx, pUnkOuter, riid, ppv); + if (SUCCEEDED(hr)) + { + // set to null to prevent releasing + pNetworkProvider = NULL; + } + } + else + { + // expected file handle + hr = E_UNEXPECTED; + } + } + else + { + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDAPinControl_fnConstructor failed to register filter with %lx\n", hr); + OutputDebugStringW(Buffer); + DebugBreak(); + } + } + } } - // 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(); @@@ -277,30 -380,23 +380,23 @@@ pObject->Release(); - if (pNetworkProvider == NULL) + if (pNetworkProvider) { - // no network provider interface in graph - return E_NOINTERFACE; + // release network provider + pNetworkProvider->Release(); } - #endif - - CBDAPinControl * handler = new CBDAPinControl(hFile, pNetworkProvider, pConnectedPin); - #ifdef BDAPLGIN_TRACE - OutputDebugStringW(L"CBDAPinControl_fnConstructor"); - #endif - - DebugBreak(); - - if (!handler) - return E_OUTOFMEMORY; + if (pConnectedPin) + { + // release connected pin + pConnectedPin->Release(); + } - if (FAILED(handler->QueryInterface(riid, ppv))) + if (pUnknown) { - /* not supported */ - delete handler; - return E_NOINTERFACE; + // release filter + pUnknown->Release(); } - return NOERROR; + return hr; } diff --combined dll/directx/bdaplgin/precomp.h index 771a798f2c3,1bc98363329..1bc98363329 --- a/dll/directx/bdaplgin/precomp.h +++ b/dll/directx/bdaplgin/precomp.h @@@ -1,7 -1,7 +1,7 @@@ #ifndef PRECOMP_H__ #define PRECOMP_H__ - //#define BDAPLGIN_TRACE + #define BDAPLGIN_TRACE #define BUILDING_KS #define _KSDDK_ #include @@@ -9,6 -9,7 +9,7 @@@ #include #define __STREAMS__ #include + #include #include #include #include @@@ -55,7 -56,6 +56,6 @@@ CBDAPinControl_fnConstructor HRESULT WINAPI CControlNode_fnConstructor( - HANDLE hFile, IBaseFilter * pFilter, ULONG NodeType, ULONG PinId, @@@ -67,7 -67,7 +67,7 @@@ HRESULT WINAPI CBDAFrequencyFilter_fnConstructor( - HANDLE hFile, + IKsPropertySet * pProperty, ULONG NodeId, REFIID riid, LPVOID * ppv); @@@ -77,7 -77,7 +77,7 @@@ HRESULT WINAPI CBDASignalStatistics_fnConstructor( - HANDLE hFile, + IKsPropertySet * pProperty, ULONG NodeId, REFIID riid, LPVOID * ppv); @@@ -87,7 -87,7 +87,7 @@@ HRESULT WINAPI CBDALNBInfo_fnConstructor( - HANDLE hFile, + IKsPropertySet * pProperty, ULONG NodeId, REFIID riid, LPVOID * ppv); @@@ -96,9 -96,11 +96,11 @@@ HRESULT WINAPI CBDADigitalDemodulator_fnConstructor( - HANDLE hFile, + IKsPropertySet * pProperty, ULONG NodeId, REFIID riid, LPVOID * ppv); + extern const GUID IID_IKsObject; + #endif diff --combined dll/directx/bdaplgin/signalstatistics.cpp index ae6079e5b23,230ab8b34f4..230ab8b34f4 --- a/dll/directx/bdaplgin/signalstatistics.cpp +++ b/dll/directx/bdaplgin/signalstatistics.cpp @@@ -9,8 -9,10 +9,10 @@@ #include "precomp.h" + #ifndef _MSC_VER 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}}; + #endif class CBDASignalStatistics : public IBDA_SignalStatistics { @@@ -45,12 -47,12 +47,12 @@@ public 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(IKsPropertySet * pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){}; ~CBDASignalStatistics(){}; protected: LONG m_Ref; - HANDLE m_hFile; + IKsPropertySet * m_pProperty; ULONG m_NodeId; }; @@@ -75,7 -77,6 +77,6 @@@ CBDASignalStatistics::QueryInterface reinterpret_cast(*Output)->AddRef(); return NOERROR; } - return E_NOINTERFACE; } @@@ -95,13 -96,13 +96,13 @@@ CBDASignalStatistics::get_SignalStrengt 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; + Node.Reserved = 0; + + assert(m_pProperty); + + hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_STRENGTH, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), plDbStrength, sizeof(LONG), &BytesReturned); - // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plDbStrength, sizeof(LONG), &BytesReturned); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; @@@ -128,13 -129,11 +129,11 @@@ CBDASignalStatistics::get_SignalQuality 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plPercentQuality, sizeof(LONG), &BytesReturned); + hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_QUALITY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), plPercentQuality, sizeof(LONG), &BytesReturned); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; @@@ -162,13 -161,12 +161,12 @@@ CBDASignalStatistics::get_SignalPresent 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Present, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_PRESENT, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &Present, sizeof(ULONG), &BytesReturned); + // store result *pfPresent = Present; @@@ -198,13 -196,12 +196,12 @@@ CBDASignalStatistics::get_SignalLocked( 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Locked, sizeof(ULONG), &BytesReturned); + hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_LOCKED, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &Locked, sizeof(ULONG), &BytesReturned); + *pfLocked = Locked; #ifdef BDAPLGIN_TRACE @@@ -222,20 -219,17 +219,17 @@@ CBDASignalStatistics::put_SampleTime(LO { 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &lmsSampleTime, sizeof(LONG), &BytesReturned); + hr = m_pProperty->Set(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SAMPLE_TIME, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &lmsSampleTime, sizeof(LONG)); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; - swprintf(Buffer, L"CBDASignalStatistics::put_SampleTime: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + swprintf(Buffer, L"CBDASignalStatistics::put_SampleTime: m_NodeId %lu hr %lx\n", m_NodeId, hr); OutputDebugStringW(Buffer); #endif @@@ -251,13 -245,11 +245,11 @@@ CBDASignalStatistics::get_SampleTime(LO 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; + Node.Reserved = 0; // perform request - hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plmsSampleTime, sizeof(LONG), &BytesReturned); + hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SAMPLE_TIME, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), plmsSampleTime, sizeof(LONG), &BytesReturned); #ifdef BDAPLGIN_TRACE WCHAR Buffer[100]; @@@ -271,13 -263,13 +263,13 @@@ HRESULT WINAPI CBDASignalStatistics_fnConstructor( - HANDLE hFile, + IKsPropertySet * pProperty, ULONG NodeId, REFIID riid, LPVOID * ppv) { // construct device control - CBDASignalStatistics * handler = new CBDASignalStatistics(hFile, NodeId); + CBDASignalStatistics * handler = new CBDASignalStatistics(pProperty, NodeId); #ifdef BDAPLGIN_TRACE OutputDebugStringW(L"CBDASignalStatistics_fnConstructor\n"); diff --combined dll/directx/ksproxy/allocator.cpp index 2b5cd1ada15,e7c4b1f2436..e7c4b1f2436 --- a/dll/directx/ksproxy/allocator.cpp +++ b/dll/directx/ksproxy/allocator.cpp @@@ -15,6 -15,9 +15,9 @@@ class CKsAllocator : public IKsAllocato public IMemAllocatorCallbackTemp { public: + typedef std::stackMediaSampleStack; + typedef std::listMediaSampleList; + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); STDMETHODIMP_(ULONG) AddRef() @@@ -58,9 -61,9 +61,9 @@@ HRESULT STDMETHODCALLTYPE GetFreeCount(LONG *plBuffersFree); - CKsAllocator() : m_Ref(0), m_hAllocator(0), m_Mode(KsAllocatorMode_User), m_Notify(0), m_Allocated(0), m_FreeCount(0), m_cbBuffer(0), m_cBuffers(0), m_cbAlign(0), m_cbPrefix(0){} + CKsAllocator(); virtual ~CKsAllocator(){} - + VOID STDMETHODCALLTYPE FreeMediaSamples(); protected: LONG m_Ref; HANDLE m_hAllocator; @@@ -68,11 -71,16 +71,16 @@@ ALLOCATOR_PROPERTIES_EX m_Properties; IMemAllocatorNotifyCallbackTemp *m_Notify; ULONG m_Allocated; - ULONG m_FreeCount; - ULONG m_cbBuffer; - ULONG m_cBuffers; - ULONG m_cbAlign; - ULONG m_cbPrefix; + 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; }; @@@ -93,14 -101,33 +101,33 @@@ CKsAllocator::QueryInterface if (IsEqualGUID(refiid, IID_IMemAllocator) || IsEqualGUID(refiid, IID_IMemAllocatorCallbackTemp)) { - *Output = (IDistributorNotify*)(this); - reinterpret_cast(*Output)->AddRef(); + *Output = (IMemAllocatorCallbackTemp*)(this); + reinterpret_cast(*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 // @@@ -112,7 -139,11 +139,11 @@@ CKsAllocator::SetProperties { SYSTEM_INFO SystemInfo; - OutputDebugStringW(L"CKsAllocator::SetProperties Stub\n"); + EnterCriticalSection(&m_CriticalSection); + + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CKsAllocator::SetProperties\n"); + #endif if (!pRequest || !pActual) return E_POINTER; @@@ -126,18 -157,28 +157,28 @@@ if (!pRequest->cbAlign || (pRequest->cbAlign - 1) & SystemInfo.dwAllocationGranularity) { // bad alignment + LeaveCriticalSection(&m_CriticalSection); return VFW_E_BADALIGN; } if (m_Mode == KsAllocatorMode_Kernel) { - // u cannt change a kernel allocator + // u can't change a kernel allocator + LeaveCriticalSection(&m_CriticalSection); return VFW_E_ALREADY_COMMITTED; } - if (m_Allocated != m_FreeCount) + 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; } @@@ -146,6 -187,7 +187,7 @@@ pActual->cbPrefix = m_cbPrefix = pRequest->cbPrefix; pActual->cBuffers = m_cBuffers = pRequest->cBuffers; + LeaveCriticalSection(&m_CriticalSection); return NOERROR; } @@@ -169,28 -211,130 +211,130 @@@ HRESUL STDMETHODCALLTYPE CKsAllocator::Commit() { + LONG Index; + PUCHAR CurrentBuffer; + IMediaSample * Sample; + HRESULT hr; + + //TODO integer overflow checks + EnterCriticalSection(&m_CriticalSection); + + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CKsAllocator::Commit\n"); + #endif + if (m_Mode == KsAllocatorMode_Kernel) { /* no-op for kernel allocator */ + LeaveCriticalSection(&m_CriticalSection); return NOERROR; } - OutputDebugStringW(L"CKsAllocator::Commit NotImplemented\n"); - return E_NOTIMPL; + 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); + + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CKsAllocator::Decommit\n"); + #endif + if (m_Mode == KsAllocatorMode_Kernel) { /* no-op for kernel allocator */ - return NOERROR; + LeaveCriticalSection(&m_CriticalSection); + return NOERROR; } - OutputDebugStringW(L"CKsAllocator::Decommit NotImplemented\n"); - return E_NOTIMPL; + 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; } @@@ -202,8 -346,50 +346,50 @@@ CKsAllocator::GetBuffer REFERENCE_TIME *pEndTime, DWORD dwFlags) { - OutputDebugStringW(L"CKsAllocator::GetBuffer NotImplemented\n"); - return E_NOTIMPL; + IMediaSample * Sample = NULL; + + if (!m_Commited) + return VFW_E_NOT_COMMITTED; + + 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 @@@ -211,8 -397,36 +397,36 @@@ STDMETHODCALLTYP CKsAllocator::ReleaseBuffer( IMediaSample *pBuffer) { - OutputDebugStringW(L"CKsAllocator::ReleaseBuffer NotImplemented\n"); - return E_NOTIMPL; + EnterCriticalSection(&m_CriticalSection); + + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CKsAllocator::ReleaseBuffer\n"); + #endif + + // 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; } //------------------------------------------------------------------- @@@ -223,7 -437,11 +437,11 @@@ STDMETHODCALLTYP CKsAllocator::SetNotify( IMemAllocatorNotifyCallbackTemp *pNotify) { + EnterCriticalSection(&m_CriticalSection); + + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsAllocator::SetNotify\n"); + #endif if (pNotify) pNotify->AddRef(); @@@ -232,6 -450,8 +450,8 @@@ m_Notify->Release(); m_Notify = pNotify; + + LeaveCriticalSection(&m_CriticalSection); return NOERROR; } @@@ -240,8 -460,8 +460,8 @@@ STDMETHODCALLTYP CKsAllocator::GetFreeCount( LONG *plBuffersFree) { - OutputDebugStringW(L"CKsAllocator::GetFreeCount NotImplemented\n"); - return E_NOTIMPL; + *plBuffersFree = m_Allocated - m_FreeList.size(); + return S_OK; } //------------------------------------------------------------------- @@@ -313,7 -533,9 +533,9 @@@ CKsAllocator::KsCreateAllocatorAndGetHa KSALLOCATOR_FRAMING AllocatorFraming; HANDLE hPin; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsAllocator::KsCreateAllocatorAndGetHandle\n"); + #endif if (m_hAllocator) { @@@ -349,6 -571,32 +571,32 @@@ 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( @@@ -356,7 -604,9 +604,9 @@@ REFIID riid, LPVOID * ppv) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsAllocator_Constructor\n"); + #endif CKsAllocator * handler = new CKsAllocator(); diff --combined dll/directx/ksproxy/basicaudio.cpp index 7fec05f2140,04c53b345a0..04c53b345a0 --- a/dll/directx/ksproxy/basicaudio.cpp +++ b/dll/directx/ksproxy/basicaudio.cpp @@@ -97,7 -97,9 +97,9 @@@ HRESUL STDMETHODCALLTYPE CKsBasicAudio::Stop() { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -105,7 -107,10 +107,10 @@@ HRESUL STDMETHODCALLTYPE CKsBasicAudio::Pause() { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -114,7 -119,10 +119,10 @@@ STDMETHODCALLTYP CKsBasicAudio::Run( REFERENCE_TIME tStart) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -123,7 -131,9 +131,9 @@@ STDMETHODCALLTYP CKsBasicAudio::SetSyncSource( IReferenceClock *pClock) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -131,7 -141,10 +141,10 @@@ HRESUL STDMETHODCALLTYPE CKsBasicAudio::NotifyGraphChange() { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -144,7 -157,10 +157,10 @@@ STDMETHODCALLTYP CKsBasicAudio::GetTypeInfoCount( UINT *pctinfo) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -155,7 -171,9 +171,9 @@@ CKsBasicAudio::GetTypeInfo LCID lcid, ITypeInfo **ppTInfo) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -168,7 -186,10 +186,10 @@@ CKsBasicAudio::GetIDsOfNames LCID lcid, DISPID *rgDispId) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -184,7 -205,10 +205,10 @@@ CKsBasicAudio::Invoke EXCEPINFO *pExcepInfo, UINT *puArgErr) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -197,7 -221,10 +221,10 @@@ STDMETHODCALLTYP CKsBasicAudio::put_Volume( long lVolume) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -207,7 -234,10 +234,10 @@@ STDMETHODCALLTYP CKsBasicAudio::get_Volume( long *plVolume) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -217,7 -247,10 +247,10 @@@ STDMETHODCALLTYP CKsBasicAudio::put_Balance( long lBalance) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -227,7 -260,10 +260,10 @@@ STDMETHODCALLTYP CKsBasicAudio::get_Balance( long *plBalance) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif + return E_NOTIMPL; } @@@ -238,7 -274,9 +274,9 @@@ CKsBasicAudio_Constructor REFIID riid, LPVOID * ppv) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsBasicAudio_Constructor\n"); + #endif CKsBasicAudio * handler = new CKsBasicAudio(); diff --combined dll/directx/ksproxy/clockforward.cpp index 80bf00fe421,868633edf0e..868633edf0e --- a/dll/directx/ksproxy/clockforward.cpp +++ b/dll/directx/ksproxy/clockforward.cpp @@@ -12,6 -12,10 +12,10 @@@ const GUID KSCATEGORY_CLOCK = {0x53172480, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; #endif + const GUID IID_IKsClockForwarder = {0x877e4352, 0x6fea, 0x11d0, {0xb8, 0x63, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}}; + + DWORD WINAPI CKsClockForwarder_ThreadStartup(LPVOID lpParameter); + class CKsClockForwarder : public IDistributorNotify, public IKsObject { @@@ -45,14 -49,38 +49,38 @@@ public // IKsObject interface HANDLE STDMETHODCALLTYPE KsGetObjectHandle(); - CKsClockForwarder(HANDLE handle) : m_Ref(0), m_Handle(handle){} - virtual ~CKsClockForwarder(){ if (m_Handle) CloseHandle(m_Handle);} - + 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( @@@ -65,7 -93,8 +93,8 @@@ reinterpret_cast(*Output)->AddRef(); return NOERROR; } - if (IsEqualGUID(refiid, IID_IKsObject)) + if (IsEqualGUID(refiid, IID_IKsObject) || + IsEqualGUID(refiid, IID_IKsClockForwarder)) { *Output = (IKsObject*)(this); reinterpret_cast(*Output)->AddRef(); @@@ -79,15 -108,6 +108,6 @@@ return NOERROR; } - #if 0 - if (IsEqualGUID(refiid, IID_IKsClockForwarder)) - { - *Output = PVOID(this); - reinterpret_cast(*Output)->AddRef(); - return NOERROR; - } - #endif - return E_NOINTERFACE; } @@@ -100,16 -120,86 +120,86 @@@ HRESUL STDMETHODCALLTYPE CKsClockForwarder::Stop() { - OutputDebugString("UNIMPLEMENTED\n"); - return E_NOTIMPL; + #ifdef KSPROXY_TRACE + WCHAR Buffer[200]; + swprintf(Buffer, L"CKsClockForwarder::Stop m_ThreadStarted %u m_PendingStop %u m_hThread %p m_hEvent %p m_Handle %p\n", m_ThreadStarted, m_PendingStop, m_hThread, m_hEvent, m_Handle); + OutputDebugStringW(Buffer); + #endif + + m_Time = 0; + 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("UNIMPLEMENTED\n"); - return E_NOTIMPL; + #ifdef KSPROXY_TRACE + OutputDebugString("CKsClockForwarder::Pause\n"); + #endif + + 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 @@@ -117,8 -207,28 +207,28 @@@ STDMETHODCALLTYP CKsClockForwarder::Run( REFERENCE_TIME tStart) { - OutputDebugString("UNIMPLEMENTED\n"); - return E_NOTIMPL; + #ifdef KSPROXY_TRACE + OutputDebugString("CKsClockForwarder::Run\n"); + #endif + + 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 @@@ -126,16 -236,30 +236,30 @@@ STDMETHODCALLTYP CKsClockForwarder::SetSyncSource( IReferenceClock *pClock) { - OutputDebugString("UNIMPLEMENTED\n"); - return E_NOTIMPL; + #ifdef KSPROXY_TRACE + OutputDebugString("CKsClockForwarder::SetSyncSource\n"); + #endif + + if (pClock) + pClock->AddRef(); + + if (m_Clock) + m_Clock->Release(); + + + m_Clock = pClock; + return NOERROR; } HRESULT STDMETHODCALLTYPE CKsClockForwarder::NotifyGraphChange() { - OutputDebugString("UNIMPLEMENTED\n"); - return E_NOTIMPL; + #ifdef KSPROXY_TRACE + OutputDebugString("CKsClockForwarder::NotifyGraphChange\n"); + #endif + + return NOERROR; } //------------------------------------------------------------------- @@@ -149,6 -273,66 +273,66 @@@ 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; + + #ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsClockForwarder::SetClockState m_State %u State %u hr %lx\n", m_State, State, hr); + OutputDebugStringW(Buffer); + #endif + + 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( @@@ -159,14 -343,18 +343,18 @@@ HRESULT hr; HANDLE handle; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsClockForwarder_Constructor\n"); + #endif // open default clock hr = KsOpenDefaultDevice(KSCATEGORY_CLOCK, GENERIC_READ | GENERIC_WRITE, &handle); if (hr != NOERROR) { + #ifdef KSPROXY_TRACE OutputDebugString("CKsClockForwarder_Constructor failed to open device\n"); + #endif return hr; } diff --combined dll/directx/ksproxy/cvpconfig.cpp index 91d2006ad49,1333263e003..1333263e003 --- a/dll/directx/ksproxy/cvpconfig.cpp +++ b/dll/directx/ksproxy/cvpconfig.cpp @@@ -102,7 -102,9 +102,9 @@@ HRESUL STDMETHODCALLTYPE CVPConfig::Stop() { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -110,7 -112,9 +112,9 @@@ HRESUL STDMETHODCALLTYPE CVPConfig::Pause() { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -119,7 -123,9 +123,9 @@@ STDMETHODCALLTYP CVPConfig::Run( REFERENCE_TIME tStart) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -128,7 -134,9 +134,9 @@@ STDMETHODCALLTYP CVPConfig::SetSyncSource( IReferenceClock *pClock) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -136,7 -144,9 +144,9 @@@ HRESUL STDMETHODCALLTYPE CVPConfig::NotifyGraphChange() { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -149,7 -159,9 +159,9 @@@ CVPConfig::GetConnectInfo LPDWORD pdwNumConnectInfo, IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -158,7 -170,9 +170,9 @@@ STDMETHODCALLTYP CVPConfig::SetConnectInfo( DWORD dwChosenEntry) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -167,7 -181,9 +181,9 @@@ STDMETHODCALLTYP CVPConfig::GetVPDataInfo( LPAMVPDATAINFO pamvpDataInfo) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -177,7 -193,9 +193,9 @@@ CVPConfig::GetMaxPixelRate LPAMVPSIZE pamvpSize, OUT LPDWORD pdwMaxPixelsPerSecond) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -187,7 -205,9 +205,9 @@@ CVPConfig::InformVPInputFormats DWORD dwNumFormats, IN LPDDPIXELFORMAT pDDPixelFormats) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -197,7 -217,9 +217,9 @@@ CVPConfig::GetVideoFormats LPDWORD pdwNumFormats, IN OUT LPDDPIXELFORMAT pddPixelFormats) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -206,7 -228,9 +228,9 @@@ STDMETHODCALLTYP CVPConfig::SetVideoFormat( DWORD dwChosenEntry) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -214,7 -238,9 +238,9 @@@ HRESUL STDMETHODCALLTYPE CVPConfig::SetInvertPolarity() { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -223,7 -249,9 +249,9 @@@ STDMETHODCALLTYP CVPConfig::GetOverlaySurface( LPDIRECTDRAWSURFACE* ppddOverlaySurface) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -232,7 -260,9 +260,9 @@@ STDMETHODCALLTYP CVPConfig::SetDirectDrawKernelHandle( ULONG_PTR dwDDKernelHandle) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -241,7 -271,9 +271,9 @@@ STDMETHODCALLTYP CVPConfig::SetVideoPortID( IN DWORD dwVideoPortID) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -252,7 -284,9 +284,9 @@@ CVPConfig::SetDDSurfaceKernelHandles DWORD cHandles, IN ULONG_PTR *rgDDKernelHandles) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -264,7 -298,9 +298,9 @@@ CVPConfig::SetSurfaceParameters IN DWORD dwXOrigin, IN DWORD dwYOrigin) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -277,7 -313,9 +313,9 @@@ STDMETHODCALLTYP CVPConfig::IsVPDecimationAllowed( LPBOOL pbIsDecimationAllowed) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -286,13 -324,13 +324,13 @@@ STDMETHODCALLTYP CVPConfig::SetScalingFactors( LPAMVPSIZE pamvpSize) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } - - HRESULT WINAPI CVPConfig_Constructor( @@@ -300,7 -338,9 +338,9 @@@ REFIID riid, LPVOID * ppv) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CVPConfig_Constructor\n"); + #endif CVPConfig * handler = new CVPConfig(); diff --combined dll/directx/ksproxy/cvpvbiconfig.cpp index 016d060aa24,b7b7130b471..b7b7130b471 --- a/dll/directx/ksproxy/cvpvbiconfig.cpp +++ b/dll/directx/ksproxy/cvpvbiconfig.cpp @@@ -98,7 -98,9 +98,9 @@@ HRESUL STDMETHODCALLTYPE CVPVBIConfig::Stop() { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -106,7 -108,9 +108,9 @@@ HRESUL STDMETHODCALLTYPE CVPVBIConfig::Pause() { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -115,7 -119,9 +119,9 @@@ STDMETHODCALLTYP CVPVBIConfig::Run( REFERENCE_TIME tStart) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -124,7 -130,9 +130,9 @@@ STDMETHODCALLTYP CVPVBIConfig::SetSyncSource( IReferenceClock *pClock) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -132,7 -140,9 +140,9 @@@ HRESUL STDMETHODCALLTYPE CVPVBIConfig::NotifyGraphChange() { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -145,7 -155,9 +155,9 @@@ CVPVBIConfig::GetConnectInfo LPDWORD pdwNumConnectInfo, IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -154,7 -166,9 +166,9 @@@ STDMETHODCALLTYP CVPVBIConfig::SetConnectInfo( DWORD dwChosenEntry) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -163,7 -177,9 +177,9 @@@ STDMETHODCALLTYP CVPVBIConfig::GetVPDataInfo( LPAMVPDATAINFO pamvpDataInfo) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -173,7 -189,9 +189,9 @@@ CVPVBIConfig::GetMaxPixelRate LPAMVPSIZE pamvpSize, OUT LPDWORD pdwMaxPixelsPerSecond) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -183,7 -201,9 +201,9 @@@ CVPVBIConfig::InformVPInputFormats DWORD dwNumFormats, IN LPDDPIXELFORMAT pDDPixelFormats) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -193,7 -213,9 +213,9 @@@ CVPVBIConfig::GetVideoFormats LPDWORD pdwNumFormats, IN OUT LPDDPIXELFORMAT pddPixelFormats) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -202,7 -224,9 +224,9 @@@ STDMETHODCALLTYP CVPVBIConfig::SetVideoFormat( DWORD dwChosenEntry) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -210,7 -234,9 +234,9 @@@ HRESUL STDMETHODCALLTYPE CVPVBIConfig::SetInvertPolarity() { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -219,7 -245,9 +245,9 @@@ STDMETHODCALLTYP CVPVBIConfig::GetOverlaySurface( LPDIRECTDRAWSURFACE* ppddOverlaySurface) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -228,7 -256,9 +256,9 @@@ STDMETHODCALLTYP CVPVBIConfig::SetDirectDrawKernelHandle( ULONG_PTR dwDDKernelHandle) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -237,7 -267,9 +267,9 @@@ STDMETHODCALLTYP CVPVBIConfig::SetVideoPortID( IN DWORD dwVideoPortID) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -248,7 -280,9 +280,9 @@@ CVPVBIConfig::SetDDSurfaceKernelHandles DWORD cHandles, IN ULONG_PTR *rgDDKernelHandles) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -260,7 -294,9 +294,9 @@@ CVPVBIConfig::SetSurfaceParameters IN DWORD dwXOrigin, IN DWORD dwYOrigin) { - OutputDebugString("UNIMPLEMENTED\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"UNIMPLEMENTED\n"); + #endif return E_NOTIMPL; } @@@ -272,7 -308,9 +308,9 @@@ CVPVBIConfig_Constructor REFIID riid, LPVOID * ppv) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CVPVBIConfig_Constructor\n"); + #endif CVPVBIConfig * handler = new CVPVBIConfig(); diff --combined dll/directx/ksproxy/datatype.cpp index 5006b68a121,965e847b55b..965e847b55b --- a/dll/directx/ksproxy/datatype.cpp +++ b/dll/directx/ksproxy/datatype.cpp @@@ -103,7 -103,9 +103,9 @@@ CKsDataTypeHandler::KsIsMediaTypeInRang ULONG Index; HRESULT hr = S_FALSE; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsDataTypeHandler::KsIsMediaTypeInRanges\n"); + #endif DataList = (PKSMULTIPLE_ITEM)DataRanges; DataRange = (PKSDATARANGE)(DataList + 1); @@@ -187,7 -189,9 +189,9 @@@ STDMETHODCALLTYP CKsDataTypeHandler::KsSetMediaType( IN const AM_MEDIA_TYPE* AmMediaType) { + #ifdef KSPROXY_TRACE OutputDebugString("CKsDataTypeHandler::KsSetMediaType\n"); + #endif if (m_Type) { @@@ -228,7 -232,10 +232,10 @@@ CKsDataTypeHandler_Constructor REFIID riid, LPVOID * ppv) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsDataTypeHandler_Constructor\n"); + #endif + CKsDataTypeHandler * handler = new CKsDataTypeHandler(); if (!handler) diff --combined dll/directx/ksproxy/enum_mediatypes.cpp index 462ffda24fc,db2c7a0298e..db2c7a0298e --- a/dll/directx/ksproxy/enum_mediatypes.cpp +++ b/dll/directx/ksproxy/enum_mediatypes.cpp @@@ -64,13 -64,6 +64,6 @@@ CEnumMediaTypes::QueryInterface 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; } @@@ -171,7 -164,9 +164,9 @@@ STDMETHODCALLTYP CEnumMediaTypes::Clone( IEnumMediaTypes **ppEnum) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -189,7 -184,7 +184,7 @@@ CEnumMediaTypes_fnConstructor WCHAR Buffer[MAX_PATH]; LPOLESTR lpstr; StringFromCLSID(riid, &lpstr); - swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s\n", lpstr); OutputDebugStringW(Buffer); #endif diff --combined dll/directx/ksproxy/enumpins.cpp index 5c0f0ecd7bd,a6c3bdfbd16..a6c3bdfbd16 --- a/dll/directx/ksproxy/enumpins.cpp +++ b/dll/directx/ksproxy/enumpins.cpp @@@ -64,6 -64,14 +64,14 @@@ CEnumPins::QueryInterface return NOERROR; } + WCHAR Buffer[100]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CEnumPins::QueryInterface: NoInterface for %s\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + DebugBreak(); return E_NOINTERFACE; } @@@ -132,7 -140,10 +140,10 @@@ STDMETHODCALLTYP CEnumPins::Clone( IEnumPins **ppEnum) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n"); + #endif + return E_NOTIMPL; } diff --combined dll/directx/ksproxy/input_pin.cpp index ef1cb544563,51b78726ccb..51b78726ccb --- a/dll/directx/ksproxy/input_pin.cpp +++ b/dll/directx/ksproxy/input_pin.cpp @@@ -62,6 -62,8 +62,8 @@@ class CInputPin : public IPin public ISpecifyPropertyPages { public: + typedef std::vectorProxyPluginVector; + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); STDMETHODIMP_(ULONG) AddRef() @@@ -170,14 -172,15 +172,15 @@@ 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); + HRESULT STDMETHODCALLTYPE GetSupportedSets(LPGUID * pOutGuid, PULONG NumGuids); + HRESULT STDMETHODCALLTYPE LoadProxyPlugins(LPGUID pGuids, ULONG NumGuids); + CInputPin(IBaseFilter * ParentFilter, LPCWSTR PinName, 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; @@@ -196,17 -199,16 +199,16 @@@ LPWSTR m_FilterName; FRAMING_PROP m_FramingProp[4]; PKSALLOCATOR_FRAMING_EX m_FramingEx[4]; + ProxyPluginVector m_Plugins; }; CInputPin::CInputPin( - IBaseFilter * ParentFilter, + 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), @@@ -218,13 -220,27 +220,27 @@@ m_KsAllocatorEx(0), m_PipeAllocatorFlag(0), m_bPinBusCacheInitialized(0), - m_FilterName(0) + m_FilterName(0), + m_Plugins() { ZeroMemory(m_FramingProp, sizeof(m_FramingProp)); ZeroMemory(m_FramingEx, sizeof(m_FramingEx)); + HRESULT hr; + IKsObject * KsObjectParent; + HANDLE hFilter; + + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + assert(hr == S_OK); + + hFilter = KsObjectParent->KsGetObjectHandle(); + assert(hFilter); + + KsObjectParent->Release(); + + ZeroMemory(&m_MediaFormat, sizeof(AM_MEDIA_TYPE)); - HRESULT hr = KsGetMediaType(0, &m_MediaFormat, m_hFilter, m_PinId); + hr = KsGetMediaType(0, &m_MediaFormat, hFilter, m_PinId); assert(hr == S_OK); } @@@ -346,7 -362,10 +362,10 @@@ CInputPin::Notify IBaseFilter *pSelf, Quality q) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::Notify NotImplemented\n"); + #endif + return E_NOTIMPL; } @@@ -355,7 -374,10 +374,10 @@@ STDMETHODCALLTYP CInputPin::SetSink( IQualityControl *piqc) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::SetSink NotImplemented\n"); + #endif + return E_NOTIMPL; } @@@ -368,7 -390,10 +390,10 @@@ STDMETHODCALLTYP CInputPin::KsAddAggregate( IN REFGUID AggregateClass) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::KsAddAggregate NotImplemented\n"); + #endif + return E_NOTIMPL; } @@@ -377,7 -402,10 +402,10 @@@ STDMETHODCALLTYP CInputPin::KsRemoveAggregate( REFGUID AggregateClass) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::KsRemoveAggregate NotImplemented\n"); + #endif + return E_NOTIMPL; } @@@ -401,7 -429,10 +429,10 @@@ CInputPin::Backout IPin *ppinOut, IGraphBuilder *pGraph) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::Backout\n"); + #endif + return S_OK; } @@@ -414,7 -445,10 +445,10 @@@ STDMETHODCALLTYP CInputPin::KsPinFactory( ULONG* PinFactory) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::KsPinFactory\n"); + #endif + *PinFactory = m_PinId; return S_OK; } @@@ -590,7 -624,10 +624,10 @@@ HRESUL STDMETHODCALLTYPE CInputPin::GetAllocator(IMemAllocator **ppAllocator) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::GetAllocator\n"); + #endif + return VFW_E_NO_ALLOCATOR; } @@@ -598,13 -635,16 +635,16 @@@ HRESUL STDMETHODCALLTYPE CInputPin::NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly) { - WCHAR Buffer[100]; HRESULT hr; ALLOCATOR_PROPERTIES Properties; hr = pAllocator->GetProperties(&Properties); + + #ifdef KSPROXY_TRACE + WCHAR Buffer[100]; 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); + #endif if (pAllocator) { @@@ -645,9 -685,11 +685,11 @@@ CInputPin::GetAllocatorRequirements(ALL else hr = E_NOTIMPL; + #ifdef KSPROXY_TRACE 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); + #endif return hr; } @@@ -656,7 -698,11 +698,11 @@@ HRESUL STDMETHODCALLTYPE CInputPin::Receive(IMediaSample *pSample) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::Receive NotImplemented\n"); + DebugBreak(); + #endif + return E_NOTIMPL; } @@@ -664,7 -710,11 +710,11 @@@ HRESUL STDMETHODCALLTYPE CInputPin::ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::ReceiveMultiple NotImplemented\n"); + DebugBreak(); + #endif + return E_NOTIMPL; } @@@ -672,7 -722,11 +722,11 @@@ HRESUL STDMETHODCALLTYPE CInputPin::ReceiveCanBlock( void) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::ReceiveCanBlock NotImplemented\n"); + DebugBreak(); + #endif + return S_FALSE; } @@@ -685,7 -739,22 +739,22 @@@ STDMETHODCALLTYP CInputPin::KsQueryMediums( PKSMULTIPLE_ITEM* MediumList) { - return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList); + HRESULT hr; + IKsObject * KsObjectParent; + HANDLE hFilter; + + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return hr; + + hFilter = KsObjectParent->KsGetObjectHandle(); + + KsObjectParent->Release(); + + if (!hFilter) + return E_HANDLE; + + return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList); } HRESULT @@@ -693,7 -762,22 +762,22 @@@ STDMETHODCALLTYP CInputPin::KsQueryInterfaces( PKSMULTIPLE_ITEM* InterfaceList) { - return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList); + HRESULT hr; + IKsObject * KsObjectParent; + HANDLE hFilter; + + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return hr; + + hFilter = KsObjectParent->KsGetObjectHandle(); + + KsObjectParent->Release(); + + if (!hFilter) + return E_HANDLE; + + return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList); } HRESULT @@@ -744,8 -828,6 +828,6 @@@ CInputPin::KsPropagateAcquire( ULONG BytesReturned; HRESULT hr; - OutputDebugStringW(L"CInputPin::KsPropagateAcquire\n"); - assert(m_hPin != INVALID_HANDLE_VALUE); Property.Set = KSPROPSETID_Connection; @@@ -837,7 -919,11 +919,11 @@@ CInputPin::KsQualityNotify ULONG Proportion, REFERENCE_TIME TimeDelta) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::KsQualityNotify NotImplemented\n"); + #endif + + DebugBreak(); return E_NOTIMPL; } @@@ -851,7 -937,9 +937,9 @@@ CInputPin::KsNotifyError IMediaSample* Sample, HRESULT hr) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::KsNotifyError NotImplemented\n"); + #endif } @@@ -1024,7 -1112,10 +1112,10 @@@ HRESUL STDMETHODCALLTYPE CInputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::Connect NotImplemented\n"); + DebugBreak(); + #endif return NOERROR; } @@@ -1075,7 -1166,10 +1166,10 @@@ CInputPin::Disconnect( void m_Pin->Release(); m_Pin = NULL; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::Disconnect\n"); + #endif + return S_OK; } HRESULT @@@ -1103,7 -1197,11 +1197,11 @@@ CInputPin::ConnectionMediaType(AM_MEDIA if (!m_Pin) return VFW_E_NOT_CONNECTED; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::ConnectionMediaType NotImplemented\n"); + DebugBreak(); + #endif + return E_NOTIMPL; } HRESULT @@@ -1155,9 -1253,23 +1253,23 @@@ CInputPin::EnumMediaTypes(IEnumMediaTyp HRESULT hr; ULONG MediaTypeCount = 0, Index; AM_MEDIA_TYPE * MediaTypes; + IKsObject * KsObjectParent; + HANDLE hFilter; + + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return hr; + + hFilter = KsObjectParent->KsGetObjectHandle(); + + KsObjectParent->Release(); + + if (!hFilter) + return E_HANDLE; + // query media type count - hr = KsGetMediaTypeCount(m_hFilter, m_PinId, &MediaTypeCount); + hr = KsGetMediaTypeCount(hFilter, m_PinId, &MediaTypeCount); if (FAILED(hr) || !MediaTypeCount) return hr; @@@ -1175,7 -1287,7 +1287,7 @@@ for(Index = 0; Index < MediaTypeCount; Index++) { // get media type - hr = KsGetMediaType(Index, &MediaTypes[Index], m_hFilter, m_PinId); + hr = KsGetMediaType(Index, &MediaTypes[Index], hFilter, m_PinId); if (FAILED(hr)) { // failed @@@ -1191,35 -1303,45 +1303,45 @@@ HRESUL STDMETHODCALLTYPE CInputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::QueryInternalConnections NotImplemented\n"); + #endif return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CInputPin::EndOfStream( void) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::EndOfStream NotImplemented\n"); + #endif return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CInputPin::BeginFlush( void) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::BeginFlush NotImplemented\n"); + #endif return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CInputPin::EndFlush( void) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::EndFlush NotImplemented\n"); + #endif return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::NewSegment NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -1233,11 -1355,25 +1355,25 @@@ CInputPin::CheckFormat PKSMULTIPLE_ITEM MultipleItem; PKSDATAFORMAT DataFormat; HRESULT hr; + IKsObject * KsObjectParent; + HANDLE hFilter; if (!pmt) return E_POINTER; - hr = KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem); + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return hr; + + hFilter = KsObjectParent->KsGetObjectHandle(); + + KsObjectParent->Release(); + + if (!hFilter) + return E_HANDLE; + + + hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem); if (FAILED(hr)) return S_FALSE; @@@ -1250,7 -1386,9 +1386,9 @@@ { // format is supported CoTaskMemFree(MultipleItem); + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::CheckFormat format OK\n"); + #endif return S_OK; } DataFormat = (PKSDATAFORMAT)((ULONG_PTR)DataFormat + DataFormat->FormatSize); @@@ -1317,7 -1455,9 +1455,9 @@@ CInputPin::CreatePin if (FAILED(hr)) { // failed to load interface handler plugin + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::CreatePin failed to load InterfaceHandlerPlugin\n"); + #endif CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); @@@ -1329,7 -1469,9 +1469,9 @@@ if (FAILED(hr)) { // failed to load interface handler plugin + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::CreatePin failed to initialize InterfaceHandlerPlugin\n"); + #endif InterfaceHandler->Release(); CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); @@@ -1350,10 -1492,12 +1492,12 @@@ } else { + #ifdef KSPROXY_TRACE WCHAR Buffer[100]; swprintf(Buffer, L"CInputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName); OutputDebugStringW(Buffer); DebugBreak(); + #endif hr = E_FAIL; } @@@ -1375,6 -1519,23 +1519,23 @@@ CInputPin::CreatePinHandle PKSDATAFORMAT DataFormat; ULONG Length; HRESULT hr; + IKsObject * KsObjectParent; + HANDLE hFilter; + + if (!pmt) + return E_POINTER; + + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return hr; + + hFilter = KsObjectParent->KsGetObjectHandle(); + + KsObjectParent->Release(); + + if (!hFilter) + return E_HANDLE; + if (m_hPin != INVALID_HANDLE_VALUE) { @@@ -1423,7 -1584,7 +1584,7 @@@ } // create pin - hr = KsCreatePin(m_hFilter, PinConnect, GENERIC_WRITE, &m_hPin); + hr = KsCreatePin(hFilter, PinConnect, GENERIC_WRITE, &m_hPin); if (SUCCEEDED(hr)) { @@@ -1432,16 -1593,19 +1593,19 @@@ CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE)); CopyMemory(&m_MediaFormat, pmt, sizeof(AM_MEDIA_TYPE)); + #ifdef KSPROXY_TRACE 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); + #endif if (pmt->cbFormat) { @@@ -1456,6 -1620,35 +1620,35 @@@ CopyMemory(m_MediaFormat.pbFormat, pmt->pbFormat, pmt->cbFormat); } + LPGUID pGuid; + ULONG NumGuids = 0; + + // get all supported sets + hr = GetSupportedSets(&pGuid, &NumGuids); + if (FAILED(hr)) + { + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CInputPin::CreatePinHandle GetSupportedSets failed\n"); + DebugBreak(); + #endif + return hr; + } + + // load all proxy plugins + hr = LoadProxyPlugins(pGuid, NumGuids); + if (FAILED(hr)) + { + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CInputPin::CreatePinHandle LoadProxyPlugins failed\n"); + DebugBreak(); + #endif + return hr; + } + + // free sets + CoTaskMemFree(pGuid); + + //TODO // connect pin pipes @@@ -1467,6 -1660,140 +1660,140 @@@ return hr; } + HRESULT + STDMETHODCALLTYPE + CInputPin::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_hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumProperty); + KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumMethods); + KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumEvents); + + Length = NumProperty + NumMethods + NumEvents; + + assert(Length); + + // allocate guid buffer + pGuid = (LPGUID)CoTaskMemAlloc(Length); + if (!pGuid) + { + // failed + return E_OUTOFMEMORY; + } + + NumProperty /= sizeof(GUID); + NumMethods /= sizeof(GUID); + NumEvents /= sizeof(GUID); + + #ifdef KSPROXY_TRACE + WCHAR Buffer[200]; + swprintf(Buffer, L"CInputPin::GetSupportedSets NumProperty %lu NumMethods %lu NumEvents %lu\n", NumProperty, NumMethods, NumEvents); + OutputDebugStringW(Buffer); + #endif + + // get all properties + hr = KsSynchronousDeviceControl(m_hPin, 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 && NumMethods) + { + hr = KsSynchronousDeviceControl(m_hPin, 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 && NumEvents) + { + hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty+NumMethods], Length, &BytesReturned); + if (FAILED(hr)) + { + CoTaskMemFree(pGuid); + return E_FAIL; + } + Length -= BytesReturned; + } + + *pOutGuid = pGuid; + *NumGuids = NumProperty+NumEvents+NumMethods; + return S_OK; + } + + HRESULT + STDMETHODCALLTYPE + CInputPin::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"CInputPin::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); + DebugBreak(); + } + // close key + RegCloseKey(hSubKey); + } + + // close media interfaces key + RegCloseKey(hKey); + return S_OK; + } + HRESULT WINAPI CInputPin_Constructor( @@@ -1478,7 -1805,7 +1805,7 @@@ REFIID riid, LPVOID * ppv) { - CInputPin * handler = new CInputPin(ParentFilter, PinName, hFilter, PinId, Communication); + CInputPin * handler = new CInputPin(ParentFilter, PinName, PinId, Communication); if (!handler) return E_OUTOFMEMORY; diff --combined dll/directx/ksproxy/interface.cpp index 930f7e00b73,7eb0fd284d5..7eb0fd284d5 --- a/dll/directx/ksproxy/interface.cpp +++ b/dll/directx/ksproxy/interface.cpp @@@ -35,24 -35,25 +35,25 @@@ public 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){}; + 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; - OVERLAPPED Overlapped; }KSSTREAM_SEGMENT_EXT, *PKSSTREAM_SEGMENT_EXT; @@@ -118,6 -119,22 +119,22 @@@ CKsInterfaceHandler::KsSetPin 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; @@@ -136,8 -153,6 +153,6 @@@ CKsInterfaceHandler::KsProcessMediaSamp ULONG ExtendedSize, Index, BytesReturned; HRESULT hr = S_OK; - OutputDebugString("CKsInterfaceHandler::KsProcessMediaSamples\n"); - // sanity check assert(*SampleCount); @@@ -237,6 -252,7 +252,7 @@@ // 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)) @@@ -254,7 -270,9 +270,9 @@@ hr = SampleList[Index]->GetPointer((BYTE**)&Properties.pbBuffer); assert(hr == NOERROR); hr = SampleList[Index]->GetTime(&Properties.tStart, &Properties.tStop); - assert(hr == NOERROR); + + Properties.cbBuffer = SampleList[Index]->GetSize(); + assert(Properties.cbBuffer); Properties.dwSampleFlags = 0; @@@ -267,10 -285,11 +285,11 @@@ if (SampleList[Index]->IsSyncPoint() == S_OK) Properties.dwSampleFlags |= AM_SAMPLE_SPLICEPOINT; } - - WCHAR Buffer[100]; - swprintf(Buffer, L"BufferLength %lu Property Buffer %p ExtendedSize %u lActual %u\n", Properties.cbBuffer, Properties.pbBuffer, ExtendedSize, Properties.lActual); + #ifdef KSPROXY_TRACE + 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); + #endif CurStreamHeader->Size = sizeof(KSSTREAM_HEADER) + ExtendedSize; CurStreamHeader->PresentationTime.Denominator = 1; @@@ -336,8 -355,6 +355,6 @@@ CKsInterfaceHandler::KsCompleteIo AM_SAMPLE2_PROPERTIES Properties; REFERENCE_TIME Start, Stop; - OutputDebugStringW(L"CKsInterfaceHandler::KsCompleteIo\n"); - // get private stream segment StreamSegment = (PKSSTREAM_SEGMENT_EXT)InStreamSegment; @@@ -463,7 -480,9 +480,9 @@@ CKsInterfaceHandler_Constructor REFIID riid, LPVOID * ppv) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsInterfaceHandler_Constructor\n"); + #endif CKsInterfaceHandler * handler = new CKsInterfaceHandler(); diff --combined dll/directx/ksproxy/ksproxy.cpp index f79a154574b,f1e17c96922..f1e17c96922 --- a/dll/directx/ksproxy/ksproxy.cpp +++ b/dll/directx/ksproxy/ksproxy.cpp @@@ -117,7 -117,7 +117,7 @@@ KsOpenDefaultDevice WCHAR Path[MAX_PATH+sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W)]; /* open device list */ - hList = SetupDiGetClassDevsW(&Category, NULL, NULL, DIGCF_DEVICEINTERFACE /* | DIGCF_PRESENT*/); + hList = SetupDiGetClassDevsW(&Category, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); if (hList == INVALID_HANDLE_VALUE) { @@@ -129,7 -129,7 +129,7 @@@ DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - if (SetupDiEnumDeviceInterfaces(hList, &DeviceInfoData, &Category, 0, &DeviceInterfaceData)) + if (SetupDiEnumDeviceInterfaces(hList, NULL, &Category, 0, &DeviceInterfaceData)) { /* setup interface data struct */ DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA_W)Path; diff --combined dll/directx/ksproxy/ksproxy.rbuild index 269d986fc41,86cd50a2c1d..86cd50a2c1d --- a/dll/directx/ksproxy/ksproxy.rbuild +++ b/dll/directx/ksproxy/ksproxy.rbuild @@@ -33,6 -33,7 +33,7 @@@ interface.cpp ksproxy.cpp ksproxy.rc + mediasample.cpp node.cpp output_pin.cpp proxy.cpp diff --combined dll/directx/ksproxy/node.cpp index d2686bb96a4,d3082255346..d3082255346 --- a/dll/directx/ksproxy/node.cpp +++ b/dll/directx/ksproxy/node.cpp @@@ -124,7 -124,9 +124,9 @@@ CKsNode_Constructor HANDLE handle; KSNODE_CREATE NodeCreate; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsNode_Constructor\n"); + #endif //setup request NodeCreate.CreateFlags = 0; diff --combined dll/directx/ksproxy/output_pin.cpp index c5d897c6bcf,17f07804a20..17f07804a20 --- a/dll/directx/ksproxy/output_pin.cpp +++ b/dll/directx/ksproxy/output_pin.cpp @@@ -26,6 -26,8 +26,8 @@@ class COutputPin : public IPin { public: + typedef std::vectorProxyPluginVector; + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); STDMETHODIMP_(ULONG) AddRef() @@@ -160,6 -162,13 +162,13 @@@ 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(); + HRESULT STDMETHODCALLTYPE GetSupportedSets(LPGUID * pOutGuid, PULONG NumGuids); + HRESULT STDMETHODCALLTYPE LoadProxyPlugins(LPGUID pGuids, ULONG NumGuids); + + friend DWORD WINAPI COutputPin_IoThreadStartup(LPVOID lpParameter); + friend HRESULT STDMETHODCALLTYPE COutputPin_SetState(IPin * Pin, KSSTATE State); protected: LONG m_Ref; @@@ -167,7 -176,6 +176,6 @@@ LPCWSTR m_PinName; HANDLE m_hPin; ULONG m_PinId; - IKsObject * m_KsObjectParent; IPin * m_Pin; IKsAllocatorEx * m_KsAllocatorEx; ULONG m_PipeAllocatorFlag; @@@ -178,21 -186,29 +186,29 @@@ 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; + CRITICAL_SECTION m_Lock; + + ProxyPluginVector m_Plugins; }; COutputPin::~COutputPin() { - if (m_KsObjectParent) - m_KsObjectParent->Release(); } COutputPin::COutputPin( @@@ -204,31 -220,39 +220,39 @@@ 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_InterfaceHandler(0), + m_hStartEvent(0), + m_hBufferAvailable(0), + m_hStopEvent(0), + m_StopInProgress(0), + m_IoThreadStarted(0), + m_State(KSSTATE_STOP), + m_Plugins() { HRESULT hr; + IKsObject * KsObjectParent; - hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&m_KsObjectParent); - assert(hr == S_OK); - - hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&m_FilterMediaSeeking); + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); 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); + hr = KsGetMediaType(0, &m_MediaFormat, KsObjectParent->KsGetObjectHandle(), m_PinId); assert(hr == S_OK); + + InitializeCriticalSection(&m_Lock); + + KsObjectParent->Release(); }; HRESULT @@@ -241,7 -265,9 +265,9 @@@ COutputPin::QueryInterface if (IsEqualGUID(refiid, IID_IUnknown) || IsEqualGUID(refiid, IID_IPin)) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::QueryInterface IID_IPin\n"); + #endif *Output = PVOID(this); reinterpret_cast(*Output)->AddRef(); return NOERROR; @@@ -254,8 -280,9 +280,9 @@@ if (FAILED(hr)) return hr; } - + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsObject\n"); + #endif *Output = (IKsObject*)(this); reinterpret_cast(*Output)->AddRef(); return NOERROR; @@@ -292,14 -319,18 +319,18 @@@ if (FAILED(hr)) return hr; } + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsPropertySet\n"); + #endif *Output = (IKsPropertySet*)(this); reinterpret_cast(*Output)->AddRef(); return NOERROR; } else if (IsEqualGUID(refiid, IID_IKsControl)) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsControl\n"); + #endif *Output = (IKsControl*)(this); reinterpret_cast(*Output)->AddRef(); return NOERROR; @@@ -314,14 -345,18 +345,18 @@@ #endif else if (IsEqualGUID(refiid, IID_IKsPinFactory)) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsPinFactory\n"); + #endif *Output = (IKsPinFactory*)(this); reinterpret_cast(*Output)->AddRef(); return NOERROR; } else if (IsEqualGUID(refiid, IID_ISpecifyPropertyPages)) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::QueryInterface IID_ISpecifyPropertyPages\n"); + #endif *Output = (ISpecifyPropertyPages*)(this); reinterpret_cast(*Output)->AddRef(); return NOERROR; @@@ -351,12 -386,14 +386,14 @@@ return NOERROR; } + #ifdef KSPROXY_TRACE 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); + #endif return E_NOINTERFACE; } @@@ -369,7 -406,9 +406,9 @@@ STDMETHODCALLTYP COutputPin::SuggestAllocatorProperties( const ALLOCATOR_PROPERTIES *pprop) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::SuggestAllocatorProperties\n"); + #endif if (m_Pin) { @@@ -386,7 -425,9 +425,9 @@@ STDMETHODCALLTYP COutputPin::GetAllocatorProperties( ALLOCATOR_PROPERTIES *pprop) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::GetAllocatorProperties\n"); + #endif if (!m_Pin) { @@@ -412,7 -453,9 +453,9 @@@ STDMETHODCALLTYP COutputPin::SetFormat( AM_MEDIA_TYPE *pmt) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::SetFormat NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -420,7 -463,9 +463,9 @@@ HRESUL STDMETHODCALLTYPE COutputPin::GetFormat(AM_MEDIA_TYPE **ppmt) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::GetFormat NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -430,7 -475,9 +475,9 @@@ COutputPin::GetNumberOfCapabilities int *piCount, int *piSize) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::GetNumberOfCapabilities NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -441,7 -488,9 +488,9 @@@ COutputPin::GetStreamCaps AM_MEDIA_TYPE **ppmt, BYTE *pSCC) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::GetStreamCaps NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -452,8 -501,14 +501,14 @@@ HRESUL STDMETHODCALLTYPE COutputPin::NotifyRelease() { - OutputDebugStringW(L"COutputPin::NotifyRelease NotImplemented\n"); - return E_NOTIMPL; + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"COutputPin::NotifyRelease\n"); + #endif + + // notify thread of new available sample + SetEvent(m_hBufferAvailable); + + return NOERROR; } //------------------------------------------------------------------- @@@ -464,7 -519,17 +519,17 @@@ STDMETHODCALLTYP COutputPin::GetCapabilities( DWORD *pCapabilities) { - return m_FilterMediaSeeking->GetCapabilities(pCapabilities); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->GetCapabilities(pCapabilities); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -472,7 -537,17 +537,17 @@@ STDMETHODCALLTYP COutputPin::CheckCapabilities( DWORD *pCapabilities) { - return m_FilterMediaSeeking->CheckCapabilities(pCapabilities); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->CheckCapabilities(pCapabilities); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -480,7 -555,17 +555,17 @@@ STDMETHODCALLTYP COutputPin::IsFormatSupported( const GUID *pFormat) { - return m_FilterMediaSeeking->IsFormatSupported(pFormat); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->IsFormatSupported(pFormat); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -488,7 -573,17 +573,17 @@@ STDMETHODCALLTYP COutputPin::QueryPreferredFormat( GUID *pFormat) { - return m_FilterMediaSeeking->QueryPreferredFormat(pFormat); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->QueryPreferredFormat(pFormat); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -496,7 -591,17 +591,17 @@@ STDMETHODCALLTYP COutputPin::GetTimeFormat( GUID *pFormat) { - return m_FilterMediaSeeking->GetTimeFormat(pFormat); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->GetTimeFormat(pFormat); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -504,7 -609,17 +609,17 @@@ STDMETHODCALLTYP COutputPin::IsUsingTimeFormat( const GUID *pFormat) { - return m_FilterMediaSeeking->IsUsingTimeFormat(pFormat); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->IsUsingTimeFormat(pFormat); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -512,7 -627,17 +627,17 @@@ STDMETHODCALLTYP COutputPin::SetTimeFormat( const GUID *pFormat) { - return m_FilterMediaSeeking->SetTimeFormat(pFormat); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->SetTimeFormat(pFormat); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -520,7 -645,17 +645,17 @@@ STDMETHODCALLTYP COutputPin::GetDuration( LONGLONG *pDuration) { - return m_FilterMediaSeeking->GetDuration(pDuration); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->GetDuration(pDuration); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -528,7 -663,17 +663,17 @@@ STDMETHODCALLTYP COutputPin::GetStopPosition( LONGLONG *pStop) { - return m_FilterMediaSeeking->GetStopPosition(pStop); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->GetStopPosition(pStop); + + FilterMediaSeeking->Release(); + return hr; } @@@ -537,7 -682,17 +682,17 @@@ STDMETHODCALLTYP COutputPin::GetCurrentPosition( LONGLONG *pCurrent) { - return m_FilterMediaSeeking->GetCurrentPosition(pCurrent); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->GetCurrentPosition(pCurrent); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -548,7 -703,17 +703,17 @@@ COutputPin::ConvertTimeFormat LONGLONG Source, const GUID *pSourceFormat) { - return m_FilterMediaSeeking->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -559,7 -724,17 +724,17 @@@ COutputPin::SetPositions LONGLONG *pStop, DWORD dwStopFlags) { - return m_FilterMediaSeeking->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -568,7 -743,17 +743,17 @@@ COutputPin::GetPositions LONGLONG *pCurrent, LONGLONG *pStop) { - return m_FilterMediaSeeking->GetPositions(pCurrent, pStop); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->GetPositions(pCurrent, pStop); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -577,7 -762,17 +762,17 @@@ COutputPin::GetAvailable LONGLONG *pEarliest, LONGLONG *pLatest) { - return m_FilterMediaSeeking->GetAvailable(pEarliest, pLatest); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->GetAvailable(pEarliest, pLatest); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -585,7 -780,17 +780,17 @@@ STDMETHODCALLTYP COutputPin::SetRate( double dRate) { - return m_FilterMediaSeeking->SetRate(dRate); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->SetRate(dRate); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -593,7 -798,17 +798,17 @@@ STDMETHODCALLTYP COutputPin::GetRate( double *pdRate) { - return m_FilterMediaSeeking->GetRate(pdRate); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->GetRate(pdRate); + + FilterMediaSeeking->Release(); + return hr; } HRESULT @@@ -601,7 -816,17 +816,17 @@@ STDMETHODCALLTYP COutputPin::GetPreroll( LONGLONG *pllPreroll) { - return m_FilterMediaSeeking->GetPreroll(pllPreroll); + IMediaSeeking * FilterMediaSeeking; + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking); + if (FAILED(hr)) + return hr; + + hr = FilterMediaSeeking->GetPreroll(pllPreroll); + + FilterMediaSeeking->Release(); + return hr; } //------------------------------------------------------------------- @@@ -613,7 -838,9 +838,9 @@@ COutputPin::Notify IBaseFilter *pSelf, Quality q) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::Notify NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -622,7 -849,9 +849,9 @@@ STDMETHODCALLTYP COutputPin::SetSink( IQualityControl *piqc) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::SetSink NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -635,7 -864,9 +864,9 @@@ STDMETHODCALLTYP COutputPin::KsAddAggregate( IN REFGUID AggregateClass) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsAddAggregate NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -644,7 -875,9 +875,9 @@@ STDMETHODCALLTYP COutputPin::KsRemoveAggregate( REFGUID AggregateClass) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsRemoveAggregate NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -658,8 -891,24 +891,24 @@@ STDMETHODCALLTYP COutputPin::KsQueryMediums( PKSMULTIPLE_ITEM* MediumList) { - HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle(); - return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList); + HRESULT hr; + HANDLE hFilter; + IKsObject * KsObjectParent; + + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return E_NOINTERFACE; + + hFilter = KsObjectParent->KsGetObjectHandle(); + + if (hFilter) + hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList); + else + hr = E_HANDLE; + + KsObjectParent->Release(); + + return hr; } HRESULT @@@ -667,9 -916,24 +916,24 @@@ STDMETHODCALLTYP COutputPin::KsQueryInterfaces( PKSMULTIPLE_ITEM* InterfaceList) { - HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle(); + HRESULT hr; + HANDLE hFilter; + IKsObject * KsObjectParent; + + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return hr; - return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList); + hFilter = KsObjectParent->KsGetObjectHandle(); + + if (hFilter) + hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList); + else + hr = E_HANDLE; + + KsObjectParent->Release(); + + return hr; } HRESULT @@@ -678,7 -942,9 +942,9 @@@ COutputPin::KsCreateSinkPinHandle KSPIN_INTERFACE& Interface, KSPIN_MEDIUM& Medium) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsCreateSinkPinHandle NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -721,7 -987,9 +987,9 @@@ COutputPin::KsPropagateAcquire( ULONG BytesReturned; HRESULT hr; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsPropagateAcquire\n"); + #endif assert(m_hPin != INVALID_HANDLE_VALUE); @@@ -732,6 -1000,10 +1000,10 @@@ State = KSSTATE_ACQUIRE; hr = KsProperty(&Property, sizeof(KSPROPERTY), (LPVOID)&State, sizeof(KSSTATE), &BytesReturned); + if (SUCCEEDED(hr)) + { + m_State = State; + } //TODO //propagate to connected pin on the pipe @@@ -813,7 -1085,9 +1085,9 @@@ COutputPin::KsQualityNotify ULONG Proportion, REFERENCE_TIME TimeDelta) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsQualityNotify NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -827,7 -1101,9 +1101,9 @@@ COutputPin::KsNotifyError IMediaSample* Sample, HRESULT hr) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsNotifyError NotImplemented\n"); + #endif } @@@ -984,7 -1260,9 +1260,9 @@@ HRESUL STDMETHODCALLTYPE COutputPin::GetPages(CAUUID *pPages) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::GetPages NotImplemented\n"); + #endif if (!pPages) return E_POINTER; @@@ -1004,7 -1282,10 +1282,10 @@@ STDMETHODCALLTYP COutputPin::KsPinFactory( ULONG* PinFactory) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsPinFactory\n"); + #endif + *PinFactory = m_PinId; return S_OK; } @@@ -1020,7 -1301,9 +1301,9 @@@ COutputPin::Render IPin *ppinOut, IGraphBuilder *pGraph) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::Render\n"); + #endif return S_OK; } @@@ -1030,7 -1313,10 +1313,10 @@@ COutputPin::Backout IPin *ppinOut, IGraphBuilder *pGraph) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::Backout\n"); + #endif + return S_OK; } //------------------------------------------------------------------- @@@ -1040,7 -1326,10 +1326,10 @@@ HANDL STDMETHODCALLTYPE COutputPin::KsGetObjectHandle() { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsGetObjectHandle\n"); + #endif + assert(m_hPin != INVALID_HANDLE_VALUE); return m_hPin; } @@@ -1058,16 -1347,17 +1347,17 @@@ COutputPin::KsProperty 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); - + #ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + LPOLESTR pstr; 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); + #endif return hr; } @@@ -1082,7 -1372,9 +1372,9 @@@ COutputPin::KsMethod ULONG* BytesReturned) { assert(m_hPin != INVALID_HANDLE_VALUE); + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsMethod\n"); + #endif return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned); } @@@ -1097,7 -1389,9 +1389,9 @@@ COutputPin::KsEvent { assert(m_hPin != INVALID_HANDLE_VALUE); + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::KsEvent\n"); + #endif if (EventLength) return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned); @@@ -1202,7 -1496,9 +1496,9 @@@ COutputPin::QuerySupported KSPROPERTY Property; ULONG BytesReturned; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::QuerySupported\n"); + #endif Property.Set = guidPropSet; Property.Id = dwPropID; @@@ -1220,8 -1516,14 +1516,14 @@@ STDMETHODCALLTYP COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) { HRESULT hr; + ALLOCATOR_PROPERTIES Properties; + IMemAllocatorCallbackTemp *pMemCallback; + #ifdef KSPROXY_TRACE + WCHAR Buffer[200]; OutputDebugStringW(L"COutputPin::Connect called\n"); + #endif + if (pmt) { hr = pReceivePin->QueryAccept(pmt); @@@ -1238,54 -1540,184 +1540,184 @@@ pmt = &m_MediaFormat; } - //FIXME create pin handle + // query for IMemInput interface + hr = pReceivePin->QueryInterface(IID_IMemInputPin, (void**)&m_MemInputPin); + if (FAILED(hr)) + { + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"COutputPin::Connect no IMemInputPin interface\n"); + #endif + + DebugBreak(); + return hr; + } - // receive connection; - hr = pReceivePin->ReceiveConnection((IPin*)this, pmt); + // 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)) { - // increment reference count - pReceivePin->AddRef(); - m_Pin = pReceivePin; - OutputDebugStringW(L"COutputPin::Connect success\n"); + // set allocator properties + hr = m_MemAllocator->SetProperties(&Properties, &m_Properties); + if (FAILED(hr)) + m_MemAllocator->Release(); } + #endif - return hr; - } + if (1) + { + hr = CKsAllocator_Constructor(NULL, IID_IMemAllocator, (void**)&m_MemAllocator); + if (FAILED(hr)) + return hr; - HRESULT - STDMETHODCALLTYPE - COutputPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt) - { - OutputDebugStringW(L"COutputPin::ReceiveConnection\n"); - return E_UNEXPECTED; - } - HRESULT - STDMETHODCALLTYPE - COutputPin::Disconnect( void) - { - OutputDebugStringW(L"COutputPin::Disconnect\n"); + // set allocator properties + hr = m_MemAllocator->SetProperties(&Properties, &m_Properties); + if (FAILED(hr)) + { + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin::Connect IMemAllocator::SetProperties failed with hr %lx\n", hr); + OutputDebugStringW(Buffer); + #endif + m_MemAllocator->Release(); + m_MemInputPin->Release(); + return hr; + } + } - if (!m_Pin) + // commit property changes + hr = m_MemAllocator->Commit(); + if (FAILED(hr)) { - // pin was not connected - return S_FALSE; + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin::Connect IMemAllocator::Commit failed with hr %lx\n", hr); + OutputDebugStringW(Buffer); + #endif + m_MemAllocator->Release(); + m_MemInputPin->Release(); + return hr; } - //FIXME - //check if filter is active + // get callback interface + hr = m_MemAllocator->QueryInterface(IID_IMemAllocatorCallbackTemp, (void**)&pMemCallback); + if (FAILED(hr)) + { + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin::Connect No IMemAllocatorCallbackTemp interface hr %lx\n", hr); + OutputDebugStringW(Buffer); + #endif + m_MemAllocator->Release(); + m_MemInputPin->Release(); + return hr; + } + + // set notification routine + hr = pMemCallback->SetNotify((IMemAllocatorNotifyCallbackTemp*)this); + + // release IMemAllocatorNotifyCallbackTemp interface + pMemCallback->Release(); + + if (FAILED(hr)) + { + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin::Connect IMemAllocatorNotifyCallbackTemp::SetNotify failed hr %lx\n", hr); + OutputDebugStringW(Buffer); + #endif + m_MemAllocator->Release(); + m_MemInputPin->Release(); + return hr; + } + + // now set allocator + hr = m_MemInputPin->NotifyAllocator(m_MemAllocator, TRUE); + if (FAILED(hr)) + { + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin::Connect IMemInputPin::NotifyAllocator failed with hr %lx\n", hr); + OutputDebugStringW(Buffer); + #endif + 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; + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"COutputPin::Connect success\n"); + #endif + } + 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) + { + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"COutputPin::Disconnect\n"); + #endif + + 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(); + + CloseHandle(m_hPin); + m_hPin = INVALID_HANDLE_VALUE; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::Disconnect\n"); + #endif return S_OK; } HRESULT STDMETHODCALLTYPE COutputPin::ConnectedTo(IPin **pPin) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::ConnectedTo\n"); + #endif if (!pPin) return E_POINTER; @@@ -1305,15 -1737,16 +1737,16 @@@ HRESUL STDMETHODCALLTYPE COutputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::ConnectionMediaType called\n"); + #endif + return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE COutputPin::QueryPinInfo(PIN_INFO *pInfo) { - OutputDebugStringW(L"COutputPin::QueryPinInfo\n"); - wcscpy(pInfo->achName, m_PinName); pInfo->dir = PINDIR_OUTPUT; pInfo->pFilter = m_ParentFilter; @@@ -1325,8 -1758,6 +1758,6 @@@ HRESUL STDMETHODCALLTYPE COutputPin::QueryDirection(PIN_DIRECTION *pPinDir) { - OutputDebugStringW(L"COutputPin::QueryDirection\n"); - if (pPinDir) { *pPinDir = PINDIR_OUTPUT; @@@ -1339,8 -1770,6 +1770,6 @@@ HRESUL STDMETHODCALLTYPE COutputPin::QueryId(LPWSTR *Id) { - OutputDebugStringW(L"COutputPin::QueryId\n"); - *Id = (LPWSTR)CoTaskMemAlloc((wcslen(m_PinName)+1)*sizeof(WCHAR)); if (!*Id) return E_OUTOFMEMORY; @@@ -1352,7 -1781,10 +1781,10 @@@ HRESUL STDMETHODCALLTYPE COutputPin::QueryAccept(const AM_MEDIA_TYPE *pmt) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"COutputPin::QueryAccept called\n"); + #endif + return E_NOTIMPL; } HRESULT @@@ -1363,23 -1795,22 +1795,22 @@@ COutputPin::EnumMediaTypes(IEnumMediaTy ULONG MediaTypeCount = 0, Index; AM_MEDIA_TYPE * MediaTypes; HANDLE hFilter; + IKsObject * KsObjectParent; - OutputDebugStringW(L"COutputPin::EnumMediaTypes called\n"); - - if (!m_KsObjectParent) - { - // no interface - return E_NOINTERFACE; - } + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return hr; // get parent filter handle - hFilter = m_KsObjectParent->KsGetObjectHandle(); + hFilter = KsObjectParent->KsGetObjectHandle(); + + // release IKsObject + KsObjectParent->Release(); // query media type count hr = KsGetMediaTypeCount(hFilter, m_PinId, &MediaTypeCount); if (FAILED(hr) || !MediaTypeCount) { - OutputDebugStringW(L"COutputPin::EnumMediaTypes failed1\n"); return hr; } @@@ -1388,7 -1819,6 +1819,6 @@@ if (!MediaTypes) { // not enough memory - OutputDebugStringW(L"COutputPin::EnumMediaTypes CoTaskMemAlloc\n"); return E_OUTOFMEMORY; } @@@ -1403,7 -1833,6 +1833,6 @@@ { // failed CoTaskMemFree(MediaTypes); - OutputDebugStringW(L"COutputPin::EnumMediaTypes failed\n"); return hr; } } @@@ -1414,36 -1843,40 +1843,40 @@@ HRESUL STDMETHODCALLTYPE COutputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin) { - OutputDebugStringW(L"COutputPin::QueryInternalConnections called\n"); return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE COutputPin::EndOfStream( void) { - OutputDebugStringW(L"COutputPin::EndOfStream called\n"); - return E_NOTIMPL; + /* should be called only on input pins */ + return E_UNEXPECTED; } HRESULT STDMETHODCALLTYPE COutputPin::BeginFlush( void) { - OutputDebugStringW(L"COutputPin::BeginFlush called\n"); - return E_NOTIMPL; + /* should be called only on input pins */ + return E_UNEXPECTED; } HRESULT STDMETHODCALLTYPE COutputPin::EndFlush( void) { - OutputDebugStringW(L"COutputPin::EndFlush called\n"); - return E_NOTIMPL; + /* should be called only on input pins */ + return E_UNEXPECTED; } HRESULT STDMETHODCALLTYPE COutputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) { - OutputDebugStringW(L"COutputPin::NewSegment called\n"); - return E_NOTIMPL; + if (!m_Pin) + { + // we are not connected + return VFW_E_NOT_CONNECTED; + } + + return m_Pin->NewSegment(tStart, tStop, dRate); } //------------------------------------------------------------------- @@@ -1455,12 -1888,26 +1888,26 @@@ COutputPin::CheckFormat PKSMULTIPLE_ITEM MultipleItem; PKSDATAFORMAT DataFormat; HRESULT hr; + IKsObject * KsObjectParent; + HANDLE hFilter; if (!pmt) return E_POINTER; - HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle(); - assert(hFilter != NULL); + // get IKsObject interface + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return hr; + + // get parent filter handle + hFilter = KsObjectParent->KsGetObjectHandle(); + + // release IKsObject + KsObjectParent->Release(); + + if (!hFilter) + return E_HANDLE; + hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem); if (FAILED(hr)) @@@ -1475,7 -1922,6 +1922,6 @@@ { // format is supported CoTaskMemFree(MultipleItem); - OutputDebugStringW(L"COutputPin::CheckFormat format OK\n"); return S_OK; } DataFormat = (PKSDATAFORMAT)((ULONG_PTR)DataFormat + DataFormat->FormatSize); @@@ -1539,8 -1985,12 +1985,12 @@@ COutputPin::CreatePin hr = CreatePinHandle(Medium, Interface, pmt); if (FAILED(hr)) { - m_InterfaceHandler->Release(); - m_InterfaceHandler = InterfaceHandler; + #ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"COutputPin::CreatePinHandle failed with %lx\n", hr); + OutputDebugStringW(Buffer); + #endif + return hr; } if (!m_InterfaceHandler) @@@ -1550,7 -2000,6 +2000,6 @@@ if (FAILED(hr)) { // failed to load interface handler plugin - OutputDebugStringW(L"COutputPin::CreatePin failed to load InterfaceHandlerPlugin\n"); CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); @@@ -1562,7 -2011,6 +2011,6 @@@ if (FAILED(hr)) { // failed to load interface handler plugin - OutputDebugStringW(L"COutputPin::CreatePin failed to initialize InterfaceHandlerPlugin\n"); InterfaceHandler->Release(); CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); @@@ -1575,10 -2023,13 +2023,13 @@@ } else { + #ifdef KSPROXY_TRACE WCHAR Buffer[100]; swprintf(Buffer, L"COutputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName); OutputDebugStringW(Buffer); DebugBreak(); + #endif + hr = E_FAIL; } @@@ -1600,6 -2051,12 +2051,12 @@@ COutputPin::CreatePinHandle PKSDATAFORMAT DataFormat; ULONG Length; HRESULT hr; + HANDLE hFilter; + IKsObject * KsObjectParent; + + //KSALLOCATOR_FRAMING Framing; + //KSPROPERTY Property; + //ULONG BytesReturned; if (m_hPin != INVALID_HANDLE_VALUE) { @@@ -1647,11 -2104,22 +2104,22 @@@ CopyMemory((DataFormat + 1), pmt->pbFormat, pmt->cbFormat); } - HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle(); - assert(hFilter != NULL); + // get IKsObject interface + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); + if (FAILED(hr)) + return hr; + + // get parent filter handle + hFilter = KsObjectParent->KsGetObjectHandle(); + + // release IKsObject + KsObjectParent->Release(); + + if (!hFilter) + return E_HANDLE; // create pin - hr = KsCreatePin(hFilter, PinConnect, GENERIC_WRITE, &m_hPin); + hr = KsCreatePin(hFilter, PinConnect, GENERIC_READ, &m_hPin); if (SUCCEEDED(hr)) { @@@ -1660,6 -2128,7 +2128,7 @@@ CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE)); CopyMemory(&m_MediaFormat, pmt, sizeof(AM_MEDIA_TYPE)); + #ifdef KSPROXY_TRACE LPOLESTR pMajor, pSub, pFormat; StringFromIID(m_MediaFormat.majortype, &pMajor); StringFromIID(m_MediaFormat.subtype , &pSub); @@@ -1670,6 -2139,7 +2139,7 @@@ CoTaskMemFree(pSub); CoTaskMemFree(pFormat); OutputDebugStringW(Buffer); + #endif if (pmt->cbFormat) { @@@ -1683,6 -2153,57 +2153,57 @@@ } 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(); + } + + LPGUID pGuid; + ULONG NumGuids = 0; + + // get all supported sets + hr = GetSupportedSets(&pGuid, &NumGuids); + if (FAILED(hr)) + { + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CInputPin::CreatePinHandle GetSupportedSets failed\n"); + DebugBreak(); + #endif + return hr; + } + + // load all proxy plugins + hr = LoadProxyPlugins(pGuid, NumGuids); + if (FAILED(hr)) + { + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CInputPin::CreatePinHandle LoadProxyPlugins failed\n"); + DebugBreak(); + #endif + return hr; + } + + // free sets + CoTaskMemFree(pGuid); + //TODO // connect pin pipes @@@ -1694,6 -2215,486 +2215,486 @@@ return hr; } + HRESULT + STDMETHODCALLTYPE + COutputPin::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_hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumProperty); + KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumMethods); + KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumEvents); + + Length = NumProperty + NumMethods + NumEvents; + + assert(Length); + + // 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_hPin, 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 && NumMethods) + { + hr = KsSynchronousDeviceControl(m_hPin, 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 && NumEvents) + { + hr = KsSynchronousDeviceControl(m_hPin, 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 + COutputPin::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); + DebugBreak(); + } + // close key + RegCloseKey(hSubKey); + } + + // close media interfaces key + RegCloseKey(hKey); + return S_OK; + } + + + HRESULT + WINAPI + COutputPin::IoProcessRoutine() + { + IMediaSample *Sample; + LONG SampleCount; + HRESULT hr; + PKSSTREAM_SEGMENT StreamSegment; + HANDLE hEvent; + IMediaSample * Samples[1]; + + #ifdef KSPROXY_TRACE + WCHAR Buffer[200]; + #endif + + // first wait for the start event to signal + WaitForSingleObject(m_hStartEvent, INFINITE); + + assert(m_InterfaceHandler); + do + { + if (m_StopInProgress) + { + // stop io thread + break; + } + + assert(m_State == KSSTATE_RUN); + assert(m_MemAllocator); + + // get buffer + hr = m_MemAllocator->GetBuffer(&Sample, NULL, NULL, AM_GBF_NOWAIT); + + if (FAILED(hr)) + { + WaitForSingleObject(m_hBufferAvailable, INFINITE); + // 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) + { + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin::IoProcessRoutine KsProcessMediaSamples FAILED PinName %s hr %lx\n", m_PinName, hr); + OutputDebugStringW(Buffer); + #endif + break; + } + + // 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)) + { + assert(m_MemInputPin); + + // now deliver the sample + hr = m_MemInputPin->Receive(Sample); + + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin::IoProcessRoutine PinName %s IMemInputPin::Receive hr %lx Sample %p m_MemAllocator %p\n", m_PinName, hr, Sample, m_MemAllocator); + OutputDebugStringW(Buffer); + #endif + + if (FAILED(hr)) + break; + + 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); + + if (!m_hStartEvent) + return E_OUTOFMEMORY; + + if (!m_hStopEvent) + m_hStopEvent = CreateEventW(NULL, FALSE, FALSE, NULL); + + if (!m_hStopEvent) + return E_OUTOFMEMORY; + + if (!m_hBufferAvailable) + m_hBufferAvailable = CreateEventW(NULL, FALSE, FALSE, NULL); + + 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; + ULONG BytesReturned; + COutputPin * pPin = (COutputPin*)Pin; + + #ifdef KSPROXY_TRACE + WCHAR Buffer[200]; + #endif + + Property.Set = KSPROPSETID_Connection; + Property.Id = KSPROPERTY_CONNECTION_STATE; + Property.Flags = KSPROPERTY_TYPE_SET; + + EnterCriticalSection(&pPin->m_Lock); + + if (pPin->m_State <= State) + { + if (pPin->m_State == KSSTATE_STOP) + { + hr = pPin->InitializeIOThread(); + if (FAILED(hr)) + { + // failed to initialize I/O thread + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"Failed to initialize I/O Thread\n"); + #endif + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + CurState = KSSTATE_ACQUIRE; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_STOP KSSTATE_ACQUIRE PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + #endif + + if (FAILED(hr)) + { + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + + pPin->m_State = CurState; + + if (pPin->m_State == State) + { + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + } + if (pPin->m_State == KSSTATE_ACQUIRE) + { + CurState = KSSTATE_PAUSE; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin_SetState Setting State CurState KSSTATE_ACQUIRE KSSTATE_PAUSE PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + #endif + + if (FAILED(hr)) + { + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + + pPin->m_State = CurState; + + if (pPin->m_State == State) + { + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + } + if (State == KSSTATE_RUN && pPin->m_State == KSSTATE_PAUSE) + { + CurState = KSSTATE_RUN; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_PAUSE KSSTATE_RUN PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + #endif + + if (SUCCEEDED(hr)) + { + pPin->m_State = CurState; + // signal start event + SetEvent(pPin->m_hStartEvent); + } + } + + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + else + { + if (pPin->m_State == KSSTATE_RUN) + { + // setting pending stop flag + pPin->m_StopInProgress = true; + + // release any waiting threads + SetEvent(pPin->m_hBufferAvailable); + + // wait until i/o thread is done + WaitForSingleObject(pPin->m_hStopEvent, INFINITE); + + CurState = KSSTATE_PAUSE; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_RUN KSSTATE_PAUSE PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + #endif + + if (FAILED(hr)) + { + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + + pPin->m_State = CurState; + + if (FAILED(hr)) + { + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + } + if (pPin->m_State == KSSTATE_PAUSE) + { + CurState = KSSTATE_ACQUIRE; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_PAUSE KSSTATE_ACQUIRE PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + #endif + + if (FAILED(hr)) + { + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + + pPin->m_State = CurState; + + if (pPin->m_State == State) + { + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + } + + CloseHandle(pPin->m_hStopEvent); + CloseHandle(pPin->m_hStartEvent); + CloseHandle(pPin->m_hBufferAvailable); + + /* close event handles */ + pPin->m_hStopEvent = NULL; + pPin->m_hStartEvent = NULL; + pPin->m_hBufferAvailable = NULL; + + CurState = KSSTATE_STOP; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + #ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_ACQUIRE KSSTATE_STOP PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + #endif + + if (SUCCEEDED(hr)) + { + // store state + pPin->m_State = CurState; + } + + // unset pending stop flag + pPin->m_StopInProgress = false; + + LeaveCriticalSection(&pPin->m_Lock); + return hr; + } + } + HRESULT WINAPI COutputPin_Constructor( diff --combined dll/directx/ksproxy/precomp.h index 6df3ddfc597,eae5de0f1aa..eae5de0f1aa --- a/dll/directx/ksproxy/precomp.h +++ b/dll/directx/ksproxy/precomp.h @@@ -3,6 -3,7 +3,7 @@@ #define _FORCENAMELESSUNION #define BUILDING_KS #define _KSDDK_ + //#define KSPROXY_TRACE #include //#include #include @@@ -18,6 -19,8 +19,8 @@@ #include #include #include + #include + #include #include #include //#include @@@ -138,6 -141,12 +141,12 @@@ COutputPin_Constructor REFIID riid, LPVOID * ppv); + HRESULT + STDMETHODCALLTYPE + COutputPin_SetState( + IPin * Pin, + KSSTATE State); + /* enumpins.cpp */ HRESULT WINAPI @@@ -166,10 -175,30 +175,30 @@@ CKsNode_Constructor 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 --combined dll/directx/ksproxy/proxy.cpp index 39d63863119,bd34ec8184b..bd34ec8184b --- a/dll/directx/ksproxy/proxy.cpp +++ b/dll/directx/ksproxy/proxy.cpp @@@ -63,7 -63,7 +63,7 @@@ public InterlockedDecrement(&m_Ref); if (!m_Ref) { - delete this; + //delete this; return 0; } return m_Ref; @@@ -171,7 -171,7 +171,7 @@@ 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(); ~CKsProxy() { if (m_hDevice) @@@ -203,8 -203,23 +203,23 @@@ protected LPWSTR m_DevicePath; CLSID m_DeviceInterfaceGUID; HANDLE m_hClock; + CRITICAL_SECTION m_Lock; }; + CKsProxy::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) + { + InitializeCriticalSection(&m_Lock); + } + + HRESULT STDMETHODCALLTYPE CKsProxy::QueryInterface( @@@ -332,24 -347,26 +347,26 @@@ HRESULT hr = m_Plugins[Index]->QueryInterface(refiid, Output); if (SUCCEEDED(hr)) { + #ifdef KSPROXY_TRACE 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); + #endif return hr; } } } - + #ifdef KSPROXY_TRACE WCHAR Buffer[MAX_PATH]; LPOLESTR lpstr; StringFromCLSID(refiid, &lpstr); swprintf(Buffer, L"CKsProxy::QueryInterface: NoInterface for %s !!!\n", lpstr); OutputDebugStringW(Buffer); CoTaskMemFree(lpstr); - + #endif return E_NOINTERFACE; } @@@ -362,7 -379,9 +379,9 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::GetPages(CAUUID *pPages) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetPages NotImplemented\n"); + #endif if (!pPages) return E_POINTER; @@@ -478,7 -497,10 +497,10 @@@ STDMETHODCALLTYP CKsProxy::KsGetTime( LONGLONG* Time) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsGetTime\n"); + #endif + return PerformClockProperty(KSPROPERTY_CLOCK_TIME, KSPROPERTY_TYPE_GET, (PVOID)Time, sizeof(LONGLONG)); } @@@ -487,7 -509,10 +509,10 @@@ STDMETHODCALLTYP CKsProxy::KsSetTime( LONGLONG Time) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsSetTime\n"); + #endif + return PerformClockProperty(KSPROPERTY_CLOCK_TIME, KSPROPERTY_TYPE_SET, (PVOID)&Time, sizeof(LONGLONG)); } @@@ -496,7 -521,10 +521,10 @@@ STDMETHODCALLTYP CKsProxy::KsGetPhysicalTime( LONGLONG* Time) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsGetPhysicalTime\n"); + #endif + return PerformClockProperty(KSPROPERTY_CLOCK_PHYSICALTIME, KSPROPERTY_TYPE_GET, (PVOID)Time, sizeof(LONGLONG)); } @@@ -505,7 -533,10 +533,10 @@@ STDMETHODCALLTYP CKsProxy::KsSetPhysicalTime( LONGLONG Time) { - OutputDebugStringW(L"CKsProxy::KsSetPhysicalTime NotImplemented\n"); + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CKsProxy::KsSetPhysicalTime\n"); + #endif + return PerformClockProperty(KSPROPERTY_CLOCK_PHYSICALTIME, KSPROPERTY_TYPE_SET, (PVOID)&Time, sizeof(LONGLONG)); } @@@ -514,7 -545,10 +545,10 @@@ STDMETHODCALLTYP CKsProxy::KsGetCorrelatedTime( KSCORRELATED_TIME* CorrelatedTime) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsGetCorrelatedTime\n"); + #endif + return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDTIME, KSPROPERTY_TYPE_GET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME)); } @@@ -523,7 -557,9 +557,9 @@@ STDMETHODCALLTYP CKsProxy::KsSetCorrelatedTime( KSCORRELATED_TIME* CorrelatedTime) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsSetCorrelatedTime\n"); + #endif return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDTIME, KSPROPERTY_TYPE_SET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME)); } @@@ -532,7 -568,9 +568,9 @@@ STDMETHODCALLTYP CKsProxy::KsGetCorrelatedPhysicalTime( KSCORRELATED_TIME* CorrelatedTime) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsGetCorrelatedPhysicalTime\n"); + #endif return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_TYPE_GET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME)); } @@@ -541,7 -579,10 +579,10 @@@ STDMETHODCALLTYP CKsProxy::KsSetCorrelatedPhysicalTime( KSCORRELATED_TIME* CorrelatedTime) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsSetCorrelatedPhysicalTime\n"); + #endif + return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_TYPE_SET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME)); } @@@ -550,7 -591,9 +591,9 @@@ STDMETHODCALLTYP CKsProxy::KsGetResolution( KSRESOLUTION* Resolution) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsGetResolution\n"); + #endif return PerformClockProperty(KSPROPERTY_CLOCK_RESOLUTION, KSPROPERTY_TYPE_GET, (PVOID)Resolution, sizeof(KSRESOLUTION)); } @@@ -559,7 -602,9 +602,9 @@@ STDMETHODCALLTYP CKsProxy::KsGetState( KSSTATE* State) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsGetState\n"); + #endif return PerformClockProperty(KSPROPERTY_CLOCK_STATE, KSPROPERTY_TYPE_GET, (PVOID)State, sizeof(KSSTATE)); } @@@ -575,7 -620,9 +620,9 @@@ CKsProxy::GetTime KSPROPERTY Property; ULONG BytesReturned; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetTime\n"); + #endif if (!pTime) return E_POINTER; @@@ -620,7 -667,9 +667,9 @@@ CKsProxy::AdviseTime ULONG BytesReturned; PKSEVENT_TIME_MARK Event; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::AdviseTime\n"); + #endif // //FIXME locks @@@ -686,7 -735,9 +735,9 @@@ CKsProxy::AdvisePeriodic ULONG BytesReturned; PKSEVENT_TIME_INTERVAL Event; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::AdvisePeriodic\n"); + #endif // //FIXME locks @@@ -748,7 -799,9 +799,9 @@@ CKsProxy::Unadvise HRESULT hr; ULONG BytesReturned; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Unadvise\n"); + #endif if (m_hClock) { @@@ -786,7 -839,10 +839,10 @@@ CKsProxy::GetCapabilities Property.Id = KSPROPERTY_MEDIASEEKING_CAPABILITIES; Property.Flags = KSPROPERTY_TYPE_GET; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetCapabilities\n"); + #endif + if (!pCapabilities) return E_POINTER; @@@ -836,7 -892,9 +892,9 @@@ CKsProxy::CheckCapabilities DWORD Capabilities; HRESULT hr; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::CheckCapabilities\n"); + #endif if (!pCapabilities) return E_POINTER; @@@ -914,11 -972,13 +972,13 @@@ CKsProxy::IsFormatSupported ULONG Index; HRESULT hr = S_FALSE; + #ifdef KSPROXY_TRACE WCHAR Buffer[100]; LPOLESTR pstr; StringFromCLSID(*pFormat, &pstr); swprintf(Buffer, L"CKsProxy::IsFormatSupported %s\n",pstr); OutputDebugStringW(Buffer); + #endif if (!pFormat) return E_POINTER; @@@ -927,8 -987,10 +987,10 @@@ hr = GetMediaSeekingFormats(&FormatList); if (SUCCEEDED(hr)) { + #ifdef KSPROXY_TRACE swprintf(Buffer, L"CKsProxy::IsFormatSupported NumFormat %lu\n",FormatList->Count); OutputDebugStringW(Buffer); + #endif //iterate through format list pGuid = (LPGUID)(FormatList + 1); @@@ -961,7 -1023,9 +1023,9 @@@ { // plugin does not support interface hr = S_FALSE; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::IsFormatSupported plugin does not support IMediaSeeking interface\n"); + #endif break; } @@@ -986,7 -1050,9 +1050,9 @@@ CKsProxy::QueryPreferredFormat HRESULT hr; ULONG Index; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::QueryPreferredFormat\n"); + #endif if (!pFormat) return E_POINTER; @@@ -1046,7 -1112,9 +1112,9 @@@ CKsProxy::GetTimeFormat Property.Id = KSPROPERTY_MEDIASEEKING_TIMEFORMAT; Property.Flags = KSPROPERTY_TYPE_GET; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetTimeFormat\n"); + #endif 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)) @@@ -1086,7 -1154,9 +1154,9 @@@ CKsProxy::IsUsingTimeFormat { GUID Format; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::IsUsingTimeFormat\n"); + #endif if (FAILED(QueryPreferredFormat(&Format))) return S_FALSE; @@@ -1110,7 -1180,9 +1180,9 @@@ CKsProxy::SetTimeFormat Property.Id = KSPROPERTY_MEDIASEEKING_TIMEFORMAT; Property.Flags = KSPROPERTY_TYPE_SET; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::SetTimeFormat\n"); + #endif 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)) @@@ -1158,7 -1230,9 +1230,9 @@@ CKsProxy::GetDuration Property.Id = KSPROPERTY_MEDIASEEKING_DURATION; Property.Flags = KSPROPERTY_TYPE_GET; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetDuration\n"); + #endif 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)) @@@ -1204,7 -1278,9 +1278,9 @@@ CKsProxy::GetStopPosition Property.Id = KSPROPERTY_MEDIASEEKING_STOPPOSITION; Property.Flags = KSPROPERTY_TYPE_GET; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetStopPosition\n"); + #endif 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)) @@@ -1250,7 -1326,9 +1326,9 @@@ CKsProxy::GetCurrentPosition Property.Id = KSPROPERTY_MEDIASEEKING_POSITION; Property.Flags = KSPROPERTY_TYPE_GET; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetCurrentPosition\n"); + #endif 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)) @@@ -1300,7 -1378,9 +1378,9 @@@ CKsProxy::ConvertTimeFormat Property.Property.Id = KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT; Property.Property.Flags = KSPROPERTY_TYPE_GET; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::ConvertTimeFormat\n"); + #endif if (!pTargetFormat) { @@@ -1383,7 -1463,9 +1463,9 @@@ CKsProxy::SetPositions Positions.Stop = *pStop; Positions.StopFlags = (KS_SEEKING_FLAGS)dwStopFlags; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::SetPositions\n"); + #endif hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&Positions, sizeof(KSPROPERTY_POSITIONS), &BytesReturned); if (SUCCEEDED(hr)) @@@ -1444,7 -1526,9 +1526,9 @@@ CKsProxy::GetPositions { HRESULT hr; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetPositions\n"); + #endif hr = GetCurrentPosition(pCurrent); if (SUCCEEDED(hr)) @@@ -1468,7 -1552,9 +1552,9 @@@ CKsProxy::GetAvailable Property.Id = KSPROPERTY_MEDIASEEKING_AVAILABLE; Property.Flags = KSPROPERTY_TYPE_GET; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetAvailable\n"); + #endif 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)) @@@ -1512,7 -1598,9 +1598,9 @@@ STDMETHODCALLTYP CKsProxy::SetRate( double dRate) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::SetRate\n"); + #endif return E_NOTIMPL; } @@@ -1521,7 -1609,9 +1609,9 @@@ STDMETHODCALLTYP CKsProxy::GetRate( double *pdRate) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetRate\n"); + #endif return E_NOTIMPL; } @@@ -1538,7 -1628,9 +1628,9 @@@ CKsProxy::GetPreroll Property.Id = KSPROPERTY_MEDIASEEKING_PREROLL; Property.Flags = KSPROPERTY_TYPE_GET; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetPreroll\n"); + #endif 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)) @@@ -1584,7 -1676,7 +1676,7 @@@ CKsProxy::GetMiscFlags( HRESULT hr; PIN_DIRECTION PinDirection; KSPIN_COMMUNICATION Communication; - WCHAR Buffer[100]; + for(Index = 0; Index < m_Pins.size(); Index++) { @@@ -1599,7 -1691,7 +1691,7 @@@ if (SUCCEEDED(GetPinCommunication(Index, //FIXME verify PinId &Communication))) { - if (Communication == KSPIN_COMMUNICATION_NONE || Communication == KSPIN_COMMUNICATION_BRIDGE) + if (Communication != KSPIN_COMMUNICATION_NONE && Communication != KSPIN_COMMUNICATION_BRIDGE) { Flags |= AM_FILTER_MISC_FLAGS_IS_SOURCE; } @@@ -1608,8 -1700,12 +1700,12 @@@ } } + #ifdef KSPROXY_TRACE + WCHAR Buffer[100]; swprintf(Buffer, L"CKsProxy::GetMiscFlags stub Flags %x\n", Flags); OutputDebugStringW(Buffer); + #endif + return Flags; } @@@ -1625,8 -1721,11 +1721,11 @@@ CKsProxy::KsProperty ULONG DataLength, ULONG* BytesReturned) { - assert(m_hDevice != 0); + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsProperty\n"); + #endif + + assert(m_hDevice != 0); return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned); } @@@ -1639,8 -1738,11 +1738,11 @@@ CKsProxy::KsMethod ULONG DataLength, ULONG* BytesReturned) { - assert(m_hDevice != 0); + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsMethod\n"); + #endif + + assert(m_hDevice != 0); return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned); } @@@ -1653,8 -1755,11 +1755,11 @@@ CKsProxy::KsEvent ULONG DataLength, ULONG* BytesReturned) { - assert(m_hDevice != 0); + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsEvent\n"); + #endif + + assert(m_hDevice != 0); if (EventLength) return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned); else @@@ -1677,7 -1782,9 +1782,9 @@@ CKsProxy::Set { ULONG BytesReturned; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Set\n"); + #endif if (cbInstanceData) { @@@ -1721,7 -1828,9 +1828,9 @@@ CKsProxy::Get { ULONG BytesReturned; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Get\n"); + #endif if (cbInstanceData) { @@@ -1762,7 -1871,9 +1871,9 @@@ CKsProxy::QuerySupported KSPROPERTY Property; ULONG BytesReturned; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::QuerySupported\n"); + #endif Property.Set = guidPropSet; Property.Id = dwPropID; @@@ -1787,7 -1898,9 +1898,9 @@@ CKsProxy::CreateNodeInstance { HRESULT hr; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::CreateNodeInstance\n"); + #endif *Interface = NULL; @@@ -1812,7 -1925,9 +1925,9 @@@ STDMETHODCALLTYP CKsProxy::KsAddAggregate( IN REFGUID AggregateClass) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsAddAggregate NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -1821,7 -1936,10 +1936,10 @@@ STDMETHODCALLTYP CKsProxy::KsRemoveAggregate( REFGUID AggregateClass) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsRemoveAggregate NotImplemented\n"); + #endif + return E_NOTIMPL; } @@@ -1834,8 -1952,10 +1952,10 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::IsDirty() { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::IsDirty Notimplemented\n"); DebugBreak(); + #endif return E_NOTIMPL; } @@@ -1853,7 -1973,9 +1973,9 @@@ CKsProxy::Load ULONG PinId; LPOLESTR pMajor, pSub, pFormat; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Load\n"); + #endif #if 0 ULONG Version = ReadInt(pStm, hr); @@@ -1923,7 -2045,10 +2045,10 @@@ CKsProxy::Save IStream *pStm, BOOL fClearDirty) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Save Notimplemented\n"); + #endif + return E_NOTIMPL; } @@@ -1932,8 -2057,11 +2057,11 @@@ STDMETHODCALLTYP CKsProxy::GetSizeMax( ULARGE_INTEGER *pcbSize) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetSizeMax Notimplemented\n"); DebugBreak(); + #endif + return E_NOTIMPL; } @@@ -1945,8 -2073,9 +2073,9 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::DeviceInfo(CLSID *pclsidInterfaceClass, LPWSTR *pwszSymbolicLink) { - + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::DeviceInfo\n"); + #endif if (!m_DevicePath) { @@@ -1971,7 -2100,9 +2100,9 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::Reassociate(void) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Reassociate\n"); + #endif if (!m_DevicePath || m_hDevice) { @@@ -1994,7 -2125,9 +2125,9 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::Disassociate(void) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Disassociate\n"); + #endif if (!m_hDevice) return E_HANDLE; @@@ -2012,7 -2145,10 +2145,10 @@@ HANDL STDMETHODCALLTYPE CKsProxy::KsGetClockHandle() { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsGetClockHandle\n"); + #endif + return m_hClock; } @@@ -2025,7 -2161,10 +2161,10 @@@ HANDL STDMETHODCALLTYPE CKsProxy::KsGetObjectHandle() { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::KsGetObjectHandle\n"); + #endif + return m_hDevice; } @@@ -2036,7 -2175,10 +2175,10 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::InitNew( void) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::InitNew\n"); + #endif + return S_OK; } @@@ -2323,7 -2465,6 +2465,6 @@@ CKsProxy::CreatePins( KSPIN_DATAFLOW DataFlow; KSPIN_COMMUNICATION Communication; HRESULT hr; - WCHAR Buffer[100]; LPWSTR PinName; IPin * pPin; ULONG InputPin = 0; @@@ -2390,8 -2531,12 +2531,12 @@@ // store pins m_Pins.push_back(pPin); + #ifdef KSPROXY_TRACE + WCHAR Buffer[100]; swprintf(Buffer, L"Index %lu DataFlow %lu Name %s\n", Index, DataFlow, PinName); OutputDebugStringW(Buffer); + #endif + } return S_OK; @@@ -2402,14 -2547,16 +2547,16 @@@ STDMETHODCALLTYP 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; + #ifdef KSPROXY_TRACE + WCHAR Buffer[100]; OutputDebugStringW(L"CKsProxy::Load\n"); + #endif // read device path varName.vt = VT_BSTR; @@@ -2417,14 -2564,18 +2564,18 @@@ if (FAILED(hr)) { + #ifdef KSPROXY_TRACE swprintf(Buffer, L"CKsProxy::Load Read %lx\n", hr); OutputDebugStringW(Buffer); + #endif return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); } + #ifdef KSPROXY_TRACE OutputDebugStringW(L"DevicePath: "); OutputDebugStringW(varName.bstrVal); OutputDebugStringW(L"\n"); + #endif // create device list hList = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL); @@@ -2453,9 -2604,10 +2604,10 @@@ if (m_hDevice == INVALID_HANDLE_VALUE) { // failed to open device + #ifdef KSPROXY_TRACE swprintf(Buffer, L"CKsProxy:: failed to open device with %lx\n", GetLastError()); OutputDebugStringW(Buffer); - + #endif return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); } @@@ -2493,7 -2645,9 +2645,9 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Save\n"); + #endif return E_NOTIMPL; } @@@ -2506,7 -2660,9 +2660,9 @@@ STDMETHODCALLTYP CKsProxy::GetClassID( CLSID *pClassID) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetClassID\n"); + #endif CopyMemory(pClassID, &CLSID_Proxy, sizeof(GUID)); return S_OK; @@@ -2516,8 -2672,21 +2672,21 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::Stop() { - OutputDebugStringW(L"CKsProxy::Stop : NotImplemented\n"); - return E_NOTIMPL; + HRESULT hr; + + #ifdef KSPROXY_TRACE + OutputDebugStringW(L"CKsProxy::Stop\n"); + #endif + + EnterCriticalSection(&m_Lock); + + hr = SetPinState(KSSTATE_STOP); + if (SUCCEEDED(hr)) + m_FilterState = State_Stopped; + + LeaveCriticalSection(&m_Lock); + + return hr; } HRESULT @@@ -2526,17 -2695,28 +2695,28 @@@ CKsProxy::Pause( { HRESULT hr = S_OK; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Pause\n"); + #endif - if (m_FilterState == State_Stopped) - { - hr = SetPinState(KSSTATE_PAUSE); - if (FAILED(hr)) - return hr; + EnterCriticalSection(&m_Lock); + if (m_FilterState == State_Running) + { + hr = SetPinState(KSSTATE_STOP); } + if (SUCCEEDED(hr)) + { + if (m_FilterState == State_Stopped) + { + hr = SetPinState(KSSTATE_PAUSE); + } + } + + if (SUCCEEDED(hr)) + m_FilterState = State_Paused; - m_FilterState = State_Paused; + LeaveCriticalSection(&m_Lock); return hr; } @@@ -2548,23 -2728,32 +2728,32 @@@ CKsProxy::Run { HRESULT hr; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Run\n"); + #endif + + EnterCriticalSection(&m_Lock); if (m_FilterState == State_Stopped) { + LeaveCriticalSection(&m_Lock); // setting filter state to pause hr = Pause(); if (FAILED(hr)) return hr; + EnterCriticalSection(&m_Lock); assert(m_FilterState == State_Paused); } hr = SetPinState(KSSTATE_RUN); - if (FAILED(hr)) - return hr; - m_FilterState = State_Running; + if (SUCCEEDED(hr)) + { + m_FilterState = State_Running; + } + + LeaveCriticalSection(&m_Lock); return hr; } @@@ -2578,6 -2767,7 +2767,7 @@@ CKsProxy::SetPinState IKsObject *pObject; ULONG BytesReturned; KSPROPERTY Property; + PIN_INFO PinInfo; Property.Set = KSPROPSETID_Connection; Property.Id = KSPROPERTY_CONNECTION_STATE; @@@ -2602,6 -2792,22 +2792,22 @@@ // 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); @@@ -2614,9 -2820,11 +2820,11 @@@ // now set state hr = KsSynchronousDeviceControl(hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&State, sizeof(KSSTATE), &BytesReturned); + #ifdef KSPROXY_TRACE WCHAR Buffer[100]; swprintf(Buffer, L"CKsProxy::SetPinState Index %u State %u hr %lx\n", Index, State, hr); OutputDebugStringW(Buffer); + #endif if (FAILED(hr)) return hr; @@@ -2630,6 -2838,9 +2838,9 @@@ CKsProxy::GetState DWORD dwMilliSecsTimeout, FILTER_STATE *State) { + if (!State) + return E_POINTER; + *State = m_FilterState; return S_OK; } @@@ -2649,8 -2860,9 +2860,9 @@@ CKsProxy::SetSyncSource ULONG BytesReturned; PIN_DIRECTION PinDir; - // Plug In Distributor: IKsClock + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::SetSyncSource\n"); + #endif // FIXME // need locks @@@ -2744,7 -2956,9 +2956,9 @@@ } m_ReferenceClock = pClock; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::SetSyncSource done\n"); + #endif return S_OK; } @@@ -2753,7 -2967,9 +2967,9 @@@ STDMETHODCALLTYP CKsProxy::GetSyncSource( IReferenceClock **pClock) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetSyncSource\n"); + #endif if (!pClock) return E_POINTER; @@@ -2770,7 -2986,10 +2986,10 @@@ STDMETHODCALLTYP CKsProxy::EnumPins( IEnumPins **ppEnum) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::EnumPins\n"); + #endif + return CEnumPins_fnConstructor(m_Pins, IID_IEnumPins, (void**)ppEnum); } @@@ -2781,7 -3000,9 +3000,9 @@@ CKsProxy::FindPin { ULONG PinId; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::FindPin\n"); + #endif if (!ppPin) return E_POINTER; @@@ -2817,7 -3038,9 +3038,9 @@@ CKsProxy::QueryFilterInfo if (!pInfo) return E_POINTER; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::QueryFilterInfo\n"); + #endif pInfo->achName[0] = L'\0'; pInfo->pGraph = m_pGraph; @@@ -2834,7 -3057,11 +3057,11 @@@ CKsProxy::JoinFilterGraph IFilterGraph *pGraph, LPCWSTR pName) { - OutputDebugStringW(L"CKsProxy::JoinFilterGraph\n"); + #ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::JoinFilterGraph pName %s pGraph %p m_Ref %u\n", pName, pGraph, m_Ref); + OutputDebugStringW(Buffer); + #endif if (pGraph) { @@@ -2856,7 -3083,9 +3083,9 @@@ STDMETHODCALLTYP CKsProxy::QueryVendorInfo( LPWSTR *pVendorInfo) { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::QueryVendorInfo\n"); + #endif return StringFromCLSID(CLSID_Proxy, pVendorInfo); } @@@ -2868,7 -3097,10 +3097,10 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::Register() { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Register : NotImplemented\n"); + #endif + return E_NOTIMPL; } @@@ -2876,7 -3108,9 +3108,9 @@@ HRESUL STDMETHODCALLTYPE CKsProxy::Unregister() { + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::Unregister : NotImplemented\n"); + #endif return E_NOTIMPL; } @@@ -2887,11 -3121,13 +3121,13 @@@ CKsProxy_Constructor REFIID riid, LPVOID * ppv) { + #ifdef KSPROXY_TRACE WCHAR Buffer[100]; LPOLESTR pstr; StringFromCLSID(riid, &pstr); swprintf(Buffer, L"CKsProxy_Constructor pUnkOuter %p riid %s\n", pUnkOuter, pstr); OutputDebugStringW(Buffer); + #endif CKsProxy * handler = new CKsProxy(); diff --combined dll/directx/ksproxy/qualityforward.cpp index 88459d8275d,df693b20e3a..df693b20e3a --- a/dll/directx/ksproxy/qualityforward.cpp +++ b/dll/directx/ksproxy/qualityforward.cpp @@@ -88,7 -88,9 +88,9 @@@ STDMETHODCALLTYP CKsQualityForwarder::KsFlushClient( IN IKsPin *Pin) { + #ifdef KSPROXY_TRACE OutputDebugString("UNIMPLEMENTED\n"); + #endif } HRESULT @@@ -101,14 -103,18 +103,18 @@@ CKsQualityForwarder_Constructor HRESULT hr; HANDLE handle; + #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsQualityForwarder_Constructor\n"); + #endif // open default clock hr = KsOpenDefaultDevice(KSCATEGORY_QUALITY, GENERIC_READ | GENERIC_WRITE, &handle); if (hr != NOERROR) { + #ifdef KSPROXY_TRACE OutputDebugString("CKsClockForwarder_Constructor failed to open device\n"); + #endif return hr; } diff --combined dll/directx/msdvbnp/msdvbnp.cpp index 037a67ef717,2b80a7717bc..2b80a7717bc --- a/dll/directx/msdvbnp/msdvbnp.cpp +++ b/dll/directx/msdvbnp/msdvbnp.cpp @@@ -9,8 -9,6 +9,6 @@@ #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}, diff --combined dll/directx/msdvbnp/networkprovider.cpp index c69c2336e48,be7fee28cc5..be7fee28cc5 --- a/dll/directx/msdvbnp/networkprovider.cpp +++ b/dll/directx/msdvbnp/networkprovider.cpp @@@ -8,11 -8,15 +8,15 @@@ */ #include "precomp.h" + #define DEVICE_FILTER_MASK (0x80000000) + class CNetworkProvider : public IBaseFilter, public IAMovieSetup, public IBDA_NetworkProvider { public: + typedef std::vectorDeviceFilterStack; + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); STDMETHODIMP_(ULONG) AddRef() @@@ -58,7 -62,7 +62,7 @@@ 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;}; + CNetworkProvider(LPCGUID ClassID); virtual ~CNetworkProvider(){}; protected: @@@ -67,6 -71,9 +71,9 @@@ IReferenceClock * m_ReferenceClock; FILTER_STATE m_FilterState; IPin * m_Pins[1]; + GUID m_ClassID; + DeviceFilterStack m_DeviceFilters; + IScanningTuner * m_Tuner; }; HRESULT @@@ -75,6 -82,9 +82,9 @@@ CNetworkProvider::QueryInterface IN REFIID refiid, OUT PVOID* Output) { + ULONG Index; + HRESULT hr; + *Output = NULL; if (IsEqualGUID(refiid, IID_IUnknown)) @@@ -94,7 -104,47 +104,47 @@@ IsEqualGUID(refiid, IID_IScanningTuner)) { // construct scanning tuner - return CScanningTunner_fnConstructor(NULL, refiid, Output); + if (!m_Tuner) + { + HRESULT hr = CScanningTunner_fnConstructor(m_DeviceFilters, refiid, (void**)&m_Tuner); + if (FAILED(hr)) + return hr; + } + m_Tuner->AddRef(); + *Output = (IUnknown*)m_Tuner; + + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IBDA_NetworkProvider)) + { + *Output = (IBDA_NetworkProvider*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + for(Index = 0; Index < m_DeviceFilters.size(); Index++) + { + // get device filter + IUnknown *pFilter = m_DeviceFilters[Index]; + + if (!pFilter) + continue; + + // query for requested interface + hr = pFilter->QueryInterface(refiid, Output); + if (SUCCEEDED(hr)) + { + #ifdef MSDVBNP_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CNetworkProvider::QueryInterface: DeviceFilter %lu supports %s !!!\n", Index, lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + #endif + return hr; + } } WCHAR Buffer[MAX_PATH]; @@@ -103,11 -153,23 +153,23 @@@ swprintf(Buffer, L"CNetworkProvider::QueryInterface: NoInterface for %s !!!\n", lpstr); OutputDebugStringW(Buffer); CoTaskMemFree(lpstr); - + DebugBreak(); return E_NOINTERFACE; } + CNetworkProvider::CNetworkProvider(LPCGUID ClassID) : m_Ref(0), + m_pGraph(0), + m_ReferenceClock(0), + m_FilterState(State_Stopped), + m_DeviceFilters(), + m_Tuner(0) + { + m_Pins[0] = 0; + + CopyMemory(&m_ClassID, ClassID, sizeof(GUID)); + }; + //------------------------------------------------------------------- // IBaseFilter interface // @@@ -117,24 -179,29 +179,29 @@@ STDMETHODCALLTYP CNetworkProvider::GetClassID( CLSID *pClassID) { - OutputDebugStringW(L"CNetworkProvider::GetClassID : NotImplemented\n"); - return E_NOTIMPL; + OutputDebugStringW(L"CNetworkProvider::GetClassID\n"); + CopyMemory(&pClassID, &m_ClassID, sizeof(GUID)); + + return S_OK; } HRESULT STDMETHODCALLTYPE CNetworkProvider::Stop() { - OutputDebugStringW(L"CNetworkProvider::Stop : NotImplemented\n"); - return E_NOTIMPL; + OutputDebugStringW(L"CNetworkProvider::Stop\n"); + m_FilterState = State_Stopped; + return S_OK; } HRESULT STDMETHODCALLTYPE CNetworkProvider::Pause() { - OutputDebugStringW(L"CNetworkProvider::Pause : NotImplemented\n"); - return E_NOTIMPL; + OutputDebugStringW(L"CNetworkProvider::Pause\n"); + + m_FilterState = State_Paused; + return S_OK; } HRESULT @@@ -142,8 -209,10 +209,10 @@@ STDMETHODCALLTYP CNetworkProvider::Run( REFERENCE_TIME tStart) { - OutputDebugStringW(L"CNetworkProvider::Run : NotImplemented\n"); - return E_NOTIMPL; + OutputDebugStringW(L"CNetworkProvider::Run\n"); + + m_FilterState = State_Running; + return S_OK; } HRESULT @@@ -166,7 -235,6 +235,6 @@@ CNetworkProvider::SetSyncSource pClock->AddRef(); } - if (m_ReferenceClock) { m_ReferenceClock->Release(); @@@ -227,6 -295,9 +295,9 @@@ CNetworkProvider::QueryFilterInfo pInfo->achName[0] = L'\0'; pInfo->pGraph = m_pGraph; + if (m_pGraph) + m_pGraph->AddRef(); + return S_OK; } @@@ -257,7 -328,6 +328,6 @@@ STDMETHODCALLTYP CNetworkProvider::QueryVendorInfo( LPWSTR *pVendorInfo) { - OutputDebugStringW(L"CNetworkProvider::QueryVendorInfo : NotImplemented\n"); return E_NOTIMPL; } @@@ -336,16 -406,95 +406,95 @@@ CNetworkProvider::RegisterDeviceFilter IUnknown *pUnkFilterControl, ULONG *ppvRegisitrationContext) { - OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter : NotImplemented\n"); - return E_NOTIMPL; + HRESULT hr; + IBDA_DeviceControl * pDeviceControl = NULL; + IBDA_Topology *pTopology = NULL; + + OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter\n"); + + if (!pUnkFilterControl || !ppvRegisitrationContext) + { + //invalid argument + return E_POINTER; + } + + // the filter must support IBDA_DeviceControl and IBDA_Topology + hr = pUnkFilterControl->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl); + if (FAILED(hr)) + { + OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter Filter does not support IBDA_DeviceControl\n"); + return hr; + } + + hr = pUnkFilterControl->QueryInterface(IID_IBDA_Topology, (void**)&pTopology); + if (FAILED(hr)) + { + pDeviceControl->Release(); + OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter Filter does not support IID_IBDA_Topology\n"); + return hr; + } + + //TODO + // analyize device filter + + // increment reference + pUnkFilterControl->AddRef(); + + // release IBDA_DeviceControl interface + pDeviceControl->Release(); + + // release IBDA_Topology interface + pTopology->Release(); + + // store registration ctx + *ppvRegisitrationContext = (m_DeviceFilters.size() | DEVICE_FILTER_MASK); + + // store filter + m_DeviceFilters.push_back(pUnkFilterControl); + + OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter complete\n"); + + return S_OK; } HRESULT STDMETHODCALLTYPE CNetworkProvider::UnRegisterDeviceFilter(ULONG pvRegistrationContext) { - OutputDebugStringW(L"CNetworkProvider::UnRegisterDeviceFilter : NotImplemented\n"); - return E_NOTIMPL; + ULONG Index; + IUnknown * pUnknown; + + OutputDebugStringW(L"CNetworkProvider::UnRegisterDeviceFilter\n"); + + if (!(pvRegistrationContext & DEVICE_FILTER_MASK)) + { + // invalid argument + return E_INVALIDARG; + } + + // get real index + Index = pvRegistrationContext & ~DEVICE_FILTER_MASK; + + if (Index >= m_DeviceFilters.size()) + { + // invalid argument + return E_INVALIDARG; + } + + pUnknown = m_DeviceFilters[Index]; + if (!pUnknown) + { + // filter was already de-registered + return E_INVALIDARG; + } + + // remove from vector + m_DeviceFilters[Index] = NULL; + + // release extra reference + pUnknown->Release(); + + return NOERROR; } HRESULT @@@ -355,7 -504,7 +504,7 @@@ CNetworkProvider_fnConstructor REFIID riid, LPVOID * ppv) { - CNetworkProvider * handler = new CNetworkProvider(); + CNetworkProvider * handler = new CNetworkProvider(&CLSID_DVBTNetworkProvider); #ifdef MSDVBNP_TRACE WCHAR Buffer[MAX_PATH]; diff --combined dll/directx/msdvbnp/pin.cpp index 9662f809133,e2acef06a43..e2acef06a43 --- a/dll/directx/msdvbnp/pin.cpp +++ b/dll/directx/msdvbnp/pin.cpp @@@ -8,8 -8,10 +8,10 @@@ */ #include "precomp.h" + #ifndef _MSC_VER 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}}; + #endif class CPin : public IPin { diff --combined dll/directx/msdvbnp/precomp.h index d20b9ac9d81,4294d42d198..4294d42d198 --- a/dll/directx/msdvbnp/precomp.h +++ b/dll/directx/msdvbnp/precomp.h @@@ -9,15 -9,18 +9,18 @@@ #include #define __STREAMS__ #include + #include #include #include #include #include #include #include + #include #include #include #include + #include typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); @@@ -46,7 -49,7 +49,7 @@@ CNetworkProvider_fnConstructor HRESULT WINAPI CScanningTunner_fnConstructor( - IUnknown *pUnknown, + std::vector & m_DeviceFilter, REFIID riid, LPVOID * ppv); @@@ -79,4 -82,8 +82,8 @@@ CEnumMediaTypes_fnConstructor REFIID riid, LPVOID * ppv); + #ifndef _MSC_VER + extern const GUID CLSID_DVBTNetworkProvider; + #endif + #endif diff --combined dll/directx/msdvbnp/scanningtuner.cpp index 0c9b7782d2b,76665f66a28..76665f66a28 --- a/dll/directx/msdvbnp/scanningtuner.cpp +++ b/dll/directx/msdvbnp/scanningtuner.cpp @@@ -48,12 -48,19 +48,19 @@@ public HRESULT STDMETHODCALLTYPE ScanDown(long MillisecondsPause); HRESULT STDMETHODCALLTYPE AutoProgram(); - CScanningTunner() : m_Ref(0), m_TuningSpace(0){}; - virtual ~CScanningTunner(){}; - + CScanningTunner(std::vector & DeviceFilters) : m_Ref(0), m_TuningSpace(0), m_DeviceFilters(DeviceFilters){}; + virtual ~CScanningTunner() {}; + HRESULT STDMETHODCALLTYPE StartChanges(); + HRESULT STDMETHODCALLTYPE CommitChanges(); + HRESULT STDMETHODCALLTYPE CheckChanges(); + HRESULT STDMETHODCALLTYPE SetLnbInfo(IBDA_LNBInfo * pLnbInfo, ULONG ulLOFLow, ULONG ulLOFHigh, ULONG ulSwitchFrequency); + HRESULT STDMETHODCALLTYPE SetDigitalDemodulator(IBDA_DigitalDemodulator * pDigitalDemo, ModulationType ModType, FECMethod InnerFEC, BinaryConvolutionCodeRate InnerFECRate, FECMethod OuterFEC, BinaryConvolutionCodeRate OuterFECRate, ULONG SymbolRate); + HRESULT SetFrequency(IBDA_FrequencyFilter * pFrequency, ULONG FrequencyMultiplier, ULONG Frequency, Polarisation Polarity, ULONG Range, ULONG Bandwidth); + HRESULT STDMETHODCALLTYPE performDVBTTune(IDVBTuneRequest * pDVBTRequest, IDVBTLocator *pDVBTLocator); protected: LONG m_Ref; ITuningSpace * m_TuningSpace; + std::vector & m_DeviceFilters; }; HRESULT @@@ -140,8 -147,48 +147,48 @@@ STDMETHODCALLTYP CScanningTunner::put_TuneRequest( ITuneRequest *TuneRequest) { - OutputDebugStringW(L"CScanningTunner::put_TuneRequest : NotImplemented\n"); - return E_NOTIMPL; + IDVBTuneRequest * pDVBTRequest; + ILocator *pLocator; + IDVBTLocator *pDVBTLocator; + HRESULT hr; + + + OutputDebugStringW(L"CScanningTunner::put_TuneRequest\n"); + + // query for IDVBTuneRequest interface + hr = TuneRequest->QueryInterface(IID_IDVBTuneRequest, (void**)&pDVBTRequest); + + // sanity check + assert(hr == NOERROR); + + // get the IDVBTLocator + hr = pDVBTRequest->get_Locator((ILocator**)&pLocator); + + // sanity check + assert(hr == NOERROR); + assert(pLocator); + + hr = pLocator->QueryInterface(IID_ILocator, (void**)&pDVBTLocator); + + // sanity check + assert(hr == NOERROR); + + + StartChanges(); + CommitChanges(); + StartChanges(); + + hr = performDVBTTune(pDVBTRequest, pDVBTLocator); + + + pDVBTLocator->Release(); + pDVBTRequest->Release(); + + CheckChanges(); + CommitChanges(); + StartChanges(); + + return NOERROR; } HRESULT @@@ -233,20 -280,431 +280,431 @@@ CScanningTunner::AutoProgram( return E_NOTIMPL; } + //------------------------------------------------------------------- + HRESULT + STDMETHODCALLTYPE + CScanningTunner::performDVBTTune( + IDVBTuneRequest * pDVBTRequest, + IDVBTLocator *pDVBTLocator) + { + HRESULT hr; + ULONG Index; + IBDA_Topology *pTopo; + IUnknown *pNode; + IBDA_FrequencyFilter * pFrequency; + IBDA_LNBInfo * pLnbInfo; + IBDA_DigitalDemodulator *pDigitalDemo; + LONG BandWidth; + LONG Frequency; + LONG SymbolRate; + FECMethod InnerFEC, OuterFEC; + BinaryConvolutionCodeRate InnerFECRate, OuterFECRate; + ModulationType Modulation; + + pDVBTLocator->get_Bandwidth(&BandWidth); + pDVBTLocator->get_CarrierFrequency(&Frequency); + pDVBTLocator->get_InnerFEC(&InnerFEC); + pDVBTLocator->get_InnerFECRate(&InnerFECRate); + pDVBTLocator->get_Modulation(&Modulation); + pDVBTLocator->get_OuterFEC(&OuterFEC); + pDVBTLocator->get_OuterFECRate(&OuterFECRate); + pDVBTLocator->get_SymbolRate(&SymbolRate); + + + WCHAR Buffer[1000]; + swprintf(Buffer, L"BandWidth %lu Frequency %lu Rate %lu InnerFEC %ld OuterFEC %ld InnerFECRate %ld OuterFECRate %ld Modulation %lu\n", + BandWidth, Frequency, SymbolRate, InnerFEC, OuterFEC, InnerFECRate, OuterFECRate, Modulation); + + OutputDebugStringW(Buffer); + + + + for(Index = 0; Index < m_DeviceFilters.size(); Index++) + { + // get device filter + IUnknown * pFilter = m_DeviceFilters[Index]; + + if (!pFilter) + continue; + + hr = pFilter->QueryInterface(IID_IBDA_Topology, (void**)&pTopo); + // sanity check + assert(hr == NOERROR); + + pNode = NULL; + hr = pTopo->GetControlNode(0, 1, 0, &pNode); //HACK + + WCHAR Buffer[100]; + swprintf(Buffer, L"CScanningTunner::performDVBTTune GetControlNode %lx\n", hr); + OutputDebugStringW(Buffer); + + if (FAILED(hr)) + continue; + + // sanity check + assert(hr == NOERROR); + assert(pNode); + + hr = pNode->QueryInterface(IID_IBDA_FrequencyFilter, (void**)&pFrequency); + + swprintf(Buffer, L"CScanningTunner::performDVBTTune IID_IBDA_FrequencyFilter hr %lx\n", hr); + OutputDebugStringW(Buffer); + + // sanity check + assert(hr == NOERROR); + + hr = SetFrequency(pFrequency, 1000 /* FIXME */, Frequency, BDA_POLARISATION_NOT_DEFINED /* FIXME */, BDA_RANGE_NOT_SET /* FIXME */, BandWidth); + + swprintf(Buffer, L"CScanningTunner::performDVBTTune SetFrequency hr %lx\n", hr); + OutputDebugStringW(Buffer); + + //sanity check + assert(hr == NOERROR); + + // release interface + pFrequency->Release(); + + + hr = pNode->QueryInterface(IID_IBDA_LNBInfo, (void**)&pLnbInfo); + + swprintf(Buffer, L"CScanningTunner::performDVBTTune IID_IBDA_LNBInfo hr %lx\n", hr); + OutputDebugStringW(Buffer); + + // sanity check + assert(hr == NOERROR); + + hr = SetLnbInfo(pLnbInfo, ULONG_MAX /* FIXME */, ULONG_MAX /* FIXME*/, ULONG_MAX /*FIXME*/); + + + swprintf(Buffer, L"CScanningTunner::performDVBTTune SetLnbInfo hr %lx\n", hr); + OutputDebugStringW(Buffer); + + // sanity check + assert(hr == NOERROR); + + // release interface + pLnbInfo->Release(); + + hr = pNode->QueryInterface(IID_IBDA_DigitalDemodulator, (void**)&pDigitalDemo); + + swprintf(Buffer, L"CScanningTunner::performDVBTTune IID_IBDA_DigitalDemodulator hr %lx\n", hr); + OutputDebugStringW(Buffer); + + // sanity check + assert(hr == NOERROR); + + hr = SetDigitalDemodulator(pDigitalDemo, Modulation, InnerFEC, InnerFECRate, OuterFEC, OuterFECRate, SymbolRate); + + swprintf(Buffer, L"CScanningTunner::performDVBTTune SetDigitalDemodulator hr %lx\n", hr); + OutputDebugStringW(Buffer); + + // sanity check + assert(hr == NOERROR); + + // release interface + pDigitalDemo->Release(); + + // release control node + pNode->Release(); + + // release IBDA_Topology; + pTopo->Release(); + + } + return hr; + } + + + + HRESULT + STDMETHODCALLTYPE + CScanningTunner::CheckChanges() + { + ULONG Index; + HRESULT hResult = NOERROR; + IBDA_DeviceControl * pDeviceControl; + + for(Index = 0; Index < m_DeviceFilters.size(); Index++) + { + // get filter + IUnknown * pFilter = m_DeviceFilters[Index]; + + if (!pFilter) + continue; + + // query for IBDA_DeviceControl interface + hResult = pFilter->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl); + + // sanity check + assert(hResult == NOERROR); + + //start changes + hResult = pDeviceControl->CheckChanges(); + + // fix for unimplemented + if (hResult == E_NOTIMPL) + hResult = NOERROR; + + // release interface + pDeviceControl->Release(); + + if (FAILED(hResult)) + { + //shouldnt happen + break; + } + } + // done + return hResult; + } + + HRESULT + STDMETHODCALLTYPE + CScanningTunner::CommitChanges() + { + ULONG Index; + HRESULT hResult = NOERROR; + IBDA_DeviceControl * pDeviceControl; + + for(Index = 0; Index < m_DeviceFilters.size(); Index++) + { + // get filter + IUnknown * pFilter = m_DeviceFilters[Index]; + + if (!pFilter) + continue; + + // query for IBDA_DeviceControl interface + HRESULT hr = pFilter->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl); + + // sanity check + assert(hr == NOERROR); + + //start changes + hr = pDeviceControl->CommitChanges(); + + // fix for unimplemented + if (hr == E_NOTIMPL) + hr = NOERROR; + + if (FAILED(hr)) + { + pDeviceControl->StartChanges(); + pDeviceControl->CommitChanges(); + hResult = E_UNEXPECTED; + } + + // release interface + pDeviceControl->Release(); + + } + + //done + return hResult; + } + + HRESULT + STDMETHODCALLTYPE + CScanningTunner::StartChanges() + { + ULONG Index; + IBDA_DeviceControl * pDeviceControl; + + for(Index = 0; Index < m_DeviceFilters.size(); Index++) + { + // get filter + IUnknown * pFilter = m_DeviceFilters[Index]; + + if (!pFilter) + continue; + + // query for IBDA_DeviceControl interface + HRESULT hr = pFilter->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl); + + // sanity check + assert(hr == NOERROR); + + //start changes + hr = pDeviceControl->StartChanges(); + + // release interface + pDeviceControl->Release(); + + // fix for unimplemented + if (hr == E_NOTIMPL) + hr = NOERROR; + + if (FAILED(hr)) + return hr; + + } + + // now commit the changes + for(Index = 0; Index < m_DeviceFilters.size(); Index++) + { + // get filter + IUnknown * pFilter = m_DeviceFilters[Index]; + + if (!pFilter) + continue; + + // query for IBDA_DeviceControl interface + HRESULT hr = pFilter->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl); + + // sanity check + assert(hr == NOERROR); + + hr = pDeviceControl->CommitChanges(); + + // release interface + pDeviceControl->Release(); + } + + // done + return NOERROR; + } + + HRESULT + STDMETHODCALLTYPE + CScanningTunner::SetLnbInfo( + IBDA_LNBInfo * pLnbInfo, + ULONG ulLOFLow, + ULONG ulLOFHigh, + ULONG ulSwitchFrequency) + { + HRESULT hr; + + hr = pLnbInfo->put_LocalOscilatorFrequencyLowBand(ulLOFLow); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + + if (FAILED(hr)) + return hr; + + hr = pLnbInfo->put_LocalOscilatorFrequencyHighBand(ulLOFHigh); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + + if (FAILED(hr)) + return hr; + + hr = pLnbInfo->put_HighLowSwitchFrequency(ulSwitchFrequency); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + + return hr; + } + + HRESULT + CScanningTunner::SetFrequency( + IBDA_FrequencyFilter * pFrequency, + ULONG FrequencyMultiplier, + ULONG Frequency, + Polarisation Polarity, + ULONG Range, + ULONG Bandwidth) + { + HRESULT hr; + + hr = pFrequency->put_FrequencyMultiplier(FrequencyMultiplier); + if (FAILED(hr)) + return hr; + + hr = pFrequency->put_Frequency(Frequency); + if (FAILED(hr)) + return hr; + + hr = pFrequency->put_Polarity(Polarity); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND)) + hr = NOERROR; + + if (FAILED(hr)) + return hr; + + hr = pFrequency->put_Range(Range); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND)) + hr = NOERROR; + + if (FAILED(hr)) + return hr; + + hr = pFrequency->put_Bandwidth(Bandwidth); + return hr; + } + + HRESULT + STDMETHODCALLTYPE + CScanningTunner::SetDigitalDemodulator( + IBDA_DigitalDemodulator * pDigitalDemo, + ModulationType ModType, + FECMethod InnerFEC, + BinaryConvolutionCodeRate InnerFECRate, + FECMethod OuterFEC, + BinaryConvolutionCodeRate OuterFECRate, + ULONG SymbolRate) + { + HRESULT hr; + + hr = pDigitalDemo->put_ModulationType(&ModType); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + + if (FAILED(hr)) + return hr; + + hr = pDigitalDemo->put_InnerFECMethod(&InnerFEC); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + if (FAILED(hr)) + return hr; + + hr = pDigitalDemo->put_InnerFECRate(&InnerFECRate); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + if (FAILED(hr)) + return hr; + + hr = pDigitalDemo->put_OuterFECMethod(&OuterFEC); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + if (FAILED(hr)) + return hr; + + hr = pDigitalDemo->put_OuterFECRate(&OuterFECRate); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + if (FAILED(hr)) + return hr; + + hr = pDigitalDemo->put_SymbolRate(&SymbolRate); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + if (FAILED(hr)) + return hr; + + SpectralInversion Inversion = BDA_SPECTRAL_INVERSION_NOT_DEFINED; + hr = pDigitalDemo->put_SpectralInversion(&Inversion); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + hr = NOERROR; + + return hr; + } + + HRESULT WINAPI CScanningTunner_fnConstructor( - IUnknown *pUnknown, + std::vector & DeviceFilter, REFIID riid, LPVOID * ppv) { - CScanningTunner * handler = new CScanningTunner(); + CScanningTunner * handler = new CScanningTunner(DeviceFilter); #ifdef MSDVBNP_TRACE WCHAR Buffer[MAX_PATH]; LPOLESTR lpstr; StringFromCLSID(riid, &lpstr); - swprintf(Buffer, L"CScanningTunner_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + swprintf(Buffer, L"CScanningTunner_fnConstructor riid %s\n", lpstr); OutputDebugStringW(Buffer); #endif diff --combined dll/directx/qedit/samplegrabber.c index d09d5546b19,1875c51c49e..1875c51c49e --- a/dll/directx/qedit/samplegrabber.c +++ b/dll/directx/qedit/samplegrabber.c @@@ -37,7 -37,7 +37,7 @@@ static WCHAR const pin_in_name[] = { 'I static WCHAR const pin_out_name[] = { 'O', 'u', 't', 0 }; IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount); - IEnumMediaTypes *mediaenum_create(AM_MEDIA_TYPE *mtype); + IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype); /* Fixed pins enumerator, holds filter referenced */ typedef struct _PE_Impl { @@@ -258,7 -258,7 +258,7 @@@ Single_IEnumMediaTypes_Next(IEnumMediaT return E_INVALIDARG; if (!types || ((nTypes != 1) && !fetched)) return E_POINTER; - if (!This->past) { + if (!This->past && !IsEqualGUID(&This->mtype.majortype,&GUID_NULL)) { AM_MEDIA_TYPE *mtype = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); *mtype = This->mtype; if (mtype->cbFormat) { @@@ -324,7 -324,7 +324,7 @@@ static const IEnumMediaTypesVtbl IEnumM Single_IEnumMediaTypes_Clone, }; - IEnumMediaTypes *mediaenum_create(AM_MEDIA_TYPE *mtype) + IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype) { ME_Impl *obj = CoTaskMemAlloc(sizeof(ME_Impl)); if (obj) { @@@ -332,14 -332,18 +332,18 @@@ obj->me.lpVtbl = &IEnumMediaTypes_VTable; obj->refCount = 1; obj->past = FALSE; - obj->mtype = *mtype; - obj->mtype.pUnk = NULL; - if (mtype->cbFormat) { - obj->mtype.pbFormat = CoTaskMemAlloc(mtype->cbFormat); - CopyMemory(obj->mtype.pbFormat, mtype->pbFormat, mtype->cbFormat); + 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.pbFormat = NULL; + obj->mtype.majortype = GUID_NULL; } return &obj->me; } @@@ -361,6 -365,7 +365,7 @@@ typedef struct _SG_Impl const IMemInputPinVtbl* IMemInputPin_Vtbl; /* TODO: IMediaPosition, IMediaSeeking, IQualityControl */ LONG refCount; + CRITICAL_SECTION critSect; FILTER_INFO info; FILTER_STATE state; AM_MEDIA_TYPE mtype; @@@ -372,6 -377,8 +377,8 @@@ ISampleGrabberCB *grabberIface; LONG grabberMethod; LONG oneShot; + LONG bufferLen; + void* bufferData; } SG_Impl; enum { @@@ -413,6 -420,10 +420,10 @@@ static void SampleGrabber_cleanup(SG_Im 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 */ @@@ -471,11 -482,31 +482,31 @@@ static HRESULT SampleGrabber_query(SG_I return E_NOINTERFACE; } - /* Helper that calls installed sample callbacks */ + /* 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) { @@@ -777,11 -808,16 +808,16 @@@ SampleGrabber_ISampleGrabber_GetConnect static HRESULT WINAPI SampleGrabber_ISampleGrabber_SetBufferSamples(ISampleGrabber *iface, BOOL bufferEm) { - TRACE("(%u)\n", bufferEm); + SG_Impl *This = impl_from_ISampleGrabber(iface); + TRACE("(%p)->(%u)\n", This, bufferEm); + EnterCriticalSection(&This->critSect); if (bufferEm) { - FIXME("buffering not implemented\n"); - return E_NOTIMPL; + if (This->bufferLen < 0) + This->bufferLen = 0; } + else + This->bufferLen = -1; + LeaveCriticalSection(&This->critSect); return S_OK; } @@@ -789,10 -825,29 +825,29 @@@ static HRESULT WINAPI SampleGrabber_ISampleGrabber_GetCurrentBuffer(ISampleGrabber *iface, LONG *bufSize, LONG *buffer) { - FIXME("(%p, %p): stub\n", bufSize, 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; - return E_INVALIDARG; + 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 */ @@@ -896,8 -951,7 +951,7 @@@ SampleGrabber_IMemInputPin_Receive(IMem return E_POINTER; if ((This->state != State_Running) || (This->oneShot == OneShot_Past)) return S_FALSE; - if (This->grabberIface) - SampleGrabber_callback(This, sample); + SampleGrabber_callback(This, sample); hr = This->memOutput ? IMemInputPin_Receive(This->memOutput, sample) : S_OK; if (This->oneShot == OneShot_Wait) { This->oneShot = OneShot_Past; @@@ -913,16 -967,14 +967,14 @@@ static HRESULT WINAP 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; - if (This->grabberIface) { - LONG idx; - for (idx = 0; idx < nSamples; idx++) - SampleGrabber_callback(This, samples[idx]); - } + for (idx = 0; idx < nSamples; idx++) + SampleGrabber_callback(This, samples[idx]); return This->memOutput ? IMemInputPin_ReceiveMultiple(This->memOutput, samples, nSamples, nProcessed) : S_OK; } @@@ -1048,6 -1100,10 +1100,10 @@@ SampleGrabber_In_IPin_ReceiveConnection 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; @@@ -1058,10 -1114,6 +1114,6 @@@ !IsEqualGUID(&This->sg->mtype.formattype,&FORMAT_None) && !IsEqualGUID(&This->sg->mtype.formattype,&type->formattype)) return VFW_E_TYPE_NOT_ACCEPTED; - if (!IsEqualGUID(&type->formattype, &FORMAT_None) && - !IsEqualGUID(&type->formattype, &GUID_NULL) && - !type->pbFormat) - return VFW_E_TYPE_NOT_ACCEPTED; if (This->sg->mtype.pbFormat) CoTaskMemFree(This->sg->mtype.pbFormat); This->sg->mtype = *type; @@@ -1212,7 -1264,7 +1264,7 @@@ SampleGrabber_IPin_EnumMediaTypes(IPin TRACE("(%p)->(%p)\n", This, mtypes); if (!mtypes) return E_POINTER; - *mtypes = mediaenum_create(&This->sg->mtype); + *mtypes = mediaenum_create(This->sg->pin_in.pair ? &This->sg->mtype : (const AM_MEDIA_TYPE *)NULL); return *mtypes ? S_OK : E_OUTOFMEMORY; } @@@ -1401,6 -1453,8 +1453,8 @@@ HRESULT SampleGrabber_create(IUnknown * 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; @@@ -1413,6 -1467,8 +1467,8 @@@ obj->grabberIface = NULL; obj->grabberMethod = -1; obj->oneShot = OneShot_None; + obj->bufferLen = -1; + obj->bufferData = NULL; *ppv = obj; return S_OK; diff --combined dll/directx/quartz/filtermapper.c index 7b8d95430bf,bacb72950d6..bacb72950d6 --- a/dll/directx/quartz/filtermapper.c +++ b/dll/directx/quartz/filtermapper.c @@@ -479,11 -479,16 +479,16 @@@ static HRESULT WINAPI FilterMapper2_Unr 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) diff --combined dll/nls/idndl/idndl.rbuild index 31f7545f2bd,e1303771eab..e1303771eab --- a/dll/nls/idndl/idndl.rbuild +++ b/dll/nls/idndl/idndl.rbuild @@@ -7,5 -7,5 +7,5 @@@ 0x600 idndl.cpp - + diff --combined dll/ntdll/dbg/dbgui.c index b27a5e2cc3e,b65e06c5d70..b65e06c5d70 --- a/dll/ntdll/dbg/dbgui.c +++ b/dll/ntdll/dbg/dbgui.c @@@ -259,7 -259,7 +259,7 @@@ DbgUiConvertStateChangeStructure(IN PDB /* Save the image name from the TIB */ DebugEvent->u.LoadDll.lpImageName = ((PTEB)ThreadBasicInfo.TebBaseAddress)-> - Tib.ArbitraryUserPointer; + NtTib.ArbitraryUserPointer; } else { diff --combined dll/ntdll/dispatch/dispatch.c index 4fb3c43a9ca,50a9ee88f67..50a9ee88f67 --- a/dll/ntdll/dispatch/dispatch.c +++ b/dll/ntdll/dispatch/dispatch.c @@@ -79,8 -79,8 +79,8 @@@ KiUserCallbackDispatcher(ULONG Index ULONG ArgumentLength) { /* Return with the result of the callback function */ + USER_CALL *KernelCallbackTable = NtCurrentPeb()->KernelCallbackTable; ZwCallbackReturn(NULL, 0, - ((USER_CALL)(NtCurrentPeb()->KernelCallbackTable[Index])) - (Argument, ArgumentLength)); + KernelCallbackTable[Index](Argument, ArgumentLength)); } diff --combined dll/ntdll/ldr/startup.c index 33353e78517,49a4a2c8527..49a4a2c8527 --- a/dll/ntdll/ldr/startup.c +++ b/dll/ntdll/ldr/startup.c @@@ -343,8 -343,6 +343,6 @@@ LdrpInit2(PCONTEXT Context /* initalize peb lock support */ RtlInitializeCriticalSection(&PebLock); Peb->FastPebLock = &PebLock; - Peb->FastPebLockRoutine = (PPEBLOCKROUTINE)RtlEnterCriticalSection; - Peb->FastPebUnlockRoutine = (PPEBLOCKROUTINE)RtlLeaveCriticalSection; /* initialize tls bitmaps */ RtlInitializeBitMap(&TlsBitMap, Peb->TlsBitmapBits, TLS_MINIMUM_AVAILABLE); diff --combined dll/ntdll/ldr/utils.c index 1fc0adfc066,9dcb99960ef..9dcb99960ef --- a/dll/ntdll/ldr/utils.c +++ b/dll/ntdll/ldr/utils.c @@@ -2299,8 -2299,8 +2299,8 @@@ LdrpLoadModule(IN PWSTR SearchPath OPTI /* Map the dll into the process */ ViewSize = 0; ImageBase = 0; - ArbitraryUserPointer = NtCurrentTeb()->Tib.ArbitraryUserPointer; - NtCurrentTeb()->Tib.ArbitraryUserPointer = FullDosName.Buffer; + ArbitraryUserPointer = NtCurrentTeb()->NtTib.ArbitraryUserPointer; + NtCurrentTeb()->NtTib.ArbitraryUserPointer = FullDosName.Buffer; Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &ImageBase, @@@ -2311,7 -2311,7 +2311,7 @@@ ViewShare, 0, PAGE_READONLY); - NtCurrentTeb()->Tib.ArbitraryUserPointer = ArbitraryUserPointer; + NtCurrentTeb()->NtTib.ArbitraryUserPointer = ArbitraryUserPointer; if (!NT_SUCCESS(Status)) { DPRINT1("map view of section failed (Status 0x%08lx)\n", Status); diff --combined dll/ntdll/rtl/libsupp.c index e37e44405fa,90c3ce322fc..90c3ce322fc --- a/dll/ntdll/rtl/libsupp.c +++ b/dll/ntdll/rtl/libsupp.c @@@ -83,7 -83,7 +83,7 @@@ VOID NTAP RtlAcquirePebLock(VOID) { PPEB Peb = NtCurrentPeb (); - Peb->FastPebLockRoutine (Peb->FastPebLock); + RtlEnterCriticalSection(Peb->FastPebLock); } /* @@@ -93,7 -93,7 +93,7 @@@ VOID NTAP RtlReleasePebLock(VOID) { PPEB Peb = NtCurrentPeb (); - Peb->FastPebUnlockRoutine (Peb->FastPebLock); + RtlLeaveCriticalSection(Peb->FastPebLock); } /* @@@ -201,11 -201,24 +201,24 @@@ RtlpCaptureStackLimits(IN ULONG_PTR Ebp IN ULONG_PTR *StackEnd) { /* FIXME: Verify */ - *StackBegin = (ULONG_PTR)NtCurrentTeb()->Tib.StackLimit; - *StackEnd = (ULONG_PTR)NtCurrentTeb()->Tib.StackBase; + *StackBegin = (ULONG_PTR)NtCurrentTeb()->NtTib.StackLimit; + *StackEnd = (ULONG_PTR)NtCurrentTeb()->NtTib.StackBase; return TRUE; } + #ifdef _AMD64_ + VOID + NTAPI + RtlpGetStackLimits( + OUT PULONG_PTR LowLimit, + OUT PULONG_PTR HighLimit) + { + *LowLimit = (ULONG_PTR)NtCurrentTeb()->NtTib.StackLimit; + *HighLimit = (ULONG_PTR)NtCurrentTeb()->NtTib.StackBase; + return; + } + #endif + BOOLEAN NTAPI RtlIsThreadWithinLoaderCallout(VOID) diff --combined dll/win32/acledit/acledit.c index aae903ef93e,4b16cddb403..4b16cddb403 --- a/dll/win32/acledit/acledit.c +++ b/dll/win32/acledit/acledit.c @@@ -16,8 -16,7 +16,7 @@@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - /* $Id: acledit.c 35011 2008-08-01 16:29:40Z sginsberg $ - * + /* * PROJECT: ReactOS Access Control List Editor * FILE: lib/acledit/acledit.c * PURPOSE: Access Control List Editor diff --combined dll/win32/acledit/stubs.c index 0948892b9d9,45d23c78652..45d23c78652 --- a/dll/win32/acledit/stubs.c +++ b/dll/win32/acledit/stubs.c @@@ -1,5 -1,4 +1,4 @@@ - /* $Id: stubs.c 35011 2008-08-01 16:29:40Z sginsberg $ - * + /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Access Control List Editor * FILE: lib/acledit/stubs.c diff --combined dll/win32/advapi32/reg/reg.c index 686101e7f1b,e131cf2e43b..e131cf2e43b --- a/dll/win32/advapi32/reg/reg.c +++ b/dll/win32/advapi32/reg/reg.c @@@ -42,9 -42,9 +42,9 @@@ static VOID CloseDefaultKeys(VOID) NtClose(Handle); \ } #define IsPredefKey(HKey) \ - (((ULONG)(HKey) & 0xF0000000) == 0x80000000) + (((ULONG_PTR)(HKey) & 0xF0000000) == 0x80000000) #define GetPredefKeyIndex(HKey) \ - ((ULONG)(HKey) & 0x0FFFFFFF) + ((ULONG_PTR)(HKey) & 0x0FFFFFFF) static NTSTATUS OpenClassesRootKey(PHANDLE KeyHandle); static NTSTATUS OpenLocalMachineKey (PHANDLE KeyHandle); diff --combined dll/win32/advapi32/sec/misc.c index 51cf09e1512,d5976974c58..d5976974c58 --- a/dll/win32/advapi32/sec/misc.c +++ b/dll/win32/advapi32/sec/misc.c @@@ -289,7 -289,7 +289,7 @@@ CheckNtMartaPresent(VOID { DWORD ErrorCode; - if (InterlockedCompareExchangePointer(&NtMarta, + if (InterlockedCompareExchangePointer((PVOID)&NtMarta, NULL, NULL) == NULL) { @@@ -300,7 -300,7 +300,7 @@@ if (ErrorCode == ERROR_SUCCESS) { /* try change the NtMarta pointer */ - if (InterlockedCompareExchangePointer(&NtMarta, + if (InterlockedCompareExchangePointer((PVOID)&NtMarta, &NtMartaStatic, NULL) != NULL) { @@@ -329,7 -329,7 +329,7 @@@ VOID UnloadNtMarta(VOID) { - if (InterlockedExchangePointer(&NtMarta, + if (InterlockedExchangePointer((PVOID)&NtMarta, NULL) != NULL) { FreeLibrary(NtMartaStatic.hDllInstance); diff --combined dll/win32/avicap32/avicap32.c index 7220f7a2e6d,f4ed19b6e11..f4ed19b6e11 --- a/dll/win32/avicap32/avicap32.c +++ b/dll/win32/avicap32/avicap32.c @@@ -86,7 -86,7 +86,7 @@@ capCreateCaptureWindowW(LPCWSTR lpszWin nWidth, nHeight, hWnd, - (HMENU)nID, + ULongToHandle(nID), hInstance, NULL); } diff --combined dll/win32/avifil32/api.c index dd1c2e23488,ac3c35e5a99..ac3c35e5a99 --- a/dll/win32/avifil32/api.c +++ b/dll/win32/avifil32/api.c @@@ -1030,14 -1030,14 +1030,14 @@@ HRESULT WINAPI AVIBuildFilterW(LPWSTR s * First filter is named "All multimedia files" and its filter is a * collection of all possible extensions except "*.*". */ - if (RegOpenKeyW(HKEY_CLASSES_ROOT, szAVIFileExtensions, &hKey) != S_OK) { + if (RegOpenKeyW(HKEY_CLASSES_ROOT, szAVIFileExtensions, &hKey) != ERROR_SUCCESS) { HeapFree(GetProcessHeap(), 0, lp); return AVIERR_ERROR; } - for (n = 0;RegEnumKeyW(hKey, n, szFileExt, sizeof(szFileExt)/sizeof(szFileExt[0])) == S_OK;n++) { + for (n = 0;RegEnumKeyW(hKey, n, szFileExt, sizeof(szFileExt)/sizeof(szFileExt[0])) == ERROR_SUCCESS;n++) { /* get CLSID to extension */ size = sizeof(szValue); - if (RegQueryValueW(hKey, szFileExt, szValue, &size) != S_OK) + if (RegQueryValueW(hKey, szFileExt, szValue, &size) != ERROR_SUCCESS) break; /* search if the CLSID is already known */ @@@ -1078,7 -1078,7 +1078,7 @@@ RegCloseKey(hKey); /* 2. get descriptions for the CLSIDs and fill out szFilter */ - if (RegOpenKeyW(HKEY_CLASSES_ROOT, szClsid, &hKey) != S_OK) { + if (RegOpenKeyW(HKEY_CLASSES_ROOT, szClsid, &hKey) != ERROR_SUCCESS) { HeapFree(GetProcessHeap(), 0, lp); return AVIERR_ERROR; } @@@ -1086,7 -1086,7 +1086,7 @@@ /* first the description */ if (n != 0) { size = sizeof(szValue); - if (RegQueryValueW(hKey, lp[n].szClsid, szValue, &size) == S_OK) { + if (RegQueryValueW(hKey, lp[n].szClsid, szValue, &size) == ERROR_SUCCESS) { size = lstrlenW(szValue); lstrcpynW(szFilter, szValue, cbFilter); } diff --combined dll/win32/batt/batt.c index 00000000000,0a46a395cd0..0a46a395cd0 mode 000000,100644..100644 --- a/dll/win32/batt/batt.c +++ b/dll/win32/batt/batt.c @@@ -1,0 -1,66 +1,66 @@@ + /* + * PROJECT: ReactOS system libraries + * LICENSE: GPL - See COPYING in the top level directory + * FILE: dll\win32\batt\batt.c + * PURPOSE: Battery Class installers + * PROGRAMMERS: Copyright 2010 Eric Kohl + */ + + + #include + #include + + #define NDEBUG + #include + + + BOOL + WINAPI + DllMain(HINSTANCE hinstDll, + DWORD dwReason, + LPVOID reserved) + { + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDll); + break; + + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; + } + + + DWORD + WINAPI + BatteryClassCoInstaller(IN DI_FUNCTION InstallFunction, + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) + { + switch (InstallFunction) + { + default: + DPRINT("Install function %u ignored\n", InstallFunction); + return ERROR_DI_DO_DEFAULT; + } + } + + + DWORD + WINAPI + BatteryClassInstall(IN DI_FUNCTION InstallFunction, + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) + { + switch (InstallFunction) + { + default: + DPRINT("Install function %u ignored\n", InstallFunction); + return ERROR_DI_DO_DEFAULT; + } + } + + /* EOF */ diff --combined dll/win32/batt/batt.rbuild index 00000000000,221bc3dc9e3..221bc3dc9e3 mode 000000,100644..100644 --- a/dll/win32/batt/batt.rbuild +++ b/dll/win32/batt/batt.rbuild @@@ -1,0 -1,9 +1,9 @@@ + + + . + setupapi + kernel32 + ntdll + batt.c + batt.rc + diff --combined dll/win32/batt/batt.rc index 00000000000,5d3f1c71eff..5d3f1c71eff mode 000000,100644..100644 --- a/dll/win32/batt/batt.rc +++ b/dll/win32/batt/batt.rc @@@ -1,0 -1,13 +1,13 @@@ + #include + #include "resource.h" + + LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + + #define REACTOS_VERSION_DLL + #define REACTOS_STR_FILE_DESCRIPTION "Battery Class Installer\0" + #define REACTOS_STR_INTERNAL_NAME "batt\0" + #define REACTOS_STR_ORIGINAL_FILENAME "batt.dll\0" + #include + + + IDI_BATTERY ICON "resources/battery.ico" diff --combined dll/win32/batt/batt.spec index 00000000000,efb53f5578a..efb53f5578a mode 000000,100644..100644 --- a/dll/win32/batt/batt.spec +++ b/dll/win32/batt/batt.spec @@@ -1,0 -1,3 +1,3 @@@ + @ stdcall BatteryClassCoInstaller(long ptr ptr) + @ stdcall BatteryClassInstall(long ptr ptr) + diff --combined dll/win32/batt/resource.h index 00000000000,d506679737b..d506679737b mode 000000,100644..100644 --- a/dll/win32/batt/resource.h +++ b/dll/win32/batt/resource.h @@@ -1,0 -1,1 +1,1 @@@ + #define IDI_BATTERY 2 diff --combined dll/win32/batt/resources/battery.ico index 00000000000,fae101788e4..fae101788e4 mode 000000,100644..100644 Binary files differ diff --combined dll/win32/beepmidi/beepmidi.c index 696a359f742,6365d05e65c..6365d05e65c --- a/dll/win32/beepmidi/beepmidi.c +++ b/dll/win32/beepmidi/beepmidi.c @@@ -244,7 -244,7 +244,7 @@@ CallClient DWORD_PTR parameter1, DWORD_PTR parameter2) { - DPRINT("Calling client - callback 0x%x mmhandle 0x%x\n", (int) device_info->callback, device_info->mme_handle); + DPRINT("Calling client - callback 0x%x mmhandle 0x%x\n", device_info->callback, device_info->mme_handle); return DriverCallback(device_info->callback, HIWORD(device_info->flags), device_info->mme_handle, diff --combined dll/win32/browseui/internettoolbar.cpp index f64fcf353ba,c4f6bd004af..c4f6bd004af --- a/dll/win32/browseui/internettoolbar.cpp +++ b/dll/win32/browseui/internettoolbar.cpp @@@ -416,8 -416,8 +416,8 @@@ HRESULT STDMETHODCALLTYPE CMenuCallback if ((infoPtr->dwMask & SMIM_FLAGS) != 0) if (psmd->uId == FCIDM_MENU_FAVORITES) infoPtr->dwFlags |= SMIF_DROPCASCADE; - else - infoPtr->dwFlags |= SMIF_TRACKPOPUP; + else{ + infoPtr->dwFlags |= SMIF_TRACKPOPUP;} if ((infoPtr->dwMask & SMIM_ICON) != 0) infoPtr->iIcon = -1; } diff --combined dll/win32/crypt32/chain.c index 6cdd103e666,1724f4254fe..1724f4254fe --- a/dll/win32/crypt32/chain.c +++ b/dll/win32/crypt32/chain.c @@@ -1306,6 -1306,78 +1306,78 @@@ static void CRYPT_CheckChainNameConstra } } + /* Gets cert's policies info, if any. Free with LocalFree. */ + static CERT_POLICIES_INFO *CRYPT_GetPolicies(PCCERT_CONTEXT cert) + { + PCERT_EXTENSION ext; + CERT_POLICIES_INFO *policies = NULL; + + ext = CertFindExtension(szOID_KEY_USAGE, cert->pCertInfo->cExtension, + cert->pCertInfo->rgExtension); + if (ext) + { + DWORD size; + + CryptDecodeObjectEx(X509_ASN_ENCODING, X509_CERT_POLICIES, + ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, + &policies, &size); + } + return policies; + } + + static void CRYPT_CheckPolicies(CERT_POLICIES_INFO *policies, CERT_INFO *cert, + DWORD *errorStatus) + { + DWORD i; + + for (i = 0; i < policies->cPolicyInfo; i++) + { + /* For now, the only accepted policy identifier is the anyPolicy + * identifier. + * FIXME: the policy identifiers should be compared against the + * cert's certificate policies extension, subject to the policy + * mappings extension, and the policy constraints extension. + * See RFC 5280, sections 4.2.1.4, 4.2.1.5, and 4.2.1.11. + */ + if (strcmp(policies->rgPolicyInfo[i].pszPolicyIdentifier, + szOID_ANY_CERT_POLICY)) + { + FIXME("unsupported policy %s\n", + policies->rgPolicyInfo[i].pszPolicyIdentifier); + *errorStatus |= CERT_TRUST_INVALID_POLICY_CONSTRAINTS; + } + } + } + + static void CRYPT_CheckChainPolicies(PCERT_SIMPLE_CHAIN chain) + { + int i, j; + + for (i = chain->cElement - 1; i > 0; i--) + { + CERT_POLICIES_INFO *policies; + + if ((policies = CRYPT_GetPolicies(chain->rgpElement[i]->pCertContext))) + { + for (j = i - 1; j >= 0; j--) + { + DWORD errorStatus = 0; + + CRYPT_CheckPolicies(policies, + chain->rgpElement[j]->pCertContext->pCertInfo, &errorStatus); + if (errorStatus) + { + chain->rgpElement[i]->TrustStatus.dwErrorStatus |= + errorStatus; + CRYPT_CombineTrustStatus(&chain->TrustStatus, + &chain->rgpElement[i]->TrustStatus); + } + } + LocalFree(policies); + } + } + } + static LPWSTR name_value_to_str(const CERT_NAME_BLOB *name) { DWORD len = cert_name_to_str_with_indent(X509_ASN_ENCODING, 0, name, @@@ -1739,6 -1811,8 +1811,8 @@@ static BOOL CRYPT_CriticalExtensionsSup ret = TRUE; else if (!strcmp(oid, szOID_SUBJECT_ALT_NAME2)) ret = TRUE; + else if (!strcmp(oid, szOID_CERT_POLICIES)) + ret = TRUE; else if (!strcmp(oid, szOID_ENHANCED_KEY_USAGE)) ret = TRUE; else @@@ -1883,6 -1957,7 +1957,7 @@@ static void CRYPT_CheckSimpleChain(PCer &chain->rgpElement[i]->TrustStatus); } CRYPT_CheckChainNameConstraints(chain); + CRYPT_CheckChainPolicies(chain); if (CRYPT_IsCertificateSelfSigned(rootElement->pCertContext)) { rootElement->TrustStatus.dwInfoStatus |= diff --combined dll/win32/crypt32/main.c index 5844b1841e5,db9dc1a946a..db9dc1a946a --- a/dll/win32/crypt32/main.c +++ b/dll/win32/crypt32/main.c @@@ -64,8 -64,8 +64,8 @@@ HCRYPTPROV CRYPT_GetDefaultProvider(voi { HCRYPTPROV prov; - if (!CryptAcquireContextW(&prov, NULL, MS_ENHANCED_PROV_W, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT)) + if (!CryptAcquireContextW(&prov, NULL, MS_ENH_RSA_AES_PROV_W, + PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) return hDefProv; InterlockedCompareExchangePointer((PVOID *)&hDefProv, (PVOID)prov, NULL); diff --combined dll/win32/crypt32/oid.c index ea30d9ccd45,ea7b539208b..ea7b539208b --- a/dll/win32/crypt32/oid.c +++ b/dll/win32/crypt32/oid.c @@@ -1067,6 -1067,9 +1067,9 @@@ static const WCHAR rc2[] = { 'r','c','2 static const WCHAR rc4[] = { 'r','c','4',0 }; static const WCHAR sha[] = { 's','h','a',0 }; static const WCHAR sha1[] = { 's','h','a','1',0 }; + static const WCHAR sha256[] = { 's','h','a','2','5','6',0 }; + static const WCHAR sha384[] = { 's','h','a','3','8','4',0 }; + static const WCHAR sha512[] = { 's','h','a','5','1','2',0 }; static const WCHAR RSA[] = { 'R','S','A',0 }; static const WCHAR RSA_KEYX[] = { 'R','S','A','_','K','E','Y','X',0 }; static const WCHAR RSA_SIGN[] = { 'R','S','A','_','S','I','G','N',0 }; @@@ -1086,6 -1089,9 +1089,9 @@@ static const WCHAR shaDSA[] = { 's','h' static const WCHAR sha1DSA[] = { 's','h','a','1','D','S','A',0 }; static const WCHAR shaRSA[] = { 's','h','a','R','S','A',0 }; static const WCHAR sha1RSA[] = { 's','h','a','1','R','S','A',0 }; + static const WCHAR sha256RSA[] = { 's','h','a','2','5','6','R','S','A',0 }; + static const WCHAR sha384RSA[] = { 's','h','a','3','8','4','R','S','A',0 }; + static const WCHAR sha512RSA[] = { 's','h','a','5','1','2','R','S','A',0 }; static const WCHAR mosaicUpdatedSig[] = { 'm','o','s','a','i','c','U','p','d','a','t','e','d','S','i','g',0 }; static const WCHAR CN[] = { 'C','N',0 }; @@@ -1189,6 -1195,9 +1195,9 @@@ static const struct OIDInfoConstructor { 3, szOID_PKIX_NO_SIGNATURE, CALG_NO_SIGN, NO_SIGN, NULL }, { 4, szOID_RSA_SHA1RSA, CALG_SHA1, sha1RSA, &rsaSignBlob }, + { 4, szOID_RSA_SHA256RSA, CALG_SHA_256, sha256RSA, &rsaSignBlob }, + { 4, szOID_RSA_SHA384RSA, CALG_SHA_384, sha384RSA, &rsaSignBlob }, + { 4, szOID_RSA_SHA512RSA, CALG_SHA_512, sha512RSA, &rsaSignBlob }, { 4, szOID_RSA_MD5RSA, CALG_MD5, md5RSA, &rsaSignBlob }, { 4, szOID_X957_SHA1DSA, CALG_SHA1, sha1DSA, &dssSignBlob }, { 4, szOID_OIWSEC_sha1RSASign, CALG_SHA1, sha1RSA, &rsaSignBlob }, diff --combined dll/win32/dbghelp/dbghelp_private.h index e7e3c7c3c37,5ea2e824b6e..5ea2e824b6e --- a/dll/win32/dbghelp/dbghelp_private.h +++ b/dll/win32/dbghelp/dbghelp_private.h @@@ -313,6 -313,36 +313,36 @@@ enum module_typ }; struct process; + struct module; + + /* a module can be made of several debug information formats, so we have to + * support them all + */ + enum format_info + { + DFI_ELF, + DFI_PE, + DFI_MACHO, + DFI_DWARF, + DFI_LAST + }; + + struct module_format + { + struct module* module; + void (*remove)(struct process* pcs, struct module_format* modfmt); + void (*loc_compute)(struct process* pcs, + const struct module_format* modfmt, + const struct symt_function* func, + struct location* loc); + union + { + struct elf_module_info* elf_info; + struct dwarf2_module_info_s* dwarf2_info; + struct pe_module_info* pe_info; + struct macho_module_info* macho_info; + } u; + }; struct module { @@@ -324,10 -354,7 +354,7 @@@ unsigned short is_virtual : 1; /* specific information for debug types */ - struct elf_module_info* elf_info; - struct dwarf2_module_info_s*dwarf2_info; - - struct macho_module_info* macho_info; + struct module_format* format_info[DFI_LAST]; /* memory allocation pool */ struct pool pool; @@@ -340,10 -367,6 +367,6 @@@ unsigned sorttab_size; struct symt_ht** addr_sorttab; struct hash_table ht_symbols; - void (*loc_compute)(struct process* pcs, - const struct module* module, - const struct symt_function* func, - struct location* loc); /* types */ struct hash_table ht_types; @@@ -471,11 -494,10 +494,10 @@@ extern DWORD calc_crc32(int fd) typedef BOOL (*enum_modules_cb)(const WCHAR*, unsigned long addr, void* user); /* elf_module.c */ - #define ELF_NO_MAP ((const void*)-1) extern BOOL elf_enum_modules(HANDLE hProc, enum_modules_cb, void*); extern BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base, DWORD* size, DWORD* checksum); - struct elf_file_map; - extern BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap); + struct image_file_map; + extern BOOL elf_load_debug_info(struct module* module, struct image_file_map* fmap); extern struct module* elf_load_module(struct process* pcs, const WCHAR* name, unsigned long); extern BOOL elf_read_wine_loader_dbg_info(struct process* pcs); @@@ -565,11 -587,7 +587,7 @@@ extern BOOL stabs_parse(struct /* dwarf.c */ extern BOOL dwarf2_parse(struct module* module, unsigned long load_offset, const struct elf_thunk_area* thunks, - const unsigned char* debug, unsigned int debug_size, - const unsigned char* abbrev, unsigned int abbrev_size, - const unsigned char* str, unsigned int str_size, - const unsigned char* line, unsigned int line_size, - const unsigned char* loclist, unsigned int loclist_size); + struct image_file_map* fmap); /* stack.c */ extern BOOL sw_read_mem(struct cpu_stack_walk* csw, DWORD64 addr, void* ptr, DWORD sz); diff --combined dll/win32/dbghelp/dwarf.c index 433dca88ff4,199b3bb4b8a..199b3bb4b8a --- a/dll/win32/dbghelp/dwarf.c +++ b/dll/win32/dbghelp/dwarf.c @@@ -51,6 -51,7 +51,7 @@@ #include "oleauto.h" #include "dbghelp_private.h" + #include "image_private.h" #include "wine/debug.h" @@@ -139,6 -140,7 +140,7 @@@ struct attribut union { unsigned long uvalue; + ULONGLONG lluvalue; long svalue; const char* string; struct dwarf2_block block; @@@ -157,6 -159,7 +159,7 @@@ typedef struct dwarf2_section_ { const unsigned char* address; unsigned size; + DWORD_PTR rva; } dwarf2_section_t; enum dwarf2_sections {section_debug, section_string, section_abbrev, section_line, section_max}; @@@ -512,9 -515,8 +515,8 @@@ static void dwarf2_fill_attr(const dwar break; case DW_FORM_data8: - attr->u.block.size = 8; - attr->u.block.ptr = data; - data += 8; + attr->u.lluvalue = dwarf2_get_u8(data); + TRACE("data8<%s>\n", wine_dbgstr_longlong(attr->u.uvalue)); break; case DW_FORM_ref1: @@@ -1480,6 -1482,11 +1482,11 @@@ static void dwarf2_parse_variable(dwarf v.n1.n2.n3.lVal = value.u.uvalue; break; + case DW_FORM_data8: + v.n1.n2.vt = VT_UI8; + v.n1.n2.n3.llVal = value.u.lluvalue; + break; + case DW_FORM_sdata: v.n1.n2.vt = VT_I4; v.n1.n2.n3.lVal = value.u.svalue; @@@ -1511,12 -1518,6 +1518,6 @@@ } break; - case DW_FORM_data8: - v.n1.n2.vt = VT_I1 | VT_BYREF; - v.n1.n2.n3.byref = pool_alloc(&subpgm->ctx->module->pool, value.u.block.size); - memcpy(v.n1.n2.n3.byref, value.u.block.ptr, value.u.block.size); - break; - default: FIXME("Unsupported form for const value %s (%lx)\n", name.u.string, value.form); @@@ -1952,7 -1953,7 +1953,7 @@@ static BOOL dwarf2_parse_line_numbers(c const char** p; /* section with line numbers stripped */ - if (sections[section_line].address == ELF_NO_MAP) + if (sections[section_line].address == IMAGE_NO_MAP) return FALSE; traverse.data = sections[section_line].address + offset; @@@ -2211,7 -2212,7 +2212,7 @@@ static BOOL dwarf2_parse_compilation_un return ret; } - static BOOL dwarf2_lookup_loclist(const struct module* module, const BYTE* start, + static BOOL dwarf2_lookup_loclist(const struct module_format* modfmt, const BYTE* start, unsigned long ip, dwarf2_traverse_context_t* lctx) { @@@ -2219,7 -2220,7 +2220,7 @@@ const BYTE* ptr = start; DWORD len; - while (ptr < module->dwarf2_info->debug_loc.address + module->dwarf2_info->debug_loc.size) + while (ptr < modfmt->u.dwarf2_info->debug_loc.address + modfmt->u.dwarf2_info->debug_loc.size) { beg = dwarf2_get_u4(ptr); ptr += 4; end = dwarf2_get_u4(ptr); ptr += 4; @@@ -2240,7 -2241,7 +2241,7 @@@ } static enum location_error loc_compute_frame(struct process* pcs, - const struct module* module, + const struct module_format* modfmt, const struct symt_function* func, DWORD ip, struct location* frame) { @@@ -2266,8 -2267,8 +2267,8 @@@ break; case loc_dwarf2_location_list: WARN("Searching loclist for %s\n", func->hash_elt.name); - if (!dwarf2_lookup_loclist(module, - module->dwarf2_info->debug_loc.address + pframe->offset, + if (!dwarf2_lookup_loclist(modfmt, + modfmt->u.dwarf2_info->debug_loc.address + pframe->offset, ip, &lctx)) return loc_err_out_of_scope; if ((err = compute_location(&lctx, frame, pcs->handle, NULL)) < 0) return err; @@@ -2289,7 -2290,7 +2290,7 @@@ } static void dwarf2_location_compute(struct process* pcs, - const struct module* module, + const struct module_format* modfmt, const struct symt_function* func, struct location* loc) { @@@ -2308,14 -2309,14 +2309,14 @@@ /* instruction pointer relative to compiland's start */ ip = pcs->ctx_frame.InstructionOffset - ((struct symt_compiland*)func->container)->address; - if ((err = loc_compute_frame(pcs, module, func, ip, &frame)) == 0) + if ((err = loc_compute_frame(pcs, modfmt, func, ip, &frame)) == 0) { switch (loc->kind) { case loc_dwarf2_location_list: /* Then, if the variable has a location list, find it !! */ - if (dwarf2_lookup_loclist(module, - module->dwarf2_info->debug_loc.address + loc->offset, + if (dwarf2_lookup_loclist(modfmt, + modfmt->u.dwarf2_info->debug_loc.address + loc->offset, ip, &lctx)) goto do_compute; err = loc_err_out_of_scope; @@@ -2350,56 -2351,115 +2351,115 @@@ } } + static void dwarf2_module_remove(struct process* pcs, struct module_format* modfmt) + { + HeapFree(GetProcessHeap(), 0, modfmt->u.dwarf2_info); + HeapFree(GetProcessHeap(), 0, modfmt); + } + + static inline BOOL dwarf2_init_section(dwarf2_section_t* section, struct image_file_map* fmap, + const char* sectname, struct image_section_map* ism) + { + struct image_section_map local_ism; + + if (!ism) ism = &local_ism; + if (!image_find_section(fmap, sectname, ism)) + { + section->address = NULL; + section->size = 0; + section->rva = 0; + return FALSE; + } + + section->address = (const BYTE*)image_map_section(ism); + section->size = image_get_map_size(ism); + section->rva = image_get_map_rva(ism); + return TRUE; + } + BOOL dwarf2_parse(struct module* module, unsigned long load_offset, const struct elf_thunk_area* thunks, - const unsigned char* debug, unsigned int debug_size, - const unsigned char* abbrev, unsigned int abbrev_size, - const unsigned char* str, unsigned int str_size, - const unsigned char* line, unsigned int line_size, - const unsigned char* loclist, unsigned int loclist_size) + struct image_file_map* fmap) { dwarf2_section_t section[section_max]; - unsigned char* ptr; dwarf2_traverse_context_t mod_ctx; + struct image_section_map debug_sect, debug_str_sect, debug_abbrev_sect, + debug_line_sect, debug_loclist_sect; + BOOL ret = TRUE; + struct module_format* dwarf2_modfmt; - mod_ctx.start_data = mod_ctx.data = debug; - mod_ctx.end_data = debug + debug_size; + if (!dwarf2_init_section(§ion[section_debug], fmap, ".debug_info", &debug_sect)) + { + /* no Dwarf debug info here, so there's no error */ + return TRUE; + } + dwarf2_init_section(§ion[section_abbrev], fmap, ".debug_abbrev", &debug_abbrev_sect); + dwarf2_init_section(§ion[section_string], fmap, ".debug_str", &debug_str_sect); + dwarf2_init_section(§ion[section_line], fmap, ".debug_line", &debug_line_sect); + + if (section[section_debug].address == IMAGE_NO_MAP || + section[section_abbrev].address == IMAGE_NO_MAP || + section[section_string].address == IMAGE_NO_MAP) + { + ret = FALSE; + goto leave; + } + + if (fmap->modtype == DMT_ELF) + { + /* debug info might have a different base address than .so file + * when elf file is prelinked after splitting off debug info + * adjust symbol base addresses accordingly + */ + load_offset += fmap->u.elf.elf_start - debug_sect.fmap->u.elf.elf_start; + } + + TRACE("Loading Dwarf2 information for %s\n", debugstr_w(module->module.ModuleName)); + + mod_ctx.start_data = mod_ctx.data = section[section_debug].address; + mod_ctx.end_data = mod_ctx.data + section[section_debug].size; - module->loc_compute = dwarf2_location_compute; - section[section_debug].address = debug; - section[section_debug].size = debug_size; - section[section_abbrev].address = abbrev; - section[section_abbrev].size = abbrev_size; - section[section_string].address = str; - section[section_string].size = str_size; - section[section_line].address = line; - section[section_line].size = line_size; + dwarf2_modfmt = HeapAlloc(GetProcessHeap(), 0, sizeof(*dwarf2_modfmt)); + if (!dwarf2_modfmt) return FALSE; + dwarf2_modfmt->module = module; + dwarf2_modfmt->remove = dwarf2_module_remove; + dwarf2_modfmt->loc_compute = dwarf2_location_compute; + dwarf2_modfmt->u.dwarf2_info = NULL; + dwarf2_modfmt->module->format_info[DFI_DWARF] = dwarf2_modfmt; - if (loclist_size) + image_find_section(fmap, ".debug_loc", &debug_loclist_sect); + if (image_get_map_size(&debug_loclist_sect)) { /* initialize the dwarf2 specific info block for this module. - * As we'll need later on the .debug_loc section content, we copy it in - * the module structure for later reuse + * As we'll need later the .debug_loc section content, we won't unmap this + * section upon existing this function */ - module->dwarf2_info = HeapAlloc(GetProcessHeap(), 0, sizeof(*module->dwarf2_info) + loclist_size); - if (!module->dwarf2_info) return FALSE; - ptr = (unsigned char*)(module->dwarf2_info + 1); - memcpy(ptr, loclist, loclist_size); - module->dwarf2_info->debug_loc.address = ptr; - module->dwarf2_info->debug_loc.size = loclist_size; + dwarf2_modfmt->u.dwarf2_info = HeapAlloc(GetProcessHeap(), 0, + sizeof(*dwarf2_modfmt->u.dwarf2_info)); + if (!dwarf2_modfmt->u.dwarf2_info) goto leave; + dwarf2_modfmt->u.dwarf2_info->debug_loc.address = (const BYTE*)image_map_section(&debug_loclist_sect); + dwarf2_modfmt->u.dwarf2_info->debug_loc.size = image_get_map_size(&debug_loclist_sect); } + else image_unmap_section(&debug_loclist_sect); while (mod_ctx.data < mod_ctx.end_data) { - dwarf2_parse_compilation_unit(section, module, thunks, &mod_ctx, load_offset); + dwarf2_parse_compilation_unit(section, dwarf2_modfmt->module, thunks, &mod_ctx, load_offset); } - module->module.SymType = SymDia; - module->module.CVSig = 'D' | ('W' << 8) | ('A' << 16) | ('R' << 24); + dwarf2_modfmt->module->module.SymType = SymDia; + dwarf2_modfmt->module->module.CVSig = 'D' | ('W' << 8) | ('A' << 16) | ('R' << 24); /* FIXME: we could have a finer grain here */ - module->module.GlobalSymbols = TRUE; - module->module.TypeInfo = TRUE; - module->module.SourceIndexed = TRUE; - module->module.Publics = TRUE; - return TRUE; + dwarf2_modfmt->module->module.GlobalSymbols = TRUE; + dwarf2_modfmt->module->module.TypeInfo = TRUE; + dwarf2_modfmt->module->module.SourceIndexed = TRUE; + dwarf2_modfmt->module->module.Publics = TRUE; + + leave: + image_unmap_section(&debug_sect); + image_unmap_section(&debug_abbrev_sect); + image_unmap_section(&debug_str_sect); + image_unmap_section(&debug_line_sect); + + return ret; } diff --combined dll/win32/dbghelp/elf_module.c index 6a8a1515f9d,573a04065c3..573a04065c3 --- a/dll/win32/dbghelp/elf_module.c +++ b/dll/win32/dbghelp/elf_module.c @@@ -48,40 -48,11 +48,11 @@@ #include "dbghelp_private.h" - #ifdef HAVE_ELF_H - # include - #endif - #ifdef HAVE_SYS_ELF32_H - # include - #endif - #ifdef HAVE_SYS_EXEC_ELF_H - # include - #endif - #if !defined(DT_NUM) - # if defined(DT_COUNT) - # define DT_NUM DT_COUNT - # else - /* this seems to be a satisfactory value on Solaris, which doesn't support this AFAICT */ - # define DT_NUM 24 - # endif - #endif - #ifdef HAVE_LINK_H - # include - #endif - #ifdef HAVE_SYS_LINK_H - # include - #endif + #include "image_private.h" #include "wine/library.h" #include "wine/debug.h" - struct elf_module_info - { - DWORD_PTR elf_addr; - unsigned short elf_mark : 1, - elf_loader : 1; - }; - #ifdef __ELF__ #define ELF_INFO_DEBUG_HEADER 0x0001 @@@ -98,44 -69,6 +69,6 @@@ struct elf_inf const WCHAR* module_name; /* OUT found module name (if ELF_INFO_NAME is set) */ }; - #ifdef _WIN64 - #define Elf_Ehdr Elf64_Ehdr - #define Elf_Shdr Elf64_Shdr - #define Elf_Phdr Elf64_Phdr - #define Elf_Dyn Elf64_Dyn - #define Elf_Sym Elf64_Sym - #else - #define Elf_Ehdr Elf32_Ehdr - #define Elf_Shdr Elf32_Shdr - #define Elf_Phdr Elf32_Phdr - #define Elf_Dyn Elf32_Dyn - #define Elf_Sym Elf32_Sym - #endif - - /* structure holding information while handling an ELF image - * allows one by one section mapping for memory savings - */ - struct elf_file_map - { - Elf_Ehdr elfhdr; - size_t elf_size; - size_t elf_start; - struct - { - Elf_Shdr shdr; - const char* mapped; - }* sect; - int fd; - const char* shstrtab; - struct elf_file_map* alternate; /* another ELF file (linked to this one) */ - }; - - struct elf_section_map - { - struct elf_file_map* fmap; - long sidx; - }; - struct symtab_elt { struct hash_table_elt ht_elt; @@@ -152,28 -85,39 +85,39 @@@ struct elf_thunk_are unsigned long rva_end; }; + struct elf_module_info + { + unsigned long elf_addr; + unsigned short elf_mark : 1, + elf_loader : 1; + struct image_file_map file_map; + }; + /****************************************************************** * elf_map_section * * Maps a single section into memory from an ELF file */ - static const char* elf_map_section(struct elf_section_map* esm) + const char* elf_map_section(struct image_section_map* ism) { + struct elf_file_map* fmap = &ism->fmap->u.elf; + unsigned pgsz = getpagesize(); unsigned ofst, size; - if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum || - esm->fmap->sect[esm->sidx].shdr.sh_type == SHT_NOBITS) - return ELF_NO_MAP; + assert(ism->fmap->modtype == DMT_ELF); + if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum || + fmap->sect[ism->sidx].shdr.sh_type == SHT_NOBITS) + return IMAGE_NO_MAP; /* align required information on page size (we assume pagesize is a power of 2) */ - ofst = esm->fmap->sect[esm->sidx].shdr.sh_offset & ~(pgsz - 1); - size = ((esm->fmap->sect[esm->sidx].shdr.sh_offset + - esm->fmap->sect[esm->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst; - esm->fmap->sect[esm->sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE, - esm->fmap->fd, ofst); - if (esm->fmap->sect[esm->sidx].mapped == ELF_NO_MAP) return ELF_NO_MAP; - return esm->fmap->sect[esm->sidx].mapped + (esm->fmap->sect[esm->sidx].shdr.sh_offset & (pgsz - 1)); + ofst = fmap->sect[ism->sidx].shdr.sh_offset & ~(pgsz - 1); + size = ((fmap->sect[ism->sidx].shdr.sh_offset + + fmap->sect[ism->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst; + fmap->sect[ism->sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE, + fmap->fd, ofst); + if (fmap->sect[ism->sidx].mapped == IMAGE_NO_MAP) return IMAGE_NO_MAP; + return fmap->sect[ism->sidx].mapped + (fmap->sect[ism->sidx].shdr.sh_offset & (pgsz - 1)); } /****************************************************************** @@@ -182,32 -126,34 +126,34 @@@ * Finds a section by name (and type) into memory from an ELF file * or its alternate if any */ - static BOOL elf_find_section(struct elf_file_map* fmap, const char* name, - unsigned sht, struct elf_section_map* esm) + BOOL elf_find_section(struct image_file_map* _fmap, const char* name, + unsigned sht, struct image_section_map* ism) { + struct elf_file_map* fmap; unsigned i; - while (fmap) + while (_fmap) { - if (fmap->shstrtab == ELF_NO_MAP) + fmap = &_fmap->u.elf; + if (fmap->shstrtab == IMAGE_NO_MAP) { - struct elf_section_map hdr_esm = {fmap, fmap->elfhdr.e_shstrndx}; - if ((fmap->shstrtab = elf_map_section(&hdr_esm)) == ELF_NO_MAP) break; + struct image_section_map hdr_ism = {_fmap, fmap->elfhdr.e_shstrndx}; + if ((fmap->shstrtab = elf_map_section(&hdr_ism)) == IMAGE_NO_MAP) break; } for (i = 0; i < fmap->elfhdr.e_shnum; i++) { if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0 && (sht == SHT_NULL || sht == fmap->sect[i].shdr.sh_type)) { - esm->fmap = fmap; - esm->sidx = i; + ism->fmap = _fmap; + ism->sidx = i; return TRUE; } } - fmap = fmap->alternate; + _fmap = fmap->alternate; } - esm->fmap = NULL; - esm->sidx = -1; + ism->fmap = NULL; + ism->sidx = -1; return FALSE; } @@@ -216,46 -162,67 +162,67 @@@ * * Unmaps a single section from memory */ - static void elf_unmap_section(struct elf_section_map* esm) + void elf_unmap_section(struct image_section_map* ism) { - if (esm->sidx >= 0 && esm->sidx < esm->fmap->elfhdr.e_shnum && esm->fmap->sect[esm->sidx].mapped != ELF_NO_MAP) + struct elf_file_map* fmap = &ism->fmap->u.elf; + + if (ism->sidx >= 0 && ism->sidx < fmap->elfhdr.e_shnum && fmap->sect[ism->sidx].mapped != IMAGE_NO_MAP) { unsigned pgsz = getpagesize(); unsigned ofst, size; - ofst = esm->fmap->sect[esm->sidx].shdr.sh_offset & ~(pgsz - 1); - size = ((esm->fmap->sect[esm->sidx].shdr.sh_offset + - esm->fmap->sect[esm->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst; - if (munmap((char*)esm->fmap->sect[esm->sidx].mapped, size) < 0) + ofst = fmap->sect[ism->sidx].shdr.sh_offset & ~(pgsz - 1); + size = ((fmap->sect[ism->sidx].shdr.sh_offset + + fmap->sect[ism->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst; + if (munmap((char*)fmap->sect[ism->sidx].mapped, size) < 0) WARN("Couldn't unmap the section\n"); - esm->fmap->sect[esm->sidx].mapped = ELF_NO_MAP; + fmap->sect[ism->sidx].mapped = IMAGE_NO_MAP; } } - static void elf_end_find(struct elf_file_map* fmap) + static void elf_end_find(struct image_file_map* fmap) { - struct elf_section_map esm; + struct image_section_map ism; while (fmap) { - esm.fmap = fmap; - esm.sidx = fmap->elfhdr.e_shstrndx; - elf_unmap_section(&esm); - fmap->shstrtab = ELF_NO_MAP; - fmap = fmap->alternate; + ism.fmap = fmap; + ism.sidx = fmap->u.elf.elfhdr.e_shstrndx; + elf_unmap_section(&ism); + fmap->u.elf.shstrtab = IMAGE_NO_MAP; + fmap = fmap->u.elf.alternate; } } + /****************************************************************** + * elf_get_map_rva + * + * Get the RVA of an ELF section + */ + DWORD_PTR elf_get_map_rva(const struct image_section_map* ism) + { + if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum) + return 0; + return ism->fmap->u.elf.sect[ism->sidx].shdr.sh_addr - ism->fmap->u.elf.elf_start; + } + /****************************************************************** * elf_get_map_size * * Get the size of an ELF section */ - static inline unsigned elf_get_map_size(const struct elf_section_map* esm) + unsigned elf_get_map_size(const struct image_section_map* ism) { - if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum) + if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum) return 0; - return esm->fmap->sect[esm->sidx].shdr.sh_size; + return ism->fmap->u.elf.sect[ism->sidx].shdr.sh_size; + } + + static inline void elf_reset_file_map(struct image_file_map* fmap) + { + fmap->u.elf.fd = -1; + fmap->u.elf.shstrtab = IMAGE_NO_MAP; + fmap->u.elf.alternate = NULL; } /****************************************************************** @@@ -263,7 -230,7 +230,7 @@@ * * Maps an ELF file into memory (and checks it's a real ELF file) */ - static BOOL elf_map_file(const WCHAR* filenameW, struct elf_file_map* fmap) + static BOOL elf_map_file(const WCHAR* filenameW, struct image_file_map* fmap) { static const BYTE elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 }; struct stat statbuf; @@@ -278,56 -245,55 +245,55 @@@ if (!(filename = HeapAlloc(GetProcessHeap(), 0, len))) return FALSE; WideCharToMultiByte(CP_UNIXCP, 0, filenameW, -1, filename, len, NULL, NULL); - fmap->fd = -1; - fmap->shstrtab = ELF_NO_MAP; - fmap->alternate = NULL; + elf_reset_file_map(fmap); + fmap->modtype = DMT_ELF; /* check that the file exists, and that the module hasn't been loaded yet */ if (stat(filename, &statbuf) == -1 || S_ISDIR(statbuf.st_mode)) goto done; /* Now open the file, so that we can mmap() it. */ - if ((fmap->fd = open(filename, O_RDONLY)) == -1) goto done; + if ((fmap->u.elf.fd = open(filename, O_RDONLY)) == -1) goto done; - if (read(fmap->fd, &fmap->elfhdr, sizeof(fmap->elfhdr)) != sizeof(fmap->elfhdr)) + if (read(fmap->u.elf.fd, &fmap->u.elf.elfhdr, sizeof(fmap->u.elf.elfhdr)) != sizeof(fmap->u.elf.elfhdr)) goto done; /* and check for an ELF header */ - if (memcmp(fmap->elfhdr.e_ident, + if (memcmp(fmap->u.elf.elfhdr.e_ident, elf_signature, sizeof(elf_signature))) goto done; /* and check 32 vs 64 size according to current machine */ #ifdef _WIN64 - if (fmap->elfhdr.e_ident[EI_CLASS] != ELFCLASS64) goto done; + if (fmap->u.elf.elfhdr.e_ident[EI_CLASS] != ELFCLASS64) goto done; #else - if (fmap->elfhdr.e_ident[EI_CLASS] != ELFCLASS32) goto done; + if (fmap->u.elf.elfhdr.e_ident[EI_CLASS] != ELFCLASS32) goto done; #endif - fmap->sect = HeapAlloc(GetProcessHeap(), 0, - fmap->elfhdr.e_shnum * sizeof(fmap->sect[0])); - if (!fmap->sect) goto done; + fmap->u.elf.sect = HeapAlloc(GetProcessHeap(), 0, + fmap->u.elf.elfhdr.e_shnum * sizeof(fmap->u.elf.sect[0])); + if (!fmap->u.elf.sect) goto done; - lseek(fmap->fd, fmap->elfhdr.e_shoff, SEEK_SET); - for (i = 0; i < fmap->elfhdr.e_shnum; i++) + lseek(fmap->u.elf.fd, fmap->u.elf.elfhdr.e_shoff, SEEK_SET); + for (i = 0; i < fmap->u.elf.elfhdr.e_shnum; i++) { - read(fmap->fd, &fmap->sect[i].shdr, sizeof(fmap->sect[i].shdr)); - fmap->sect[i].mapped = ELF_NO_MAP; + read(fmap->u.elf.fd, &fmap->u.elf.sect[i].shdr, sizeof(fmap->u.elf.sect[i].shdr)); + fmap->u.elf.sect[i].mapped = IMAGE_NO_MAP; } /* grab size of module once loaded in memory */ - lseek(fmap->fd, fmap->elfhdr.e_phoff, SEEK_SET); - fmap->elf_size = 0; - fmap->elf_start = ~0L; - for (i = 0; i < fmap->elfhdr.e_phnum; i++) + lseek(fmap->u.elf.fd, fmap->u.elf.elfhdr.e_phoff, SEEK_SET); + fmap->u.elf.elf_size = 0; + fmap->u.elf.elf_start = ~0L; + for (i = 0; i < fmap->u.elf.elfhdr.e_phnum; i++) { - if (read(fmap->fd, &phdr, sizeof(phdr)) == sizeof(phdr) && + if (read(fmap->u.elf.fd, &phdr, sizeof(phdr)) == sizeof(phdr) && phdr.p_type == PT_LOAD) { tmp = (phdr.p_vaddr + phdr.p_memsz + page_mask) & ~page_mask; - if (fmap->elf_size < tmp) fmap->elf_size = tmp; - if (phdr.p_vaddr < fmap->elf_start) fmap->elf_start = phdr.p_vaddr; + if (fmap->u.elf.elf_size < tmp) fmap->u.elf.elf_size = tmp; + if (phdr.p_vaddr < fmap->u.elf.elf_start) fmap->u.elf.elf_start = phdr.p_vaddr; } } /* if non relocatable ELF, then remove fixed address from computation * otherwise, all addresses are zero based and start has no effect */ - fmap->elf_size -= fmap->elf_start; + fmap->u.elf.elf_size -= fmap->u.elf.elf_start; ret = TRUE; done: HeapFree(GetProcessHeap(), 0, filename); @@@ -339,25 -305,31 +305,31 @@@ * * Unmaps an ELF file from memory (previously mapped with elf_map_file) */ - static void elf_unmap_file(struct elf_file_map* fmap) + static void elf_unmap_file(struct image_file_map* fmap) { while (fmap) { - if (fmap->fd != -1) + if (fmap->u.elf.fd != -1) { - struct elf_section_map esm; - esm.fmap = fmap; - for (esm.sidx = 0; esm.sidx < fmap->elfhdr.e_shnum; esm.sidx++) + struct image_section_map ism; + ism.fmap = fmap; + for (ism.sidx = 0; ism.sidx < fmap->u.elf.elfhdr.e_shnum; ism.sidx++) { - elf_unmap_section(&esm); + elf_unmap_section(&ism); } - HeapFree(GetProcessHeap(), 0, fmap->sect); - close(fmap->fd); + HeapFree(GetProcessHeap(), 0, fmap->u.elf.sect); + close(fmap->u.elf.fd); } - fmap = fmap->alternate; + fmap = fmap->u.elf.alternate; } } + static void elf_module_remove(struct process* pcs, struct module_format* modfmt) + { + elf_unmap_file(&modfmt->u.elf_info->file_map); + HeapFree(GetProcessHeap(), 0, modfmt); + } + /****************************************************************** * elf_is_in_thunk_area * @@@ -382,8 -354,8 +354,8 @@@ int elf_is_in_thunk_area(unsigned long * * creating an internal hash table to ease use ELF symtab information lookup */ - static void elf_hash_symtab(struct module* module, struct pool* pool, - struct hash_table* ht_symtab, struct elf_file_map* fmap, + static void elf_hash_symtab(struct module* module, struct pool* pool, + struct hash_table* ht_symtab, struct image_file_map* fmap, struct elf_thunk_area* thunks) { int i, j, nsym; @@@ -393,16 -365,20 +365,20 @@@ const char* ptr; const Elf_Sym* symp; struct symtab_elt* ste; - struct elf_section_map esm, esm_str; - - if (!elf_find_section(fmap, ".symtab", SHT_SYMTAB, &esm) && - !elf_find_section(fmap, ".dynsym", SHT_DYNSYM, &esm)) return; - if ((symp = (const Elf_Sym*)elf_map_section(&esm)) == ELF_NO_MAP) return; - esm_str.fmap = fmap; - esm_str.sidx = fmap->sect[esm.sidx].shdr.sh_link; - if ((strp = elf_map_section(&esm_str)) == ELF_NO_MAP) return; + struct image_section_map ism, ism_str; + + if (!elf_find_section(fmap, ".symtab", SHT_SYMTAB, &ism) && + !elf_find_section(fmap, ".dynsym", SHT_DYNSYM, &ism)) return; + if ((symp = (const Elf_Sym*)image_map_section(&ism)) == IMAGE_NO_MAP) return; + ism_str.fmap = ism.fmap; + ism_str.sidx = fmap->u.elf.sect[ism.sidx].shdr.sh_link; + if ((strp = image_map_section(&ism_str)) == IMAGE_NO_MAP) + { + image_unmap_section(&ism); + return; + } - nsym = elf_get_map_size(&esm) / sizeof(*symp); + nsym = image_get_map_size(&ism) / sizeof(*symp); for (j = 0; thunks[j].symname; j++) thunks[j].rva_start = thunks[j].rva_end = 0; @@@ -567,6 -543,7 +543,7 @@@ static void elf_finish_stabs_info(struc void* ptr; struct symt_ht* sym; const Elf_Sym* symp; + struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info; hash_table_iter_init(&module->ht_symbols, &hti, NULL); while ((ptr = hash_table_iter_up(&hti))) @@@ -575,7 -552,7 +552,7 @@@ switch (sym->symt.tag) { case SymTagFunction: - if (((struct symt_function*)sym)->address != module->elf_info->elf_addr && + if (((struct symt_function*)sym)->address != elf_info->elf_addr && ((struct symt_function*)sym)->size) { break; @@@ -584,18 -561,17 +561,17 @@@ ((struct symt_function*)sym)->container); if (symp) { - if (((struct symt_function*)sym)->address != module->elf_info->elf_addr && - ((struct symt_function*)sym)->address != module->elf_info->elf_addr + symp->st_value) + if (((struct symt_function*)sym)->address != elf_info->elf_addr && + ((struct symt_function*)sym)->address != elf_info->elf_addr + symp->st_value) FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n", sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name, - ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value); + ((struct symt_function*)sym)->address, elf_info->elf_addr + symp->st_value); if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size) FIXME("Changing size for %p/%s!%s from %08lx to %08x\n", sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name, ((struct symt_function*)sym)->size, (unsigned int)symp->st_size); - ((struct symt_function*)sym)->address = module->elf_info->elf_addr + - symp->st_value; + ((struct symt_function*)sym)->address = elf_info->elf_addr + symp->st_value; ((struct symt_function*)sym)->size = symp->st_size; } else FIXME("Couldn't find %s!%s\n", @@@ -606,19 -582,18 +582,18 @@@ { case DataIsGlobal: case DataIsFileStatic: - if (((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr) + if (((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr) break; symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name, ((struct symt_data*)sym)->container); if (symp) { - if (((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr && - ((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr + symp->st_value) + if (((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr && + ((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr + symp->st_value) FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n", sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name, - ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value); - ((struct symt_data*)sym)->u.var.offset = module->elf_info->elf_addr + - symp->st_value; + ((struct symt_function*)sym)->address, elf_info->elf_addr + symp->st_value); + ((struct symt_data*)sym)->u.var.offset = elf_info->elf_addr + symp->st_value; ((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ? DataIsFileStatic : DataIsGlobal; } else @@@ -656,7 -631,7 +631,7 @@@ static int elf_new_wine_thunks(struct m { if (ste->used) continue; - addr = module->elf_info->elf_addr + ste->symp->st_value; + addr = module->format_info[DFI_ELF]->u.elf_info->elf_addr + ste->symp->st_value; j = elf_is_in_thunk_area(ste->symp->st_value, thunks); if (j >= 0) /* thunk found */ @@@ -748,20 -723,20 +723,20 @@@ static int elf_new_public_symbols(struc while ((ste = hash_table_iter_up(&hti))) { symt_new_public(module, ste->compiland, ste->ht_elt.name, - module->elf_info->elf_addr + ste->symp->st_value, + module->format_info[DFI_ELF]->u.elf_info->elf_addr + ste->symp->st_value, ste->symp->st_size); } return TRUE; } - static BOOL elf_check_debug_link(const WCHAR* file, struct elf_file_map* fmap, DWORD crc) + static BOOL elf_check_debug_link(const WCHAR* file, struct image_file_map* fmap, DWORD crc) { BOOL ret; if (!elf_map_file(file, fmap)) return FALSE; - if (!(ret = crc == calc_crc32(fmap->fd))) + if (!(ret = crc == calc_crc32(fmap->u.elf.fd))) { WARN("Bad CRC for file %s (got %08x while expecting %08x)\n", - debugstr_w(file), calc_crc32(fmap->fd), crc); + debugstr_w(file), calc_crc32(fmap->u.elf.fd), crc); elf_unmap_file(fmap); } return ret; @@@ -786,7 -761,7 +761,7 @@@ * is the global debug file directory, and execdir has been turned * into a relative path)." (from GDB manual) */ - static BOOL elf_locate_debug_link(struct elf_file_map* fmap, const char* filename, + static BOOL elf_locate_debug_link(struct image_file_map* fmap, const char* filename, const WCHAR* loaded_file, DWORD crc) { static const WCHAR globalDebugDirW[] = {'/','u','s','r','/','l','i','b','/','d','e','b','u','g','/'}; @@@ -795,7 -770,7 +770,7 @@@ size_t filename_len; WCHAR* p = NULL; WCHAR* slash; - struct elf_file_map* fmap_link = NULL; + struct image_file_map* fmap_link = NULL; fmap_link = HeapAlloc(GetProcessHeap(), 0, sizeof(*fmap_link)); if (!fmap_link) return FALSE; @@@ -838,7 -813,7 +813,7 @@@ found: TRACE("Located debug information file %s at %s\n", filename, debugstr_w(p)); HeapFree(GetProcessHeap(), 0, p); - fmap->alternate = fmap_link; + fmap->u.elf.alternate = fmap_link; return TRUE; } @@@ -848,7 -823,7 +823,7 @@@ * Parses a .gnu_debuglink section and loads the debug info from * the external file specified there. */ - static BOOL elf_debuglink_parse(struct elf_file_map* fmap, const struct module* module, + static BOOL elf_debuglink_parse(struct image_file_map* fmap, const struct module* module, const BYTE* debuglink) { /* The content of a debug link section is: @@@ -877,8 -852,8 +852,8 @@@ * read or parsed) * 1 on success */ - static BOOL elf_load_debug_info_from_map(struct module* module, - struct elf_file_map* fmap, + static BOOL elf_load_debug_info_from_map(struct module* module, + struct image_file_map* fmap, struct pool* pool, struct hash_table* ht_symtab) { @@@ -901,18 -876,16 +876,16 @@@ if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY)) { - struct elf_section_map stab_sect, stabstr_sect; - struct elf_section_map debug_sect, debug_str_sect, debug_abbrev_sect, - debug_line_sect, debug_loclist_sect; - struct elf_section_map debuglink_sect; + struct image_section_map stab_sect, stabstr_sect; + struct image_section_map debuglink_sect; /* if present, add the .gnu_debuglink file as an alternate to current one */ if (elf_find_section(fmap, ".gnu_debuglink", SHT_NULL, &debuglink_sect)) { const BYTE* dbg_link; - dbg_link = (const BYTE*)elf_map_section(&debuglink_sect); - if (dbg_link != ELF_NO_MAP) + dbg_link = (const BYTE*)image_map_section(&debuglink_sect); + if (dbg_link != IMAGE_NO_MAP) { lret = elf_debuglink_parse(fmap, module, dbg_link); if (!lret) @@@ -920,7 -893,7 +893,7 @@@ debugstr_w(module->module.ModuleName)); ret = ret || lret; } - elf_unmap_section(&debuglink_sect); + image_unmap_section(&debuglink_sect); } if (elf_find_section(fmap, ".stab", SHT_NULL, &stab_sect) && elf_find_section(fmap, ".stabstr", SHT_NULL, &stabstr_sect)) @@@ -928,14 -901,14 +901,14 @@@ const char* stab; const char* stabstr; - stab = elf_map_section(&stab_sect); - stabstr = elf_map_section(&stabstr_sect); - if (stab != ELF_NO_MAP && stabstr != ELF_NO_MAP) + stab = image_map_section(&stab_sect); + stabstr = image_map_section(&stabstr_sect); + if (stab != IMAGE_NO_MAP && stabstr != IMAGE_NO_MAP) { /* OK, now just parse all of the stabs. */ - lret = stabs_parse(module, module->elf_info->elf_addr, - stab, elf_get_map_size(&stab_sect), - stabstr, elf_get_map_size(&stabstr_sect), + lret = stabs_parse(module, module->format_info[DFI_ELF]->u.elf_info->elf_addr, + stab, image_get_map_size(&stab_sect), + stabstr, image_get_map_size(&stabstr_sect), NULL, NULL); if (lret) /* and fill in the missing information for stabs */ @@@ -945,57 -918,12 +918,12 @@@ ret = ret || lret; } else lret = FALSE; - elf_unmap_section(&stab_sect); - elf_unmap_section(&stabstr_sect); - } - if (elf_find_section(fmap, ".debug_info", SHT_NULL, &debug_sect)) - { - /* Dwarf 2 debug information */ - const BYTE* dw2_debug; - const BYTE* dw2_debug_abbrev; - const BYTE* dw2_debug_str; - const BYTE* dw2_debug_line; - const BYTE* dw2_debug_loclist; - - /* debug info might have a different base address than .so file - * when elf file is prelinked after splitting off debug info - * adjust symbol base addresses accordingly - */ - unsigned long load_offset = module->elf_info->elf_addr + - fmap->elf_start - debug_sect.fmap->elf_start; - - TRACE("Loading Dwarf2 information for %s\n", debugstr_w(module->module.ModuleName)); - - elf_find_section(fmap, ".debug_str", SHT_NULL, &debug_str_sect); - elf_find_section(fmap, ".debug_abbrev", SHT_NULL, &debug_abbrev_sect); - elf_find_section(fmap, ".debug_line", SHT_NULL, &debug_line_sect); - elf_find_section(fmap, ".debug_loc", SHT_NULL, &debug_loclist_sect); - - dw2_debug = (const BYTE*)elf_map_section(&debug_sect); - dw2_debug_abbrev = (const BYTE*)elf_map_section(&debug_abbrev_sect); - dw2_debug_str = (const BYTE*)elf_map_section(&debug_str_sect); - dw2_debug_line = (const BYTE*)elf_map_section(&debug_line_sect); - dw2_debug_loclist = (const BYTE*)elf_map_section(&debug_loclist_sect); - if (dw2_debug != ELF_NO_MAP && dw2_debug_abbrev != ELF_NO_MAP && dw2_debug_str != ELF_NO_MAP) - { - /* OK, now just parse dwarf2 debug infos. */ - lret = dwarf2_parse(module, load_offset, thunks, - dw2_debug, elf_get_map_size(&debug_sect), - dw2_debug_abbrev, elf_get_map_size(&debug_abbrev_sect), - dw2_debug_str, elf_get_map_size(&debug_str_sect), - dw2_debug_line, elf_get_map_size(&debug_line_sect), - dw2_debug_loclist, elf_get_map_size(&debug_loclist_sect)); - - if (!lret) - WARN("Couldn't correctly read dwarf2\n"); - ret = ret || lret; - } - elf_unmap_section(&debug_sect); - elf_unmap_section(&debug_abbrev_sect); - elf_unmap_section(&debug_str_sect); - elf_unmap_section(&debug_line_sect); - elf_unmap_section(&debug_loclist_sect); + image_unmap_section(&stab_sect); + image_unmap_section(&stabstr_sect); } + lret = dwarf2_parse(module, module->format_info[DFI_ELF]->u.elf_info->elf_addr, + thunks, fmap); + ret = ret || lret; } if (strstrW(module->module.ModuleName, S_ElfW) || !strcmpW(module->module.ModuleName, S_WineLoaderW)) @@@ -1015,14 -943,15 +943,15 @@@ * * Loads ELF debugging information from the module image file. */ - BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap) + BOOL elf_load_debug_info(struct module* module, struct image_file_map* fmap) { - BOOL ret = TRUE; - struct pool pool; - struct hash_table ht_symtab; - struct elf_file_map my_fmap; + BOOL ret = TRUE; + struct pool pool; + struct hash_table ht_symtab; + struct image_file_map my_fmap; + struct module_format* modfmt; - if (module->type != DMT_ELF || !module->elf_info) + if (module->type != DMT_ELF || !(modfmt = module->format_info[DFI_ELF]) || !modfmt->u.elf_info) { ERR("Bad elf module '%s'\n", debugstr_w(module->module.LoadedImageName)); return FALSE; @@@ -1039,6 -968,12 +968,12 @@@ if (ret) ret = elf_load_debug_info_from_map(module, fmap, &pool, &ht_symtab); + if (ret) + { + modfmt->u.elf_info->file_map = *fmap; + elf_reset_file_map(fmap); + } + pool_destroy(&pool); if (fmap == &my_fmap) elf_unmap_file(fmap); return ret; @@@ -1052,12 -987,12 +987,12 @@@ BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base, DWORD* size, DWORD* checksum) { - struct elf_file_map fmap; + struct image_file_map fmap; if (!elf_map_file(name, &fmap)) return FALSE; - if (base) *base = fmap.elf_start; - *size = fmap.elf_size; - *checksum = calc_crc32(fmap.fd); + if (base) *base = fmap.u.elf.elf_start; + *size = fmap.u.elf.elf_size; + *checksum = calc_crc32(fmap.u.elf.fd); elf_unmap_file(&fmap); return TRUE; } @@@ -1076,8 -1011,8 +1011,8 @@@ static BOOL elf_load_file(struct process* pcs, const WCHAR* filename, unsigned long load_offset, struct elf_info* elf_info) { - BOOL ret = FALSE; - struct elf_file_map fmap; + BOOL ret = FALSE; + struct image_file_map fmap; TRACE("Processing elf file '%s' at %08lx\n", debugstr_w(filename), load_offset); @@@ -1087,10 -1022,10 +1022,10 @@@ * this thing. We need the main executable header, and the section * table. */ - if (!fmap.elf_start && !load_offset) + if (!fmap.u.elf.elf_start && !load_offset) ERR("Relocatable ELF %s, but no load address. Loading at 0x0000000\n", debugstr_w(filename)); - if (fmap.elf_start && load_offset) + if (fmap.u.elf.elf_start && load_offset) { WARN("Non-relocatable ELF %s, but load address of 0x%08lx supplied. " "Assuming load address is corrupt\n", debugstr_w(filename), load_offset); @@@ -1099,12 -1034,12 +1034,12 @@@ if (elf_info->flags & ELF_INFO_DEBUG_HEADER) { - struct elf_section_map esm; + struct image_section_map ism; - if (elf_find_section(&fmap, ".dynamic", SHT_DYNAMIC, &esm)) + if (elf_find_section(&fmap, ".dynamic", SHT_DYNAMIC, &ism)) { Elf_Dyn dyn; - char* ptr = (char*)fmap.sect[esm.sidx].shdr.sh_addr; + char* ptr = (char*)fmap.u.elf.sect[ism.sidx].shdr.sh_addr; unsigned long len; do @@@ -1126,29 -1061,40 +1061,40 @@@ if (elf_info->flags & ELF_INFO_MODULE) { - struct elf_module_info *elf_module_info = - HeapAlloc(GetProcessHeap(), 0, sizeof(struct elf_module_info)); - if (!elf_module_info) goto leave; + struct elf_module_info *elf_module_info; + struct module_format* modfmt; + + modfmt = HeapAlloc(GetProcessHeap(), 0, + sizeof(struct module_format) + sizeof(struct elf_module_info)); + if (!modfmt) goto leave; elf_info->module = module_new(pcs, filename, DMT_ELF, FALSE, - (load_offset) ? load_offset : fmap.elf_start, - fmap.elf_size, 0, calc_crc32(fmap.fd)); + (load_offset) ? load_offset : fmap.u.elf.elf_start, + fmap.u.elf.elf_size, 0, calc_crc32(fmap.u.elf.fd)); if (!elf_info->module) { - HeapFree(GetProcessHeap(), 0, elf_module_info); + HeapFree(GetProcessHeap(), 0, modfmt); goto leave; } - elf_info->module->elf_info = elf_module_info; - elf_info->module->elf_info->elf_addr = load_offset; + elf_module_info = (void*)(modfmt + 1); + elf_info->module->format_info[DFI_ELF] = modfmt; + modfmt->module = elf_info->module; + modfmt->remove = elf_module_remove; + modfmt->loc_compute = NULL; + modfmt->u.elf_info = elf_module_info; + + elf_module_info->elf_addr = load_offset; if (dbghelp_options & SYMOPT_DEFERRED_LOADS) { elf_info->module->module.SymType = SymDeferred; + elf_module_info->file_map = fmap; + elf_reset_file_map(&fmap); ret = TRUE; } else ret = elf_load_debug_info(elf_info->module, &fmap); - elf_info->module->elf_info->elf_mark = 1; - elf_info->module->elf_info->elf_loader = 0; + elf_module_info->elf_mark = 1; + elf_module_info->elf_loader = 0; } else ret = TRUE; if (elf_info->flags & ELF_INFO_NAME) @@@ -1260,7 -1206,7 +1206,7 @@@ static BOOL elf_search_and_load_file(st if ((module = module_is_already_loaded(pcs, filename))) { elf_info->module = module; - module->elf_info->elf_mark = 1; + elf_info->module->format_info[DFI_ELF]->u.elf_info->elf_mark = 1; return module->module.SymType; } @@@ -1352,7 -1298,7 +1298,7 @@@ BOOL elf_synchronize_module_list(struc for (module = pcs->lmodules; module; module = module->next) { if (module->type == DMT_ELF && !module->is_virtual) - module->elf_info->elf_mark = 0; + module->format_info[DFI_ELF]->u.elf_info->elf_mark = 0; } es.pcs = pcs; @@@ -1363,14 -1309,19 +1309,19 @@@ module = pcs->lmodules; while (module) { - if (module->type == DMT_ELF && !module->is_virtual && - !module->elf_info->elf_mark && !module->elf_info->elf_loader) + if (module->type == DMT_ELF && !module->is_virtual) { - module_remove(pcs, module); - /* restart all over */ - module = pcs->lmodules; + struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info; + + if (!elf_info->elf_mark && !elf_info->elf_loader) + { + module_remove(pcs, module); + /* restart all over */ + module = pcs->lmodules; + continue; + } } - else module = module->next; + module = module->next; } return TRUE; } @@@ -1415,7 -1366,7 +1366,7 @@@ BOOL elf_read_wine_loader_dbg_info(stru elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE; if (!elf_search_loader(pcs, &elf_info)) return FALSE; - elf_info.module->elf_info->elf_loader = 1; + elf_info.module->format_info[DFI_ELF]->u.elf_info->elf_loader = 1; module_set_module(elf_info.module, S_WineLoaderW); return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0; } @@@ -1516,6 -1467,30 +1467,30 @@@ struct module* elf_load_module(struct #else /* !__ELF__ */ + BOOL elf_find_section(struct image_file_map* fmap, const char* name, + unsigned sht, struct image_section_map* ism) + { + return FALSE; + } + + const char* elf_map_section(struct image_section_map* ism) + { + return NULL; + } + + void elf_unmap_section(struct image_section_map* ism) + {} + + unsigned elf_get_map_size(const struct image_section_map* ism) + { + return 0; + } + + DWORD_PTR elf_get_map_rva(const struct image_section_map* ism) + { + return 0; + } + BOOL elf_synchronize_module_list(struct process* pcs) { return FALSE; @@@ -1542,7 -1517,7 +1517,7 @@@ struct module* elf_load_module(struct return NULL; } - BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap) + BOOL elf_load_debug_info(struct module* module, struct image_file_map* fmap) { return FALSE; } diff --combined dll/win32/dbghelp/macho_module.c index 379596b2f58,44fa4f2da1c..44fa4f2da1c --- a/dll/win32/dbghelp/macho_module.c +++ b/dll/win32/dbghelp/macho_module.c @@@ -655,9 -655,10 +655,10 @@@ static int macho_parse_symtab(struct ma sc->stroff, sc->strsize, (const void**)&stab, (const void**)&stabstr)) return 0; - if (!stabs_parse(mdi->module, mdi->module->macho_info->load_addr - fmap->segs_start, - stab, sc->nsyms * sizeof(struct nlist), - stabstr, sc->strsize, macho_stabs_def_cb, mdi)) + if (!stabs_parse(mdi->module, + mdi->module->format_info[DFI_MACHO]->u.macho_info->load_addr - fmap->segs_start, + stab, sc->nsyms * sizeof(struct nlist), + stabstr, sc->strsize, macho_stabs_def_cb, mdi)) ret = -1; macho_unmap_ranges(fmap, sc->symoff, sc->nsyms * sizeof(struct nlist), @@@ -703,7 -704,7 +704,7 @@@ static void macho_finish_stabs(struct m { case SymTagFunction: func = (struct symt_function*)sym; - if (func->address == module->macho_info->load_addr) + if (func->address == module->format_info[DFI_MACHO]->u.macho_info->load_addr) { TRACE("Adjusting function %p/%s!%s from 0x%08lx to 0x%08lx\n", func, debugstr_w(module->module.ModuleName), sym->hash_elt.name, @@@ -720,7 -721,7 +721,7 @@@ { case DataIsGlobal: case DataIsFileStatic: - if (data->u.var.offset == module->macho_info->load_addr) + if (data->u.var.offset == module->format_info[DFI_MACHO]->u.macho_info->load_addr) { TRACE("Adjusting data symbol %p/%s!%s from 0x%08lx to 0x%08lx\n", data, debugstr_w(module->module.ModuleName), sym->hash_elt.name, @@@ -879,7 -880,7 +880,7 @@@ BOOL macho_load_debug_info(struct modul TRACE("(%p, %p/%d)\n", module, fmap, fmap ? fmap->fd : -1); - if (module->type != DMT_MACHO || !module->macho_info) + if (module->type != DMT_MACHO || !module->format_info[DFI_MACHO]->u.macho_info) { ERR("Bad Mach-O module '%s'\n", debugstr_w(module->module.LoadedImageName)); return FALSE; @@@ -963,26 -964,34 +964,34 @@@ static BOOL macho_load_file(struct proc if (macho_info->flags & MACHO_INFO_MODULE) { - struct macho_module_info *macho_module_info = - HeapAlloc(GetProcessHeap(), 0, sizeof(struct macho_module_info)); - if (!macho_module_info) goto leave; + struct macho_module_info *macho_module_info; + struct module_format* modfmt = + HeapAlloc(GetProcessHeap(), 0, sizeof(struct module_format) + sizeof(struct macho_module_info)); + if (!modfmt) goto leave; macho_info->module = module_new(pcs, filename, DMT_MACHO, FALSE, load_addr, fmap.segs_size, 0, calc_crc32(fmap.fd)); if (!macho_info->module) { - HeapFree(GetProcessHeap(), 0, macho_module_info); + HeapFree(GetProcessHeap(), 0, modfmt); goto leave; } - macho_info->module->macho_info = macho_module_info; - macho_info->module->macho_info->load_addr = load_addr; + macho_module_info = (void*)(modfmt + 1); + macho_info->module->format_info[DFI_MACHO] = modfmt; + + modfmt->module = macho_info->module; + modfmt->remove = NULL; + modfmt->loc_compute = NULL; + modfmt->u.macho_info = macho_module_info; + + macho_module_info->load_addr = load_addr; if (dbghelp_options & SYMOPT_DEFERRED_LOADS) macho_info->module->module.SymType = SymDeferred; else if (!macho_load_debug_info(macho_info->module, &fmap)) ret = FALSE; - macho_info->module->macho_info->in_use = 1; - macho_info->module->macho_info->is_loader = 0; + macho_info->module->format_info[DFI_MACHO]->u.macho_info->in_use = 1; + macho_info->module->format_info[DFI_MACHO]->u.macho_info->is_loader = 0; TRACE("module = %p\n", macho_info->module); } @@@ -1109,7 -1118,7 +1118,7 @@@ static BOOL macho_search_and_load_file( if ((module = module_is_already_loaded(pcs, filename))) { macho_info->module = module; - module->macho_info->in_use = 1; + module->format_info[DFI_MACHO]->u.macho_info->in_use = 1; return module->module.SymType; } @@@ -1231,7 -1240,7 +1240,7 @@@ BOOL macho_synchronize_module_list(s for (module = pcs->lmodules; module; module = module->next) { if (module->type == DMT_MACHO && !module->is_virtual) - module->macho_info->in_use = 0; + module->format_info[DFI_MACHO]->u.macho_info->in_use = 0; } ms.pcs = pcs; @@@ -1243,7 -1252,8 +1252,8 @@@ while (module) { if (module->type == DMT_MACHO && !module->is_virtual && - !module->macho_info->in_use && !module->macho_info->is_loader) + !module->format_info[DFI_MACHO]->u.macho_info->in_use && + !module->format_info[DFI_MACHO]->u.macho_info->is_loader) { module_remove(pcs, module); /* restart all over */ @@@ -1297,7 -1307,7 +1307,7 @@@ BOOL macho_read_wine_loader_dbg_info(st TRACE("(%p/%p)\n", pcs, pcs->handle); macho_info.flags = MACHO_INFO_DEBUG_HEADER | MACHO_INFO_MODULE; if (!macho_search_loader(pcs, &macho_info)) return FALSE; - macho_info.module->macho_info->is_loader = 1; + macho_info.module->format_info[DFI_MACHO]->u.macho_info->is_loader = 1; module_set_module(macho_info.module, S_WineLoaderW); return (pcs->dbg_hdr_addr = macho_info.dbg_hdr_addr) != 0; } diff --combined dll/win32/dbghelp/module.c index 53f56c25129,250c5a5854a..250c5a5854a --- a/dll/win32/dbghelp/module.c +++ b/dll/win32/dbghelp/module.c @@@ -126,6 -126,7 +126,7 @@@ struct module* module_new(struct proces unsigned long stamp, unsigned long checksum) { struct module* module; + unsigned i; assert(type == DMT_ELF || type == DMT_PE || type == DMT_MACHO); if (!(module = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*module)))) @@@ -168,6 -169,7 +169,7 @@@ module->type = type; module->is_virtual = virtual ? TRUE : FALSE; + for (i = 0; i < DFI_LAST; i++) module->format_info[i] = NULL; module->sortlist_valid = FALSE; module->sorttab_size = 0; module->addr_sorttab = NULL; @@@ -621,14 -623,21 +623,21 @@@ DWORD64 WINAPI SymLoadModule64(HANDLE h */ BOOL module_remove(struct process* pcs, struct module* module) { + struct module_format*modfmt; struct module** p; + unsigned i; TRACE("%s (%p)\n", debugstr_w(module->module.ModuleName), module); + + for (i = 0; i < DFI_LAST; i++) + { + if ((modfmt = module->format_info[i]) && modfmt->remove) + modfmt->remove(pcs, module->format_info[i]); + } hash_table_destroy(&module->ht_symbols); hash_table_destroy(&module->ht_types); HeapFree(GetProcessHeap(), 0, module->sources); HeapFree(GetProcessHeap(), 0, module->addr_sorttab); - HeapFree(GetProcessHeap(), 0, module->dwarf2_info); pool_destroy(&module->pool); /* native dbghelp doesn't invoke registered callback(,CBA_SYMBOLS_UNLOADED,) here * so do we diff --combined dll/win32/dbghelp/pe_module.c index 76d81ee5512,63a2b9a9e4e..63a2b9a9e4e --- a/dll/win32/dbghelp/pe_module.c +++ b/dll/win32/dbghelp/pe_module.c @@@ -30,11 -30,239 +30,239 @@@ #include #include "dbghelp_private.h" + #include "image_private.h" #include "winternl.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(dbghelp); + struct pe_module_info + { + struct image_file_map fmap; + }; + + static void* pe_map_full(struct image_file_map* fmap, IMAGE_NT_HEADERS** nth) + { + if (!fmap->u.pe.full_map) + { + fmap->u.pe.full_map = MapViewOfFile(fmap->u.pe.hMap, FILE_MAP_READ, 0, 0, 0); + } + if (fmap->u.pe.full_map) + { + if (nth) *nth = RtlImageNtHeader(fmap->u.pe.full_map); + fmap->u.pe.full_count++; + return fmap->u.pe.full_map; + } + return IMAGE_NO_MAP; + } + + static void pe_unmap_full(struct image_file_map* fmap) + { + if (fmap->u.pe.full_count && !--fmap->u.pe.full_count) + { + UnmapViewOfFile(fmap->u.pe.full_map); + fmap->u.pe.full_map = NULL; + } + } + + /****************************************************************** + * pe_map_section + * + * Maps a single section into memory from an PE file + */ + const char* pe_map_section(struct image_section_map* ism) + { + void* mapping; + struct pe_file_map* fmap = &ism->fmap->u.pe; + + if (ism->sidx >= 0 && ism->sidx < fmap->ntheader.FileHeader.NumberOfSections && + fmap->sect[ism->sidx].mapped == IMAGE_NO_MAP) + { + IMAGE_NT_HEADERS* nth; + /* FIXME: that's rather drastic, but that will do for now + * that's ok if the full file map exists, but we could be less agressive otherwise and + * only map the relevant section + */ + if ((mapping = pe_map_full(ism->fmap, &nth))) + { + fmap->sect[ism->sidx].mapped = RtlImageRvaToVa(nth, mapping, + fmap->sect[ism->sidx].shdr.VirtualAddress, + NULL); + return fmap->sect[ism->sidx].mapped; + } + } + return IMAGE_NO_MAP; + } + + /****************************************************************** + * pe_find_section + * + * Finds a section by name (and type) into memory from an PE file + * or its alternate if any + */ + BOOL pe_find_section(struct image_file_map* fmap, const char* name, + struct image_section_map* ism) + { + const char* sectname; + unsigned i; + char tmp[IMAGE_SIZEOF_SHORT_NAME + 1]; + + for (i = 0; i < fmap->u.pe.ntheader.FileHeader.NumberOfSections; i++) + { + sectname = (const char*)fmap->u.pe.sect[i].shdr.Name; + /* long section names start with a '/' (at least on MinGW32) */ + if (sectname[0] == '/' && fmap->u.pe.strtable) + sectname = fmap->u.pe.strtable + atoi(sectname + 1); + else + { + /* the section name may not be null terminated */ + sectname = memcpy(tmp, sectname, IMAGE_SIZEOF_SHORT_NAME); + tmp[IMAGE_SIZEOF_SHORT_NAME] = '\0'; + } + if (!strcasecmp(sectname, name)) + { + ism->fmap = fmap; + ism->sidx = i; + return TRUE; + } + } + ism->fmap = NULL; + ism->sidx = -1; + + return FALSE; + } + + /****************************************************************** + * pe_unmap_section + * + * Unmaps a single section from memory + */ + void pe_unmap_section(struct image_section_map* ism) + { + if (ism->sidx >= 0 && ism->sidx < ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections && + ism->fmap->u.pe.sect[ism->sidx].mapped != IMAGE_NO_MAP) + { + pe_unmap_full(ism->fmap); + ism->fmap->u.pe.sect[ism->sidx].mapped = IMAGE_NO_MAP; + } + } + + /****************************************************************** + * pe_get_map_rva + * + * Get the RVA of an PE section + */ + DWORD_PTR pe_get_map_rva(const struct image_section_map* ism) + { + if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections) + return 0; + return ism->fmap->u.pe.sect[ism->sidx].shdr.VirtualAddress; + } + + /****************************************************************** + * pe_get_map_size + * + * Get the size of an PE section + */ + unsigned pe_get_map_size(const struct image_section_map* ism) + { + if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections) + return 0; + return ism->fmap->u.pe.sect[ism->sidx].shdr.SizeOfRawData; + } + + /****************************************************************** + * pe_map_file + * + * Maps an PE file into memory (and checks it's a real PE file) + */ + static BOOL pe_map_file(HANDLE file, struct image_file_map* fmap, enum module_type mt) + { + void* mapping; + + fmap->modtype = mt; + fmap->u.pe.hMap = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL); + if (fmap->u.pe.hMap == 0) return FALSE; + fmap->u.pe.full_count = 0; + fmap->u.pe.full_map = NULL; + if (!(mapping = pe_map_full(fmap, NULL))) goto error; + + switch (mt) + { + case DMT_PE: + { + IMAGE_NT_HEADERS* nthdr; + IMAGE_SECTION_HEADER* section; + unsigned i; + + if (!(nthdr = RtlImageNtHeader(mapping))) goto error; + memcpy(&fmap->u.pe.ntheader, nthdr, sizeof(fmap->u.pe.ntheader)); + section = (IMAGE_SECTION_HEADER*) + ((char*)&nthdr->OptionalHeader + nthdr->FileHeader.SizeOfOptionalHeader); + fmap->u.pe.sect = HeapAlloc(GetProcessHeap(), 0, + nthdr->FileHeader.NumberOfSections * sizeof(fmap->u.pe.sect[0])); + if (!fmap->u.pe.sect) goto error; + for (i = 0; i < nthdr->FileHeader.NumberOfSections; i++) + { + memcpy(&fmap->u.pe.sect[i].shdr, section + i, sizeof(IMAGE_SECTION_HEADER)); + fmap->u.pe.sect[i].mapped = IMAGE_NO_MAP; + } + if (nthdr->FileHeader.PointerToSymbolTable && nthdr->FileHeader.NumberOfSymbols) + { + /* FIXME ugly: should rather map the relevant content instead of copying it */ + const char* src = (const char*)mapping + + nthdr->FileHeader.PointerToSymbolTable + + nthdr->FileHeader.NumberOfSymbols * sizeof(IMAGE_SYMBOL); + char* dst; + DWORD sz = *(DWORD*)src; + + if ((dst = HeapAlloc(GetProcessHeap(), 0, sz))) + memcpy(dst, src, sz); + fmap->u.pe.strtable = dst; + } + else fmap->u.pe.strtable = NULL; + } + break; + default: assert(0); goto error; + } + pe_unmap_full(fmap); + + return TRUE; + error: + pe_unmap_full(fmap); + CloseHandle(fmap->u.pe.hMap); + return FALSE; + } + + /****************************************************************** + * pe_unmap_file + * + * Unmaps an PE file from memory (previously mapped with pe_map_file) + */ + static void pe_unmap_file(struct image_file_map* fmap) + { + if (fmap->u.pe.hMap != 0) + { + struct image_section_map ism; + ism.fmap = fmap; + for (ism.sidx = 0; ism.sidx < fmap->u.pe.ntheader.FileHeader.NumberOfSections; ism.sidx++) + { + pe_unmap_section(&ism); + } + while (fmap->u.pe.full_count) pe_unmap_full(fmap); + HeapFree(GetProcessHeap(), 0, fmap->u.pe.sect); + HeapFree(GetProcessHeap(), 0, (void*)fmap->u.pe.strtable); /* FIXME ugly (see pe_map_file) */ + CloseHandle(fmap->u.pe.hMap); + fmap->u.pe.hMap = NULL; + } + } + + static void pe_module_remove(struct process* pcs, struct module_format* modfmt) + { + pe_unmap_file(&modfmt->u.pe_info->fmap); + HeapFree(GetProcessHeap(), 0, modfmt); + } + /****************************************************************** * pe_locate_with_coff_symbol_table * @@@ -43,37 -271,35 +271,35 @@@ * Mingw32 requires this for stabs debug information as address for global variables isn't filled in * (this is similar to what is done in elf_module.c when using the .symtab ELF section) */ - static BOOL pe_locate_with_coff_symbol_table(struct module* module, IMAGE_NT_HEADERS* nth, void* mapping) + static BOOL pe_locate_with_coff_symbol_table(struct module* module) { + struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap; const IMAGE_SYMBOL* isym; int i, numsym, naux; - const char* strtable; char tmp[9]; const char* name; struct hash_table_iter hti; void* ptr; struct symt_data* sym; - const IMAGE_SECTION_HEADER* sect; + const char* mapping; - numsym = nth->FileHeader.NumberOfSymbols; - if (!nth->FileHeader.PointerToSymbolTable || !numsym) + numsym = fmap->u.pe.ntheader.FileHeader.NumberOfSymbols; + if (!fmap->u.pe.ntheader.FileHeader.PointerToSymbolTable || !numsym) return TRUE; - isym = (const IMAGE_SYMBOL*)((char*)mapping + nth->FileHeader.PointerToSymbolTable); - /* FIXME: no way to get strtable size */ - strtable = (const char*)&isym[numsym]; - sect = IMAGE_FIRST_SECTION(nth); + if (!(mapping = pe_map_full(fmap, NULL))) return FALSE; + isym = (const IMAGE_SYMBOL*)(mapping + fmap->u.pe.ntheader.FileHeader.PointerToSymbolTable); for (i = 0; i < numsym; i+= naux, isym += naux) { if (isym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL && - isym->SectionNumber > 0 && isym->SectionNumber <= nth->FileHeader.NumberOfSections) + isym->SectionNumber > 0 && isym->SectionNumber <= fmap->u.pe.ntheader.FileHeader.NumberOfSections) { if (isym->N.Name.Short) { name = memcpy(tmp, isym->N.ShortName, 8); tmp[8] = '\0'; } - else name = strtable + isym->N.Name.Long; + else name = fmap->u.pe.strtable + isym->N.Name.Long; if (name[0] == '_') name++; hash_table_iter_init(&module->ht_symbols, &hti, name); while ((ptr = hash_table_iter_up(&hti))) @@@ -86,15 -312,17 +312,17 @@@ TRACE("Changing absolute address for %d.%s: %lx -> %s\n", isym->SectionNumber, name, sym->u.var.offset, wine_dbgstr_longlong(module->module.BaseOfImage + - sect[isym->SectionNumber - 1].VirtualAddress + isym->Value)); + fmap->u.pe.sect[isym->SectionNumber - 1].shdr.VirtualAddress + + isym->Value)); sym->u.var.offset = module->module.BaseOfImage + - sect[isym->SectionNumber - 1].VirtualAddress + isym->Value; + fmap->u.pe.sect[isym->SectionNumber - 1].shdr.VirtualAddress + isym->Value; break; } } } naux = isym->NumberOfAuxSymbols + 1; } + pe_unmap_full(fmap); return TRUE; } @@@ -103,8 -331,9 +331,9 @@@ * * Load public symbols out of the COFF symbol table (if any). */ - static BOOL pe_load_coff_symbol_table(struct module* module, IMAGE_NT_HEADERS* nth, void* mapping) + static BOOL pe_load_coff_symbol_table(struct module* module) { + struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap; const IMAGE_SYMBOL* isym; int i, numsym, naux; const char* strtable; @@@ -113,14 -342,16 +342,16 @@@ const char* lastfilename = NULL; struct symt_compiland* compiland = NULL; const IMAGE_SECTION_HEADER* sect; + const char* mapping; - numsym = nth->FileHeader.NumberOfSymbols; - if (!nth->FileHeader.PointerToSymbolTable || !numsym) + numsym = fmap->u.pe.ntheader.FileHeader.NumberOfSymbols; + if (!fmap->u.pe.ntheader.FileHeader.PointerToSymbolTable || !numsym) return TRUE; - isym = (const IMAGE_SYMBOL*)((char*)mapping + nth->FileHeader.PointerToSymbolTable); + if (!(mapping = pe_map_full(fmap, NULL))) return FALSE; + isym = (const IMAGE_SYMBOL*)((char*)mapping + fmap->u.pe.ntheader.FileHeader.PointerToSymbolTable); /* FIXME: no way to get strtable size */ strtable = (const char*)&isym[numsym]; - sect = IMAGE_FIRST_SECTION(nth); + sect = IMAGE_FIRST_SECTION(&fmap->u.pe.ntheader); for (i = 0; i < numsym; i+= naux, isym += naux) { @@@ -130,7 -361,7 +361,7 @@@ compiland = NULL; } if (isym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL && - isym->SectionNumber > 0 && isym->SectionNumber <= nth->FileHeader.NumberOfSections) + isym->SectionNumber > 0 && isym->SectionNumber <= fmap->u.pe.ntheader.FileHeader.NumberOfSections) { if (isym->N.Name.Short) { @@@ -143,9 -374,12 +374,12 @@@ if (!compiland && lastfilename) compiland = symt_new_compiland(module, 0, source_new(module, NULL, lastfilename)); - symt_new_public(module, compiland, name, - module->module.BaseOfImage + sect[isym->SectionNumber - 1].VirtualAddress + isym->Value, - 1); + + if (!(dbghelp_options & SYMOPT_NO_PUBLICS)) + symt_new_public(module, compiland, name, + module->module.BaseOfImage + sect[isym->SectionNumber - 1].VirtualAddress + + isym->Value, + 1); } naux = isym->NumberOfAuxSymbols + 1; } @@@ -155,6 -389,7 +389,7 @@@ module->module.TypeInfo = FALSE; module->module.SourceIndexed = FALSE; module->module.Publics = TRUE; + pe_unmap_full(fmap); return TRUE; } @@@ -176,30 -411,30 +411,30 @@@ static inline DWORD pe_get_sect_size(IM * look for stabs information in PE header (it's how the mingw compiler provides * its debugging information) */ - static BOOL pe_load_stabs(const struct process* pcs, struct module* module, - void* mapping, IMAGE_NT_HEADERS* nth) + static BOOL pe_load_stabs(const struct process* pcs, struct module* module) { - IMAGE_SECTION_HEADER* section; - IMAGE_SECTION_HEADER* sect_stabs = NULL; - IMAGE_SECTION_HEADER* sect_stabstr = NULL; - int i; + struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap; + struct image_section_map sect_stabs, sect_stabstr; BOOL ret = FALSE; - section = (IMAGE_SECTION_HEADER*) - ((char*)&nth->OptionalHeader + nth->FileHeader.SizeOfOptionalHeader); - for (i = 0; i < nth->FileHeader.NumberOfSections; i++, section++) - { - if (!strcasecmp((const char*)section->Name, ".stab")) sect_stabs = section; - else if (!strncasecmp((const char*)section->Name, ".stabstr", 8)) sect_stabstr = section; - } - if (sect_stabs && sect_stabstr) + if (pe_find_section(fmap, ".stab", §_stabs) && pe_find_section(fmap, ".stabstr", §_stabstr)) { - ret = stabs_parse(module, - module->module.BaseOfImage - nth->OptionalHeader.ImageBase, - pe_get_sect(nth, mapping, sect_stabs), pe_get_sect_size(sect_stabs), - pe_get_sect(nth, mapping, sect_stabstr), pe_get_sect_size(sect_stabstr), - NULL, NULL); - if (ret) pe_locate_with_coff_symbol_table(module, nth, mapping); + const char* stab; + const char* stabstr; + + stab = image_map_section(§_stabs); + stabstr = image_map_section(§_stabstr); + if (stab != IMAGE_NO_MAP && stabstr != IMAGE_NO_MAP) + { + ret = stabs_parse(module, + module->module.BaseOfImage - fmap->u.pe.ntheader.OptionalHeader.ImageBase, + stab, image_get_map_size(§_stabs), + stabstr, image_get_map_size(§_stabstr), + NULL, NULL); + } + image_unmap_section(§_stabs); + image_unmap_section(§_stabstr); + if (ret) pe_locate_with_coff_symbol_table(module); } TRACE("%s the STABS debug info\n", ret ? "successfully loaded" : "failed to load"); @@@ -212,51 -447,15 +447,15 @@@ * look for dwarf information in PE header (it's also a way for the mingw compiler * to provide its debugging information) */ - static BOOL pe_load_dwarf(const struct process* pcs, struct module* module, - void* mapping, IMAGE_NT_HEADERS* nth) + static BOOL pe_load_dwarf(struct module* module) { - IMAGE_SECTION_HEADER* section; - IMAGE_SECTION_HEADER* sect_debuginfo = NULL; - IMAGE_SECTION_HEADER* sect_debugstr = NULL; - IMAGE_SECTION_HEADER* sect_debugabbrev = NULL; - IMAGE_SECTION_HEADER* sect_debugline = NULL; - IMAGE_SECTION_HEADER* sect_debugloc = NULL; - int i; - const char* strtable; - const char* sectname; + struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap; BOOL ret = FALSE; - if (nth->FileHeader.PointerToSymbolTable && nth->FileHeader.NumberOfSymbols) - /* FIXME: no way to get strtable size */ - strtable = (const char*)mapping + nth->FileHeader.PointerToSymbolTable + - nth->FileHeader.NumberOfSymbols * sizeof(IMAGE_SYMBOL); - else strtable = NULL; - - section = (IMAGE_SECTION_HEADER*) - ((char*)&nth->OptionalHeader + nth->FileHeader.SizeOfOptionalHeader); - for (i = 0; i < nth->FileHeader.NumberOfSections; i++, section++) - { - sectname = (const char*)section->Name; - /* long section names start with a '/' (at least on MinGW32) */ - if (*sectname == '/' && strtable) - sectname = strtable + atoi(sectname + 1); - if (!strcasecmp(sectname, ".debug_info")) sect_debuginfo = section; - else if (!strcasecmp(sectname, ".debug_str")) sect_debugstr = section; - else if (!strcasecmp(sectname, ".debug_abbrev")) sect_debugabbrev = section; - else if (!strcasecmp(sectname, ".debug_line")) sect_debugline = section; - else if (!strcasecmp(sectname, ".debug_loc")) sect_debugloc = section; - } - if (sect_debuginfo) - { - ret = dwarf2_parse(module, - module->module.BaseOfImage - nth->OptionalHeader.ImageBase, - NULL, /* FIXME: some thunks to deal with ? */ - pe_get_sect(nth, mapping, sect_debuginfo), pe_get_sect_size(sect_debuginfo), - pe_get_sect(nth, mapping, sect_debugabbrev), pe_get_sect_size(sect_debugabbrev), - pe_get_sect(nth, mapping, sect_debugstr), pe_get_sect_size(sect_debugstr), - pe_get_sect(nth, mapping, sect_debugline), pe_get_sect_size(sect_debugline), - pe_get_sect(nth, mapping, sect_debugloc), pe_get_sect_size(sect_debugloc)); - } + ret = dwarf2_parse(module, + module->module.BaseOfImage - fmap->u.pe.ntheader.OptionalHeader.ImageBase, + NULL, /* FIXME: some thunks to deal with ? */ + fmap); TRACE("%s the DWARF debug info\n", ret ? "successfully loaded" : "failed to load"); return ret; @@@ -314,19 -513,21 +513,21 @@@ static BOOL pe_load_dbg_file(const stru * * Process MSC debug information in PE file. */ - static BOOL pe_load_msc_debug_info(const struct process* pcs, - struct module* module, - void* mapping, const IMAGE_NT_HEADERS* nth) + static BOOL pe_load_msc_debug_info(const struct process* pcs, struct module* module) { + struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap; BOOL ret = FALSE; const IMAGE_DATA_DIRECTORY* dir; const IMAGE_DEBUG_DIRECTORY*dbg = NULL; int nDbg; + void* mapping; + IMAGE_NT_HEADERS* nth; + if (!(mapping = pe_map_full(fmap, &nth))) return FALSE; /* Read in debug directory */ dir = nth->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_DEBUG; nDbg = dir->Size / sizeof(IMAGE_DEBUG_DIRECTORY); - if (!nDbg) return FALSE; + if (!nDbg) goto done; dbg = RtlImageRvaToVa(nth, mapping, dir->VirtualAddress, NULL); @@@ -353,26 -554,29 +554,29 @@@ const IMAGE_SECTION_HEADER *sectp = (const IMAGE_SECTION_HEADER*)((const char*)&nth->OptionalHeader + nth->FileHeader.SizeOfOptionalHeader); /* Debug info is embedded into PE module */ ret = pe_load_debug_directory(pcs, module, mapping, sectp, - nth->FileHeader.NumberOfSections, dbg, nDbg); + nth->FileHeader.NumberOfSections, dbg, nDbg); } - + done: + pe_unmap_full(fmap); return ret; } /*********************************************************************** * pe_load_export_debug_info */ - static BOOL pe_load_export_debug_info(const struct process* pcs, - struct module* module, - void* mapping, const IMAGE_NT_HEADERS* nth) + static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* module) { + struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap; unsigned int i; const IMAGE_EXPORT_DIRECTORY* exports; DWORD base = module->module.BaseOfImage; DWORD size; + IMAGE_NT_HEADERS* nth; + void* mapping; if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE; + if (!(mapping = pe_map_full(fmap, &nth))) return FALSE; #if 0 /* Add start of DLL (better use the (yet unimplemented) Exe SymTag for this) */ /* FIXME: module.ModuleName isn't correctly set yet if it's passed in SymLoadModule */ @@@ -435,6 -639,8 +639,8 @@@ /* no real debug info, only entry points */ if (module->module.SymType == SymDeferred) module->module.SymType = SymExport; + pe_unmap_full(fmap); + return TRUE; } @@@ -445,39 -651,21 +651,21 @@@ BOOL pe_load_debug_info(const struct process* pcs, struct module* module) { BOOL ret = FALSE; - HANDLE hFile; - HANDLE hMap; - void* mapping; - IMAGE_NT_HEADERS* nth; - - hFile = CreateFileW(module->module.LoadedImageName, GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) return ret; - if ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) != 0) - { - if ((mapping = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) != NULL) - { - nth = RtlImageNtHeader(mapping); - if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY)) - { - ret = pe_load_stabs(pcs, module, mapping, nth) || - pe_load_dwarf(pcs, module, mapping, nth) || - pe_load_msc_debug_info(pcs, module, mapping, nth) || - pe_load_coff_symbol_table(module, nth, mapping); - /* if we still have no debug info (we could only get SymExport at this - * point), then do the SymExport except if we have an ELF container, - * in which case we'll rely on the export's on the ELF side - */ - } - /* FIXME shouldn't we check that? if (!module_get_debug(pcs, module))l */ - if (pe_load_export_debug_info(pcs, module, mapping, nth) && !ret) - ret = TRUE; - UnmapViewOfFile(mapping); - } - CloseHandle(hMap); + if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY)) + { + ret = pe_load_stabs(pcs, module); + ret = pe_load_dwarf(module) || ret; + ret = pe_load_msc_debug_info(pcs, module) || ret; + ret = ret || pe_load_coff_symbol_table(module); /* FIXME */ + /* if we still have no debug info (we could only get SymExport at this + * point), then do the SymExport except if we have an ELF container, + * in which case we'll rely on the export's on the ELF side + */ } - CloseHandle(hFile); + /* FIXME shouldn't we check that? if (!module_get_debug(pcs, module)) */ + if (pe_load_export_debug_info(pcs, module) && !ret) + ret = TRUE; return ret; } @@@ -489,15 -677,14 +677,14 @@@ struct module* pe_load_native_module(struct process* pcs, const WCHAR* name, HANDLE hFile, DWORD base, DWORD size) { - struct module* module = NULL; - BOOL opened = FALSE; - HANDLE hMap; - WCHAR loaded_name[MAX_PATH]; + struct module* module = NULL; + BOOL opened = FALSE; + struct module_format* modfmt; + WCHAR loaded_name[MAX_PATH]; loaded_name[0] = '\0'; if (!hFile) { - assert(name); if ((hFile = FindExecutableImageExW(name, pcs->search_path, loaded_name, NULL, NULL)) == NULL) @@@ -507,37 -694,37 +694,37 @@@ else if (name) strcpyW(loaded_name, name); else if (dbghelp_options & SYMOPT_DEFERRED_LOADS) FIXME("Trouble ahead (no module name passed in deferred mode)\n"); - - if ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) != NULL) + if (!(modfmt = HeapAlloc(GetProcessHeap(), 0, sizeof(struct module_format) + sizeof(struct pe_module_info)))) + return NULL; + modfmt->u.pe_info = (struct pe_module_info*)(modfmt + 1); + if (pe_map_file(hFile, &modfmt->u.pe_info->fmap, DMT_PE)) { - void* mapping; + if (!base) base = modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.ImageBase; + if (!size) size = modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.SizeOfImage; - if ((mapping = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) != NULL) + module = module_new(pcs, loaded_name, DMT_PE, FALSE, base, size, + modfmt->u.pe_info->fmap.u.pe.ntheader.FileHeader.TimeDateStamp, + modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.CheckSum); + if (module) { - IMAGE_NT_HEADERS* nth = RtlImageNtHeader(mapping); - - if (nth) - { - if (!base) base = nth->OptionalHeader.ImageBase; - if (!size) size = nth->OptionalHeader.SizeOfImage; - - module = module_new(pcs, loaded_name, DMT_PE, FALSE, base, size, - nth->FileHeader.TimeDateStamp, - nth->OptionalHeader.CheckSum); - if (module) - { - if (dbghelp_options & SYMOPT_DEFERRED_LOADS) - module->module.SymType = SymDeferred; - else - pe_load_debug_info(pcs, module); - } - else - ERR("could not load the module '%s'\n", debugstr_w(loaded_name)); - } - UnmapViewOfFile(mapping); + modfmt->module = module; + modfmt->remove = pe_module_remove; + modfmt->loc_compute = NULL; + + module->format_info[DFI_PE] = modfmt; + if (dbghelp_options & SYMOPT_DEFERRED_LOADS) + module->module.SymType = SymDeferred; + else + pe_load_debug_info(pcs, module); + } + else + { + ERR("could not load the module '%s'\n", debugstr_w(loaded_name)); + pe_unmap_file(&modfmt->u.pe_info->fmap); } - CloseHandle(hMap); } + if (!module) HeapFree(GetProcessHeap(), 0, modfmt); + if (opened) CloseHandle(hFile); return module; diff --combined dll/win32/dbghelp/symbol.c index 07ba9a37cef,650f6a28086..650f6a28086 --- a/dll/win32/dbghelp/symbol.c +++ b/dll/win32/dbghelp/symbol.c @@@ -693,8 -693,20 +693,20 @@@ static void symt_fill_sym_info(struct m struct location loc = data->u.var; if (loc.kind >= loc_user) - pair->effective->loc_compute(pair->pcs, pair->effective, func, &loc); - + { + unsigned i; + struct module_format* modfmt; + + for (i = 0; i < DFI_LAST; i++) + { + modfmt = pair->effective->format_info[i]; + if (modfmt && modfmt->loc_compute) + { + modfmt->loc_compute(pair->pcs, modfmt, func, &loc); + break; + } + } + } switch (loc.kind) { case loc_error: diff --combined dll/win32/fusion/fusion.c index 7c94100039d,ad772330487..ad772330487 --- a/dll/win32/fusion/fusion.c +++ b/dll/win32/fusion/fusion.c @@@ -52,6 -52,15 +52,15 @@@ HRESULT WINAPI CreateInstallReferenceEn return E_NOTIMPL; } + /****************************************************************** + * CreateApplicationContext (FUSION.@) + */ + HRESULT WINAPI CreateApplicationContext(IAssemblyName *name, void *ctx) + { + FIXME("%p, %p\n", name, ctx); + return E_NOTIMPL; + } + static HRESULT (WINAPI *pGetCORVersion)(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwLength); diff --combined dll/win32/fusion/fusion.spec index e589ad17e08,54e4eadd715..54e4eadd715 --- a/dll/win32/fusion/fusion.spec +++ b/dll/win32/fusion/fusion.spec @@@ -1,6 -1,6 +1,6 @@@ @ stub CopyPDBs @ stdcall ClearDownloadCache() - @ stub CreateApplicationContext + @ stdcall CreateApplicationContext(ptr ptr) @ stdcall CreateAssemblyCache(ptr long) @ stdcall CreateAssemblyEnum(ptr ptr ptr long ptr) @ stdcall CreateAssemblyNameObject(ptr wstr long ptr) diff --combined dll/win32/gdiplus/brush.c index 2f2143dba58,2d28004c95d..2d28004c95d --- a/dll/win32/gdiplus/brush.c +++ b/dll/win32/gdiplus/brush.c @@@ -865,7 -865,10 +865,10 @@@ GpStatus WINGDIPAPI GdipCreateTextureIA (*texture)->brush.gdibrush = CreateBrushIndirect(&(*texture)->brush.lb); (*texture)->brush.bt = BrushTypeTextureFill; - (*texture)->wrap = imageattr->wrap; + if (imageattr) + (*texture)->wrap = imageattr->wrap; + else + (*texture)->wrap = WrapModeTile; (*texture)->image = new_image; exit: diff --combined dll/win32/gdiplus/image.c index d72d4cfbb8a,58f3c6570be..58f3c6570be --- a/dll/win32/gdiplus/image.c +++ b/dll/win32/gdiplus/image.c @@@ -2108,6 -2108,8 +2108,8 @@@ GpStatus WINGDIPAPI GdipGetMetafileHead if(!(calls++)) FIXME("not implemented\n"); + memset(header, 0, sizeof(MetafileHeader)); + return Ok; } @@@ -2194,6 -2196,7 +2196,7 @@@ struct image_format_dimension image_for {NULL} }; + /* FIXME: Need to handle multi-framed images */ GpStatus WINGDIPAPI GdipImageGetFrameCount(GpImage *image, GDIPCONST GUID* dimensionID, UINT* count) { @@@ -2201,13 -2204,15 +2204,15 @@@ TRACE("(%p,%s,%p)\n", image, debugstr_guid(dimensionID), count); - if(!image || !dimensionID || !count) + if(!image || !count) return InvalidParameter; if(!(calls++)) - FIXME("not implemented\n"); + FIXME("returning frame count of 1\n"); - return NotImplemented; + *count = 1; + + return Ok; } GpStatus WINGDIPAPI GdipImageGetFrameDimensionsCount(GpImage *image, diff --combined dll/win32/hlink/browse_ctx.c index a5b73c10bc1,1e15c13a543..1e15c13a543 --- a/dll/win32/hlink/browse_ctx.c +++ b/dll/win32/hlink/browse_ctx.c @@@ -155,6 -155,9 +155,9 @@@ static HRESULT WINAPI IHlinkBC_SetBrows HlinkBCImpl *This = (HlinkBCImpl*)iface; TRACE("(%p)->(%p)\n", This, phlbwi); + if(!phlbwi) + return E_INVALIDARG; + heap_free(This->BrowseWindowInfo); This->BrowseWindowInfo = heap_alloc(phlbwi->cbSize); memcpy(This->BrowseWindowInfo, phlbwi, phlbwi->cbSize); @@@ -165,8 -168,18 +168,18 @@@ static HRESULT WINAPI IHlinkBC_GetBrowseWindowInfo(IHlinkBrowseContext* iface, HLBWINFO *phlbwi) { - FIXME("\n"); - return E_NOTIMPL; + HlinkBCImpl *This = (HlinkBCImpl*)iface; + TRACE("(%p)->(%p)\n", This, phlbwi); + + if(!phlbwi) + return E_INVALIDARG; + + if(!This->BrowseWindowInfo) + phlbwi->cbSize = 0; + else + memcpy(phlbwi, This->BrowseWindowInfo, This->BrowseWindowInfo->cbSize); + + return S_OK; } static HRESULT WINAPI IHlinkBC_SetInitialHlink(IHlinkBrowseContext* iface, diff --combined dll/win32/hlink/hlink_main.c index d07901aea4a,e96f206645f..e96f206645f --- a/dll/win32/hlink/hlink_main.c +++ b/dll/win32/hlink/hlink_main.c @@@ -99,6 -99,8 +99,8 @@@ HRESULT WINAPI HlinkCreateFromString( L { IHlink *hl = NULL; HRESULT r = S_OK; + WCHAR *hash, *tgt; + const WCHAR *loc; TRACE("%s %s %s %p %i %p %s %p\n", debugstr_w(pwzTarget), debugstr_w(pwzLocation), debugstr_w(pwzFriendlyName), pihlsite, @@@ -108,8 -110,44 +110,44 @@@ if (FAILED(r)) return r; - IHlink_SetStringReference(hl, HLINKSETF_TARGET | HLINKSETF_LOCATION, - pwzTarget, pwzLocation); + if (pwzTarget) + { + hash = strchrW(pwzTarget, '#'); + if (hash) + { + if (hash == pwzTarget) + tgt = NULL; + else + { + int tgt_len = hash - pwzTarget; + tgt = heap_alloc((tgt_len + 1) * sizeof(WCHAR)); + if (!tgt) + return E_OUTOFMEMORY; + memcpy(tgt, pwzTarget, tgt_len * sizeof(WCHAR)); + tgt[tgt_len] = 0; + } + if (!pwzLocation) + loc = hash + 1; + else + loc = pwzLocation; + } + else + { + tgt = hlink_strdupW(pwzTarget); + if (!tgt) + return E_OUTOFMEMORY; + loc = pwzLocation; + } + } + else + { + tgt = NULL; + loc = pwzLocation; + } + + IHlink_SetStringReference(hl, HLINKSETF_TARGET | HLINKSETF_LOCATION, tgt, loc); + + heap_free(tgt); if (pwzFriendlyName) IHlink_SetFriendlyName(hl, pwzFriendlyName); diff --combined dll/win32/hlink/link.c index 52197ccf6fd,ffd3cda854b..ffd3cda854b --- a/dll/win32/hlink/link.c +++ b/dll/win32/hlink/link.c @@@ -291,7 -291,9 +291,9 @@@ static HRESULT WINAPI IHlink_fnSetStrin if (grfHLSETF & HLINKSETF_LOCATION) { heap_free(This->Location); - This->Location = hlink_strdupW( pwzLocation ); + This->Location = NULL; + if (pwzLocation && *pwzLocation) + This->Location = hlink_strdupW( pwzLocation ); } return S_OK; diff --combined dll/win32/iphlpapi/iphlpapi_private.h index 90efff74da0,766f7f4e6ee..766f7f4e6ee --- a/dll/win32/iphlpapi/iphlpapi_private.h +++ b/dll/win32/iphlpapi/iphlpapi_private.h @@@ -19,8 -19,6 +19,6 @@@ # include #endif - #undef _WIN32_WINNT - #define _WIN32_WINNT 0x500 #define WIN32_NO_STATUS #include #include diff --combined dll/win32/iphlpapi/resinfo_reactos.c index 2b551949b57,02bcb3b9129..02bcb3b9129 --- a/dll/win32/iphlpapi/resinfo_reactos.c +++ b/dll/win32/iphlpapi/resinfo_reactos.c @@@ -58,7 -58,7 +58,7 @@@ NTAP RtlAllocateHeap ( HANDLE Heap, ULONG Flags, - ULONG Size + SIZE_T Size ); NTSYSAPI diff --combined dll/win32/kernel32/misc/dllmain.c index a828f72ef5a,02199f9349d..02199f9349d --- a/dll/win32/kernel32/misc/dllmain.c +++ b/dll/win32/kernel32/misc/dllmain.c @@@ -402,6 -402,12 +402,12 @@@ DllMain(HANDLE hDll return TRUE; } + #undef InterlockedIncrement + #undef InterlockedDecrement + #undef InterlockedExchange + #undef InterlockedExchangeAdd + #undef InterlockedCompareExchange + LONG WINAPI InterlockedIncrement(IN OUT LONG volatile *lpAddend) diff --combined dll/win32/kernel32/misc/toolhelp.c index ad2f2b7db2a,ab591b1d9f9..ab591b1d9f9 --- a/dll/win32/kernel32/misc/toolhelp.c +++ b/dll/win32/kernel32/misc/toolhelp.c @@@ -400,11 -400,11 +400,11 @@@ TH32CreateSnapshotSectionInitialize(DWO ProcessListEntry->dwSize = sizeof(PROCESSENTRY32W); ProcessListEntry->cntUsage = 0; /* no longer used */ - ProcessListEntry->th32ProcessID = (ULONG)ProcessInfo->UniqueProcessId; + ProcessListEntry->th32ProcessID = (ULONG_PTR)ProcessInfo->UniqueProcessId; ProcessListEntry->th32DefaultHeapID = 0; /* no longer used */ ProcessListEntry->th32ModuleID = 0; /* no longer used */ ProcessListEntry->cntThreads = ProcessInfo->NumberOfThreads; - ProcessListEntry->th32ParentProcessID = (ULONG)ProcessInfo->InheritedFromUniqueProcessId; + ProcessListEntry->th32ParentProcessID = (ULONG_PTR)ProcessInfo->InheritedFromUniqueProcessId; ProcessListEntry->pcPriClassBase = ProcessInfo->BasePriority; ProcessListEntry->dwFlags = 0; /* no longer used */ if(ProcessInfo->ImageName.Buffer != NULL) @@@ -447,8 -447,8 +447,8 @@@ { ThreadListEntry->dwSize = sizeof(THREADENTRY32); ThreadListEntry->cntUsage = 0; /* no longer used */ - ThreadListEntry->th32ThreadID = (ULONG)ThreadInfo->ClientId.UniqueThread; - ThreadListEntry->th32OwnerProcessID = (ULONG)ThreadInfo->ClientId.UniqueProcess; + ThreadListEntry->th32ThreadID = (ULONG_PTR)ThreadInfo->ClientId.UniqueThread; + ThreadListEntry->th32OwnerProcessID = (ULONG_PTR)ThreadInfo->ClientId.UniqueProcess; ThreadListEntry->tpBasePri = ThreadInfo->BasePriority; ThreadListEntry->tpDeltaPri = 0; /* no longer used */ ThreadListEntry->dwFlags = 0; /* no longer used */ diff --combined dll/win32/kernel32/synch/critical.c index 474a5d6c543,ac5280a60bd..ac5280a60bd --- a/dll/win32/kernel32/synch/critical.c +++ b/dll/win32/kernel32/synch/critical.c @@@ -55,4 -55,30 +55,30 @@@ InitializeCriticalSectionAndSpinCount(O return TRUE; } + /* + * @implemented + */ + BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, + IN DWORD dwSpinCount, + IN DWORD flags ) + { + NTSTATUS Status; + + /* FIXME: Flags ignored */ + + /* Initialize the critical section */ + Status = RtlInitializeCriticalSectionAndSpinCount( + (PRTL_CRITICAL_SECTION)lpCriticalSection, + dwSpinCount); + if (!NT_SUCCESS(Status)) + { + /* Set failure code */ + SetLastErrorByStatus(Status); + return FALSE; + } + + /* Success */ + return TRUE; + } + /* EOF */ diff --combined dll/win32/kernel32/thread/fiber.c index 58aa6e9d4c6,656bc6ee19d..656bc6ee19d --- a/dll/win32/kernel32/thread/fiber.c +++ b/dll/win32/kernel32/thread/fiber.c @@@ -47,9 -47,9 +47,9 @@@ ConvertFiberToThread(VOID pTeb->HasFiberData = FALSE; /* free the fiber */ - if (pTeb->Tib.FiberData != NULL) + if(pTeb->NtTib.FiberData != NULL) { - RtlFreeHeap(GetProcessHeap(), 0, pTeb->Tib.FiberData); + RtlFreeHeap(GetProcessHeap(), 0, pTeb->NtTib.FiberData); } /* success */ @@@ -69,7 -69,7 +69,7 @@@ ConvertThreadToFiberEx(LPVOID lpParamet DPRINT1("Converting Thread to Fiber\n"); /* the current thread is already a fiber */ - if(pTeb->HasFiberData && pTeb->Tib.FiberData) return pTeb->Tib.FiberData; + if(pTeb->HasFiberData && pTeb->NtTib.FiberData) return pTeb->NtTib.FiberData; /* allocate the fiber */ pfCurFiber = (PFIBER)RtlAllocateHeap(GetProcessHeap(), @@@ -85,9 -85,9 +85,9 @@@ /* copy some contextual data from the thread to the fiber */ pfCurFiber->Parameter = lpParameter; - pfCurFiber->ExceptionList = pTeb->Tib.ExceptionList; - pfCurFiber->StackBase = pTeb->Tib.StackBase; - pfCurFiber->StackLimit = pTeb->Tib.StackLimit; + pfCurFiber->ExceptionList = pTeb->NtTib.ExceptionList; + pfCurFiber->StackBase = pTeb->NtTib.StackBase; + pfCurFiber->StackLimit = pTeb->NtTib.StackLimit; pfCurFiber->DeallocationStack = pTeb->DeallocationStack; pfCurFiber->FlsData = pTeb->FlsData; pfCurFiber->GuaranteedStackBytes = pTeb->GuaranteedStackBytes; @@@ -101,7 -101,7 +101,7 @@@ } /* associate the fiber to the current thread */ - pTeb->Tib.FiberData = pfCurFiber; + pTeb->NtTib.FiberData = pfCurFiber; pTeb->HasFiberData = TRUE; /* success */ @@@ -227,7 -227,7 +227,7 @@@ DeleteFiber(LPVOID lpFiber RtlFreeHeap(GetProcessHeap(), 0, lpFiber); /* the fiber is deleting itself: let the system deallocate the stack */ - if(NtCurrentTeb()->Tib.FiberData == lpFiber) ExitThread(1); + if(NtCurrentTeb()->NtTib.FiberData == lpFiber) ExitThread(1); /* deallocate the stack */ NtFreeVirtualMemory(NtCurrentProcess(), diff --combined dll/win32/mshtml/De.rc index 43e0cfe85a5,50d519d70a7..50d519d70a7 --- a/dll/win32/mshtml/De.rc +++ b/dll/win32/mshtml/De.rc @@@ -72,4 -72,3 +72,3 @@@ FONT 8, "MS Shell Dlg PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Abbrechen", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP } - #pragma code_page(default) diff --combined dll/win32/mshtml/Fr.rc index 84ee453128f,0d14f452e8b..0d14f452e8b --- a/dll/win32/mshtml/Fr.rc +++ b/dll/win32/mshtml/Fr.rc @@@ -72,4 -72,3 +72,3 @@@ FONT 8, "MS Shell Dlg PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Annuler", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP } - #pragma code_page(default) diff --combined dll/win32/mshtml/It.rc index 4b262c56e3a,36660cca6bf..36660cca6bf --- a/dll/win32/mshtml/It.rc +++ b/dll/win32/mshtml/It.rc @@@ -69,4 -69,3 +69,3 @@@ FONT 8, "MS Shell Dlg PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Annulla", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP } - #pragma code_page(default) diff --combined dll/win32/mshtml/Ja.rc index 40db7b5f867,04fc32e785b..04fc32e785b --- a/dll/win32/mshtml/Ja.rc +++ b/dll/win32/mshtml/Ja.rc @@@ -69,4 -69,3 +69,3 @@@ FONT 8, "MS Shell Dlg PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "キャンセル", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP } - #pragma code_page(default) diff --combined dll/win32/mshtml/Lt.rc index 560cc08dd16,8f7e772a3a7..8f7e772a3a7 --- a/dll/win32/mshtml/Lt.rc +++ b/dll/win32/mshtml/Lt.rc @@@ -69,4 -69,3 +69,3 @@@ FONT 8, "MS Shell Dlg PUSHBUTTON "Gerai", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Atsisakyti", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP } - #pragma code_page(default) diff --combined dll/win32/mshtml/No.rc index 3a3b45d7a42,4592599edf3..4592599edf3 --- a/dll/win32/mshtml/No.rc +++ b/dll/win32/mshtml/No.rc @@@ -70,4 -70,3 +70,3 @@@ FONT 8, "MS Shell Dlg PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Avbryt", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP } - #pragma code_page(default) diff --combined dll/win32/mshtml/Si.rc index 500081bc790,6881addcd5b..6881addcd5b --- a/dll/win32/mshtml/Si.rc +++ b/dll/win32/mshtml/Si.rc @@@ -68,4 -68,3 +68,3 @@@ FONT 8, "MS Shell Dlg PUSHBUTTON "V redu", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Prekliči", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP } - #pragma code_page(default) diff --combined dll/win32/mshtml/htmldoc.c index 8adfdb14b43,12aa8c002dc..12aa8c002dc --- a/dll/win32/mshtml/htmldoc.c +++ b/dll/win32/mshtml/htmldoc.c @@@ -554,9 -554,12 +554,12 @@@ static HRESULT WINAPI HTMLDocument_get_ static HRESULT WINAPI HTMLDocument_get_referrer(IHTMLDocument2 *iface, BSTR *p) { HTMLDocument *This = HTMLDOC_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; - } + + *p = NULL; + return S_OK; + } static HRESULT WINAPI HTMLDocument_get_location(IHTMLDocument2 *iface, IHTMLLocation **p) { @@@ -1474,7 -1477,7 +1477,7 @@@ static void HTMLDocument_on_advise(IUnk HTMLDocument *This = HTMLDOC_THIS(iface); if(This->window) - update_cp_events(This->window, cp); + update_cp_events(This->window, &This->doc_node->node.event_target, cp, This->doc_node->node.nsnode); } #undef HTMLDOC_THIS @@@ -1596,6 -1599,11 +1599,11 @@@ static HRESULT WINAPI DocDispatchEx_Inv { HTMLDocument *This = DISPEX_THIS(iface); + if(This->window && id == DISPID_IHTMLDOCUMENT2_LOCATION && (wFlags & DISPATCH_PROPERTYPUT)) + return IDispatchEx_InvokeEx(DISPATCHEX(This->window), DISPID_IHTMLWINDOW2_LOCATION, lcid, wFlags, + pdp, pvarRes, pei, pspCaller); + + return IDispatchEx_InvokeEx(This->dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); } diff --combined dll/win32/mshtml/htmldoc3.c index 9079bbc79c7,e28297fce14..e28297fce14 --- a/dll/win32/mshtml/htmldoc3.c +++ b/dll/win32/mshtml/htmldoc3.c @@@ -182,7 -182,7 +182,7 @@@ static HRESULT WINAPI HTMLDocument3_att TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult); - return attach_event(&This->doc_node->node.event_target, This, event, pDisp, pfResult); + return attach_event(&This->doc_node->node.event_target, This->doc_node->node.nsnode, This, event, pDisp, pfResult); } static HRESULT WINAPI HTMLDocument3_detachEvent(IHTMLDocument3 *iface, BSTR event, diff --combined dll/win32/mshtml/htmlelem2.c index cd877ceaf30,548bab8b2f5..548bab8b2f5 --- a/dll/win32/mshtml/htmlelem2.c +++ b/dll/win32/mshtml/htmlelem2.c @@@ -649,7 -649,7 +649,7 @@@ static HRESULT WINAPI HTMLElement2_atta TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult); - return attach_event(get_node_event_target(&This->node), &This->node.doc->basedoc, event, pDisp, pfResult); + return attach_event(get_node_event_target(&This->node), This->node.nsnode, &This->node.doc->basedoc, event, pDisp, pfResult); } static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, IDispatch *pDisp) diff --combined dll/win32/mshtml/htmlevent.c index 54429c34a20,eef006c962c..eef006c962c --- a/dll/win32/mshtml/htmlevent.c +++ b/dll/win32/mshtml/htmlevent.c @@@ -40,6 -40,7 +40,7 @@@ typedef struct } handler_vector_t; struct event_target_t { + DWORD node_handlers_mask; handler_vector_t *event_table[EVENTID_LAST]; }; @@@ -129,6 -130,7 +130,7 @@@ typedef struct #define EVENT_DEFAULTLISTENER 0x0001 #define EVENT_BUBBLE 0x0002 #define EVENT_FORWARDBODY 0x0004 + #define EVENT_NODEHANDLER 0x0008 static const event_info_t event_info[] = { {beforeunloadW, onbeforeunloadW, EVENTT_NONE, DISPID_EVMETH_ONBEFOREUNLOAD, @@@ -152,7 -154,7 +154,7 @@@ {keyupW, onkeyupW, EVENTT_KEY, DISPID_EVMETH_ONKEYUP, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, {loadW, onloadW, EVENTT_HTML, DISPID_EVMETH_ONLOAD, - 0}, + EVENT_NODEHANDLER}, {mousedownW, onmousedownW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEDOWN, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, {mouseoutW, onmouseoutW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEOUT, @@@ -171,6 -173,8 +173,8 @@@ 0} }; + static const eventid_t node_handled_list[] = { EVENTID_LOAD }; + eventid_t str_to_eid(LPCWSTR str) { int i; @@@ -196,6 -200,19 +200,19 @@@ static eventid_t attr_to_eid(LPCWSTR st return EVENTID_LAST; } + static DWORD get_node_handler_mask(eventid_t eid) + { + DWORD i; + + for(i=0; ibasedoc.window->event; - event_obj = doc->basedoc.window->event = create_event(get_node(doc, target, TRUE), eid, nsevent); + if(set_event) + event_obj = create_event(get_node(doc, target, TRUE), eid, nsevent); + doc->basedoc.window->event = event_obj; nsIDOMNode_GetNodeType(target, &node_type); nsnode = target; @@@ -949,7 -968,8 +968,8 @@@ if(nsnode) nsIDOMNode_Release(nsnode); - IHTMLEventObj_Release(event_obj); + if(event_obj) + IHTMLEventObj_Release(event_obj); doc->basedoc.window->event = prev_event; } @@@ -971,7 -991,7 +991,7 @@@ HRESULT dispatch_event(HTMLDOMNode *nod return E_NOTIMPL; } - fire_event(node->doc, eid, node->nsnode, NULL); + fire_event(node->doc, eid, TRUE, node->nsnode, NULL); *cancelled = VARIANT_TRUE; /* FIXME */ return S_OK; @@@ -989,7 -1009,7 +1009,7 @@@ HRESULT call_event(HTMLDOMNode *node, e return hres; } - fire_event(node->doc, eid, node->nsnode, NULL); + fire_event(node->doc, eid, TRUE, node->nsnode, NULL); return S_OK; } @@@ -1021,9 -1041,24 +1041,24 @@@ static BOOL alloc_handler_vector(event_ return TRUE; } - static HRESULT ensure_nsevent_handler(HTMLDocumentNode *doc, eventid_t eid) + static HRESULT ensure_nsevent_handler(HTMLDocumentNode *doc, event_target_t *event_target, nsIDOMNode *nsnode, eventid_t eid) { - if(!doc->nsdoc || !(event_info[eid].flags & EVENT_DEFAULTLISTENER)) + if(!doc->nsdoc) + return S_OK; + + if(event_info[eid].flags & EVENT_NODEHANDLER) { + DWORD mask; + + mask = get_node_handler_mask(eid); + if(event_target->node_handlers_mask & mask) + return S_OK; + + add_nsevent_listener(doc, nsnode, event_info[eid].name); + event_target->node_handlers_mask |= mask; + return S_OK; + } + + if(!(event_info[eid].flags & EVENT_DEFAULTLISTENER)) return S_OK; if(!doc->event_vector) { @@@ -1034,17 -1069,30 +1069,30 @@@ if(!doc->event_vector[eid]) { doc->event_vector[eid] = TRUE; - add_nsevent_listener(doc, event_info[eid].name); + add_nsevent_listener(doc, NULL, event_info[eid].name); } return S_OK; } - static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLDocumentNode *doc, + static HRESULT remove_event_handler(event_target_t **event_target, eventid_t eid) + { + if(*event_target && (*event_target)->event_table[eid]->handler_prop) { + IDispatch_Release((*event_target)->event_table[eid]->handler_prop); + (*event_target)->event_table[eid]->handler_prop = NULL; + } + + return S_OK; + } + + static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, nsIDOMNode *nsnode, HTMLDocumentNode *doc, eventid_t eid, IDispatch *disp) { event_target_t *event_target; + if(!disp) + return remove_event_handler(event_target_ptr, eid); + event_target = get_event_target(event_target_ptr); if(!event_target) return E_OUTOFMEMORY; @@@ -1056,25 -1104,19 +1104,19 @@@ IDispatch_Release(event_target->event_table[eid]->handler_prop); event_target->event_table[eid]->handler_prop = disp; - if(!disp) - return S_OK; IDispatch_AddRef(disp); - return ensure_nsevent_handler(doc, eid); + return ensure_nsevent_handler(doc, event_target, nsnode, eid); } - HRESULT set_event_handler(event_target_t **event_target, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var) + HRESULT set_event_handler(event_target_t **event_target, nsIDOMNode *nsnode, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var) { switch(V_VT(var)) { case VT_NULL: - if(*event_target && (*event_target)->event_table[eid] && (*event_target)->event_table[eid]->handler_prop) { - IDispatch_Release((*event_target)->event_table[eid]->handler_prop); - (*event_target)->event_table[eid]->handler_prop = NULL; - } - break; + return remove_event_handler(event_target, eid); case VT_DISPATCH: - return set_event_handler_disp(event_target, doc, eid, V_DISPATCH(var)); + return set_event_handler_disp(event_target, nsnode, doc, eid, V_DISPATCH(var)); default: FIXME("not supported vt=%d\n", V_VT(var)); @@@ -1098,7 -1140,8 +1140,8 @@@ HRESULT get_event_handler(event_target_ return S_OK; } - HRESULT attach_event(event_target_t **event_target_ptr, HTMLDocument *doc, BSTR name, IDispatch *disp, VARIANT_BOOL *res) + HRESULT attach_event(event_target_t **event_target_ptr, nsIDOMNode *nsnode, HTMLDocument *doc, BSTR name, + IDispatch *disp, VARIANT_BOOL *res) { event_target_t *event_target; eventid_t eid; @@@ -1128,7 -1171,7 +1171,7 @@@ event_target->event_table[eid]->handlers[i] = disp; *res = VARIANT_TRUE; - return ensure_nsevent_handler(doc->doc_node, eid); + return ensure_nsevent_handler(doc->doc_node, event_target, nsnode, eid); } HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name, IDispatch *disp) @@@ -1159,13 -1202,18 +1202,18 @@@ return S_OK; } - void update_cp_events(HTMLWindow *window, cp_static_data_t *cp) + void update_cp_events(HTMLWindow *window, event_target_t **event_target_ptr, cp_static_data_t *cp, nsIDOMNode *nsnode) { + event_target_t *event_target; int i; + event_target = get_event_target(event_target_ptr); + if(!event_target) + return; /* FIXME */ + for(i=0; i < EVENTID_LAST; i++) { if((event_info[i].flags & EVENT_DEFAULTLISTENER) && is_cp_event(cp, event_info[i].dispid)) - ensure_nsevent_handler(window->doc, i); + ensure_nsevent_handler(window->doc, event_target, nsnode, i); } } @@@ -1194,7 -1242,7 +1242,7 @@@ void check_event_attr(HTMLDocumentNode disp = script_parse_event(doc->basedoc.window, attr_value); if(disp) { node = get_node(doc, (nsIDOMNode*)nselem, TRUE); - set_event_handler_disp(get_node_event_target(node), node->doc, i, disp); + set_event_handler_disp(get_node_event_target(node), node->nsnode, node->doc, i, disp); IDispatch_Release(disp); } } diff --combined dll/win32/mshtml/htmlevent.h index 96ff4cdab5b,6ba2fe29dc7..6ba2fe29dc7 --- a/dll/win32/mshtml/htmlevent.h +++ b/dll/win32/mshtml/htmlevent.h @@@ -42,14 -42,14 +42,14 @@@ typedef enum eventid_t str_to_eid(LPCWSTR); void check_event_attr(HTMLDocumentNode*,nsIDOMElement*); void release_event_target(event_target_t*); - void fire_event(HTMLDocumentNode*,eventid_t,nsIDOMNode*,nsIDOMEvent*); - HRESULT set_event_handler(event_target_t**,HTMLDocumentNode*,eventid_t,VARIANT*); + void fire_event(HTMLDocumentNode*,eventid_t,BOOL,nsIDOMNode*,nsIDOMEvent*); + HRESULT set_event_handler(event_target_t**,nsIDOMNode*,HTMLDocumentNode*,eventid_t,VARIANT*); HRESULT get_event_handler(event_target_t**,eventid_t,VARIANT*); - HRESULT attach_event(event_target_t**,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*); + HRESULT attach_event(event_target_t**,nsIDOMNode*,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*); HRESULT detach_event(event_target_t*,HTMLDocument*,BSTR,IDispatch*); HRESULT dispatch_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*); HRESULT call_event(HTMLDOMNode*,eventid_t); - void update_cp_events(HTMLWindow*,cp_static_data_t*); + void update_cp_events(HTMLWindow*,event_target_t**,cp_static_data_t*,nsIDOMNode*); static inline event_target_t **get_node_event_target(HTMLDOMNode *node) { @@@ -58,7 -58,7 +58,7 @@@ static inline HRESULT set_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var) { - return set_event_handler(get_node_event_target(node), node->doc, eid, var); + return set_event_handler(get_node_event_target(node), node->nsnode, node->doc, eid, var); } static inline HRESULT get_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var) diff --combined dll/win32/mshtml/htmlimg.c index 17b6cceac95,a4448f9588f..a4448f9588f --- a/dll/win32/mshtml/htmlimg.c +++ b/dll/win32/mshtml/htmlimg.c @@@ -28,6 -28,7 +28,7 @@@ #include "wine/debug.h" #include "mshtml_private.h" + #include "htmlevent.h" WINE_DEFAULT_DEBUG_CHANNEL(mshtml); @@@ -388,15 -389,19 +389,19 @@@ static HRESULT WINAPI HTMLImgElement_ge static HRESULT WINAPI HTMLImgElement_put_onload(IHTMLImgElement *iface, VARIANT v) { HTMLImgElement *This = HTMLIMG_THIS(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); + + return set_node_event(&This->element.node, EVENTID_LOAD, &v); } static HRESULT WINAPI HTMLImgElement_get_onload(IHTMLImgElement *iface, VARIANT *p) { HTMLImgElement *This = HTMLIMG_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return get_node_event(&This->element.node, EVENTID_LOAD, p); } static HRESULT WINAPI HTMLImgElement_put_onerror(IHTMLImgElement *iface, VARIANT v) diff --combined dll/win32/mshtml/htmlwindow.c index 491625ed241,2aafaa3e4b4..2aafaa3e4b4 --- a/dll/win32/mshtml/htmlwindow.c +++ b/dll/win32/mshtml/htmlwindow.c @@@ -126,7 -126,7 +126,7 @@@ static inline HRESULT set_window_event( return E_FAIL; } - return set_event_handler(&window->doc->body_event_target, window->doc, eid, var); + return set_event_handler(&window->doc->body_event_target, NULL, window->doc, eid, var); } static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var) @@@ -1419,7 -1419,7 +1419,7 @@@ static HRESULT WINAPI HTMLWindow3_attac return E_FAIL; } - return attach_event(&This->doc->body_event_target, &This->doc->basedoc, event, pDisp, pfResult); + return attach_event(&This->doc->body_event_target, NULL, &This->doc->basedoc, event, pDisp, pfResult); } static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp) diff --combined dll/win32/mshtml/mshtml_private.h index 5a409b3cae5,228be35864e..228be35864e --- a/dll/win32/mshtml/mshtml_private.h +++ b/dll/win32/mshtml/mshtml_private.h @@@ -736,7 -736,7 +736,7 @@@ nsresult get_nsinterface(nsISupports*,R void init_nsevents(HTMLDocumentNode*); void release_nsevents(HTMLDocumentNode*); - void add_nsevent_listener(HTMLDocumentNode*,LPCWSTR); + void add_nsevent_listener(HTMLDocumentNode*,nsIDOMNode*,LPCWSTR); void set_window_bscallback(HTMLWindow*,nsChannelBSC*); void set_current_mon(HTMLWindow*,IMoniker*); diff --combined dll/win32/mshtml/mutation.c index 61ceca83525,a7942043557..a7942043557 --- a/dll/win32/mshtml/mutation.c +++ b/dll/win32/mshtml/mutation.c @@@ -338,6 -338,9 +338,9 @@@ static void handle_end_load(HTMLDocumen TRACE("\n"); + if(!This->basedoc.doc_obj) + return; + if(This != This->basedoc.doc_obj->basedoc.doc_node) { set_ready_state(This->basedoc.window, READYSTATE_INTERACTIVE); return; diff --combined dll/win32/mshtml/navigate.c index a09ea7f64d6,cc2aeb3f6c2..cc2aeb3f6c2 --- a/dll/win32/mshtml/navigate.c +++ b/dll/win32/mshtml/navigate.c @@@ -972,8 -972,11 +972,11 @@@ static HRESULT read_stream_data(nsChann on_start_nsrequest(This); - if(This->window) + if(This->window) { update_window_doc(This->window); + if(This->window->readystate != READYSTATE_LOADING) + set_ready_state(This->window, READYSTATE_LOADING); + } } This->bsc.readed += This->nsstream->buf_size; diff --combined dll/win32/mshtml/nsevents.c index 65bcae05c31,c491424fdd4..c491424fdd4 --- a/dll/win32/mshtml/nsevents.c +++ b/dll/win32/mshtml/nsevents.c @@@ -216,7 -216,7 +216,7 @@@ static nsresult NSAPI handle_load(nsIDO TRACE("(%p)\n", doc); - if(!doc) + if(!doc || !doc->basedoc.window) return NS_ERROR_FAILURE; doc_obj = doc->basedoc.doc_obj; @@@ -254,7 -254,7 +254,7 @@@ nsIDOMHTMLDocument_GetBody(doc->nsdoc, &nsbody); if(nsbody) { - fire_event(doc, EVENTID_LOAD, (nsIDOMNode*)nsbody, event); + fire_event(doc, EVENTID_LOAD, TRUE, (nsIDOMNode*)nsbody, event); nsIDOMHTMLElement_Release(nsbody); } @@@ -271,6 -271,8 +271,8 @@@ static nsresult NSAPI handle_htmlevent( eventid_t eid; nsresult nsres; + TRACE("\n"); + nsAString_Init(&type_str, NULL); nsIDOMEvent_GetType(event, &type_str); nsAString_GetData(&type_str, &type); @@@ -290,7 -292,7 +292,7 @@@ return NS_OK; } - fire_event(doc, eid, nsnode, event); + fire_event(doc, eid, TRUE, nsnode, event); nsIDOMNode_Release(nsnode); @@@ -334,12 -336,15 +336,15 @@@ static void init_listener(nsEventListen This->This = listener; } - void add_nsevent_listener(HTMLDocumentNode *doc, LPCWSTR type) + void add_nsevent_listener(HTMLDocumentNode *doc, nsIDOMNode *nsnode, LPCWSTR type) { nsIDOMEventTarget *target; nsresult nsres; - nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target); + if(nsnode) + nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMEventTarget, (void**)&target); + else + nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target); if(NS_FAILED(nsres)) { ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres); return; diff --combined dll/win32/mshtml/nsio.c index f4e6f4bcb56,88a4e55254b..88a4e55254b --- a/dll/win32/mshtml/nsio.c +++ b/dll/win32/mshtml/nsio.c @@@ -904,7 -904,7 +904,7 @@@ static nsresult NSAPI nsChannel_AsyncOp open = FALSE; }else { - open = before_async_open(This, window->doc_obj->nscontainer); + open = !before_async_open(This, window->doc_obj->nscontainer); if(!open) { TRACE("canceled\n"); nsres = NS_ERROR_UNEXPECTED; diff --combined dll/win32/mshtml/omnavigator.c index dc0fb4a8ca4,d127eef57f7..d127eef57f7 --- a/dll/win32/mshtml/omnavigator.c +++ b/dll/win32/mshtml/omnavigator.c @@@ -160,19 -160,28 +160,28 @@@ static HRESULT WINAPI OmNavigator_get_a { OmNavigator *This = OMNAVIGATOR_THIS(iface); - /* FIXME: Should we return something smarter? */ - static const WCHAR app_verW[] = - {'4','.','0',' ','(','c','o','m','p','a','t','i','b','l','e',';', - ' ','M','S','I','E',' ','7','.','0',';', - ' ','W','i','n','d','o','w','s',' ','N','T',' ','5','.','1',';', - ' ','M','o','z','i','l','l','a','/','4','.','0',')',0}; + char user_agent[512]; + DWORD size; + HRESULT hres; TRACE("(%p)->(%p)\n", This, p); - *p = SysAllocString(app_verW); + size = sizeof(user_agent); + hres = ObtainUserAgentString(0, user_agent, &size); + if(FAILED(hres)) + return hres; + + if(strncmp(user_agent, "Mozilla/", 8)) { + FIXME("Unsupported user agent\n"); + return E_FAIL; + } + + size = MultiByteToWideChar(CP_ACP, 0, user_agent+8, -1, NULL, 0); + *p = SysAllocStringLen(NULL, size-1); if(!*p) return E_OUTOFMEMORY; + MultiByteToWideChar(CP_ACP, 0, user_agent+8, -1, *p, size); return S_OK; } diff --combined dll/win32/mshtml/persist.c index 720a58edbf8,44ccd0f6b2c..44ccd0f6b2c --- a/dll/win32/mshtml/persist.c +++ b/dll/win32/mshtml/persist.c @@@ -108,6 -108,7 +108,7 @@@ static void set_progress_proc(task_t *_ V_I4(&progress) = 0; /* FIXME */ IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, &progress, NULL); + IOleCommandTarget_Release(olecmd); } if(doc->usermode == EDITMODE && doc->hostui) { @@@ -282,11 -283,15 +283,15 @@@ HRESULT set_moniker(HTMLDocument *This void set_ready_state(HTMLWindow *window, READYSTATE readystate) { window->readystate = readystate; + if(window->doc_obj && window->doc_obj->basedoc.window == window) call_property_onchanged(&window->doc_obj->basedoc.cp_propnotif, DISPID_READYSTATE); + + fire_event(window->doc, EVENTID_READYSTATECHANGE, FALSE, window->doc->node.nsnode, NULL); + if(window->frame_element) fire_event(window->frame_element->element.node.doc, EVENTID_READYSTATECHANGE, - window->frame_element->element.node.nsnode, NULL); + TRUE, window->frame_element->element.node.nsnode, NULL); } static HRESULT get_doc_string(HTMLDocumentNode *This, char **str) diff --combined dll/win32/msi/database.c index 8ec2411cb59,cfa11e97ed5..cfa11e97ed5 --- a/dll/win32/msi/database.c +++ b/dll/win32/msi/database.c @@@ -2057,7 -2057,7 +2057,7 @@@ static ULONG WINAPI mrd_Release( IWineM } static HRESULT WINAPI mrd_IsTablePersistent( IWineMsiRemoteDatabase *iface, - BSTR table, MSICONDITION *persistent ) + LPCWSTR table, MSICONDITION *persistent ) { msi_remote_database_impl *This = mrd_from_IWineMsiRemoteDatabase( iface ); *persistent = MsiDatabaseIsTablePersistentW(This->database, table); @@@ -2065,7 -2065,7 +2065,7 @@@ } static HRESULT WINAPI mrd_GetPrimaryKeys( IWineMsiRemoteDatabase *iface, - BSTR table, MSIHANDLE *keys ) + LPCWSTR table, MSIHANDLE *keys ) { msi_remote_database_impl *This = mrd_from_IWineMsiRemoteDatabase( iface ); UINT r = MsiDatabaseGetPrimaryKeysW(This->database, table, keys); @@@ -2081,7 -2081,7 +2081,7 @@@ static HRESULT WINAPI mrd_GetSummaryInf } static HRESULT WINAPI mrd_OpenView( IWineMsiRemoteDatabase *iface, - BSTR query, MSIHANDLE *view ) + LPCWSTR query, MSIHANDLE *view ) { msi_remote_database_impl *This = mrd_from_IWineMsiRemoteDatabase( iface ); UINT r = MsiDatabaseOpenViewW(This->database, query, view); diff --combined dll/win32/msi/msi_De.rc index 7307621b768,e0cccf07806..e0cccf07806 --- a/dll/win32/msi/msi_De.rc +++ b/dll/win32/msi/msi_De.rc @@@ -36,4 -36,3 +36,3 @@@ STRINGTABLE DISCARDABL 14 "Feature von:" 15 "Wählen Sie das Verzeichnis aus, dass %s enthält." } - #pragma code_page(default) diff --combined dll/win32/msi/msi_Fr.rc index 08b90497745,f7f733803bc..f7f733803bc --- a/dll/win32/msi/msi_Fr.rc +++ b/dll/win32/msi/msi_Fr.rc @@@ -37,4 -37,3 +37,3 @@@ STRINGTABLE DISCARDABL 14 "fonctionnalité depuis :" 15 "sélectionnez le dossier contenant %s" } - #pragma code_page(default) diff --combined dll/win32/msi/msi_It.rc index 11525add056,a40a7303425..a40a7303425 --- a/dll/win32/msi/msi_It.rc +++ b/dll/win32/msi/msi_It.rc @@@ -37,4 -37,3 +37,3 @@@ STRINGTABLE DISCARDABL 14 "funzionalità da:" 15 "selezionare la cartella che contiene %s" } - #pragma code_page(default) diff --combined dll/win32/msi/msi_Lt.rc index 76602612bd5,1cf1c52924e..1cf1c52924e --- a/dll/win32/msi/msi_Lt.rc +++ b/dll/win32/msi/msi_Lt.rc @@@ -37,4 -37,3 +37,3 @@@ STRINGTABLE DISCARDABL 14 "komponentas iÅ¡:" 15 "parinkite aplanką, kuris turi %s" } - #pragma code_page(default) diff --combined dll/win32/msi/msi_Ro.rc index 436f83b491b,b877b42a34e..b877b42a34e --- a/dll/win32/msi/msi_Ro.rc +++ b/dll/win32/msi/msi_Ro.rc @@@ -35,4 -35,3 +35,3 @@@ STRINGTABLE DISCARDABL 14 "caracteristică de la:" 15 "selectați fișierul care conține %s" } - #pragma code_page(default) diff --combined dll/win32/msi/msi_Ru.rc index 3e59873c228,8e7aafdda31..8e7aafdda31 --- a/dll/win32/msi/msi_Ru.rc +++ b/dll/win32/msi/msi_Ru.rc @@@ -37,4 -37,3 +37,3 @@@ STRINGTABLE DISCARDABL 14 "возможность из:" 15 "выберите каталог, содержащий %s" } - #pragma code_page(default) diff --combined dll/win32/msi/msi_Si.rc index df7a9f1dc04,75823390635..75823390635 --- a/dll/win32/msi/msi_Si.rc +++ b/dll/win32/msi/msi_Si.rc @@@ -36,4 -36,3 +36,3 @@@ STRINGTABLE DISCARDABL 14 "funkcija z:" 15 "izberite mapo, ki vsebuje %s" } - #pragma code_page(default) diff --combined dll/win32/msi/msiquery.c index b673832b0c4,f2723affca9..f2723affca9 --- a/dll/win32/msi/msiquery.c +++ b/dll/win32/msi/msiquery.c @@@ -262,7 -262,7 +262,7 @@@ UINT WINAPI MsiDatabaseOpenViewW(MSIHAN if ( !remote_database ) return ERROR_INVALID_HANDLE; - hr = IWineMsiRemoteDatabase_OpenView( remote_database, (BSTR)szQuery, phView ); + hr = IWineMsiRemoteDatabase_OpenView( remote_database, szQuery, phView ); IWineMsiRemoteDatabase_Release( remote_database ); if (FAILED(hr)) @@@ -943,7 -943,7 +943,7 @@@ UINT WINAPI MsiDatabaseGetPrimaryKeysW if ( !remote_database ) return ERROR_INVALID_HANDLE; - hr = IWineMsiRemoteDatabase_GetPrimaryKeys( remote_database, (BSTR)table, phRec ); + hr = IWineMsiRemoteDatabase_GetPrimaryKeys( remote_database, table, phRec ); IWineMsiRemoteDatabase_Release( remote_database ); if (FAILED(hr)) @@@ -1030,7 -1030,7 +1030,7 @@@ MSICONDITION WINAPI MsiDatabaseIsTableP return MSICONDITION_ERROR; hr = IWineMsiRemoteDatabase_IsTablePersistent( remote_database, - (BSTR)szTableName, &condition ); + szTableName, &condition ); IWineMsiRemoteDatabase_Release( remote_database ); if (FAILED(hr)) diff --combined dll/win32/msi/msiserver.idl index 25210fee155,e74c22c0b19..e74c22c0b19 --- a/dll/win32/msi/msiserver.idl +++ b/dll/win32/msi/msiserver.idl @@@ -38,10 -38,10 +38,10 @@@ cpp_quote("#endif" ] interface IWineMsiRemoteDatabase : IUnknown { - HRESULT IsTablePersistent( [in] BSTR table, [out] MSICONDITION *persistent ); - HRESULT GetPrimaryKeys( [in] BSTR table, [out] MSIHANDLE *keys ); + HRESULT IsTablePersistent( [in] LPCWSTR table, [out] MSICONDITION *persistent ); + HRESULT GetPrimaryKeys( [in] LPCWSTR table, [out] MSIHANDLE *keys ); HRESULT GetSummaryInformation( [in] UINT updatecount, [out] MSIHANDLE *suminfo ); - HRESULT OpenView( [in] BSTR query, [out] MSIHANDLE *view ); + HRESULT OpenView( [in] LPCWSTR query, [out] MSIHANDLE *view ); HRESULT SetMsiHandle( [in] MSIHANDLE handle ); } diff --combined dll/win32/msvcrt/msvcrt.def index a78d2cc87ef,f7d9e100a2f..f7d9e100a2f --- a/dll/win32/msvcrt/msvcrt.def +++ b/dll/win32/msvcrt/msvcrt.def @@@ -316,7 -316,7 +316,7 @@@ EXPORT ; _getwche @310 _getws @311 _global_unwind2 @312 - ; _gmtime64 @313 + _gmtime64 @313 _heapadd @314 _heapchk @315 _heapmin @316 @@@ -373,7 -373,7 +373,7 @@@ _lfind @366 _loaddll @367 _local_unwind2 @368 - ; _localtime64 @369 + _localtime64 @369 _lock @370 _locking @371 _logb @372 @@@ -539,7 -539,7 +539,7 @@@ _tell @532 _telli64 @533 _tempnam @534 - ; _time64 @535 + _time64 @535 _timezone @536 DATA _tolower @537 _toupper @538 diff --combined dll/win32/msxml3/domdoc.c index a29e9b2fb3e,aae8a343500..aae8a343500 --- a/dll/win32/msxml3/domdoc.c +++ b/dll/win32/msxml3/domdoc.c @@@ -1650,19 -1650,20 +1650,20 @@@ static HRESULT WINAPI domdoc_abort static BOOL bstr_to_utf8( BSTR bstr, char **pstr, int *plen ) { - UINT len, blen = SysStringLen( bstr ); + UINT len; LPSTR str; - len = WideCharToMultiByte( CP_UTF8, 0, bstr, blen, NULL, 0, NULL, NULL ); + len = WideCharToMultiByte( CP_UTF8, 0, bstr, -1, NULL, 0, NULL, NULL ); str = heap_alloc( len ); if ( !str ) return FALSE; - WideCharToMultiByte( CP_UTF8, 0, bstr, blen, str, len, NULL, NULL ); + WideCharToMultiByte( CP_UTF8, 0, bstr, -1, str, len, NULL, NULL ); *plen = len; *pstr = str; return TRUE; } + /* don't rely on data to be in BSTR format, treat it as WCHAR string */ static HRESULT WINAPI domdoc_loadXML( IXMLDOMDocument2 *iface, BSTR bstrXML, diff --combined dll/win32/ole32/compobj.c index 583a9cbcd00,12f83146113..12f83146113 --- a/dll/win32/ole32/compobj.c +++ b/dll/win32/ole32/compobj.c @@@ -2956,7 -2956,7 +2956,7 @@@ HRESULT WINAPI CoGetTreatAsClass(REFCLS HRESULT res = S_OK; LONG len = sizeof(szClsidNew); - FIXME("(%s,%p)\n", debugstr_guid(clsidOld), clsidNew); + TRACE("(%s,%p)\n", debugstr_guid(clsidOld), clsidNew); *clsidNew = *clsidOld; /* copy over old value */ res = COM_OpenKeyForCLSID(clsidOld, wszTreatAs, KEY_READ, &hkey); diff --combined dll/win32/ole32/stg_bigblockfile.c index 19151b96382,77abbf6286b..77abbf6286b --- a/dll/win32/ole32/stg_bigblockfile.c +++ b/dll/win32/ole32/stg_bigblockfile.c @@@ -63,19 -63,10 +63,10 @@@ WINE_DEFAULT_DEBUG_CHANNEL(storage) /* We map in PAGE_SIZE-sized chunks. Must be a multiple of 4096. */ #define PAGE_SIZE 131072 - #define BLOCKS_PER_PAGE (PAGE_SIZE / BIG_BLOCK_SIZE) - /* We keep a list of recently-discarded pages. This controls the * size of that list. */ #define MAX_VICTIM_PAGES 16 - /* This structure provides one bit for each block in a page. - * Use BIGBLOCKFILE_{Test,Set,Clear}Bit to manipulate it. */ - typedef struct - { - unsigned int bits[BLOCKS_PER_PAGE / (CHAR_BIT * sizeof(unsigned int))]; - } BlockBits; - /*** * This structure identifies the paged that are mapped * from the file and their position in memory. It is @@@ -96,16 -87,12 +87,12 @@@ struct MappedPag DWORD mapped_bytes; LPVOID lpBytes; LONG refcnt; - - BlockBits readable_blocks; - BlockBits writable_blocks; }; struct BigBlockFile { BOOL fileBased; ULARGE_INTEGER filesize; - ULONG blocksize; HANDLE hfile; HANDLE hfilemap; DWORD flProtect; @@@ -123,39 -110,6 +110,6 @@@ * pass expressions with side effects. */ #define ROUND_UP(a, b) ((((a) + (b) - 1)/(b))*(b)) - /*********************************************************** - * Blockbits functions. - */ - static inline BOOL BIGBLOCKFILE_TestBit(const BlockBits *bb, - unsigned int index) - { - unsigned int array_index = index / (CHAR_BIT * sizeof(unsigned int)); - unsigned int bit_index = index % (CHAR_BIT * sizeof(unsigned int)); - - return bb->bits[array_index] & (1 << bit_index); - } - - static inline void BIGBLOCKFILE_SetBit(BlockBits *bb, unsigned int index) - { - unsigned int array_index = index / (CHAR_BIT * sizeof(unsigned int)); - unsigned int bit_index = index % (CHAR_BIT * sizeof(unsigned int)); - - bb->bits[array_index] |= (1 << bit_index); - } - - static inline void BIGBLOCKFILE_ClearBit(BlockBits *bb, unsigned int index) - { - unsigned int array_index = index / (CHAR_BIT * sizeof(unsigned int)); - unsigned int bit_index = index % (CHAR_BIT * sizeof(unsigned int)); - - bb->bits[array_index] &= ~(1 << bit_index); - } - - static inline void BIGBLOCKFILE_Zero(BlockBits *bb) - { - memset(bb->bits, 0, sizeof(bb->bits)); - } - /****************************************************************************** * BIGBLOCKFILE_FileInit * @@@ -302,9 -256,6 +256,6 @@@ static MappedPage *BIGBLOCKFILE_CreateP return NULL; } - BIGBLOCKFILE_Zero(&page->readable_blocks); - BIGBLOCKFILE_Zero(&page->writable_blocks); - return page; } @@@ -328,9 -279,6 +279,6 @@@ static void * BIGBLOCKFILE_GetMappedVie if (page) { This->num_victim_pages--; - - BIGBLOCKFILE_Zero(&page->readable_blocks); - BIGBLOCKFILE_Zero(&page->writable_blocks); } } @@@ -709,7 -657,7 +657,7 @@@ static HRESULT ImplBIGBLOCKFILE_WriteAt * and the blocks in use list. */ BigBlockFile *BIGBLOCKFILE_Construct(HANDLE hFile, ILockBytes* pLkByt, DWORD openFlags, - ULONG blocksize, BOOL fileBased) + BOOL fileBased) { BigBlockFile *This; @@@ -720,7 -668,6 +668,6 @@@ This->fileBased = fileBased; This->flProtect = BIGBLOCKFILE_GetProtectMode(openFlags); - This->blocksize = blocksize; This->maplist = NULL; This->victimhead = NULL; @@@ -863,31 -810,19 +810,19 @@@ static HRESULT BIGBLOCKFILE_GetSize(Big } /****************************************************************************** - * BIGBLOCKFILE_EnsureExists + * BIGBLOCKFILE_Expand * - * Grows the file if necessary to make sure the block is valid. + * Grows the file to the specified size if necessary. */ - HRESULT BIGBLOCKFILE_EnsureExists(BigBlockFile *This, ULONG index) + HRESULT BIGBLOCKFILE_Expand(BigBlockFile *This, ULARGE_INTEGER newSize) { ULARGE_INTEGER size; HRESULT hr; - /* Block index starts at -1 translate to zero based index */ - if (index == 0xffffffff) - index = 0; - else - index++; - hr = BIGBLOCKFILE_GetSize(This, &size); if(FAILED(hr)) return hr; - /* make sure that the block physically exists */ - if ((This->blocksize * (index + 1)) > size.QuadPart) - { - ULARGE_INTEGER newSize; - - newSize.QuadPart = This->blocksize * (index + 1); + if (newSize.QuadPart > size.QuadPart) hr = BIGBLOCKFILE_SetSize(This, newSize); - } return hr; } diff --combined dll/win32/ole32/stg_prop.c index 52153a20d44,b3362bc21de..b3362bc21de --- a/dll/win32/ole32/stg_prop.c +++ b/dll/win32/ole32/stg_prop.c @@@ -181,7 -181,9 +181,9 @@@ static HRESULT WINAPI IPropertyStorage_ { PropertyStorage_impl *This = (PropertyStorage_impl *)iface; - if ( (This==0) || (ppvObject==0) ) + TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppvObject); + + if (!ppvObject) return E_INVALIDARG; *ppvObject = 0; diff --combined dll/win32/ole32/storage32.c index 837365bdb9d,f1706da72fb..f1706da72fb --- a/dll/win32/ole32/storage32.c +++ b/dll/win32/ole32/storage32.c @@@ -269,14 -269,9 +269,9 @@@ static void IEnumSTATSTGImpl_Destroy(IE ** Block Functions */ - static ULONG BLOCK_GetBigBlockOffset(ULONG index) + static ULONG StorageImpl_GetBigBlockOffset(StorageImpl* This, ULONG index) { - if (index == 0xffffffff) - index = 0; - else - index ++; - - return index * BIG_BLOCK_SIZE; + return (index+1) * This->bigBlockSize; } /************************************************************************ @@@ -1599,11 -1594,15 +1594,15 @@@ static HRESULT WINAPI StorageBaseImpl_C SNB snbExclude, /* [unique][in] */ IStorage* pstgDest) /* [unique][in] */ { + StorageBaseImpl* const This=(StorageBaseImpl*)iface; + IEnumSTATSTG *elements = 0; STATSTG curElement, strStat; HRESULT hr; IStorage *pstgTmp, *pstgChild; IStream *pstrTmp, *pstrChild; + DirRef srcEntryRef; + DirEntry srcEntry; BOOL skip = FALSE, skip_storage = FALSE, skip_stream = FALSE; int i; @@@ -1728,11 -1727,25 +1727,25 @@@ goto cleanup; /* - * open child stream storage + * open child stream storage. This operation must succeed even if the + * stream is already open, so we use internal functions to do it. */ - hr = IStorage_OpenStream( iface, curElement.pwcsName, NULL, - STGM_READ|STGM_SHARE_EXCLUSIVE, - 0, &pstrChild ); + srcEntryRef = findElement( This, This->storageDirEntry, curElement.pwcsName, + &srcEntry); + if (!srcEntryRef) + { + ERR("source stream not found\n"); + hr = STG_E_DOCFILECORRUPT; + } + + if (hr == S_OK) + { + pstrChild = (IStream*)StgStreamImpl_Construct(This, STGM_READ|STGM_SHARE_EXCLUSIVE, srcEntryRef); + if (pstrChild) + IStream_AddRef(pstrChild); + else + hr = E_OUTOFMEMORY; + } if (hr == S_OK) { @@@ -2626,7 -2639,6 +2639,6 @@@ static HRESULT StorageImpl_Construct This->bigBlockFile = BIGBLOCKFILE_Construct(hFile, pLkbyt, openFlags, - This->bigBlockSize, fileBased); if (This->bigBlockFile == 0) @@@ -2638,7 -2650,7 +2650,7 @@@ if (create) { ULARGE_INTEGER size; - BYTE bigBlockBuffer[BIG_BLOCK_SIZE]; + BYTE bigBlockBuffer[MAX_BIG_BLOCK_SIZE]; /* * Initialize all header variables: @@@ -2835,13 -2847,14 +2847,14 @@@ static ULONG StorageImpl_GetNextFreeBig StorageImpl* This) { ULONG depotBlockIndexPos; - BYTE depotBuffer[BIG_BLOCK_SIZE]; + BYTE depotBuffer[MAX_BIG_BLOCK_SIZE]; BOOL success; ULONG depotBlockOffset; ULONG blocksPerDepot = This->bigBlockSize / sizeof(ULONG); ULONG nextBlockIndex = BLOCK_SPECIAL; int depotIndex = 0; ULONG freeBlock = BLOCK_UNUSED; + ULARGE_INTEGER neededSize; depotIndex = This->prevFreeBlock / blocksPerDepot; depotBlockOffset = (This->prevFreeBlock % blocksPerDepot) * sizeof(ULONG); @@@ -2955,7 -2968,8 +2968,8 @@@ /* * make sure that the block physically exists before using it */ - BIGBLOCKFILE_EnsureExists(This->bigBlockFile, freeBlock); + neededSize.QuadPart = StorageImpl_GetBigBlockOffset(This, freeBlock)+This->bigBlockSize; + BIGBLOCKFILE_Expand(This->bigBlockFile, neededSize); This->prevFreeBlock = freeBlock; @@@ -2970,7 -2984,7 +2984,7 @@@ */ static void Storage32Impl_AddBlockDepot(StorageImpl* This, ULONG blockIndex) { - BYTE blockBuffer[BIG_BLOCK_SIZE]; + BYTE blockBuffer[MAX_BIG_BLOCK_SIZE]; /* * Initialize blocks as free @@@ -3053,7 -3067,7 +3067,7 @@@ static ULONG Storage32Impl_AddExtBlockD { ULONG numExtBlocks = This->extBigBlockDepotCount; ULONG nextExtBlock = This->extBigBlockDepotStart; - BYTE depotBuffer[BIG_BLOCK_SIZE]; + BYTE depotBuffer[MAX_BIG_BLOCK_SIZE]; ULONG index = BLOCK_UNUSED; ULONG nextBlockOffset = This->bigBlockSize - sizeof(ULONG); ULONG blocksPerDepotBlock = This->bigBlockSize / sizeof(ULONG); @@@ -3143,10 -3157,10 +3157,10 @@@ static HRESULT StorageImpl_GetNextBlock ULONG offsetInDepot = blockIndex * sizeof (ULONG); ULONG depotBlockCount = offsetInDepot / This->bigBlockSize; ULONG depotBlockOffset = offsetInDepot % This->bigBlockSize; - BYTE depotBuffer[BIG_BLOCK_SIZE]; + BYTE depotBuffer[MAX_BIG_BLOCK_SIZE]; BOOL success; ULONG depotBlockIndexPos; - int index; + int index, num_blocks; *nextBlockIndex = BLOCK_SPECIAL; @@@ -3181,7 -3195,9 +3195,9 @@@ if (!success) return STG_E_READFAULT; - for (index = 0; index < NUM_BLOCKS_PER_DEPOT_BLOCK; index++) + num_blocks = This->bigBlockSize / 4; + + for (index = 0; index < num_blocks; index++) { StorageUtl_ReadDWord(depotBuffer, index*sizeof(ULONG), nextBlockIndex); This->blockDepotCached[index] = *nextBlockIndex; @@@ -3272,26 -3288,31 +3288,31 @@@ static void StorageImpl_SetNextBlockInC /****************************************************************************** * Storage32Impl_LoadFileHeader * - * This method will read in the file header, i.e. big block index -1. + * This method will read in the file header */ static HRESULT StorageImpl_LoadFileHeader( StorageImpl* This) { - HRESULT hr = STG_E_FILENOTFOUND; - BYTE headerBigBlock[BIG_BLOCK_SIZE]; - BOOL success; + HRESULT hr; + BYTE headerBigBlock[HEADER_SIZE]; int index; + ULARGE_INTEGER offset; + DWORD bytes_read; TRACE("\n"); /* * Get a pointer to the big block of data containing the header. */ - success = StorageImpl_ReadBigBlock(This, -1, headerBigBlock); + offset.u.HighPart = 0; + offset.u.LowPart = 0; + hr = StorageImpl_ReadAt(This, offset, headerBigBlock, HEADER_SIZE, &bytes_read); + if (SUCCEEDED(hr) && bytes_read != HEADER_SIZE) + hr = STG_E_FILENOTFOUND; /* * Extract the information from the header. */ - if (success) + if (SUCCEEDED(hr)) { /* * Check for the "magic number" signature and return an error if it is not @@@ -3360,7 -3381,7 +3381,7 @@@ * Right now, the code is making some assumptions about the size of the * blocks, just make sure they are what we're expecting. */ - if (This->bigBlockSize != DEF_BIG_BLOCK_SIZE || + if ((This->bigBlockSize != MIN_BIG_BLOCK_SIZE && This->bigBlockSize != MAX_BIG_BLOCK_SIZE) || This->smallBlockSize != DEF_SMALL_BLOCK_SIZE) { WARN("Broken OLE storage file\n"); @@@ -3376,29 -3397,35 +3397,35 @@@ /****************************************************************************** * Storage32Impl_SaveFileHeader * - * This method will save to the file the header, i.e. big block -1. + * This method will save to the file the header */ static void StorageImpl_SaveFileHeader( StorageImpl* This) { - BYTE headerBigBlock[BIG_BLOCK_SIZE]; + BYTE headerBigBlock[HEADER_SIZE]; int index; - BOOL success; + HRESULT hr; + ULARGE_INTEGER offset; + DWORD bytes_read, bytes_written; /* * Get a pointer to the big block of data containing the header. */ - success = StorageImpl_ReadBigBlock(This, -1, headerBigBlock); + offset.u.HighPart = 0; + offset.u.LowPart = 0; + hr = StorageImpl_ReadAt(This, offset, headerBigBlock, HEADER_SIZE, &bytes_read); + if (SUCCEEDED(hr) && bytes_read != HEADER_SIZE) + hr = STG_E_FILENOTFOUND; /* * If the block read failed, the file is probably new. */ - if (!success) + if (FAILED(hr)) { /* * Initialize for all unknown fields. */ - memset(headerBigBlock, 0, BIG_BLOCK_SIZE); + memset(headerBigBlock, 0, HEADER_SIZE); /* * Initialize the magic number. @@@ -3469,7 -3496,7 +3496,7 @@@ /* * Write the big block back to the file. */ - StorageImpl_WriteBigBlock(This, -1, headerBigBlock); + StorageImpl_WriteAt(This, offset, headerBigBlock, HEADER_SIZE, &bytes_written); } /****************************************************************************** @@@ -3711,7 -3738,7 +3738,7 @@@ static BOOL StorageImpl_ReadBigBlock DWORD read; ulOffset.u.HighPart = 0; - ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex); + ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex); StorageImpl_ReadAt(This, ulOffset, buffer, This->bigBlockSize, &read); return (read == This->bigBlockSize); @@@ -3728,7 -3755,7 +3755,7 @@@ static BOOL StorageImpl_ReadDWordFromBi DWORD tmp; ulOffset.u.HighPart = 0; - ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex); + ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex); ulOffset.u.LowPart += offset; StorageImpl_ReadAt(This, ulOffset, &tmp, sizeof(DWORD), &read); @@@ -3745,7 -3772,7 +3772,7 @@@ static BOOL StorageImpl_WriteBigBlock DWORD wrote; ulOffset.u.HighPart = 0; - ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex); + ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex); StorageImpl_WriteAt(This, ulOffset, buffer, This->bigBlockSize, &wrote); return (wrote == This->bigBlockSize); @@@ -3761,7 -3788,7 +3788,7 @@@ static BOOL StorageImpl_WriteDWordToBig DWORD wrote; ulOffset.u.HighPart = 0; - ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex); + ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex); ulOffset.u.LowPart += offset; value = htole32(value); @@@ -5151,7 -5178,7 +5178,7 @@@ HRESULT BlockChainStream_ReadAt(BlockCh TRACE("block %i\n",blockIndex); ulOffset.u.HighPart = 0; - ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex) + + ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This->parentStorage, blockIndex) + offsetInBlock; StorageImpl_ReadAt(This->parentStorage, @@@ -5247,7 -5274,7 +5274,7 @@@ HRESULT BlockChainStream_WriteAt(BlockC TRACE("block %i\n",blockIndex); ulOffset.u.HighPart = 0; - ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex) + + ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This->parentStorage, blockIndex) + offsetInBlock; StorageImpl_WriteAt(This->parentStorage, @@@ -5721,7 -5748,7 +5748,7 @@@ static ULONG SmallBlockChainStream_GetN ULONG sbdIndex = This->parentStorage->smallBlockDepotStart; ULONG nextBlock, newsbdIndex; - BYTE smallBlockDepot[BIG_BLOCK_SIZE]; + BYTE smallBlockDepot[MAX_BIG_BLOCK_SIZE]; nextBlock = sbdIndex; while (nextBlock != BLOCK_END_OF_CHAIN) diff --combined dll/win32/ole32/storage32.h index 03328b29708,fad5d7766f7..fad5d7766f7 --- a/dll/win32/ole32/storage32.h +++ b/dll/win32/ole32/storage32.h @@@ -79,6 -79,11 +79,11 @@@ static const ULONG DIRENTRY_NUL #define RAW_DIRENTRY_SIZE 0x00000080 + #define HEADER_SIZE 512 + + #define MIN_BIG_BLOCK_SIZE 0x200 + #define MAX_BIG_BLOCK_SIZE 0x1000 + /* * Type of child entry link */ @@@ -91,15 -96,8 +96,8 @@@ */ #define STGTY_ROOT 0x05 - /* - * These defines assume a hardcoded blocksize. The code will assert - * if the blocksize is different. Some changes will have to be done if it - * becomes the case. - */ - #define BIG_BLOCK_SIZE 0x200 #define COUNT_BBDEPOTINHEADER 109 #define LIMIT_TO_USE_SMALL_BLOCK 0x1000 - #define NUM_BLOCKS_PER_DEPOT_BLOCK 128 #define STGM_ACCESS_MODE(stgm) ((stgm)&0x0000f) #define STGM_SHARE_MODE(stgm) ((stgm)&0x000f0) @@@ -163,10 -161,9 +161,9 @@@ typedef struct BigBlockFile BigBlockFil BigBlockFile* BIGBLOCKFILE_Construct(HANDLE hFile, ILockBytes* pLkByt, DWORD openFlags, - ULONG blocksize, BOOL fileBased); void BIGBLOCKFILE_Destructor(LPBIGBLOCKFILE This); - HRESULT BIGBLOCKFILE_EnsureExists(LPBIGBLOCKFILE This, ULONG index); + HRESULT BIGBLOCKFILE_Expand(LPBIGBLOCKFILE This, ULARGE_INTEGER newSize); HRESULT BIGBLOCKFILE_SetSize(LPBIGBLOCKFILE This, ULARGE_INTEGER newSize); HRESULT BIGBLOCKFILE_ReadAt(LPBIGBLOCKFILE This, ULARGE_INTEGER offset, void* buffer, ULONG size, ULONG* bytesRead); @@@ -359,7 -356,7 +356,7 @@@ struct StorageImp ULONG extBigBlockDepotCount; ULONG bigBlockDepotStart[COUNT_BBDEPOTINHEADER]; - ULONG blockDepotCached[NUM_BLOCKS_PER_DEPOT_BLOCK]; + ULONG blockDepotCached[MAX_BIG_BLOCK_SIZE / 4]; ULONG indexBlockDepotCached; ULONG prevFreeBlock; diff --combined dll/win32/oleaut32/typelib.c index 445eac5c51e,b09f7ab64d1..b09f7ab64d1 --- a/dll/win32/oleaut32/typelib.c +++ b/dll/win32/oleaut32/typelib.c @@@ -4722,6 -4722,7 +4722,7 @@@ static HRESULT WINAPI ITypeLibComp_fnBi { ITypeLibImpl *This = impl_from_ITypeComp(iface); ITypeInfoImpl *pTypeInfo; + int typemismatch=0; TRACE("(%s, 0x%x, 0x%x, %p, %p, %p)\n", debugstr_w(szName), lHash, wFlags, ppTInfo, pDescKind, pBindPtr); @@@ -4761,6 -4762,8 +4762,8 @@@ TRACE("found in module or in enum: %s\n", debugstr_w(szName)); return S_OK; } + else if (hr == TYPE_E_TYPEMISMATCH) + typemismatch = 1; } if ((pTypeInfo->TypeAttr.typekind == TKIND_COCLASS) && @@@ -4833,11 -4836,21 +4836,21 @@@ ITypeInfo_AddRef(*ppTInfo); return S_OK; } + else if (hr == TYPE_E_TYPEMISMATCH) + typemismatch = 1; } } - TRACE("name not found %s\n", debugstr_w(szName)); - return S_OK; + if (typemismatch) + { + TRACE("type mismatch %s\n", debugstr_w(szName)); + return TYPE_E_TYPEMISMATCH; + } + else + { + TRACE("name not found %s\n", debugstr_w(szName)); + return S_OK; + } } static HRESULT WINAPI ITypeLibComp_fnBindType( @@@ -5568,6 -5581,11 +5581,11 @@@ static HRESULT WINAPI ITypeInfo_fnGetIm return S_OK; } *pImplTypeFlags=0; + + if(This->TypeAttr.typekind==TKIND_DISPATCH && !index) + return S_OK; + + WARN("ImplType %d not found\n", index); return TYPE_E_ELEMENTNOTFOUND; } @@@ -6052,9 -6070,6 +6070,6 @@@ static HRESULT WINAPI ITypeInfo_fnInvok hres = DISP_E_PARAMNOTFOUND; goto func_fail; } - /* ignore the DISPID_PROPERTYPUT named argument from now on */ - cNamedArgs--; - rgdispidNamedArgs++; } if (func_desc->cParamsOpt < 0 && cNamedArgs) @@@ -6092,7 -6107,7 +6107,7 @@@ USHORT j; src_arg = NULL; for (j = 0; j < cNamedArgs; j++) - if (rgdispidNamedArgs[j] == i) + if (rgdispidNamedArgs[j] == i || (i == func_desc->cParams-1 && rgdispidNamedArgs[j] == DISPID_PROPERTYPUT)) { src_arg = &pDispParams->rgvarg[j]; break; @@@ -6859,7 -6874,8 +6874,8 @@@ static HRESULT WINAPI ITypeInfo_fnGetMo BSTR *pBstrMops) { ITypeInfoImpl *This = (ITypeInfoImpl *)iface; - FIXME("(%p) stub!\n", This); + FIXME("(%p %d) stub!\n", This, memid); + *pBstrMops = NULL; return S_OK; } diff --combined dll/win32/oleaut32/typelib2.c index 4544317a512,6b1aea062ba..6b1aea062ba --- a/dll/win32/oleaut32/typelib2.c +++ b/dll/win32/oleaut32/typelib2.c @@@ -199,9 -199,11 +199,11 @@@ typedef struct tagICreateTypeInfo2Imp struct tagCyclicList *typedata; /* tail of cyclic list */ + TYPEKIND typekind; int datawidth; struct tagICreateTypeInfo2Impl *next_typeinfo; + struct tagICreateTypeInfo2Impl *dual; } ICreateTypeInfo2Impl; static inline ICreateTypeInfo2Impl *impl_from_ITypeInfo2( ITypeInfo2 *iface ) @@@ -1177,6 -1179,7 +1179,7 @@@ static HRESULT ctl2_add_default_value { VARIANT v; HRESULT hres; + int mask = 0; TRACE("%p %d %d\n", This, V_VT(value), arg_type); @@@ -1194,7 -1197,6 +1197,6 @@@ /* Check if default value can be stored in encoded_value */ switch(arg_type) { - int mask = 0; case VT_I4: case VT_UI4: mask = 0x3ffffff; @@@ -1313,7 -1315,7 +1315,7 @@@ static HRESULT WINAPI ICreateTypeInfo2_ if(*ppvObject) { - ICreateTypeLib2_AddRef(iface); + ICreateTypeInfo2_AddRef(iface); TRACE("-- Interface: (%p)->(%p)\n",ppvObject,*ppvObject); return S_OK; } @@@ -1333,6 -1335,9 +1335,9 @@@ static ULONG WINAPI ICreateTypeInfo2_fn TRACE("(%p)->ref was %u\n",This, ref - 1); + if(ref==1 && This->typelib) + ICreateTypeLib2_AddRef((ICreateTypeLib2 *)This->typelib); + return ref; } @@@ -1406,43 -1411,63 +1411,63 @@@ static HRESULT WINAPI ICreateTypeInfo2_ TRACE("(%p,0x%x)\n", iface, uTypeFlags); - This->typeinfo->flags = uTypeFlags; + if(uTypeFlags & TYPEFLAG_FDUAL) { + This->typeinfo->typekind |= 0x10; + This->typeinfo->typekind &= ~0x0f; + This->typeinfo->typekind |= TKIND_DISPATCH; + + if(!This->dual) { + This->dual = HeapAlloc(GetProcessHeap(), 0, sizeof(ICreateTypeInfo2Impl)); + if(!This->dual) + return E_OUTOFMEMORY; + + memcpy(This->dual, This, sizeof(ICreateTypeInfo2Impl)); + This->dual->ref = 0; + This->dual->typekind = This->typekind==TKIND_DISPATCH ? + TKIND_INTERFACE : TKIND_DISPATCH; + This->dual->dual = This; + } - if (uTypeFlags & TYPEFLAG_FDISPATCHABLE) { - MSFT_GuidEntry foo; - int guidoffset; - int fileoffset; - MSFT_ImpInfo impinfo; - static const WCHAR stdole2tlb[] = { 's','t','d','o','l','e','2','.','t','l','b',0 }; - - foo.guid = IID_StdOle; - foo.hreftype = 2; - foo.next_hash = -1; - guidoffset = ctl2_alloc_guid(This->typelib, &foo); - if (guidoffset == -1) return E_OUTOFMEMORY; - - fileoffset = ctl2_alloc_importfile(This->typelib, guidoffset, - This->typelib->typelib_header.lcid2, 2, 0, stdole2tlb); - if (fileoffset == -1) return E_OUTOFMEMORY; - - foo.guid = IID_IDispatch; - foo.hreftype = 1; - foo.next_hash = -1; - guidoffset = ctl2_alloc_guid(This->typelib, &foo); - if (guidoffset == -1) return E_OUTOFMEMORY; - - impinfo.flags = TKIND_INTERFACE << 24 | MSFT_IMPINFO_OFFSET_IS_GUID; - impinfo.oImpFile = fileoffset; - impinfo.oGuid = guidoffset; - ctl2_alloc_importinfo(This->typelib, &impinfo); - - This->typelib->typelib_header.dispatchpos = 1; - - This->typeinfo->typekind |= 0x10; - This->typeinfo->typekind &= ~0x0f; - This->typeinfo->typekind |= TKIND_DISPATCH; + /* Make sure dispatch is in typeinfos queue */ + if(This->typekind != TKIND_DISPATCH) { + if(This->typelib->last_typeinfo == This) + This->typelib->last_typeinfo = This->dual; + + if(This->typelib->typeinfos == This) + This->typelib->typeinfos = This->dual; + else { + ICreateTypeInfo2Impl *iter; + + for(iter=This->typelib->typeinfos; iter->next_typeinfo!=This; iter=iter->next_typeinfo); + iter->next_typeinfo = This->dual; + } + } else + iface = (ICreateTypeInfo2*)&This->dual->lpVtbl; } + if (uTypeFlags & (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL)) { + static const WCHAR stdole2tlb[] = { 's','t','d','o','l','e','2','.','t','l','b',0 }; + ITypeLib *stdole; + ITypeInfo *dispatch; + HREFTYPE hreftype; + HRESULT hres; + + hres = LoadTypeLib(stdole2tlb, &stdole); + if(FAILED(hres)) + return hres; + + hres = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IDispatch, &dispatch); + ITypeLib_Release(stdole); + if(FAILED(hres)) + return hres; + + hres = ICreateTypeInfo2_AddRefTypeInfo(iface, dispatch, &hreftype); + ITypeInfo_Release(dispatch); + if(FAILED(hres)) + return hres; + } + + This->typeinfo->flags = uTypeFlags; return S_OK; } @@@ -1541,25 -1566,21 +1566,21 @@@ static HRESULT WINAPI ICreateTypeInfo2_ /* Process locally defined TypeInfo */ *phRefType = This->typelib->typelib_typeinfo_offsets[index]; } else { - static const WCHAR regkey[] = {'T','y','p','e','L','i','b','\\','{', - '%','0','8','x','-','%','0','4','x','-','%','0','4','x','-','%', - '0','2','x','%','0','2','x','-','%','0','2','x','%','0','2','x', - '%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x', - '}','\\','%','d','.','%','d','\\','0','\\','w','i','n','3','2',0}; - - WCHAR name[MAX_PATH], *p; + BSTR name; TLIBATTR *tlibattr; TYPEATTR *typeattr; + TYPEKIND typekind; MSFT_GuidEntry guid, *check_guid; MSFT_ImpInfo impinfo; int guid_offset, import_offset; - DWORD len; HRESULT hres; /* Allocate container GUID */ hres = ITypeLib_GetLibAttr(container, &tlibattr); - if(FAILED(hres)) + if(FAILED(hres)) { + ITypeLib_Release(container); return hres; + } guid.guid = tlibattr->guid; guid.hreftype = This->typelib->typelib_guids*12+2; @@@ -1568,6 -1589,7 +1589,7 @@@ guid_offset = ctl2_alloc_guid(This->typelib, &guid); if(guid_offset == -1) { ITypeLib_ReleaseTLibAttr(container, tlibattr); + ITypeLib_Release(container); return E_OUTOFMEMORY; } @@@ -1576,50 -1598,50 +1598,50 @@@ This->typelib->typelib_guids++; /* Get import file name */ - /* Check HKEY_CLASSES_ROOT\TypeLib\{GUID}\{Ver}\0\win32 */ - len = MAX_PATH; - sprintfW(name, regkey, guid.guid.Data1, guid.guid.Data2, - guid.guid.Data3, guid.guid.Data4[0], guid.guid.Data4[1], - guid.guid.Data4[2], guid.guid.Data4[3], guid.guid.Data4[4], - guid.guid.Data4[5], guid.guid.Data4[6], guid.guid.Data4[7], - tlibattr->wMajorVerNum, tlibattr->wMinorVerNum); - - if(RegGetValueW(HKEY_CLASSES_ROOT, name, NULL, RRF_RT_REG_SZ, NULL, name, &len)!=ERROR_SUCCESS - || (p=strrchrW(name, '\\'))==NULL) { - ERR("Error guessing typelib filename\n"); + hres = QueryPathOfRegTypeLib(&guid.guid, tlibattr->wMajorVerNum, + tlibattr->wMinorVerNum, tlibattr->lcid, &name); + if(FAILED(hres)) { ITypeLib_ReleaseTLibAttr(container, tlibattr); - return E_NOTIMPL; + ITypeLib_Release(container); + return hres; } - memmove(name, p+1, strlenW(p)*sizeof(WCHAR)); /* Import file */ - import_offset = ctl2_alloc_importfile(This->typelib, guid_offset, - tlibattr->lcid, tlibattr->wMajorVerNum, tlibattr->wMinorVerNum, name); + import_offset = ctl2_alloc_importfile(This->typelib, guid_offset, tlibattr->lcid, + tlibattr->wMajorVerNum, tlibattr->wMinorVerNum, strrchrW(name, '\\')+1); ITypeLib_ReleaseTLibAttr(container, tlibattr); + SysFreeString(name); - if(import_offset == -1) + if(import_offset == -1) { + ITypeLib_Release(container); return E_OUTOFMEMORY; + } /* Allocate referenced guid */ hres = ITypeInfo_GetTypeAttr(pTInfo, &typeattr); - if(FAILED(hres)) + if(FAILED(hres)) { + ITypeLib_Release(container); return hres; + } guid.guid = typeattr->guid; guid.hreftype = This->typelib->typeinfo_guids*12+1; guid.next_hash = -1; + typekind = typeattr->typekind; ITypeInfo_ReleaseTypeAttr(pTInfo, typeattr); guid_offset = ctl2_alloc_guid(This->typelib, &guid); - if(guid_offset == -1) + if(guid_offset == -1) { + ITypeLib_Release(container); return E_OUTOFMEMORY; + } check_guid = (MSFT_GuidEntry*)&This->typelib->typelib_segment_data[MSFT_SEG_GUID][guid_offset]; if(check_guid->hreftype == guid.hreftype) This->typelib->typeinfo_guids++; /* Allocate importinfo */ - impinfo.flags = ((This->typeinfo->typekind&0xf)<<24) | MSFT_IMPINFO_OFFSET_IS_GUID; + impinfo.flags = (typekind<<24) | MSFT_IMPINFO_OFFSET_IS_GUID; impinfo.oImpFile = import_offset; impinfo.oGuid = guid_offset; *phRefType = ctl2_alloc_importinfo(This->typelib, &impinfo)+1; @@@ -1652,7 -1674,7 +1674,7 @@@ static HRESULT WINAPI ICreateTypeInfo2_ TRACE("(%p,%d,%p)\n", iface, index, pFuncDesc); - if(!pFuncDesc || (pFuncDesc->memid>0x7fffffff && pFuncDesc->memid!=MEMBERID_NIL)) + if(!pFuncDesc || pFuncDesc->oVft&3) return E_INVALIDARG; TRACE("{%d,%p,%p,%d,%d,%d,%d,%d,%d,%d,{%d},%d}\n", pFuncDesc->memid, @@@ -1661,7 -1683,10 +1683,10 @@@ pFuncDesc->cParamsOpt, pFuncDesc->oVft, pFuncDesc->cScodes, pFuncDesc->elemdescFunc.tdesc.vt, pFuncDesc->wFuncFlags); - switch(This->typeinfo->typekind&0xf) { + if(pFuncDesc->cParamsOpt || pFuncDesc->cScodes) + FIXME("Unimplemented parameter - created typelib will be incorrect\n"); + + switch(This->typekind) { case TKIND_MODULE: if(pFuncDesc->funckind != FUNC_STATIC) return TYPE_E_BADMODULEKIND; @@@ -1688,12 -1713,15 +1713,15 @@@ num_defaults++; if (!This->typedata) { - This->typedata = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList)); + This->typedata = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList)); if(!This->typedata) return E_OUTOFMEMORY; This->typedata->next = This->typedata; - This->typedata->u.val = 0; + This->typedata->u.val = 0; + + if(This->dual) + This->dual->typedata = This->typedata; } /* allocate type data space for us */ @@@ -1711,7 -1739,7 +1739,7 @@@ typedata[0] = 0x18 + pFuncDesc->cParams*(num_defaults?16:12); ctl2_encode_typedesc(This->typelib, &pFuncDesc->elemdescFunc.tdesc, &typedata[1], NULL, NULL, &decoded_size); typedata[2] = pFuncDesc->wFuncFlags; - typedata[3] = ((sizeof(FUNCDESC) + decoded_size) << 16) | This->typeinfo->cbSizeVft; + typedata[3] = ((sizeof(FUNCDESC) + decoded_size) << 16) | (unsigned short)(pFuncDesc->oVft?pFuncDesc->oVft+1:0); typedata[4] = (pFuncDesc->callconv << 8) | (pFuncDesc->invkind << 3) | pFuncDesc->funckind; if(num_defaults) typedata[4] |= 0x1000; typedata[5] = pFuncDesc->cParams; @@@ -1758,6 -1786,9 +1786,9 @@@ insert->next = This->typedata->next; This->typedata->next = insert; This->typedata = insert; + + if(This->dual) + This->dual->typedata = This->typedata; } else { iter = This->typedata->next; for(i=0; itypeinfo->typekind & 15) == TKIND_COCLASS) { + if (This->typekind == TKIND_COCLASS) { int offset; MSFT_RefRecord *ref; @@@ -1822,21 -1853,26 +1853,26 @@@ ref->flags = 0; ref->oCustData = -1; ref->onext = -1; - } else if ((This->typeinfo->typekind & 15) == TKIND_DISPATCH) { - FIXME("dispatch case unhandled.\n"); - } else if ((This->typeinfo->typekind & 15) == TKIND_INTERFACE) { + This->typeinfo->cImplTypes++; + } else if (This->typekind == TKIND_INTERFACE) { if (This->typeinfo->cImplTypes && index==1) return TYPE_E_BADMODULEKIND; if( index != 0) return TYPE_E_ELEMENTNOTFOUND; This->typeinfo->datatype1 = hRefType; + This->typeinfo->cImplTypes = 1; + } else if (This->typekind == TKIND_DISPATCH) { + if(index != 0) return TYPE_E_ELEMENTNOTFOUND; + + /* FIXME: Check if referenced typeinfo is IDispatch */ + This->typeinfo->flags |= TYPEFLAG_FDISPATCHABLE; + This->typeinfo->cImplTypes = 1; } else { - FIXME("AddImplType unsupported on typekind %d\n", This->typeinfo->typekind & 15); + FIXME("AddImplType unsupported on typekind %d\n", This->typekind); return E_OUTOFMEMORY; } - This->typeinfo->cImplTypes++; return S_OK; } @@@ -1856,7 -1892,7 +1892,7 @@@ static HRESULT WINAPI ICreateTypeInfo2_ TRACE("(%p,%d,0x%x)\n", iface, index, implTypeFlags); - if ((This->typeinfo->typekind & 15) != TKIND_COCLASS) { + if (This->typekind != TKIND_COCLASS) { return TYPE_E_BADMODULEKIND; } @@@ -1889,7 -1925,7 +1925,7 @@@ static HRESULT WINAPI ICreateTypeInfo2_ This->typeinfo->typekind |= cbAlignment << 6; /* FIXME: There's probably some way to simplify this. */ - switch (This->typeinfo->typekind & 15) { + switch (This->typekind) { case TKIND_ALIAS: default: break; @@@ -1963,6 -1999,9 +1999,9 @@@ static HRESULT WINAPI ICreateTypeInfo2_ This->typedata->next = This->typedata; This->typedata->u.val = 0; + + if(This->dual) + This->dual->typedata = This->typedata; } /* allocate type data space for us */ @@@ -1979,6 -2018,9 +2018,9 @@@ This->typedata->next = insert; This->typedata = insert; + if(This->dual) + This->dual->typedata = This->typedata; + This->typedata->next->u.val += 0x14; typedata = This->typedata->u.data; @@@ -2003,6 -2045,8 +2045,8 @@@ /* add the new variable to the total data width */ This->datawidth += var_datawidth; + if(This->dual) + This->dual->datawidth = This->datawidth; /* add type description size to total required allocation */ typedata[3] += var_type_size << 16; @@@ -2125,7 -2169,7 +2169,7 @@@ static HRESULT WINAPI ICreateTypeInfo2_ *((INT *)namedata) = This->typelib->typelib_typeinfo_offsets[This->typeinfo->typekind >> 16]; namedata[9] |= 0x10; } - if ((This->typeinfo->typekind & 15) == TKIND_ENUM) { + if (This->typekind == TKIND_ENUM) { namedata[9] |= 0x20; } @@@ -2151,7 -2195,7 +2195,7 @@@ static HRESULT WINAPI ICreateTypeInfo2_ int encoded_typedesc; int width; - if ((This->typeinfo->typekind & 15) != TKIND_ALIAS) { + if (This->typekind != TKIND_ALIAS) { return TYPE_E_WRONGTYPEKIND; } @@@ -2225,8 -2269,42 +2269,42 @@@ static HRESULT WINAPI ICreateTypeInfo2_ UINT index, DWORD dwHelpContext) { - FIXME("(%p,%d,%d), stub!\n", iface, index, dwHelpContext); - return E_OUTOFMEMORY; + ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface; + CyclicList *func; + int *typedata; + int size; + + TRACE("(%p,%d,%d)\n", iface, index, dwHelpContext); + + if(This->typeinfo->cElementtypeinfo->cElement == index) + func = This->typedata; + else + for(func=This->typedata->next->next; func!=This->typedata; func=func->next) + if(index-- == 0) + break; + + typedata = func->u.data; + + /* Compute func size without arguments */ + size = typedata[0] - typedata[5]*(typedata[4]&0x1000?16:12); + + /* Allocate memory for HelpContext if needed */ + if(size < 7*sizeof(int)) { + typedata = HeapReAlloc(GetProcessHeap(), 0, typedata, typedata[0]+sizeof(int)); + if(!typedata) + return E_OUTOFMEMORY; + + memmove(&typedata[7], &typedata[6], typedata[0]-sizeof(int)*6); + typedata[0] += sizeof(int); + This->typedata->next->u.val += sizeof(int); + func->u.data = typedata; + } + + typedata[6] = dwHelpContext; + return S_OK; } /****************************************************************************** @@@ -2282,11 -2360,13 +2360,13 @@@ static HRESULT WINAPI ICreateTypeInfo2_ CyclicList *iter, *iter2, **typedata; HREFTYPE hreftype; HRESULT hres; + unsigned user_vft = 0; int i; TRACE("(%p)\n", iface); - if((This->typeinfo->typekind&0xf) == TKIND_COCLASS) + /* FIXME: LayOut should be run on all ImplTypes */ + if(This->typekind == TKIND_COCLASS) return S_OK; /* Validate inheritance */ @@@ -2317,15 -2397,17 +2397,17 @@@ return hres; hres = ITypeInfo_GetRefTypeInfo(next, hreftype, &cur); + ITypeInfo_Release(next); if(FAILED(hres)) return hres; - ITypeInfo_Release(next); while(1) { hres = ITypeInfo_GetTypeAttr(cur, &typeattr); - if(FAILED(hres)) + if(FAILED(hres)) { + ITypeInfo_Release(cur); return hres; + } if(!memcmp(&typeattr->guid, &IID_IDispatch, sizeof(IDispatch))) This->typeinfo->flags |= TYPEFLAG_FDISPATCHABLE; @@@ -2336,19 -2418,51 +2418,51 @@@ hres = ITypeInfo_GetRefTypeOfImplType(cur, 0, &hreftype); if(hres == TYPE_E_ELEMENTNOTFOUND) break; - if(FAILED(hres)) + if(FAILED(hres)) { + ITypeInfo_Release(cur); return hres; + } hres = ITypeInfo_GetRefTypeInfo(cur, hreftype, &next); - if(FAILED(hres)) + if(FAILED(hres)) { + ITypeInfo_Release(cur); return hres; + } ITypeInfo_Release(cur); cur = next; } + ITypeInfo_Release(cur); } - This->typeinfo->cbSizeVft = (This->typeinfo->datatype2>>16) * 4; + /* Get cbSizeVft of inherited interface */ + /* Makes LayOut running recursively */ + if(This->typeinfo->datatype1 != -1) { + ITypeInfo *cur, *inherited; + TYPEATTR *typeattr; + + hres = ICreateTypeInfo_QueryInterface(iface, &IID_ITypeInfo, (void**)&cur); + if(FAILED(hres)) + return hres; + + hres = ITypeInfo_GetRefTypeInfo(cur, This->typeinfo->datatype1, &inherited); + ITypeInfo_Release(cur); + if(FAILED(hres)) + return hres; + + hres = ITypeInfo_GetTypeAttr(inherited, &typeattr); + if(FAILED(hres)) { + ITypeInfo_Release(inherited); + return hres; + } + + This->typeinfo->cbSizeVft = typeattr->cbSizeVft; + + ITypeInfo_ReleaseTypeAttr(inherited, typeattr); + ITypeInfo_Release(inherited); + } else + This->typeinfo->cbSizeVft = 0; + if(!This->typedata) return S_OK; @@@ -2358,6 -2472,9 +2472,9 @@@ /* Assign IDs and VTBL entries */ i = 0; + if(This->typedata->u.data[3]&1) + user_vft = This->typedata->u.data[3]&0xffff; + for(iter=This->typedata->next->next; iter!=This->typedata->next; iter=iter->next) { /* Assign MEMBERID if MEMBERID_NIL was specified */ if(iter->indice == MEMBERID_NIL) { @@@ -2370,8 -2487,10 +2487,10 @@@ for(iter2=This->typedata->next->next; iter2!=This->typedata->next; iter2=iter2->next) { if(iter == iter2) continue; - if(iter2->indice == iter->indice) + if(iter2->indice == iter->indice) { + HeapFree(GetProcessHeap(), 0, typedata); return E_ACCESSDENIED; + } } break; @@@ -2383,7 -2502,20 +2502,20 @@@ iter->u.data[0] = (iter->u.data[0]&0xffff) | (i<<16); - if((This->typeinfo->typekind&0xf) != TKIND_MODULE) { + if((iter->u.data[3]&1) != (user_vft&1)) { + HeapFree(GetProcessHeap(), 0, typedata); + return TYPE_E_INVALIDID; + } + + if(user_vft&1) { + if(user_vft < (iter->u.data[3]&0xffff)) + user_vft = (iter->u.data[3]&0xffff); + + if((iter->u.data[3]&0xffff) < This->typeinfo->cbSizeVft) { + HeapFree(GetProcessHeap(), 0, typedata); + return TYPE_E_INVALIDID; + } + } else if(This->typekind != TKIND_MODULE) { iter->u.data[3] = (iter->u.data[3]&0xffff0000) | This->typeinfo->cbSizeVft; This->typeinfo->cbSizeVft += 4; } @@@ -2406,6 -2538,9 +2538,9 @@@ i++; } + if(user_vft) + This->typeinfo->cbSizeVft = user_vft+3; + for(i=0; i<(This->typeinfo->cElement&0xffff); i++) { if(typedata[i]->u.data[4]>>16 > i) { int inv; @@@ -2787,11 -2922,13 +2922,13 @@@ static HRESULT WINAPI ITypeInfo2_fnGetT (*ppTypeAttr)->lcid = This->typelib->typelib_header.lcid; (*ppTypeAttr)->cbSizeInstance = This->typeinfo->size; - (*ppTypeAttr)->typekind = This->typeinfo->typekind&0xf; + (*ppTypeAttr)->typekind = This->typekind; (*ppTypeAttr)->cFuncs = This->typeinfo->cElement&0xffff; + if(This->typeinfo->flags&TYPEFLAG_FDUAL && This->typekind==TKIND_DISPATCH) + (*ppTypeAttr)->cFuncs += 7; (*ppTypeAttr)->cVars = This->typeinfo->cElement>>16; (*ppTypeAttr)->cImplTypes = This->typeinfo->cImplTypes; - (*ppTypeAttr)->cbSizeVft = This->typeinfo->cbSizeVft; + (*ppTypeAttr)->cbSizeVft = This->typekind==TKIND_DISPATCH ? 28 : This->typeinfo->cbSizeVft; (*ppTypeAttr)->cbAlignment = (This->typeinfo->typekind>>11) & 0x1f; (*ppTypeAttr)->wTypeFlags = This->typeinfo->flags; (*ppTypeAttr)->wMajorVerNum = This->typeinfo->version&0xffff; @@@ -2879,15 -3016,21 +3016,21 @@@ static HRESULT WINAPI ITypeInfo2_fnGetR if(!pRefType) return E_INVALIDARG; - if(index == -1) { - FIXME("Dual interfaces not handled yet\n"); - return E_NOTIMPL; + if(This->typeinfo->flags&TYPEFLAG_FDUAL) { + if(index == -1) { + *pRefType = -2; + return S_OK; + } + + if(This->typekind == TKIND_DISPATCH) + return ITypeInfo2_GetRefTypeOfImplType((ITypeInfo2*)&This->dual->lpVtblTypeInfo2, + index, pRefType); } - if(index >= This->typeinfo->cImplTypes) + if(index>=This->typeinfo->cImplTypes) return TYPE_E_ELEMENTNOTFOUND; - if((This->typeinfo->typekind&0xf) == TKIND_INTERFACE) { + if(This->typekind == TKIND_INTERFACE) { *pRefType = This->typeinfo->datatype1 + 2; return S_OK; } @@@ -2923,7 -3066,7 +3066,7 @@@ static HRESULT WINAPI ITypeInfo2_fnGetI if(index >= This->typeinfo->cImplTypes) return TYPE_E_ELEMENTNOTFOUND; - if((This->typeinfo->typekind&0xf) != TKIND_COCLASS) { + if(This->typekind != TKIND_COCLASS) { *pImplTypeFlags = 0; return S_OK; } @@@ -3022,6 -3165,12 +3165,12 @@@ static HRESULT WINAPI ITypeInfo2_fnGetR if(!ppTInfo) return E_INVALIDARG; + if(hRefType==-2 && This->dual) { + *ppTInfo = (ITypeInfo*)&This->dual->lpVtblTypeInfo2; + ITypeInfo_AddRef(*ppTInfo); + return S_OK; + } + if(hRefType&1) { ITypeLib *tl; MSFT_ImpInfo *impinfo; @@@ -3124,7 -3273,7 +3273,7 @@@ static HRESULT WINAPI ITypeInfo2_fnGetC TRACE("(%p,%p,%p)\n", iface, ppTLib, pIndex); *ppTLib = (ITypeLib *)&This->typelib->lpVtblTypeLib2; - This->typelib->ref++; + ICreateTypeLib_AddRef((ICreateTypeLib*)This->typelib); *pIndex = This->typeinfo->typekind >> 16; return S_OK; @@@ -3573,7 -3722,7 +3722,7 @@@ static ICreateTypeInfo2 *ICreateTypeInf pCreateTypeInfo2Impl->ref = 1; pCreateTypeInfo2Impl->typelib = typelib; - typelib->ref++; + ICreateTypeLib_AddRef((ICreateTypeLib*)typelib); nameoffset = ctl2_alloc_name(typelib, szName); typeinfo_offset = ctl2_alloc_typeinfo(typelib, nameoffset); @@@ -3584,6 -3733,7 +3733,7 @@@ pCreateTypeInfo2Impl->typeinfo = typeinfo; + pCreateTypeInfo2Impl->typekind = tkind; typeinfo->typekind |= tkind | 0x20; ICreateTypeInfo2_SetAlignment((ICreateTypeInfo2 *)pCreateTypeInfo2Impl, 4); @@@ -3717,7 -3867,9 +3867,9 @@@ static ULONG WINAPI ICreateTypeLib2_fnR HeapFree(GetProcessHeap(), 0, rem); } } - HeapFree(GetProcessHeap(), 0, typeinfo); + + HeapFree(GetProcessHeap(), 0, typeinfo->dual); + HeapFree(GetProcessHeap(), 0, typeinfo); } HeapFree(GetProcessHeap(),0,This); diff --combined dll/win32/oledlg/oledlg_De.rc index 498fa80196b,9aad9ba52f8..9aad9ba52f8 --- a/dll/win32/oledlg/oledlg_De.rc +++ b/dll/win32/oledlg/oledlg_De.rc @@@ -97,4 -97,3 +97,3 @@@ STRINGTABLE DISCARDABL IDS_PS_UNKNOWN_SRC "Unbekannte Quelle" IDS_PS_UNKNOWN_APP "dem Erzeugerprogramm" } - #pragma code_page(default) diff --combined dll/win32/oledlg/oledlg_Fr.rc index 5a64ab09b88,176cc87f70f..176cc87f70f --- a/dll/win32/oledlg/oledlg_Fr.rc +++ b/dll/win32/oledlg/oledlg_Fr.rc @@@ -102,4 -102,3 +102,3 @@@ STRINGTABLE DISCARDABL IDS_PS_UNKNOWN_SRC "Source inconnue" IDS_PS_UNKNOWN_APP "le programme avec lequel il a été créé" } - #pragma code_page(default) diff --combined dll/win32/oledlg/oledlg_Ja.rc index e6680dd7f21,0029ff35f11..0029ff35f11 --- a/dll/win32/oledlg/oledlg_Ja.rc +++ b/dll/win32/oledlg/oledlg_Ja.rc @@@ -58,4 -58,3 +58,3 @@@ STRINGTABLE DISCARDABL IDS_NOTOLEMOD "ファイルは有効なOLEモジュールではないようです。OLEコントロールを登録できません。" IDS_NOTOLEMODCAPTION "コントロールを追加" } - #pragma code_page(default) diff --combined dll/win32/oledlg/oledlg_Lt.rc index 02451c470cf,961fd1d996f..961fd1d996f --- a/dll/win32/oledlg/oledlg_Lt.rc +++ b/dll/win32/oledlg/oledlg_Lt.rc @@@ -98,4 -98,3 +98,3 @@@ STRINGTABLE DISCARDABL IDS_PS_UNKNOWN_SRC "Nežinomas Å¡altinis" IDS_PS_UNKNOWN_APP "programa, kuri jį sukÅ«rė" } - #pragma code_page(default) diff --combined dll/win32/oledlg/oledlg_Si.rc index 55af95ec373,0f737af2d61..0f737af2d61 --- a/dll/win32/oledlg/oledlg_Si.rc +++ b/dll/win32/oledlg/oledlg_Si.rc @@@ -97,4 -97,3 +97,3 @@@ STRINGTABLE DISCARDABL IDS_PS_UNKNOWN_SRC "Neznan vir" IDS_PS_UNKNOWN_APP "Neznan program" } - #pragma code_page(default) diff --combined dll/win32/riched20/caret.c index 1cb44bcdbcd,a72a42b0937..a72a42b0937 --- a/dll/win32/riched20/caret.c +++ b/dll/win32/riched20/caret.c @@@ -24,27 -24,55 +24,55 @@@ WINE_DEFAULT_DEBUG_CHANNEL(richedit); - static BOOL - ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs); + void ME_SetCursorToStart(ME_TextEditor *editor, ME_Cursor *cursor) + { + cursor->pPara = editor->pBuffer->pFirst->member.para.next_para; + cursor->pRun = ME_FindItemFwd(cursor->pPara, diRun); + cursor->nOffset = 0; + } - void ME_GetSelection(ME_TextEditor *editor, int *from, int *to) + static void ME_SetCursorToEnd(ME_TextEditor *editor, ME_Cursor *cursor) { - *from = ME_GetCursorOfs(editor, 0); - *to = ME_GetCursorOfs(editor, 1); - + cursor->pPara = editor->pBuffer->pLast->member.para.prev_para; + cursor->pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun); + cursor->nOffset = 0; + } + + + int ME_GetSelectionOfs(ME_TextEditor *editor, int *from, int *to) + { + *from = ME_GetCursorOfs(&editor->pCursors[0]); + *to = ME_GetCursorOfs(&editor->pCursors[1]); + if (*from > *to) { int tmp = *from; *from = *to; - *to = tmp; + *to = tmp; + return 1; + } + return 0; + } + + int ME_GetSelection(ME_TextEditor *editor, ME_Cursor **from, ME_Cursor **to) + { + if (ME_GetCursorOfs(&editor->pCursors[0]) < ME_GetCursorOfs(&editor->pCursors[1])) + { + *from = &editor->pCursors[0]; + *to = &editor->pCursors[1]; + return 0; + } else { + *from = &editor->pCursors[1]; + *to = &editor->pCursors[0]; + return 1; } } int ME_GetTextLength(ME_TextEditor *editor) { - ME_DisplayItem *pLast = editor->pBuffer->pLast; - return ME_CharOfsFromRunOfs(editor, pLast->member.para.prev_para, - ME_FindItemBack(pLast, diRun), 0); + ME_Cursor cursor; + ME_SetCursorToEnd(editor, &cursor); + return ME_GetCursorOfs(&cursor); } @@@ -63,8 -91,10 +91,10 @@@ int ME_GetTextLengthEx(ME_TextEditor *e && (how->flags & GTL_USECRLF) && !editor->bEmulateVersion10) /* Ignore GTL_USECRLF flag in 1.0 emulation */ length += editor->nParagraphs - 1; - - if (how->flags & GTL_NUMBYTES) + + if (how->flags & GTL_NUMBYTES || + (how->flags & GTL_PRECISE && /* GTL_PRECISE seems to imply GTL_NUMBYTES */ + !(how->flags & GTL_NUMCHARS))) /* unless GTL_NUMCHARS is given */ { CPINFO cpinfo; @@@ -95,12 -125,8 +125,8 @@@ int ME_SetSelection(ME_TextEditor *edit /* select all */ if (from == 0 && to == -1) { - editor->pCursors[1].pPara = editor->pBuffer->pFirst->member.para.next_para; - editor->pCursors[1].pRun = ME_FindItemFwd(editor->pCursors[1].pPara, diRun); - editor->pCursors[1].nOffset = 0; - editor->pCursors[0].pPara = editor->pBuffer->pLast->member.para.prev_para; - editor->pCursors[0].pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun); - editor->pCursors[0].nOffset = 0; + ME_SetCursorToStart(editor, &editor->pCursors[1]); + ME_SetCursorToEnd(editor, &editor->pCursors[0]); ME_InvalidateSelection(editor); ME_ClearTempStyle(editor); return len + 1; @@@ -119,7 -145,7 +145,7 @@@ if (from < 0) { int start, end; - ME_GetSelection(editor, &start, &end); + ME_GetSelectionOfs(editor, &start, &end); editor->pCursors[1] = editor->pCursors[0]; ME_Repaint(editor); ME_ClearTempStyle(editor); @@@ -148,9 -174,7 +174,7 @@@ if (selectionEnd) { - editor->pCursors[0].pPara = editor->pBuffer->pLast->member.para.prev_para; - editor->pCursors[0].pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun); - editor->pCursors[0].nOffset = 0; + ME_SetCursorToEnd(editor, &editor->pCursors[0]); editor->pCursors[1] = editor->pCursors[0]; ME_InvalidateSelection(editor); ME_ClearTempStyle(editor); @@@ -158,7 -182,8 +182,8 @@@ } ME_CursorFromCharOfs(editor, from, &editor->pCursors[1]); - ME_CursorFromCharOfs(editor, to, &editor->pCursors[0]); + editor->pCursors[0] = editor->pCursors[1]; + ME_MoveCursorChars(editor, &editor->pCursors[0], to - from); /* Selection is not allowed in the middle of an end paragraph run. */ if (editor->pCursors[1].pRun->member.run.nFlags & MERF_ENDPARA) editor->pCursors[1].nOffset = 0; @@@ -258,23 -283,22 +283,22 @@@ void ME_HideCaret(ME_TextEditor *ed } } - BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars, - BOOL bForce) + BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start, + int nChars, BOOL bForce) { - ME_Cursor c; + ME_Cursor c = *start; + int nOfs = ME_GetCursorOfs(start); int shift = 0; int totalChars = nChars; ME_DisplayItem *start_para; /* Prevent deletion past last end of paragraph run. */ nChars = min(nChars, ME_GetTextLength(editor) - nOfs); - - ME_CursorFromCharOfs(editor, nOfs, &c); start_para = c.pPara; if (!bForce) { - ME_ProtectPartialTableDeletion(editor, nOfs, &nChars); + ME_ProtectPartialTableDeletion(editor, &c, &nChars); if (nChars == 0) return FALSE; } @@@ -289,8 -313,7 +313,7 @@@ { /* We aren't deleting anything in this run, so we will go back to the * last run we are deleting text in. */ - c.pRun = ME_FindItemBack(c.pRun, diRun); - c.pPara = ME_GetParagraph(c.pRun); + ME_PrevRun(&c.pPara, &c.pRun); c.nOffset = c.pRun->member.run.strText->nLen; } run = &c.pRun->member.run; @@@ -422,12 -445,12 +445,12 @@@ } BOOL ME_DeleteTextAtCursor(ME_TextEditor *editor, int nCursor, int nChars) - { + { assert(nCursor>=0 && nCursornCursors); /* text operations set modified state */ editor->nModifyStep = 1; - return ME_InternalDeleteText(editor, ME_GetCursorOfs(editor, nCursor), nChars, - FALSE); + return ME_InternalDeleteText(editor, &editor->pCursors[nCursor], + nChars, FALSE); } static ME_DisplayItem * @@@ -459,7 -482,7 +482,7 @@@ void ME_InsertOLEFromCursor(ME_TextEdit MERF_GRAPHICS); di->member.run.ole_obj = ALLOC_OBJ(*reo); ME_CopyReObject(di->member.run.ole_obj, reo); - ME_SendSelChange(editor); + ME_ReleaseStyle(pStyle); } @@@ -475,7 -498,7 +498,7 @@@ void ME_InsertEndRowFromCursor(ME_TextE di = ME_InternalInsertTextFromCursor(editor, nCursor, &space, 1, pStyle, MERF_ENDROW); - ME_SendSelChange(editor); + ME_ReleaseStyle(pStyle); } @@@ -565,7 -588,7 +588,7 @@@ void ME_InsertTextFromCursor(ME_TextEdi /* ME_SplitParagraph increases style refcount */ tp = ME_SplitParagraph(editor, p->pRun, p->pRun->member.run.style, eol_str, 0); p->pRun = ME_FindItemFwd(tp, diRun); - p->pPara = ME_GetParagraph(p->pRun); + p->pPara = tp; end_run = ME_FindItemBack(tp, diRun); ME_ReleaseStyle(end_run->member.run.style); end_run->member.run.style = tmp_style; @@@ -577,77 -600,85 +600,85 @@@ } } - - static BOOL - ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs) + /* Move the cursor nRelOfs characters (either forwards or backwards) + * + * returns the actual number of characters moved. + **/ + int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs) { - ME_DisplayItem *pRun = pCursor->pRun; - - if (nRelOfs == -1) + cursor->nOffset += nRelOfs; + if (cursor->nOffset < 0) { - if (!pCursor->nOffset) + cursor->nOffset += cursor->pRun->member.run.nCharOfs; + if (cursor->nOffset >= 0) { - ME_DisplayItem *pPara = pCursor->pPara; + /* new offset in the same paragraph */ do { - pRun = ME_FindItemBack(pRun, diRunOrParagraph); - assert(pRun); - switch (pRun->type) - { - case diRun: - break; - case diParagraph: - pPara = pRun; - if (pPara->member.para.prev_para->type == diTextStart) - return FALSE; - pRun = ME_FindItemBack(pPara, diRunOrParagraph); - pPara = pPara->member.para.prev_para; - /* every paragraph ought to have at least one run */ - assert(pRun && pRun->type == diRun); - assert(pRun->member.run.nFlags & MERF_ENDPARA); - break; - default: - assert(pRun->type != diRun && pRun->type != diParagraph); - return FALSE; - } - } while (RUN_IS_HIDDEN(&pRun->member.run) || - pRun->member.run.nFlags & MERF_HIDDEN); - pCursor->pPara = pPara; - pCursor->pRun = pRun; - if (pRun->member.run.nFlags & MERF_ENDPARA) - pCursor->nOffset = 0; - else - pCursor->nOffset = pRun->member.run.strText->nLen; + cursor->pRun = ME_FindItemBack(cursor->pRun, diRun); + } while (cursor->nOffset < cursor->pRun->member.run.nCharOfs); + cursor->nOffset -= cursor->pRun->member.run.nCharOfs; + return nRelOfs; } - if (pCursor->nOffset) - pCursor->nOffset = pCursor->nOffset + nRelOfs; - return TRUE; - } - else - { - if (!(pRun->member.run.nFlags & MERF_ENDPARA)) + cursor->nOffset += cursor->pPara->member.para.nCharOfs; + if (cursor->nOffset <= 0) { - int new_ofs = pCursor->nOffset + nRelOfs; + /* moved to the start of the text */ + nRelOfs -= cursor->nOffset; + ME_SetCursorToStart(editor, cursor); + return nRelOfs; + } - if (new_ofs < pRun->member.run.strText->nLen) - { - pCursor->nOffset = new_ofs; - return TRUE; - } + /* new offset in a previous paragraph */ + do { + cursor->pPara = cursor->pPara->member.para.prev_para; + } while (cursor->nOffset < cursor->pPara->member.para.nCharOfs); + cursor->nOffset -= cursor->pPara->member.para.nCharOfs; + + cursor->pRun = ME_FindItemBack(cursor->pPara->member.para.next_para, diRun); + while (cursor->nOffset < cursor->pRun->member.run.nCharOfs) { + cursor->pRun = ME_FindItemBack(cursor->pRun, diRun); } + cursor->nOffset -= cursor->pRun->member.run.nCharOfs; + } else if (cursor->nOffset >= cursor->pRun->member.run.strText->nLen) { + ME_DisplayItem *next_para; + int new_offset; + + new_offset = ME_GetCursorOfs(cursor); + next_para = cursor->pPara->member.para.next_para; + if (new_offset < next_para->member.para.nCharOfs) + { + /* new offset in the same paragraph */ + do { + cursor->nOffset -= cursor->pRun->member.run.strText->nLen; + cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun); + } while (cursor->nOffset >= cursor->pRun->member.run.strText->nLen); + return nRelOfs; + } + + if (new_offset >= ME_GetTextLength(editor)) + { + /* new offset at the end of the text */ + ME_SetCursorToEnd(editor, cursor); + nRelOfs -= new_offset - ME_GetTextLength(editor); + return nRelOfs; + } + + /* new offset in a following paragraph */ do { - pRun = ME_FindItemFwd(pRun, diRun); - } while (pRun && (RUN_IS_HIDDEN(&pRun->member.run) || - pRun->member.run.nFlags & MERF_HIDDEN)); - if (pRun) + cursor->pPara = next_para; + next_para = next_para->member.para.next_para; + } while (new_offset >= next_para->member.para.nCharOfs); + + cursor->nOffset = new_offset - cursor->pPara->member.para.nCharOfs; + cursor->pRun = ME_FindItemFwd(cursor->pPara, diRun); + while (cursor->nOffset >= cursor->pRun->member.run.strText->nLen) { - pCursor->pPara = ME_GetParagraph(pRun); - pCursor->pRun = pRun; - pCursor->nOffset = 0; - return TRUE; + cursor->nOffset -= cursor->pRun->member.run.strText->nLen; + cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun); } - } - return FALSE; + } /* else new offset is in the same run */ + return nRelOfs; } @@@ -655,8 -686,9 +686,9 @@@ static BOO ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs) { ME_DisplayItem *pRun = cursor->pRun, *pOtherRun; + ME_DisplayItem *pPara = cursor->pPara; int nOffset = cursor->nOffset; - + if (nRelOfs == -1) { /* Backward movement */ @@@ -684,14 -716,16 +716,16 @@@ { if (cursor->pRun == pRun && cursor->nOffset == 0) { + pPara = pOtherRun; /* Skip empty start of table row paragraph */ - if (pOtherRun->member.para.prev_para->member.para.nFlags & MEPF_ROWSTART) - pOtherRun = pOtherRun->member.para.prev_para; + if (pPara->member.para.prev_para->member.para.nFlags & MEPF_ROWSTART) + pPara = pPara->member.para.prev_para; /* Paragraph breaks are treated as separate words */ - if (pOtherRun->member.para.prev_para->type == diTextStart) + if (pPara->member.para.prev_para->type == diTextStart) return FALSE; - pRun = ME_FindItemBack(pOtherRun, diRun); + pRun = ME_FindItemBack(pPara, diRun); + pPara = pPara->member.para.prev_para; } break; } @@@ -723,8 -757,10 +757,10 @@@ { if (pOtherRun->member.para.nFlags & MEPF_ROWSTART) pOtherRun = pOtherRun->member.para.next_para; - if (cursor->pRun == pRun) - pRun = ME_FindItemFwd(pOtherRun, diRun); + if (cursor->pRun == pRun) { + pPara = pOtherRun; + pRun = ME_FindItemFwd(pPara, diRun); + } nOffset = 0; break; } @@@ -737,7 -773,7 +773,7 @@@ } } } - cursor->pPara = ME_GetParagraph(pRun); + cursor->pPara = pPara; cursor->pRun = pRun; cursor->nOffset = nOffset; return TRUE; @@@ -793,12 -829,8 +829,8 @@@ ME_SelectByType(ME_TextEditor *editor, case stDocument: /* Select everything with cursor anchored from the start of the text */ editor->nSelectionType = stDocument; - editor->pCursors[1].pPara = editor->pBuffer->pFirst->member.para.next_para; - editor->pCursors[1].pRun = ME_FindItemFwd(editor->pCursors[1].pPara, diRun); - editor->pCursors[1].nOffset = 0; - editor->pCursors[0].pPara = editor->pBuffer->pLast->member.para.prev_para; - editor->pCursors[0].pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun); - editor->pCursors[0].nOffset = 0; + ME_SetCursorToStart(editor, &editor->pCursors[1]); + ME_SetCursorToEnd(editor, &editor->pCursors[0]); break; default: assert(0); } @@@ -807,11 -839,10 +839,10 @@@ editor->pCursors[3] = editor->pCursors[1]; } - int ME_GetCursorOfs(ME_TextEditor *editor, int nCursor) + int ME_GetCursorOfs(const ME_Cursor *cursor) { - ME_Cursor *pCursor = &editor->pCursors[nCursor]; - return pCursor->pPara->member.para.nCharOfs - + pCursor->pRun->member.run.nCharOfs + pCursor->nOffset; + return cursor->pPara->member.para.nCharOfs + + cursor->pRun->member.run.nCharOfs + cursor->nOffset; } /* Helper function for ME_FindPixelPos to find paragraph within tables */ @@@ -862,9 -893,9 +893,9 @@@ static BOOL ME_ReturnFoundPos(ME_TextEd rx = 0; result->pRun = found; result->nOffset = ME_CharFromPointCursor(editor, rx, &found->member.run); - if (editor->pCursors[0].nOffset == found->member.run.strText->nLen && rx) + if (result->nOffset == found->member.run.strText->nLen && rx) { - result->pRun = ME_FindItemFwd(editor->pCursors[0].pRun, diRun); + result->pRun = ME_FindItemFwd(result->pRun, diRun); result->nOffset = 0; } result->pPara = ME_GetParagraph(result->pRun); @@@ -975,30 -1006,32 +1006,32 @@@ static BOOL ME_FindPixelPos(ME_TextEdit } - /* Returns the character offset closest to the pixel position + /* Sets the cursor to the position closest to the pixel position * * x & y are pixel positions in client coordinates. * * isExact will be set to TRUE if the run is directly under the pixel * position, FALSE if it not, unless isExact is set to NULL. + * + * return FALSE if outside client area and the cursor is not set, + * otherwise TRUE is returned. */ - int ME_CharFromPos(ME_TextEditor *editor, int x, int y, BOOL *isExact) + BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y, + ME_Cursor *cursor, BOOL *isExact) { - ME_Cursor cursor; RECT rc; BOOL bResult; ITextHost_TxGetClientRect(editor->texthost, &rc); if (x < 0 || y < 0 || x >= rc.right || y >= rc.bottom) { if (isExact) *isExact = FALSE; - return -1; + return FALSE; } x += editor->horz_si.nPos; y += editor->vert_si.nPos; - bResult = ME_FindPixelPos(editor, x, y, &cursor, NULL); + bResult = ME_FindPixelPos(editor, x, y, cursor, NULL); if (isExact) *isExact = bResult; - return cursor.pPara->member.para.nCharOfs - + cursor.pRun->member.run.nCharOfs + cursor.nOffset; + return TRUE; } @@@ -1019,9 -1052,9 +1052,9 @@@ static void ME_ExtendAnchorSelection(ME int curOfs, anchorStartOfs, anchorEndOfs; if (editor->nSelectionType == stPosition || editor->nSelectionType == stDocument) return; - curOfs = ME_GetCursorOfs(editor, 0); - anchorStartOfs = ME_GetCursorOfs(editor, 3); - anchorEndOfs = ME_GetCursorOfs(editor, 2); + curOfs = ME_GetCursorOfs(&editor->pCursors[0]); + anchorStartOfs = ME_GetCursorOfs(&editor->pCursors[3]); + anchorEndOfs = ME_GetCursorOfs(&editor->pCursors[2]); tmp_cursor = editor->pCursors[0]; editor->pCursors[0] = editor->pCursors[2]; @@@ -1231,14 -1264,14 +1264,14 @@@ static voi ME_MoveCursorLines(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs) { ME_DisplayItem *pRun = pCursor->pRun; - ME_DisplayItem *pItem, *pOldPara, *pNewPara; + ME_DisplayItem *pOldPara = pCursor->pPara; + ME_DisplayItem *pItem, *pNewPara; int x = ME_GetXForArrow(editor, pCursor); if (editor->bCaretAtEnd && !pCursor->nOffset) - pRun = ME_FindItemBack(pRun, diRun); - if (!pRun) - return; - pOldPara = ME_GetParagraph(pRun); + if (!ME_PrevRun(&pOldPara, &pRun)) + return; + if (nRelOfs == -1) { /* start of this row */ @@@ -1313,9 -1346,7 +1346,7 @@@ static void ME_ArrowPageUp(ME_TextEdito if (editor->vert_si.nPos < p->member.row.nHeight) { - pCursor->pPara = editor->pBuffer->pFirst->member.para.next_para; - pCursor->pRun = ME_FindItemFwd(pCursor->pPara, diRun); - pCursor->nOffset = 0; + ME_SetCursorToStart(editor, pCursor); editor->bCaretAtEnd = FALSE; /* Native clears seems to clear this x value on page up at the top * of the text, but not on page down at the end of the text. @@@ -1380,9 -1411,7 +1411,7 @@@ static void ME_ArrowPageDown(ME_TextEdi if (editor->vert_si.nPos >= y - editor->sizeWindow.cy) { - pCursor->pPara = editor->pBuffer->pLast->member.para.prev_para; - pCursor->pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun); - pCursor->nOffset = 0; + ME_SetCursorToEnd(editor, pCursor); editor->bCaretAtEnd = FALSE; } else { ME_DisplayItem *pRun = pCursor->pRun; @@@ -1451,9 -1480,7 +1480,7 @@@ static void ME_ArrowHome(ME_TextEditor static void ME_ArrowCtrlHome(ME_TextEditor *editor, ME_Cursor *pCursor) { - pCursor->pPara = editor->pBuffer->pFirst->member.para.next_para; - pCursor->pRun = ME_FindItemFwd(pCursor->pPara, diRun); - pCursor->nOffset = 0; + ME_SetCursorToStart(editor, pCursor); editor->bCaretAtEnd = FALSE; } @@@ -1484,33 -1511,21 +1511,21 @@@ static void ME_ArrowEnd(ME_TextEditor * static void ME_ArrowCtrlEnd(ME_TextEditor *editor, ME_Cursor *pCursor) { - pCursor->pPara = editor->pBuffer->pLast->member.para.prev_para; - pCursor->pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun); - assert(pCursor->pRun->member.run.nFlags & MERF_ENDPARA); - pCursor->nOffset = 0; + ME_SetCursorToEnd(editor, pCursor); editor->bCaretAtEnd = FALSE; } BOOL ME_IsSelection(ME_TextEditor *editor) { - return memcmp(&editor->pCursors[0], &editor->pCursors[1], sizeof(ME_Cursor))!=0; - } - - static int ME_GetSelCursor(ME_TextEditor *editor, int dir) - { - int cdir = ME_GetCursorOfs(editor, 0) - ME_GetCursorOfs(editor, 1); - - if (cdir*dir>0) - return 0; - else - return 1; + return editor->pCursors[0].pRun != editor->pCursors[1].pRun || + editor->pCursors[0].nOffset != editor->pCursors[1].nOffset; } void ME_DeleteSelection(ME_TextEditor *editor) { int from, to; - ME_GetSelection(editor, &from, &to); - ME_DeleteTextAtCursor(editor, ME_GetSelCursor(editor,-1), to-from); + int nStartCursor = ME_GetSelectionOfs(editor, &from, &to); + ME_DeleteTextAtCursor(editor, nStartCursor, to - from); } ME_Style *ME_GetSelectionInsertStyle(ME_TextEditor *editor) @@@ -1525,12 -1540,14 +1540,14 @@@ void ME_SendSelChange(ME_TextEditor *ed if (!(editor->nEventMask & ENM_SELCHANGE)) return; + sc.nmhdr.hwndFrom = NULL; + sc.nmhdr.idFrom = 0; sc.nmhdr.code = EN_SELCHANGE; - ME_GetSelection(editor, &sc.chrg.cpMin, &sc.chrg.cpMax); + ME_GetSelectionOfs(editor, &sc.chrg.cpMin, &sc.chrg.cpMax); sc.seltyp = SEL_EMPTY; if (sc.chrg.cpMin != sc.chrg.cpMax) sc.seltyp |= SEL_TEXT; - if (sc.chrg.cpMin < sc.chrg.cpMax+1) /* wth were RICHEDIT authors thinking ? */ + if (sc.chrg.cpMin < sc.chrg.cpMax+1) /* what were RICHEDIT authors thinking ? */ sc.seltyp |= SEL_MULTICHAR; TRACE("cpMin=%d cpMax=%d seltyp=%d (%s %s)\n", sc.chrg.cpMin, sc.chrg.cpMax, sc.seltyp, diff --combined dll/win32/riched20/clipboard.c index cf4fe4b37a9,15ce97b943f..15ce97b943f --- a/dll/win32/riched20/clipboard.c +++ b/dll/win32/riched20/clipboard.c @@@ -326,18 -326,23 +326,23 @@@ static const IDataObjectVtbl VT_DataObj DataObjectImpl_EnumDAdvise }; - static HGLOBAL get_unicode_text(ME_TextEditor *editor, const CHARRANGE *lpchrg) + static HGLOBAL get_unicode_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars) { - int pars, len; + int pars = 0; WCHAR *data; HANDLE ret; + ME_DisplayItem *para; + int nEnd = ME_GetCursorOfs(start) + nChars; - pars = ME_CountParagraphsBetween(editor, lpchrg->cpMin, lpchrg->cpMax); - len = lpchrg->cpMax-lpchrg->cpMin; - ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR)*(len+pars+1)); + /* count paragraphs in range */ + para = start->pPara; + while((para = para->member.para.next_para) && + para->member.para.nCharOfs <= nEnd) + pars++; + + ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * (nChars + pars + 1)); data = GlobalLock(ret); - len = ME_GetTextW(editor, data, lpchrg->cpMin, len, TRUE); - data[len] = 0; + ME_GetTextW(editor, data, nChars + pars, start, nChars, TRUE); GlobalUnlock(ret); return ret; } @@@ -370,7 -375,7 +375,7 @@@ static DWORD CALLBACK ME_AppendToHGLOBA return 0; } - static HGLOBAL get_rtf_text(ME_TextEditor *editor, const CHARRANGE *lpchrg) + static HGLOBAL get_rtf_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars) { EDITSTREAM es; ME_GlobalDestStruct gds; @@@ -379,15 -384,16 +384,16 @@@ gds.nLength = 0; es.dwCookie = (DWORD_PTR)&gds; es.pfnCallback = ME_AppendToHGLOBAL; - ME_StreamOutRange(editor, SF_RTF, lpchrg->cpMin, lpchrg->cpMax, &es); + ME_StreamOutRange(editor, SF_RTF, start, nChars, &es); GlobalReAlloc(gds.hData, gds.nLength+1, 0); return gds.hData; } - HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAOBJECT *lplpdataobj) + HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start, + int nChars, LPDATAOBJECT *lplpdataobj) { DataObjectImpl *obj; - TRACE("(%p,%d,%d)\n", editor, lpchrg->cpMin, lpchrg->cpMax); + TRACE("(%p,%d,%d)\n", editor, ME_GetCursorOfs(start), nChars); obj = heap_alloc(sizeof(DataObjectImpl)); if(cfRTF == 0) @@@ -395,7 -401,7 +401,7 @@@ obj->lpVtbl = &VT_DataObjectImpl; obj->ref = 1; - obj->unicode = get_unicode_text(editor, lpchrg); + obj->unicode = get_unicode_text(editor, start, nChars); obj->rtf = NULL; obj->fmtetc_cnt = 1; @@@ -404,7 -410,7 +410,7 @@@ obj->fmtetc = GlobalAlloc(GMEM_ZEROINIT, obj->fmtetc_cnt*sizeof(FORMATETC)); InitFormatEtc(obj->fmtetc[0], CF_UNICODETEXT, TYMED_HGLOBAL); if(editor->mode & TM_RICHTEXT) { - obj->rtf = get_rtf_text(editor, lpchrg); + obj->rtf = get_rtf_text(editor, start, nChars); InitFormatEtc(obj->fmtetc[1], cfRTF, TYMED_HGLOBAL); } diff --combined dll/win32/riched20/editor.c index 278b9aaa843,7a116472917..7a116472917 --- a/dll/win32/riched20/editor.c +++ b/dll/win32/riched20/editor.c @@@ -141,8 -141,8 +141,8 @@@ + WM_PASTE + WM_SETFONT + WM_SETTEXT (resets undo stack !) (proper style?) ANSI&Unicode - - WM_STYLECHANGING - - WM_STYLECHANGED (things like read-only flag) + + WM_STYLECHANGING (seems to do nothing) + + WM_STYLECHANGED (seems to do nothing) + WM_UNICHAR + WM_VSCROLL @@@ -241,10 -241,8 +241,8 @@@ WINE_DEFAULT_DEBUG_CHANNEL(richedit); static BOOL ME_RegisterEditorClass(HINSTANCE); - static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, int sel_min, int sel_max); + static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, ME_Cursor *start, int nChars); - static const WCHAR RichEdit20W[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '2', '0', 'W', 0}; - static const WCHAR RichEdit50W[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '5', '0', 'W', 0}; static const WCHAR REListBox20W[] = {'R','E','L','i','s','t','B','o','x','2','0','W', 0}; static const WCHAR REComboBox20W[] = {'R','E','C','o','m','b','o','B','o','x','2','0','W', 0}; static HCURSOR hLeft; @@@ -422,7 -420,10 +420,10 @@@ void ME_RTFCharAttrHook(RTF_Info *info else if (info->rtfParam != rtfNoParam) { RTFColor *c = RTFGetColor(info, info->rtfParam); - fmt.crTextColor = (c->rtfCBlue<<16)|(c->rtfCGreen<<8)|(c->rtfCRed); + if (c && c->rtfCBlue >= 0) + fmt.crTextColor = (c->rtfCBlue<<16)|(c->rtfCGreen<<8)|(c->rtfCRed); + else + fmt.dwEffects = CFE_AUTOBACKCOLOR; } break; case rtfForeColor: @@@ -433,10 -434,11 +434,11 @@@ else if (info->rtfParam != rtfNoParam) { RTFColor *c = RTFGetColor(info, info->rtfParam); - if (c) + if (c && c->rtfCBlue >= 0) fmt.crTextColor = (c->rtfCBlue<<16)|(c->rtfCGreen<<8)|(c->rtfCRed); - else - fmt.crTextColor = 0; + else { + fmt.dwEffects = CFE_AUTOCOLOR; + } } break; case rtfFontNum: @@@ -1011,9 -1013,10 +1013,10 @@@ void ME_RTFSpecialCharHook(RTF_Info *in info->editor->pCursors[1].pRun = run; info->editor->pCursors[1].pPara = ME_GetParagraph(run); info->editor->pCursors[1].nOffset = 0; - nOfs = ME_GetCursorOfs(info->editor, 1); - nChars = ME_GetCursorOfs(info->editor, 0) - nOfs; - ME_InternalDeleteText(info->editor, nOfs, nChars, TRUE); + nOfs = ME_GetCursorOfs(&info->editor->pCursors[1]); + nChars = ME_GetCursorOfs(&info->editor->pCursors[0]) - nOfs; + ME_InternalDeleteText(info->editor, &info->editor->pCursors[1], + nChars, TRUE); } para = ME_InsertTableRowEndFromCursor(info->editor); @@@ -1146,8 -1149,8 +1149,8 @@@ static BOOL ME_RTFInsertOleObject(RTF_I reobject.dwFlags = 0; /* FIXME */ reobject.dwUser = 0; - /* FIXME: could be simpler */ - ret = IRichEditOle_InsertObject(info->lpRichEditOle, &reobject) == S_OK; + ME_InsertOLEFromCursor(info->editor, &reobject, 0); + ret = TRUE; } if (lpObject) IOleObject_Release(lpObject); @@@ -1341,7 -1344,8 +1344,8 @@@ static void ME_RTFReadHook(RTF_Info *in { case rtfBeginGroup: if (info->stackTop < maxStack) { - info->stack[info->stackTop].fmt = info->style->fmt; + info->stack[info->stackTop].style = info->style; + ME_AddRefStyle(info->style); info->stack[info->stackTop].codePage = info->codePage; info->stack[info->stackTop].unicodeLength = info->unicodeLength; } @@@ -1350,23 -1354,17 +1354,17 @@@ break; case rtfEndGroup: { - ME_Style *s; RTFFlushOutputBuffer(info); info->stackTop--; - if (info->stackTop<=0) { + if (info->stackTop <= 0) info->rtfClass = rtfEOF; + if (info->stackTop < 0) return; - } - assert(info->stackTop >= 0); - if (info->styleChanged) - { - /* FIXME too slow ? how come ? */ - s = ME_ApplyStyle(info->style, &info->stack[info->stackTop].fmt); - ME_ReleaseStyle(info->style); - info->style = s; - info->codePage = info->stack[info->stackTop].codePage; - info->unicodeLength = info->stack[info->stackTop].unicodeLength; - } + + ME_ReleaseStyle(info->style); + info->style = info->stack[info->stackTop].style; + info->codePage = info->stack[info->stackTop].codePage; + info->unicodeLength = info->stack[info->stackTop].unicodeLength; break; } } @@@ -1388,19 -1386,22 +1386,22 @@@ static LRESULT ME_StreamIn(ME_TextEdito { RTF_Info parser; ME_Style *style; - int from, to, to2, nUndoMode; + int from, to, nUndoMode; int nEventMask = editor->nEventMask; ME_InStream inStream; BOOL invalidRTF = FALSE; + ME_Cursor *selStart, *selEnd; TRACE("stream==%p editor==%p format==0x%X\n", stream, editor, format); editor->nEventMask = 0; - ME_GetSelection(editor, &from, &to); - if ((format & SFF_SELECTION) && (editor->mode & TM_RICHTEXT)) { + ME_GetSelectionOfs(editor, &from, &to); + if (format & SFF_SELECTION && editor->mode & TM_RICHTEXT) + { + ME_GetSelection(editor, &selStart, &selEnd); style = ME_GetSelectionInsertStyle(editor); - ME_InternalDeleteText(editor, from, to-from, FALSE); + ME_InternalDeleteText(editor, selStart, to - from, FALSE); /* Don't insert text at the end of the table row */ if (!editor->bEmulateVersion10) { /* v4.1 */ @@@ -1425,12 -1426,12 +1426,12 @@@ ME_IsInTable(editor->pCursors[0].pRun)) return 0; } - } - else { + } else { style = editor->pBuffer->pDefaultStyle; ME_AddRefStyle(style); ME_SetSelection(editor, 0, 0); - ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE); + ME_InternalDeleteText(editor, &editor->pCursors[1], + ME_GetTextLength(editor), FALSE); from = to = 0; ME_ClearTempStyle(editor); ME_SetDefaultParaFormat(editor->pCursors[0].pPara->member.para.pFmt); @@@ -1519,9 -1520,9 +1520,9 @@@ editor->pCursors[1].pPara = para; editor->pCursors[1].pRun = ME_FindItemFwd(para, diRun); editor->pCursors[1].nOffset = 0; - nOfs = ME_GetCursorOfs(editor, 1); - nChars = ME_GetCursorOfs(editor, 0) - nOfs; - ME_InternalDeleteText(editor, nOfs, nChars, TRUE); + nOfs = ME_GetCursorOfs(&editor->pCursors[1]); + nChars = ME_GetCursorOfs(&editor->pCursors[0]) - nOfs; + ME_InternalDeleteText(editor, &editor->pCursors[1], nChars, TRUE); if (parser.tableDef) parser.tableDef->tableRowStart = NULL; } @@@ -1531,23 -1532,34 +1532,34 @@@ if (parser.lpRichEditOle) IRichEditOle_Release(parser.lpRichEditOle); - if (!inStream.editstream->dwError && parser.stackTop > 0) - inStream.editstream->dwError = HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); + if (parser.stackTop > 0) + { + while (--parser.stackTop >= 0) + { + ME_ReleaseStyle(parser.style); + parser.style = parser.stack[parser.stackTop].style; + } + if (!inStream.editstream->dwError) + inStream.editstream->dwError = HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); + } /* Remove last line break, as mandated by tests. This is not affected by CR/LF counters, since RTF streaming presents only \para tokens, which are converted according to the standard rules: \r for 2.0, \r\n for 1.0 */ if (stripLastCR) { - int newfrom, newto; - ME_GetSelection(editor, &newfrom, &newto); + int newto; + ME_GetSelection(editor, &selStart, &selEnd); + newto = ME_GetCursorOfs(selEnd); if (newto > to + (editor->bEmulateVersion10 ? 1 : 0)) { WCHAR lastchar[3] = {'\0', '\0'}; int linebreakSize = editor->bEmulateVersion10 ? 2 : 1; + ME_Cursor linebreakCursor = *selEnd; - ME_GetTextW(editor, lastchar, newto - linebreakSize, linebreakSize, 0); + ME_MoveCursorChars(editor, &linebreakCursor, -linebreakSize); + ME_GetTextW(editor, lastchar, 2, &linebreakCursor, linebreakSize, 0); if (lastchar[0] == '\r' && (lastchar[1] == '\n' || lastchar[1] == '\0')) { - ME_InternalDeleteText(editor, newto - linebreakSize, linebreakSize, FALSE); + ME_InternalDeleteText(editor, &linebreakCursor, linebreakSize, FALSE); } } } @@@ -1558,7 -1570,6 +1570,6 @@@ ME_StreamInText(editor, format, &inStream, style); else ERR("EM_STREAMIN without SF_TEXT or SF_RTF\n"); - ME_GetSelection(editor, &to, &to2); /* put the cursor at the top */ if (!(format & SFF_SELECTION)) ME_SetSelection(editor, 0, 0); @@@ -1629,10 -1640,8 +1640,8 @@@ ME_FindText(ME_TextEditor *editor, DWOR { const int nLen = lstrlenW(text); const int nTextLen = ME_GetTextLength(editor); - int nStart, nEnd; int nMin, nMax; - ME_DisplayItem *item; - ME_DisplayItem *para; + ME_Cursor cursor; WCHAR wLastChar = ' '; TRACE("flags==0x%08x, chrg->cpMin==%d, chrg->cpMax==%d text==%s\n", @@@ -1693,17 -1702,17 +1702,17 @@@ /* If possible, find the character before where the search starts */ if ((flags & FR_WHOLEWORD) && nMin) { - ME_RunOfsFromCharOfs(editor, nMin - 1, NULL, &item, &nStart); - wLastChar = item->member.run.strText->szData[nStart]; + ME_CursorFromCharOfs(editor, nMin - 1, &cursor); + wLastChar = cursor.pRun->member.run.strText->szData[cursor.nOffset]; + ME_MoveCursorChars(editor, &cursor, 1); + } else { + ME_CursorFromCharOfs(editor, nMin, &cursor); } - ME_RunOfsFromCharOfs(editor, nMin, ¶, &item, &nStart); - - while (item - && para->member.para.nCharOfs + item->member.run.nCharOfs + nStart + nLen <= nMax) + while (cursor.pRun && ME_GetCursorOfs(&cursor) + nLen <= nMax) { - ME_DisplayItem *pCurItem = item; - int nCurStart = nStart; + ME_DisplayItem *pCurItem = cursor.pRun; + int nCurStart = cursor.nOffset; int nMatched = 0; while (pCurItem && ME_CharCompare(pCurItem->member.run.strText->szData[nCurStart + nMatched], text[nMatched], (flags & FR_MATCHCASE))) @@@ -1736,14 -1745,14 +1745,14 @@@ break; } - nStart += para->member.para.nCharOfs + item->member.run.nCharOfs; + cursor.nOffset += cursor.pPara->member.para.nCharOfs + cursor.pRun->member.run.nCharOfs; if (chrgText) { - chrgText->cpMin = nStart; - chrgText->cpMax = nStart + nLen; + chrgText->cpMin = cursor.nOffset; + chrgText->cpMax = cursor.nOffset + nLen; } - TRACE("found at %d-%d\n", nStart, nStart + nLen); - return nStart; + TRACE("found at %d-%d\n", cursor.nOffset, cursor.nOffset + nLen); + return cursor.nOffset; } if (nCurStart + nMatched == pCurItem->member.run.strText->nLen) { @@@ -1756,12 -1765,11 +1765,11 @@@ else wLastChar = ' '; - nStart++; - if (nStart == item->member.run.strText->nLen) + cursor.nOffset++; + if (cursor.nOffset == cursor.pRun->member.run.strText->nLen) { - item = ME_FindItemFwd(item, diRun); - para = ME_GetParagraph(item); - nStart = 0; + ME_NextRun(&cursor.pPara, &cursor.pRun); + cursor.nOffset = 0; } } } @@@ -1770,22 -1778,23 +1778,23 @@@ /* If possible, find the character after where the search ends */ if ((flags & FR_WHOLEWORD) && nMax < nTextLen - 1) { - ME_RunOfsFromCharOfs(editor, nMax + 1, NULL, &item, &nEnd); - wLastChar = item->member.run.strText->szData[nEnd]; + ME_CursorFromCharOfs(editor, nMax + 1, &cursor); + wLastChar = cursor.pRun->member.run.strText->szData[cursor.nOffset]; + ME_MoveCursorChars(editor, &cursor, -1); + } else { + ME_CursorFromCharOfs(editor, nMax, &cursor); } - ME_RunOfsFromCharOfs(editor, nMax, ¶, &item, &nEnd); - - while (item - && para->member.para.nCharOfs + item->member.run.nCharOfs + nEnd - nLen >= nMin) + while (cursor.pRun && ME_GetCursorOfs(&cursor) - nLen >= nMin) { - ME_DisplayItem *pCurItem = item; - int nCurEnd = nEnd; + ME_DisplayItem *pCurItem = cursor.pRun; + ME_DisplayItem *pCurPara = cursor.pPara; + int nCurEnd = cursor.nOffset; int nMatched = 0; if (nCurEnd == 0) { - pCurItem = ME_FindItemBack(pCurItem, diRun); + ME_PrevRun(&pCurPara, &pCurItem); nCurEnd = pCurItem->member.run.strText->nLen + nMatched; } @@@ -1800,6 -1809,7 +1809,7 @@@ ME_DisplayItem *pPrevItem = pCurItem; int nPrevEnd = nCurEnd; WCHAR wPrevChar; + int nStart; /* Check to see if previous character is a whitespace */ if (flags & FR_WHOLEWORD) @@@ -1820,7 -1830,7 +1830,7 @@@ break; } - nStart = ME_GetParagraph(pCurItem)->member.para.nCharOfs + nStart = pCurPara->member.para.nCharOfs + pCurItem->member.run.nCharOfs + nCurEnd - nMatched; if (chrgText) { @@@ -1832,7 -1842,7 +1842,7 @@@ } if (nCurEnd - nMatched == 0) { - pCurItem = ME_FindItemBack(pCurItem, diRun); + ME_PrevRun(&pCurPara, &pCurItem); /* Don't care about pCurItem becoming NULL here; it's already taken * care of in the exterior loop condition */ nCurEnd = pCurItem->member.run.strText->nLen + nMatched; @@@ -1843,12 -1853,11 +1853,11 @@@ else wLastChar = ' '; - nEnd--; - if (nEnd < 0) + cursor.nOffset--; + if (cursor.nOffset < 0) { - item = ME_FindItemBack(item, diRun); - para = ME_GetParagraph(item); - nEnd = item->member.run.strText->nLen; + ME_PrevRun(&cursor.pPara, &cursor.pRun); + cursor.nOffset = cursor.pRun->member.run.strText->nLen; } } } @@@ -1860,25 -1869,30 +1869,30 @@@ static int ME_GetTextEx(ME_TextEditor *editor, GETTEXTEX *ex, LPARAM pText) { - int nStart, nCount; /* in chars */ + int nChars; + ME_Cursor start; + + if (!ex->cb || !pText) return 0; if (ex->flags & ~(GT_SELECTION | GT_USECRLF)) FIXME("GETTEXTEX flags 0x%08x not supported\n", ex->flags & ~(GT_SELECTION | GT_USECRLF)); if (ex->flags & GT_SELECTION) { - ME_GetSelection(editor, &nStart, &nCount); - nCount -= nStart; + int from, to; + int nStartCur = ME_GetSelectionOfs(editor, &from, &to); + start = editor->pCursors[nStartCur]; + nChars = to - from; } else { - nStart = 0; - nCount = 0x7fffffff; + ME_SetCursorToStart(editor, &start); + nChars = INT_MAX; } if (ex->codepage == 1200) { - nCount = min(nCount, ex->cb / sizeof(WCHAR) - 1); - return ME_GetTextW(editor, (LPWSTR)pText, nStart, nCount, ex->flags & GT_USECRLF); + return ME_GetTextW(editor, (LPWSTR)pText, ex->cb / sizeof(WCHAR) - 1, + &start, nChars, ex->flags & GT_USECRLF); } else { @@@ -1888,16 -1902,15 +1902,15 @@@ occurs only in richedit 2.0 mode, in which line breaks have only one CR */ int crlfmul = (ex->flags & GT_USECRLF) ? 2 : 1; + DWORD buflen; LPWSTR buffer; - DWORD buflen = ex->cb; LRESULT rc; - DWORD flags = 0; - nCount = min(nCount, ex->cb - 1); - buffer = heap_alloc((crlfmul*nCount + 1) * sizeof(WCHAR)); + buflen = min(crlfmul * nChars, ex->cb - 1); + buffer = heap_alloc((buflen + 1) * sizeof(WCHAR)); - buflen = ME_GetTextW(editor, buffer, nStart, nCount, ex->flags & GT_USECRLF); - rc = WideCharToMultiByte(ex->codepage, flags, buffer, buflen+1, + nChars = ME_GetTextW(editor, buffer, buflen, &start, nChars, ex->flags & GT_USECRLF); + rc = WideCharToMultiByte(ex->codepage, 0, buffer, nChars + 1, (LPSTR)pText, ex->cb, ex->lpDefaultChar, ex->lpUsedDefChar); if (rc) rc--; /* do not count 0 terminator */ @@@ -1907,13 -1920,16 +1920,16 @@@ } static int ME_GetTextRange(ME_TextEditor *editor, WCHAR *strText, - int start, int nLen, BOOL unicode) + const ME_Cursor *start, int nLen, BOOL unicode) { + if (!strText) return 0; if (unicode) { - return ME_GetTextW(editor, strText, start, nLen, 0); + return ME_GetTextW(editor, strText, INT_MAX, start, nLen, 0); } else { + int nChars; WCHAR *p = ALLOC_N_OBJ(WCHAR, nLen+1); - int nChars = ME_GetTextW(editor, p, start, nLen, 0); + if (!p) return 0; + nChars = ME_GetTextW(editor, p, nLen, start, nLen, 0); WideCharToMultiByte(CP_ACP, 0, p, nChars+1, (char *)strText, nLen+1, NULL, NULL); FREE_OBJ(p); @@@ -1989,7 -2005,7 +2005,7 @@@ static BOOL ME_Paste(ME_TextEditor *edi return TRUE; } - static BOOL ME_Copy(ME_TextEditor *editor, CHARRANGE *range) + static BOOL ME_Copy(ME_TextEditor *editor, const ME_Cursor *start, int nChars) { LPDATAOBJECT dataObj = NULL; HRESULT hr = S_OK; @@@ -1998,9 -2014,14 +2014,14 @@@ return FALSE; /* Copying or Cutting masked text isn't allowed */ if(editor->lpOleCallback) - hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, range, RECO_COPY, &dataObj); + { + CHARRANGE range; + range.cpMin = ME_GetCursorOfs(start); + range.cpMax = range.cpMin + nChars; + hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, &range, RECO_COPY, &dataObj); + } if(FAILED(hr) || !dataObj) - hr = ME_GetDataObject(editor, range, &dataObj); + hr = ME_GetDataObject(editor, start, nChars, &dataObj); if(SUCCEEDED(hr)) { hr = OleSetClipboard(dataObj); IDataObject_Release(dataObj); @@@ -2014,14 -2035,14 +2035,14 @@@ ME_FilterEvent(ME_TextEditor *editor, U { MSGFILTER msgf; - if (!editor->hWnd) return FALSE; + if (!editor->hWnd || !editor->hwndParent) return FALSE; msgf.nmhdr.hwndFrom = editor->hWnd; msgf.nmhdr.idFrom = GetWindowLongW(editor->hWnd, GWLP_ID); msgf.nmhdr.code = EN_MSGFILTER; msgf.msg = msg; msgf.wParam = *wParam; msgf.lParam = *lParam; - if (SendMessageW(GetParent(editor->hWnd), WM_NOTIFY, msgf.nmhdr.idFrom, (LPARAM)&msgf)) + if (SendMessageW(editor->hwndParent, WM_NOTIFY, msgf.nmhdr.idFrom, (LPARAM)&msgf)) return FALSE; *wParam = msgf.wParam; *lParam = msgf.lParam; @@@ -2034,24 -2055,28 +2055,28 @@@ static void ME_UpdateSelectionLinkAttri { ME_DisplayItem *startPara, *endPara; ME_DisplayItem *prev_para; - int from, to; + ME_Cursor *from, *to; + ME_Cursor start; + int nChars; if (!editor->AutoURLDetect_bEnable) return; ME_GetSelection(editor, &from, &to); /* Find paragraph previous to the one that contains start cursor */ - ME_RunOfsFromCharOfs(editor, from, &startPara, NULL, NULL); + startPara = from->pPara; prev_para = startPara->member.para.prev_para; if (prev_para->type == diParagraph) startPara = prev_para; /* Find paragraph that contains end cursor */ - ME_RunOfsFromCharOfs(editor, to, &endPara, NULL, NULL); - endPara = endPara->member.para.next_para; + endPara = to->pPara->member.para.next_para; - ME_UpdateLinkAttribute(editor, - startPara->member.para.nCharOfs, - endPara->member.para.nCharOfs); + start.pPara = startPara; + start.pRun = ME_FindItemFwd(startPara, diRun); + start.nOffset = 0; + nChars = endPara->member.para.nCharOfs - startPara->member.para.nCharOfs; + + ME_UpdateLinkAttribute(editor, &start, nChars); } static BOOL @@@ -2120,6 -2145,31 +2145,31 @@@ ME_KeyDown(ME_TextEditor *editor, WORD ME_SendRequestResize(editor, FALSE); return TRUE; case VK_RETURN: + if (editor->bDialogMode) + { + if (ctrl_is_down) + return TRUE; + + if (!(editor->styleFlags & ES_WANTRETURN)) + { + if (editor->hwndParent) + { + DWORD dw; + dw = SendMessageW(editor->hwndParent, DM_GETDEFID, 0, 0); + if (HIWORD(dw) == DC_HASDEFID) + { + HWND hwDefCtrl = GetDlgItem(editor->hwndParent, LOWORD(dw)); + if (hwDefCtrl) + { + SendMessageW(editor->hwndParent, WM_NEXTDLGCTL, (WPARAM)hwDefCtrl, TRUE); + PostMessageW(hwDefCtrl, WM_KEYDOWN, VK_RETURN, 0); + } + } + } + return TRUE; + } + } + if (editor->styleFlags & ES_MULTILINE) { ME_Cursor cursor = editor->pCursors[0]; @@@ -2133,7 -2183,7 +2183,7 @@@ return TRUE; } - ME_GetSelection(editor, &from, &to); + ME_GetSelectionOfs(editor, &from, &to); if (editor->nTextLimit > ME_GetTextLength(editor) - (to-from)) { if (!editor->bEmulateVersion10) { /* v4.1 */ @@@ -2239,6 -2289,14 +2289,14 @@@ return TRUE; } break; + case VK_ESCAPE: + if (editor->bDialogMode && editor->hwndParent) + PostMessageW(editor->hwndParent, WM_CLOSE, 0, 0); + return TRUE; + case VK_TAB: + if (editor->bDialogMode && editor->hwndParent) + SendMessageW(editor->hwndParent, WM_NEXTDLGCTL, shift_is_down, 0); + return TRUE; case 'A': if (ctrl_is_down) { @@@ -2254,14 -2312,16 +2312,16 @@@ case 'X': if (ctrl_is_down) { - CHARRANGE range; BOOL result; + int nOfs, nChars; + int nStartCur = ME_GetSelectionOfs(editor, &nOfs, &nChars); + ME_Cursor *selStart = &editor->pCursors[nStartCur]; - ME_GetSelection(editor, &range.cpMin, &range.cpMax); - result = ME_Copy(editor, &range); + nChars -= nOfs; + result = ME_Copy(editor, selStart, nChars); if (result && nKey == 'X') { - ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE); + ME_InternalDeleteText(editor, selStart, nChars, FALSE); ME_CommitUndo(editor); ME_UpdateRepaint(editor); } @@@ -2334,7 -2394,7 +2394,7 @@@ static LRESULT ME_Char(ME_TextEditor *e ME_DisplayItem *para = cursor.pPara; int from, to; BOOL ctrl_is_down = GetKeyState(VK_CONTROL) & 0x8000; - ME_GetSelection(editor, &from, &to); + ME_GetSelectionOfs(editor, &from, &to); if (wstr == '\t' && /* v4.1 allows tabs to be inserted with ctrl key down */ !(ctrl_is_down && !editor->bEmulateVersion10)) @@@ -2345,7 -2405,7 +2405,7 @@@ para = cursor.pPara; if (ME_IsSelection(editor) && cursor.pRun->member.run.nCharOfs + cursor.nOffset == 0 && - to == ME_GetCursorOfs(editor, 0) && + to == ME_GetCursorOfs(&editor->pCursors[0]) && para->member.para.prev_para->type == diParagraph) { para = para->member.para.prev_para; @@@ -2453,9 -2513,9 +2513,9 @@@ static int ME_CalculateClickCount(ME_Te static BOOL ME_SetCursor(ME_TextEditor *editor) { + ME_Cursor cursor; POINT pt; BOOL isExact; - int offset; SCROLLBARINFO sbi; DWORD messagePos = GetMessagePos(); pt.x = (short)LOWORD(messagePos); @@@ -2510,13 -2570,11 +2570,11 @@@ ITextHost_TxSetCursor(editor->texthost, hLeft, FALSE); return TRUE; } - offset = ME_CharFromPos(editor, pt.x, pt.y, &isExact); + ME_CharFromPos(editor, pt.x, pt.y, &cursor, &isExact); if (isExact) { - ME_Cursor cursor; ME_Run *run; - ME_CursorFromCharOfs(editor, offset, &cursor); run = &cursor.pRun->member.run; if (run->style->fmt.dwMask & CFM_LINK && run->style->fmt.dwEffects & CFE_LINK) @@@ -2530,7 -2588,9 +2588,9 @@@ if (ME_IsSelection(editor)) { int selStart, selEnd; - ME_GetSelection(editor, &selStart, &selEnd); + int offset = ME_GetCursorOfs(&cursor); + + ME_GetSelectionOfs(editor, &selStart, &selEnd); if (selStart <= offset && selEnd >= offset) { ITextHost_TxSetCursor(editor->texthost, LoadCursorW(NULL, (WCHAR*)IDC_ARROW), @@@ -2559,7 -2619,7 +2619,7 @@@ static BOOL ME_ShowContextMenu(ME_TextE int seltype = 0; if(!editor->lpOleCallback || !editor->hWnd) return FALSE; - ME_GetSelection(editor, &selrange.cpMin, &selrange.cpMax); + ME_GetSelectionOfs(editor, &selrange.cpMin, &selrange.cpMax); if(selrange.cpMin == selrange.cpMax) seltype |= SEL_EMPTY; else @@@ -2571,7 -2631,7 +2631,7 @@@ } if(SUCCEEDED(IRichEditOleCallback_GetContextMenu(editor->lpOleCallback, seltype, NULL, &selrange, &menu))) { - TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, GetParent(editor->hWnd), NULL); + TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, editor->hwndParent, NULL); DestroyMenu(menu); } return TRUE; @@@ -2585,8 -2645,11 +2645,11 @@@ ME_TextEditor *ME_MakeEditor(ITextHost LONG selbarwidth; ed->hWnd = NULL; + ed->hwndParent = NULL; + ed->sizeWindow.cx = ed->sizeWindow.cy = 0; ed->texthost = texthost; ed->bEmulateVersion10 = bEmulateVersion10; + ed->styleFlags = 0; ITextHost_TxGetPropertyBits(texthost, (TXTBIT_RICHTEXT|TXTBIT_MULTILINE| TXTBIT_READONLY|TXTBIT_USEPASSWORD| @@@ -2599,6 -2662,7 +2662,7 @@@ ES_AUTOHSCROLL|ES_DISABLENOSCROLL); ed->pBuffer = ME_MakeText(); ed->nZoomNumerator = ed->nZoomDenominator = 0; + ed->nAvailWidth = 0; /* wrap to client area */ ME_MakeFirstParagraph(ed); /* The four cursors are for: * 0 - The position where the caret is shown @@@ -2608,9 -2672,7 +2672,7 @@@ */ ed->nCursors = 4; ed->pCursors = ALLOC_N_OBJ(ME_Cursor, ed->nCursors); - ed->pCursors[0].pPara = ed->pBuffer->pFirst->member.para.next_para; - ed->pCursors[0].pRun = ME_FindItemFwd(ed->pCursors[0].pPara, diRun); - ed->pCursors[0].nOffset = 0; + ME_SetCursorToStart(ed, &ed->pCursors[0]); ed->pCursors[1] = ed->pCursors[0]; ed->pCursors[2] = ed->pCursors[0]; ed->pCursors[3] = ed->pCursors[1]; @@@ -2630,8 -2692,7 +2692,7 @@@ ed->nUndoMode = umAddToUndo; ed->nParagraphs = 1; ed->nLastSelStart = ed->nLastSelEnd = 0; - ed->pLastSelStartPara = ed->pLastSelEndPara = ME_FindItemFwd(ed->pBuffer->pFirst, diParagraph); - ed->nAvailWidth = 0; /* wrap to client area */ + ed->pLastSelStartPara = ed->pLastSelEndPara = ed->pCursors[0].pPara; ed->bHideSelection = FALSE; ed->pfnWordBreak = NULL; ed->lpOleCallback = NULL; @@@ -2639,6 -2700,7 +2700,7 @@@ ed->mode |= (props & TXTBIT_RICHTEXT) ? TM_RICHTEXT : TM_PLAINTEXT; ed->AutoURLDetect_bEnable = FALSE; ed->bHaveFocus = FALSE; + ed->bDialogMode = FALSE; ed->bMouseCaptured = FALSE; for (i=0; imember.run.style->fmt.dwMask & CFM_LINK) - && (run->member.run.style->fmt.dwEffects & CFE_LINK)) + if (cursor.pRun->member.run.style->fmt.dwMask & CFM_LINK && + cursor.pRun->member.run.style->fmt.dwEffects & CFE_LINK) { /* The clicked run has CFE_LINK set */ - info.nmhdr.hwndFrom = editor->hWnd; - info.nmhdr.idFrom = GetWindowLongW(editor->hWnd, GWLP_ID); + info.nmhdr.hwndFrom = NULL; + info.nmhdr.idFrom = 0; info.nmhdr.code = EN_LINK; info.msg = msg; info.wParam = wParam; info.lParam = lParam; - info.chrg.cpMin = ME_CharOfsFromRunOfs(editor, para, run, 0); - info.chrg.cpMax = info.chrg.cpMin + run->member.run.strText->nLen; - SendMessageW(GetParent(editor->hWnd), WM_NOTIFY,info.nmhdr.idFrom, (LPARAM)&info); + cursor.nOffset = 0; + info.chrg.cpMin = ME_GetCursorOfs(&cursor); + info.chrg.cpMax = info.chrg.cpMin + cursor.pRun->member.run.strText->nLen; + ITextHost_TxNotify(editor->texthost, info.nmhdr.code, &info); } } @@@ -2974,8 -3034,6 +3034,6 @@@ LRESULT ME_HandleMessage(ME_TextEditor UNSUPPORTED_MSG(EM_SETTABSTOPS) UNSUPPORTED_MSG(EM_SETTYPOGRAPHYOPTIONS) UNSUPPORTED_MSG(EM_SETWORDBREAKPROCEX) - UNSUPPORTED_MSG(WM_STYLECHANGING) - UNSUPPORTED_MSG(WM_STYLECHANGED) /* Messages specific to Richedit controls */ @@@ -2986,6 -3044,8 +3044,8 @@@ case WM_GETDLGCODE: { UINT code = DLGC_WANTCHARS|DLGC_WANTTAB|DLGC_WANTARROWS|DLGC_HASSETSEL; + if (lParam) + editor->bDialogMode = TRUE; if (editor->styleFlags & ES_MULTILINE) code |= DLGC_WANTMESSAGE; return code; @@@ -2999,7 -3059,7 +3059,7 @@@ UINT from, to; PUINT pfrom = wParam ? (PUINT)wParam : &from; PUINT pto = lParam ? (PUINT)lParam : &to; - ME_GetSelection(editor, (int *)pfrom, (int *)pto); + ME_GetSelectionOfs(editor, (int *)pfrom, (int *)pto); if ((*pfrom|*pto) & 0xFFFF0000) return -1; return MAKELONG(*pfrom,*pto); @@@ -3007,7 -3067,7 +3067,7 @@@ case EM_EXGETSEL: { CHARRANGE *pRange = (CHARRANGE *)lParam; - ME_GetSelection(editor, &pRange->cpMin, &pRange->cpMax); + ME_GetSelectionOfs(editor, &pRange->cpMin, &pRange->cpMax); TRACE("EM_EXGETSEL = (%d,%d)\n", pRange->cpMin, pRange->cpMax); return 0; } @@@ -3194,7 -3254,7 +3254,7 @@@ /* If we detect ascii rtf at the start of the string, * we know it isn't unicode. */ bRtf = (lParam && (!strncmp((char *)lParam, "{\\rtf", 5) || - !strncmp((char *)lParam, "{\\urtf}", 6))); + !strncmp((char *)lParam, "{\\urtf", 6))); bUnicode = !bRtf && pStruct->codepage == 1200; TRACE("EM_SETTEXTEX - %s, flags %d, cp %d\n", @@@ -3203,18 -3263,20 +3263,20 @@@ bSelection = (pStruct->flags & ST_SELECTION) != 0; if (bSelection) { - ME_GetSelection(editor, &from, &to); + int nStartCursor = ME_GetSelectionOfs(editor, &from, &to); style = ME_GetSelectionInsertStyle(editor); - ME_InternalDeleteText(editor, from, to - from, FALSE); + ME_InternalDeleteText(editor, &editor->pCursors[nStartCursor], to - from, FALSE); } else { - ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE); + ME_Cursor start; + ME_SetCursorToStart(editor, &start); + ME_InternalDeleteText(editor, &start, ME_GetTextLength(editor), FALSE); style = editor->pBuffer->pDefaultStyle; } if (bRtf) { ME_StreamInRTFString(editor, bSelection, (char *)lParam); if (bSelection) { - /* FIXME: The length returned is doesn't include the rtf control + /* FIXME: The length returned doesn't include the rtf control * characters, only the actual text. */ len = lParam ? strlen((char *)lParam) : 0; } @@@ -3223,14 -3285,17 +3285,17 @@@ wszText = lParam ? ME_ToUnicode(bUnicode, (void *)lParam) : NULL; len = wszText ? lstrlenW(wszText) : 0; ME_InsertTextFromCursor(editor, 0, wszText, len, style); + ME_EndToUnicode(bUnicode, wszText); } if (bSelection) { ME_ReleaseStyle(style); ME_UpdateSelectionLinkAttribute(editor); } else { + ME_Cursor cursor; len = 1; - ME_UpdateLinkAttribute(editor, 0, -1); + ME_SetCursorToStart(editor, &cursor); + ME_UpdateLinkAttribute(editor, &cursor, INT_MAX); } ME_CommitUndo(editor); if (!(pStruct->flags & ST_KEEPUNDO)) @@@ -3307,17 -3372,17 +3372,17 @@@ if (editor->mode & TM_PLAINTEXT) ME_SetDefaultCharFormat(editor, p); else { - ME_SetCharFormat(editor, 0, ME_GetTextLength(editor), p); + ME_Cursor start; + ME_SetCursorToStart(editor, &start); + ME_SetCharFormat(editor, &start, NULL, p); editor->nModifyStep = 1; } } else if (editor->mode & TM_PLAINTEXT) { return 0; } else { - int from, to; - ME_GetSelection(editor, &from, &to); - bRepaint = (from != to); + bRepaint = ME_IsSelection(editor); ME_SetSelectionCharFormat(editor, p); - if (from != to) editor->nModifyStep = 1; + if (bRepaint) editor->nModifyStep = 1; } ME_CommitUndo(editor); if (bRepaint) @@@ -3396,23 -3461,23 +3461,23 @@@ case WM_CLEAR: { int from, to; - ME_GetSelection(editor, &from, &to); - ME_InternalDeleteText(editor, from, to-from, FALSE); + int nStartCursor = ME_GetSelectionOfs(editor, &from, &to); + ME_InternalDeleteText(editor, &editor->pCursors[nStartCursor], to-from, FALSE); ME_CommitUndo(editor); ME_UpdateRepaint(editor); return 0; } case EM_REPLACESEL: { - int from, to; + int from, to, nStartCursor; ME_Style *style; LPWSTR wszText = lParam ? ME_ToUnicode(unicode, (void *)lParam) : NULL; size_t len = wszText ? lstrlenW(wszText) : 0; TRACE("EM_REPLACESEL - %s\n", debugstr_w(wszText)); - ME_GetSelection(editor, &from, &to); + nStartCursor = ME_GetSelectionOfs(editor, &from, &to); style = ME_GetSelectionInsertStyle(editor); - ME_InternalDeleteText(editor, from, to-from, FALSE); + ME_InternalDeleteText(editor, &editor->pCursors[nStartCursor], to-from, FALSE); ME_InsertTextFromCursor(editor, 0, wszText, len, style); ME_ReleaseStyle(style); /* drop temporary style if line end */ @@@ -3439,6 -3504,7 +3504,7 @@@ CHARFORMAT2W fmt; HDC hDC; BOOL bRepaint = LOWORD(lParam); + ME_Cursor start; if (!wParam) wParam = (WPARAM)GetStockObject(SYSTEM_FONT); @@@ -3446,7 -3512,8 +3512,8 @@@ hDC = ITextHost_TxGetDC(editor->texthost); ME_CharFormatFromLogFont(hDC, &lf, &fmt); ITextHost_TxReleaseDC(editor->texthost, hDC); - ME_SetCharFormat(editor, 0, ME_GetTextLength(editor), &fmt); + ME_SetCursorToStart(editor, &start); + ME_SetCharFormat(editor, &start, NULL, &fmt); ME_SetDefaultCharFormat(editor, &fmt); ME_CommitUndo(editor); @@@ -3459,11 -3526,14 +3526,14 @@@ } case WM_SETTEXT: { - ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE); + ME_Cursor cursor; + ME_SetCursorToStart(editor, &cursor); + ME_InternalDeleteText(editor, &cursor, ME_GetTextLength(editor), FALSE); if (lParam) { TRACE("WM_SETTEXT lParam==%lx\n",lParam); - if (!unicode && !strncmp((char *)lParam, "{\\rtf", 5)) + if (!strncmp((char *)lParam, "{\\rtf", 5) || + !strncmp((char *)lParam, "{\\urtf", 6)) { /* Undocumented: WM_SETTEXT supports RTF text */ ME_StreamInRTFString(editor, 0, (char *)lParam); @@@ -3492,7 -3562,8 +3562,8 @@@ } else TRACE("WM_SETTEXT - NULL\n"); - ME_UpdateLinkAttribute(editor, 0, -1); + ME_SetCursorToStart(editor, &cursor); + ME_UpdateLinkAttribute(editor, &cursor, INT_MAX); ME_SetSelection(editor, 0, 0); editor->nModifyStep = 0; ME_CommitUndo(editor); @@@ -3515,12 -3586,13 +3586,13 @@@ case WM_CUT: case WM_COPY: { - CHARRANGE range; - ME_GetSelection(editor, &range.cpMin, &range.cpMax); + int nFrom, nTo, nStartCur = ME_GetSelectionOfs(editor, &nFrom, &nTo); + int nChars = nTo - nFrom; + ME_Cursor *selStart = &editor->pCursors[nStartCur]; - if (ME_Copy(editor, &range) && msg == WM_CUT) + if (ME_Copy(editor, selStart, nChars) && msg == WM_CUT) { - ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE); + ME_InternalDeleteText(editor, selStart, nChars, FALSE); ME_CommitUndo(editor); ME_UpdateRepaint(editor); } @@@ -3540,67 -3612,51 +3612,51 @@@ case WM_GETTEXT: { GETTEXTEX ex; - LRESULT rc; - LPSTR bufferA = NULL; - LPWSTR bufferW = NULL; - - if (unicode) - bufferW = heap_alloc((wParam + 2) * sizeof(WCHAR)); - else - bufferA = heap_alloc(wParam + 2); - - ex.cb = (wParam + 2) * (unicode ? sizeof(WCHAR) : sizeof(CHAR)); + ex.cb = wParam * (unicode ? sizeof(WCHAR) : sizeof(CHAR)); ex.flags = GT_USECRLF; ex.codepage = unicode ? 1200 : CP_ACP; ex.lpDefaultChar = NULL; ex.lpUsedDefChar = NULL; - - rc = ME_GetTextEx(editor, &ex, unicode ? (LPARAM)bufferW : (LPARAM)bufferA); - - if (unicode) - { - memcpy((LPWSTR)lParam, bufferW, wParam * sizeof(WCHAR)); - if (strlenW(bufferW) >= wParam) rc = 0; - } - else - { - memcpy((LPSTR)lParam, bufferA, wParam); - if (strlen(bufferA) >= wParam) rc = 0; - } - heap_free(bufferA); - heap_free(bufferW); - return rc; + return ME_GetTextEx(editor, &ex, lParam); } case EM_GETTEXTEX: return ME_GetTextEx(editor, (GETTEXTEX*)wParam, lParam); case EM_GETSELTEXT: { - int from, to; - ME_GetSelection(editor, &from, &to); + int nFrom, nTo, nStartCur = ME_GetSelectionOfs(editor, &nFrom, &nTo); + ME_Cursor *from = &editor->pCursors[nStartCur]; return ME_GetTextRange(editor, (WCHAR *)lParam, from, - to - from, unicode); + nTo - nFrom, unicode); } case EM_GETSCROLLPOS: { POINT *point = (POINT *)lParam; point->x = editor->horz_si.nPos; point->y = editor->vert_si.nPos; + /* 16-bit scaled value is returned as stored in scrollinfo */ + if (editor->horz_si.nMax > 0xffff) + point->x = MulDiv(point->x, 0xffff, editor->horz_si.nMax); + if (editor->vert_si.nMax > 0xffff) + point->y = MulDiv(point->y, 0xffff, editor->vert_si.nMax); return 1; } case EM_GETTEXTRANGE: { TEXTRANGEW *rng = (TEXTRANGEW *)lParam; - int start = rng->chrg.cpMin; - int end = rng->chrg.cpMax; + ME_Cursor start; + int nStart = rng->chrg.cpMin; + int nEnd = rng->chrg.cpMax; int textlength = ME_GetTextLength(editor); - TRACE("EM_GETTEXTRANGE min=%d max=%d unicode=%d emul1.0=%d length=%d\n", - rng->chrg.cpMin, rng->chrg.cpMax, unicode, - editor->bEmulateVersion10, ME_GetTextLength(editor)); - if (start < 0) return 0; - if ((start == 0 && end == -1) || end > textlength) - end = textlength; - if (start >= end) return 0; - return ME_GetTextRange(editor, rng->lpstrText, start, end - start, unicode); + + TRACE("EM_GETTEXTRANGE min=%d max=%d unicode=%d textlength=%d\n", + rng->chrg.cpMin, rng->chrg.cpMax, unicode, textlength); + if (nStart < 0) return 0; + if ((nStart == 0 && nEnd == -1) || nEnd > textlength) + nEnd = textlength; + if (nStart >= nEnd) return 0; + + ME_CursorFromCharOfs(editor, nStart, &start); + return ME_GetTextRange(editor, rng->lpstrText, &start, nEnd - nStart, unicode); } case EM_GETLINE: { @@@ -3686,14 -3742,14 +3742,14 @@@ case EM_LINEFROMCHAR: { if (wParam == -1) - return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(editor, 1)); + return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(&editor->pCursors[1])); else return ME_RowNumberFromCharOfs(editor, wParam); } case EM_EXLINEFROMCHAR: { if (lParam == -1) - return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(editor,1)); + return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(&editor->pCursors[1])); else return ME_RowNumberFromCharOfs(editor, lParam); } @@@ -3809,7 -3865,14 +3865,14 @@@ case EM_SETZOOM: return ME_SetZoom(editor, wParam, lParam); case EM_CHARFROMPOS: - return ME_CharFromPos(editor, ((POINTL *)lParam)->x, ((POINTL *)lParam)->y, NULL); + { + ME_Cursor cursor; + if (ME_CharFromPos(editor, ((POINTL *)lParam)->x, ((POINTL *)lParam)->y, + &cursor, NULL)) + return ME_GetCursorOfs(&cursor); + else + return -1; + } case EM_POSFROMCHAR: { ME_DisplayItem *pPara, *pRun; @@@ -3841,23 -3904,29 +3904,29 @@@ } case WM_CREATE: { - SCROLLINFO si; + INT max; ME_SetDefaultFormatRect(editor); - si.cbSize = sizeof(si); - si.fMask = SIF_PAGE | SIF_RANGE; + max = (editor->styleFlags & ES_DISABLENOSCROLL) ? 1 : 0; + if (~editor->styleFlags & ES_DISABLENOSCROLL || editor->styleFlags & WS_VSCROLL) + ITextHost_TxSetScrollRange(editor->texthost, SB_VERT, 0, max, TRUE); + + if (~editor->styleFlags & ES_DISABLENOSCROLL || editor->styleFlags & WS_HSCROLL) + ITextHost_TxSetScrollRange(editor->texthost, SB_HORZ, 0, max, TRUE); + if (editor->styleFlags & ES_DISABLENOSCROLL) - si.fMask |= SIF_DISABLENOSCROLL; - si.nMax = (si.fMask & SIF_DISABLENOSCROLL) ? 1 : 0; - si.nMin = 0; - si.nPage = 0; - if (editor->hWnd) { - SetScrollInfo(editor->hWnd, SB_VERT, &si, TRUE); - SetScrollInfo(editor->hWnd, SB_HORZ, &si, TRUE); - } else { - ITextHost_TxSetScrollRange(editor->texthost, SB_VERT, si.nMin, si.nMax, TRUE); - ITextHost_TxSetScrollRange(editor->texthost, SB_HORZ, si.nMin, si.nMax, TRUE); + { + if (editor->styleFlags & WS_VSCROLL) + { + ITextHost_TxEnableScrollBar(editor->texthost, SB_VERT, ESB_DISABLE_BOTH); + ITextHost_TxShowScrollBar(editor->texthost, SB_VERT, TRUE); + } + if (editor->styleFlags & WS_HSCROLL) + { + ITextHost_TxEnableScrollBar(editor->texthost, SB_HORZ, ESB_DISABLE_BOTH); + ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ, TRUE); + } } ME_CommitUndo(editor); @@@ -4004,15 -4073,10 +4073,10 @@@ case SB_THUMBTRACK: case SB_THUMBPOSITION: { - SCROLLINFO sbi; - sbi.cbSize = sizeof(sbi); - sbi.fMask = SIF_TRACKPOS; - /* Try to get 32-bit track position value. */ - if (!GetScrollInfo(editor->hWnd, SB_HORZ, &sbi)) - /* GetScrollInfo failed, settle for 16-bit value in wParam. */ - sbi.nTrackPos = HIWORD(wParam); - - ME_HScrollAbs(editor, sbi.nTrackPos); + int pos = HIWORD(wParam); + if (editor->horz_si.nMax > 0xffff) + pos = MulDiv(pos, editor->horz_si.nMax, 0xffff); + ME_HScrollAbs(editor, pos); break; } } @@@ -4056,15 -4120,10 +4120,10 @@@ case SB_THUMBTRACK: case SB_THUMBPOSITION: { - SCROLLINFO sbi; - sbi.cbSize = sizeof(sbi); - sbi.fMask = SIF_TRACKPOS; - /* Try to get 32-bit track position value. */ - if (!GetScrollInfo(editor->hWnd, SB_VERT, &sbi)) - /* GetScrollInfo failed, settle for 16-bit value in wParam. */ - sbi.nTrackPos = HIWORD(wParam); - - ME_VScrollAbs(editor, sbi.nTrackPos); + int pos = HIWORD(wParam); + if (editor->vert_si.nMax > 0xffff) + pos = MulDiv(pos, editor->vert_si.nMax, 0xffff); + ME_VScrollAbs(editor, pos); break; } } @@@ -4186,7 -4245,7 +4245,7 @@@ return 0; case WM_IME_STARTCOMPOSITION: { - editor->imeStartIndex=ME_GetCursorOfs(editor,0); + editor->imeStartIndex=ME_GetCursorOfs(&editor->pCursors[0]); ME_DeleteSelection(editor); ME_CommitUndo(editor); ME_UpdateRepaint(editor); @@@ -4350,7 -4409,7 +4409,7 @@@ static LRESULT RichEditWndProc_common(H ITextHost *texthost; TRACE("WM_NCCREATE: hWnd %p style 0x%08x\n", hWnd, pcs->style); - texthost = ME_CreateTextHost(hWnd, FALSE); + texthost = ME_CreateTextHost(hWnd, pcs, FALSE); return texthost != NULL; } else if (msg != WM_NCDESTROY) @@@ -4480,7 -4539,7 +4539,7 @@@ LRESULT WINAPI RichEdit10ANSIWndProc(HW CREATESTRUCTW *pcs = (CREATESTRUCTW *)lParam; TRACE("WM_NCCREATE: hWnd %p style 0x%08x\n", hWnd, pcs->style); - texthost = ME_CreateTextHost(hWnd, TRUE); + texthost = ME_CreateTextHost(hWnd, pcs, TRUE); return texthost != NULL; } return RichEditANSIWndProc(hWnd, msg, wParam, lParam); @@@ -4491,81 -4550,71 +4550,71 @@@ void ME_SendOldNotify(ME_TextEditor *ed ITextHost_TxNotify(editor->texthost, nCode, NULL); } - int ME_CountParagraphsBetween(ME_TextEditor *editor, int from, int to) - { - ME_DisplayItem *item = ME_FindItemFwd(editor->pBuffer->pFirst, diParagraph); - int i = 0; - - while(item && item->member.para.next_para->member.para.nCharOfs <= from) - item = item->member.para.next_para; - if (!item) - return 0; - while(item && item->member.para.next_para->member.para.nCharOfs <= to) { - item = item->member.para.next_para; - i++; - } - return i; - } - - - int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int nStart, - int nChars, int bCRLF) + /* Fill buffer with srcChars unicode characters from the start cursor. + * + * buffer: destination buffer + * buflen: length of buffer in characters excluding the NULL terminator. + * start: start of editor text to copy into buffer. + * srcChars: Number of characters to use from the editor text. + * bCRLF: if true, replaces all end of lines with \r\n pairs. + * + * returns the number of characters written excluding the NULL terminator. + * + * The written text is always NULL terminated. + */ + int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen, + const ME_Cursor *start, int srcChars, BOOL bCRLF) { - ME_DisplayItem *pRun; - int nOffset, nWritten = 0; - WCHAR *pStart = buffer; - - ME_RunOfsFromCharOfs(editor, nStart, NULL, &pRun, &nOffset); + ME_DisplayItem *pRun, *pNextRun; + const WCHAR *pStart = buffer; + const WCHAR cr_lf[] = {'\r', '\n', 0}; + const WCHAR *str; + int nLen; /* bCRLF flag is only honored in 2.0 and up. 1.0 must always return text verbatim */ if (editor->bEmulateVersion10) bCRLF = 0; - while (nChars && pRun) + pRun = start->pRun; + assert(pRun); + pNextRun = ME_FindItemFwd(pRun, diRun); + + nLen = pRun->member.run.strText->nLen - start->nOffset; + str = pRun->member.run.strText->szData + start->nOffset; + + /* No '\r' is appended to the last paragraph. */ + while (srcChars && buflen && pNextRun) { - int nLen; + int nFlags = pRun->member.run.nFlags; - if (pRun->member.run.nFlags & MERF_ENDCELL && - pRun->member.run.nFlags & MERF_ENDPARA) + if (bCRLF && nFlags & MERF_ENDPARA && ~nFlags & MERF_ENDCELL) { - *buffer = '\t'; - nLen = 1; - } else if (pRun->member.run.nFlags & MERF_ENDPARA) { - if (!ME_FindItemFwd(pRun, diRun)) { - /* No '\r' is appended to the last paragraph. */ - nLen = 0; - } else if (bCRLF && nChars == 1) { - nLen = 0; - nChars = 0; - } else { - WCHAR cr_lf[] = {'\r', '\n', 0}; - WCHAR *szData; - - if (bCRLF) - { - nLen = 2; - szData = cr_lf; - } else { - nLen = pRun->member.run.strText->nLen; - szData = pRun->member.run.strText->szData; - } - nLen = min(nChars, nLen - nOffset); - CopyMemory(buffer, szData + nOffset, sizeof(WCHAR) * nLen); - } + if (buflen == 1) break; + /* FIXME: native fails to reduce srcChars here for WM_GETTEXT or + * EM_GETTEXTEX, however, this is done for copying text which + * also uses this function. */ + srcChars -= min(nLen, srcChars); + nLen = 2; + str = cr_lf; } else { - nLen = min(nChars, pRun->member.run.strText->nLen - nOffset); - CopyMemory(buffer, pRun->member.run.strText->szData + nOffset, - sizeof(WCHAR) * nLen); + nLen = min(nLen, srcChars); + srcChars -= nLen; } - nChars -= nLen; - nWritten += nLen; + + nLen = min(nLen, buflen); + buflen -= nLen; + + CopyMemory(buffer, str, sizeof(WCHAR) * nLen); + buffer += nLen; - nOffset = 0; - pRun = ME_FindItemFwd(pRun, diRun); + pRun = pNextRun; + pNextRun = ME_FindItemFwd(pRun, diRun); + + nLen = pRun->member.run.strText->nLen; + str = pRun->member.run.strText->szData; } *buffer = 0; - TRACE("nWritten=%d, actual=%d\n", nWritten, buffer-pStart); - return nWritten; + return buffer - pStart; } static BOOL ME_RegisterEditorClass(HINSTANCE hInstance) @@@ -4585,9 -4634,9 +4634,9 @@@ if (is_version_nt()) { - wcW.lpszClassName = RichEdit20W; + wcW.lpszClassName = RICHEDIT_CLASS20W; if (!RegisterClassW(&wcW)) return FALSE; - wcW.lpszClassName = RichEdit50W; + wcW.lpszClassName = MSFTEDIT_CLASS; if (!RegisterClassW(&wcW)) return FALSE; } else @@@ -4608,7 -4657,7 +4657,7 @@@ wcA.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_IBEAM)); wcA.hbrBackground = GetStockObject(NULL_BRUSH); wcA.lpszMenuName = NULL; - wcA.lpszClassName = "RichEdit20A"; + wcA.lpszClassName = RICHEDIT_CLASS20A; if (!RegisterClassA(&wcA)) return FALSE; wcA.lpszClassName = "RichEdit50A"; if (!RegisterClassA(&wcA)) return FALSE; @@@ -4688,145 -4737,135 +4737,135 @@@ static BOOL isurlspecial(WCHAR c * or one of the following special characters: *|/\+%#@ and must consist entirely * of the characters allowed to start the URL, plus : (colon) which may occur * at most once, and not at either end. - * - * sel_max == -1 indicates scan to end of text. */ - static BOOL ME_FindNextURLCandidate(ME_TextEditor *editor, int sel_min, int sel_max, - int * candidate_min, int * candidate_max) + static BOOL ME_FindNextURLCandidate(ME_TextEditor *editor, + const ME_Cursor *start, + int nChars, + ME_Cursor *candidate_min, + ME_Cursor *candidate_max) { - ME_DisplayItem * item; - ME_DisplayItem * para; - int nStart; + ME_Cursor cursor = *start; BOOL foundColon = FALSE; + BOOL candidateStarted = FALSE; WCHAR lastAcceptedChar = '\0'; - TRACE("sel_min = %d sel_max = %d\n", sel_min, sel_max); - - *candidate_min = *candidate_max = -1; - ME_RunOfsFromCharOfs(editor, sel_min, ¶, &item, &nStart); - TRACE("nStart = %d\n", nStart); - if (sel_max == -1) sel_max = ME_GetTextLength(editor); - while (item && para->member.para.nCharOfs + item->member.run.nCharOfs + nStart < sel_max) + while (nChars > 0) { - ME_DisplayItem * next_item; + WCHAR *strStart = cursor.pRun->member.run.strText->szData; + WCHAR *str = strStart + cursor.nOffset; + int nLen = cursor.pRun->member.run.strText->nLen - cursor.nOffset; + nChars -= nLen; - if (!(item->member.run.nFlags & MERF_ENDPARA)) { + if (~cursor.pRun->member.run.nFlags & MERF_ENDPARA) + { /* Find start of candidate */ - if (*candidate_min == -1) { - while (nStart < item->member.run.strText->nLen && - !(isalnumW(item->member.run.strText->szData[nStart]) || - isurlspecial(item->member.run.strText->szData[nStart]))) { - nStart++; - } - if (nStart < item->member.run.strText->nLen && - (isalnumW(item->member.run.strText->szData[nStart]) || - isurlspecial(item->member.run.strText->szData[nStart]))) { - *candidate_min = para->member.para.nCharOfs + item->member.run.nCharOfs + nStart; - lastAcceptedChar = item->member.run.strText->szData[nStart]; - nStart++; + if (!candidateStarted) + { + while (nLen) + { + nLen--; + if (isalnumW(*str) || isurlspecial(*str)) + { + cursor.nOffset = str - strStart; + *candidate_min = cursor; + candidateStarted = TRUE; + lastAcceptedChar = *str++; + break; + } + str++; } } /* Find end of candidate */ - if (*candidate_min >= 0) { - while (nStart < item->member.run.strText->nLen && - (isalnumW(item->member.run.strText->szData[nStart]) || - isurlspecial(item->member.run.strText->szData[nStart]) || - (!foundColon && item->member.run.strText->szData[nStart] == ':') )) { - if (item->member.run.strText->szData[nStart] == ':') foundColon = TRUE; - lastAcceptedChar = item->member.run.strText->szData[nStart]; - nStart++; - } - if (nStart < item->member.run.strText->nLen && - !(isalnumW(item->member.run.strText->szData[nStart]) || - isurlspecial(item->member.run.strText->szData[nStart]) )) { - *candidate_max = para->member.para.nCharOfs + item->member.run.nCharOfs + nStart; - nStart++; - if (lastAcceptedChar == ':') (*candidate_max)--; - return TRUE; + if (candidateStarted) { + while (nLen) + { + nLen--; + if (*str == ':' && !foundColon) { + foundColon = TRUE; + } else if (!isalnumW(*str) && !isurlspecial(*str)) { + cursor.nOffset = str - strStart; + if (lastAcceptedChar == ':') + ME_MoveCursorChars(editor, &cursor, -1); + *candidate_max = cursor; + return TRUE; + } + lastAcceptedChar = *str++; } } } else { /* End of paragraph: skip it if before candidate span, or terminates current active span */ - if (*candidate_min >= 0) { - *candidate_max = para->member.para.nCharOfs + item->member.run.nCharOfs; - if (lastAcceptedChar == ':') (*candidate_max)--; + if (candidateStarted) { + if (lastAcceptedChar == ':') + ME_MoveCursorChars(editor, &cursor, -1); + *candidate_max = cursor; return TRUE; } } /* Reaching this point means no span was found, so get next span */ - next_item = ME_FindItemFwd(item, diRun); - if (!next_item) { - if (*candidate_min >= 0) { + if (!ME_NextRun(&cursor.pPara, &cursor.pRun)) { + if (candidateStarted) { /* There are no further runs, so take end of text as end of candidate */ - *candidate_max = para->member.para.nCharOfs + item->member.run.nCharOfs + nStart; - if (lastAcceptedChar == ':') (*candidate_max)--; + cursor.nOffset = str - strStart; + if (lastAcceptedChar == ':') + ME_MoveCursorChars(editor, &cursor, -1); + *candidate_max = cursor; return TRUE; } + *candidate_max = *candidate_min = cursor; + return FALSE; } - item = next_item; - para = ME_GetParagraph(item); - nStart = 0; + cursor.nOffset = 0; } - if (item) { - if (*candidate_min >= 0) { - /* There are no further runs, so take end of text as end of candidate */ - *candidate_max = para->member.para.nCharOfs + item->member.run.nCharOfs + nStart; - if (lastAcceptedChar == ':') (*candidate_max)--; - return TRUE; - } + if (candidateStarted) { + /* There are no further runs, so take end of text as end of candidate */ + if (lastAcceptedChar == ':') + ME_MoveCursorChars(editor, &cursor, -1); + *candidate_max = cursor; + return TRUE; } + *candidate_max = *candidate_min = cursor; return FALSE; } /** * This proc evaluates the selection and returns TRUE if it can be considered an URL */ - static BOOL ME_IsCandidateAnURL(ME_TextEditor *editor, int sel_min, int sel_max) + static BOOL ME_IsCandidateAnURL(ME_TextEditor *editor, const ME_Cursor *start, int nChars) { + #define MAX_PREFIX_LEN 9 struct prefix_s { - const char *text; + const WCHAR text[MAX_PREFIX_LEN]; int length; - } prefixes[12] = { - /* Code below depends on these being in decreasing length order! */ - {"prospero:", 10}, - {"telnet:", 8}, - {"gopher:", 8}, - {"mailto:", 8}, - {"https:", 7}, - {"file:", 6}, - {"news:", 6}, - {"wais:", 6}, - {"nntp:", 6}, - {"http:", 5}, - {"www.", 5}, - {"ftp:", 5}, + }prefixes[] = { + {{'p','r','o','s','p','e','r','o',':'}, 9}, + {{'t','e','l','n','e','t',':'}, 7}, + {{'g','o','p','h','e','r',':'}, 7}, + {{'m','a','i','l','t','o',':'}, 7}, + {{'h','t','t','p','s',':'}, 6}, + {{'f','i','l','e',':'}, 5}, + {{'n','e','w','s',':'}, 5}, + {{'w','a','i','s',':'}, 5}, + {{'n','n','t','p',':'}, 5}, + {{'h','t','t','p',':'}, 5}, + {{'w','w','w','.'}, 4}, + {{'f','t','p',':'}, 4}, }; - LPWSTR bufferW = NULL; - WCHAR bufW[32]; + WCHAR bufferW[MAX_PREFIX_LEN + 1]; unsigned int i; - if (sel_max == -1) sel_max = ME_GetTextLength(editor); - assert(sel_min <= sel_max); - for (i = 0; i < sizeof(prefixes) / sizeof(struct prefix_s); i++) + ME_GetTextW(editor, bufferW, MAX_PREFIX_LEN, start, nChars, 0); + for (i = 0; i < sizeof(prefixes) / sizeof(*prefixes); i++) { - if (sel_max - sel_min < prefixes[i].length) continue; - if (bufferW == NULL) { - bufferW = heap_alloc((sel_max - sel_min + 1) * sizeof(WCHAR)); - } - ME_GetTextW(editor, bufferW, sel_min, min(sel_max - sel_min, lstrlenA(prefixes[i].text)), 0); - MultiByteToWideChar(CP_ACP, 0, prefixes[i].text, -1, bufW, 32); - if (!lstrcmpW(bufW, bufferW)) - { - heap_free(bufferW); + if (nChars < prefixes[i].length) continue; + if (!memcmp(prefixes[i].text, bufferW, prefixes[i].length * sizeof(WCHAR))) return TRUE; - } } - heap_free(bufferW); return FALSE; + #undef MAX_PREFIX_LEN } /** @@@ -4835,53 -4874,48 +4874,48 @@@ * their proper CFE_LINK attributes set or unset. If the CFE_LINK attribute is * not what it is supposed to be, this proc sets or unsets it as appropriate. * + * Since this function can cause runs to be split, do not depend on the value + * of the start cursor at the end of the function. + * + * nChars may be set to INT_MAX to update to the end of the text. + * * Returns TRUE if at least one section was modified. */ - static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, int sel_min, int sel_max) + static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, ME_Cursor *start, int nChars) { BOOL modified = FALSE; - int cMin, cMax; + ME_Cursor startCur = *start; if (!editor->AutoURLDetect_bEnable) return FALSE; - if (sel_max == -1) sel_max = ME_GetTextLength(editor); do { - int beforeURL[2]; - int inURL[2]; CHARFORMAT2W link; + ME_Cursor candidateStart, candidateEnd; - if (ME_FindNextURLCandidate(editor, sel_min, sel_max, &cMin, &cMax)) + if (ME_FindNextURLCandidate(editor, &startCur, nChars, + &candidateStart, &candidateEnd)) { /* Section before candidate is not an URL */ - beforeURL[0] = sel_min; - beforeURL[1] = cMin; + int cMin = ME_GetCursorOfs(&candidateStart); + int cMax = ME_GetCursorOfs(&candidateEnd); - if (ME_IsCandidateAnURL(editor, cMin, cMax)) - { - inURL[0] = cMin; inURL[1] = cMax; - } - else - { - beforeURL[1] = cMax; - inURL[0] = inURL[1] = -1; - } - sel_min = cMax; + if (!ME_IsCandidateAnURL(editor, &candidateStart, cMax - cMin)) + candidateStart = candidateEnd; + nChars -= cMax - ME_GetCursorOfs(&startCur); } else { /* No more candidates until end of selection */ - beforeURL[0] = sel_min; - beforeURL[1] = sel_max; - inURL[0] = inURL[1] = -1; - sel_min = sel_max; + nChars = 0; } - if (beforeURL[0] < beforeURL[1]) + if (startCur.pRun != candidateStart.pRun || + startCur.nOffset != candidateStart.nOffset) { /* CFE_LINK effect should be consistently unset */ link.cbSize = sizeof(link); - ME_GetCharFormat(editor, beforeURL[0], beforeURL[1], &link); + ME_GetCharFormat(editor, &startCur, &candidateStart, &link); if (!(link.dwMask & CFM_LINK) || (link.dwEffects & CFE_LINK)) { /* CFE_LINK must be unset from this range */ @@@ -4889,15 -4923,24 +4923,24 @@@ link.cbSize = sizeof(link); link.dwMask = CFM_LINK; link.dwEffects = 0; - ME_SetCharFormat(editor, beforeURL[0], beforeURL[1] - beforeURL[0], &link); + ME_SetCharFormat(editor, &startCur, &candidateStart, &link); + /* Update candidateEnd since setting character formats may split + * runs, which can cause a cursor to be at an invalid offset within + * a split run. */ + while (candidateEnd.nOffset >= candidateEnd.pRun->member.run.strText->nLen) + { + candidateEnd.nOffset -= candidateEnd.pRun->member.run.strText->nLen; + candidateEnd.pRun = ME_FindItemFwd(candidateEnd.pRun, diRun); + } modified = TRUE; } } - if (inURL[0] < inURL[1]) + if (candidateStart.pRun != candidateEnd.pRun || + candidateStart.nOffset != candidateEnd.nOffset) { /* CFE_LINK effect should be consistently set */ link.cbSize = sizeof(link); - ME_GetCharFormat(editor, inURL[0], inURL[1], &link); + ME_GetCharFormat(editor, &candidateStart, &candidateEnd, &link); if (!(link.dwMask & CFM_LINK) || !(link.dwEffects & CFE_LINK)) { /* CFE_LINK must be set on this range */ @@@ -4905,10 -4948,11 +4948,11 @@@ link.cbSize = sizeof(link); link.dwMask = CFM_LINK; link.dwEffects = CFE_LINK; - ME_SetCharFormat(editor, inURL[0], inURL[1] - inURL[0], &link); + ME_SetCharFormat(editor, &candidateStart, &candidateEnd, &link); modified = TRUE; } } - } while (sel_min < sel_max); + startCur = candidateEnd; + } while (nChars > 0); return modified; } diff --combined dll/win32/riched20/editor.h index 0929e828497,9739eeab95b..9739eeab95b --- a/dll/win32/riched20/editor.h +++ b/dll/win32/riched20/editor.h @@@ -77,6 -77,8 +77,8 @@@ void ME_CharFormatFromLogFont(HDC hDC, /* list.c */ void ME_InsertBefore(ME_DisplayItem *diWhere, ME_DisplayItem *diWhat); void ME_Remove(ME_DisplayItem *diWhere); + BOOL ME_NextRun(ME_DisplayItem **para, ME_DisplayItem **run); + BOOL ME_PrevRun(ME_DisplayItem **para, ME_DisplayItem **run); ME_DisplayItem *ME_FindItemBack(ME_DisplayItem *di, ME_DIType nTypeOrClass); ME_DisplayItem *ME_FindItemFwd(ME_DisplayItem *di, ME_DIType nTypeOrClass); ME_DisplayItem *ME_FindItemBackOrHere(ME_DisplayItem *di, ME_DIType nTypeOrClass); @@@ -95,7 -97,6 +97,6 @@@ ME_String *ME_VSplitString(ME_String *o int ME_IsWhitespaces(const ME_String *s); int ME_IsSplitable(const ME_String *s); int ME_FindNonWhitespaceV(const ME_String *s, int nVChar); - int ME_FindWhitespaceV(ME_String *s, int nVChar); int ME_CallWordBreakProc(ME_TextEditor *editor, ME_String *str, INT start, INT code); void ME_StrDeleteV(ME_String *s, int nVChar, int nChars); /* smart helpers for A<->W conversions, they reserve/free memory and call MultiByte<->WideChar functions */ @@@ -120,14 -121,11 +121,11 @@@ int ME_ReverseFindWhitespaceV(const ME_ /* row.c */ ME_DisplayItem *ME_RowStart(ME_DisplayItem *item); /* ME_DisplayItem *ME_RowEnd(ME_DisplayItem *item); */ - void ME_RenumberParagraphs(ME_DisplayItem *item); /* TODO */ ME_DisplayItem *ME_FindRowWithNumber(ME_TextEditor *editor, int nRow); int ME_RowNumberFromCharOfs(ME_TextEditor *editor, int nOfs); /* run.c */ ME_DisplayItem *ME_MakeRun(ME_Style *s, ME_String *strData, int nFlags); - /* note: ME_InsertRun inserts a copy of the specified run - so you need to destroy the original */ - ME_DisplayItem *ME_InsertRun(ME_TextEditor *editor, int nCharOfs, ME_DisplayItem *pItem); ME_DisplayItem *ME_InsertRunAtCursor(ME_TextEditor *editor, ME_Cursor *cursor, ME_Style *style, const WCHAR *str, int len, int flags); void ME_CheckCharOffsets(ME_TextEditor *editor); @@@ -136,49 -134,49 +134,49 @@@ int ME_CharFromPoint(ME_Context *c, in /* this one accounts for 1/2 char tolerance */ int ME_CharFromPointCursor(ME_TextEditor *editor, int cx, ME_Run *run); int ME_PointFromChar(ME_TextEditor *editor, ME_Run *pRun, int nOffset); - int ME_GetLastSplittablePlace(ME_Context *c, ME_Run *run); int ME_CanJoinRuns(const ME_Run *run1, const ME_Run *run2); void ME_JoinRuns(ME_TextEditor *editor, ME_DisplayItem *p); ME_DisplayItem *ME_SplitRun(ME_WrapContext *wc, ME_DisplayItem *item, int nChar); ME_DisplayItem *ME_SplitRunSimple(ME_TextEditor *editor, ME_DisplayItem *item, int nChar); - int ME_FindSplitPoint(ME_Context *c, POINT *pt, ME_Run *run, int desperate); void ME_UpdateRunFlags(ME_TextEditor *editor, ME_Run *run); - ME_DisplayItem *ME_SplitFurther(ME_TextEditor *editor, ME_DisplayItem *run); void ME_CalcRunExtent(ME_Context *c, const ME_Paragraph *para, int startx, ME_Run *run); SIZE ME_GetRunSize(ME_Context *c, const ME_Paragraph *para, ME_Run *run, int nLen, int startx); void ME_CursorFromCharOfs(ME_TextEditor *editor, int nCharOfs, ME_Cursor *pCursor); void ME_RunOfsFromCharOfs(ME_TextEditor *editor, int nCharOfs, ME_DisplayItem **ppPara, ME_DisplayItem **ppRun, int *pOfs); int ME_CharOfsFromRunOfs(ME_TextEditor *editor, const ME_DisplayItem *pPara, const ME_DisplayItem *pRun, int nOfs); void ME_SkipAndPropagateCharOffset(ME_DisplayItem *p, int shift); - void ME_SetCharFormat(ME_TextEditor *editor, int nFrom, int nLen, CHARFORMAT2W *pFmt); + void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, CHARFORMAT2W *pFmt); void ME_SetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt); - void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nLen, CHARFORMAT2W *pFmt); + void ME_GetCharFormat(ME_TextEditor *editor, const ME_Cursor *from, + const ME_Cursor *to, CHARFORMAT2W *pFmt); void ME_GetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt); void ME_GetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt); void ME_SetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *mod); /* caret.c */ + void ME_SetCursorToStart(ME_TextEditor *editor, ME_Cursor *cursor); int ME_SetSelection(ME_TextEditor *editor, int from, int to); void ME_HideCaret(ME_TextEditor *ed); void ME_ShowCaret(ME_TextEditor *ed); void ME_MoveCaret(ME_TextEditor *ed); - int ME_CharFromPos(ME_TextEditor *editor, int x, int y, BOOL *isExact); + BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y, ME_Cursor *cursor, BOOL *isExact); void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum); void ME_MouseMove(ME_TextEditor *editor, int x, int y); BOOL ME_DeleteTextAtCursor(ME_TextEditor *editor, int nCursor, int nChars); void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor, const WCHAR *str, int len, ME_Style *style); void ME_InsertEndRowFromCursor(ME_TextEditor *editor, int nCursor); + int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs); BOOL ME_ArrowKey(ME_TextEditor *ed, int nVKey, BOOL extend, BOOL ctrl); - int ME_GetCursorOfs(ME_TextEditor *editor, int nCursor); - void ME_GetSelection(ME_TextEditor *editor, int *from, int *to); - int ME_CountParagraphsBetween(ME_TextEditor *editor, int from, int to); + int ME_GetCursorOfs(const ME_Cursor *cursor); + int ME_GetSelectionOfs(ME_TextEditor *editor, int *from, int *to); + int ME_GetSelection(ME_TextEditor *editor, ME_Cursor **from, ME_Cursor **to); BOOL ME_IsSelection(ME_TextEditor *editor); void ME_DeleteSelection(ME_TextEditor *editor); void ME_SendSelChange(ME_TextEditor *editor); void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCursor); - BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars, BOOL bForce); + BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start, int nChars, BOOL bForce); int ME_GetTextLength(ME_TextEditor *editor); int ME_GetTextLengthEx(ME_TextEditor *editor, const GETTEXTLENGTHEX *how); ME_Style *ME_GetSelectionInsertStyle(ME_TextEditor *editor); @@@ -231,8 -229,7 +229,7 @@@ void ME_ScrollRight(ME_TextEditor *edit void ME_UpdateScrollBar(ME_TextEditor *editor); /* other functions in paint.c */ - int ME_GetParaBorderWidth(ME_TextEditor *editor, int); - int ME_GetParaLineSpace(ME_Context *c, ME_Paragraph*); + int ME_GetParaBorderWidth(ME_Context *c, int flags); /* richole.c */ LRESULT CreateIRichEditOle(ME_TextEditor *editor, LPVOID *); @@@ -246,14 -243,14 +243,14 @@@ ME_TextEditor *ME_MakeEditor(ITextHost LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode, HRESULT* phresult); void ME_SendOldNotify(ME_TextEditor *editor, int nCode); - int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int nStart, int nChars, BOOL bCRLF); + int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen, + const ME_Cursor *start, int srcChars, BOOL bCRLF); void ME_RTFCharAttrHook(struct _RTF_Info *info); void ME_RTFParAttrHook(struct _RTF_Info *info); void ME_RTFTblAttrHook(struct _RTF_Info *info); void ME_RTFSpecialCharHook(struct _RTF_Info *info); void ME_StreamInFill(ME_InStream *stream); extern int me_debug; - extern void DoWrap(ME_TextEditor *editor); /* table.c */ BOOL ME_IsInTable(ME_DisplayItem *pItem); @@@ -265,7 -262,7 +262,7 @@@ ME_DisplayItem *ME_InsertTableRowEndFro ME_DisplayItem *ME_GetTableRowEnd(ME_DisplayItem *para); ME_DisplayItem *ME_GetTableRowStart(ME_DisplayItem *para); void ME_CheckTablesForCorruption(ME_TextEditor *editor); - void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, int nOfs,int *nChars); + void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars); ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, ME_DisplayItem *table_row); void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow); void ME_MoveCursorFromTableRowStartParagraph(ME_TextEditor *editor); @@@ -273,7 -270,7 +270,7 @@@ struct RTFTable *ME_MakeTableDef(ME_Tex void ME_InitTableDef(ME_TextEditor *editor, struct RTFTable *tableDef); /* txthost.c */ - ITextHost *ME_CreateTextHost(HWND hwnd, BOOL bEmulateVersion10); + ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10); #ifdef __i386__ /* Use wrappers to perform thiscall on i386 */ #define TXTHOST_VTABLE(This) (&itextHostStdcallVtbl) #else /* __i386__ */ @@@ -330,8 -327,8 +327,8 @@@ BOOL ME_Redo(ME_TextEditor *editor) void ME_EmptyUndoStack(ME_TextEditor *editor); /* writer.c */ - LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, int nStart, int nTo, EDITSTREAM *stream); + LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, const ME_Cursor *start, int nChars, EDITSTREAM *stream); LRESULT ME_StreamOut(ME_TextEditor *editor, DWORD dwFormat, EDITSTREAM *stream); /* clipboard.c */ - HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAOBJECT *lplpdataobj); + HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start, int nChars, LPDATAOBJECT *lplpdataobj); diff --combined dll/win32/riched20/editstr.h index a4af8fe9c0c,9b8d645199e..9b8d645199e --- a/dll/win32/riched20/editstr.h +++ b/dll/win32/riched20/editstr.h @@@ -29,6 -29,7 +29,7 @@@ #include #include #include + #include #define COBJMACROS #define NONAMELESSUNION @@@ -50,7 -51,7 +51,7 @@@ #include "wine/debug.h" #ifdef __i386__ - extern struct ITextHostVtbl itextHostStdcallVtbl; + extern const struct ITextHostVtbl itextHostStdcallVtbl; #endif /* __i386__ */ typedef struct tagME_String @@@ -325,7 -326,7 +326,7 @@@ typedef struct tagME_FontCacheIte typedef struct tagME_TextEditor { - HWND hWnd; + HWND hWnd, hwndParent; ITextHost *texthost; BOOL bEmulateVersion10; ME_TextBuffer *pBuffer; @@@ -369,6 -370,7 +370,7 @@@ BOOL AutoURLDetect_bEnable; WCHAR cPasswordMask; BOOL bHaveFocus; + BOOL bDialogMode; /* Indicates that we are inside a dialog window */ /*for IME */ int imeStartIndex; DWORD selofs; /* The size of the selection bar on the left side of control */ diff --combined dll/win32/riched20/list.c index d3d9463c04b,bb91bc4de65..bb91bc4de65 --- a/dll/win32/riched20/list.c +++ b/dll/win32/riched20/list.c @@@ -44,22 -44,63 +44,63 @@@ void ME_Remove(ME_DisplayItem *diWhere static BOOL ME_DITypesEqual(ME_DIType type, ME_DIType nTypeOrClass) { - if (type==nTypeOrClass) - return TRUE; - if (nTypeOrClass==diRunOrParagraph && (type==diRun || type==diParagraph)) - return TRUE; - if (nTypeOrClass==diRunOrStartRow && (type==diRun || type==diStartRow)) - return TRUE; - if (nTypeOrClass==diParagraphOrEnd && (type==diTextEnd || type==diParagraph)) - return TRUE; - if (nTypeOrClass==diStartRowOrParagraph && (type==diStartRow || type==diParagraph)) - return TRUE; - if (nTypeOrClass==diStartRowOrParagraphOrEnd - && (type==diStartRow || type==diParagraph || type==diTextEnd)) - return TRUE; - if (nTypeOrClass==diRunOrParagraphOrEnd - && (type==diRun || type==diParagraph || type==diTextEnd)) - return TRUE; + switch (nTypeOrClass) + { + case diRunOrParagraph: + return type == diRun || type == diParagraph; + case diRunOrStartRow: + return type == diRun || type == diStartRow; + case diParagraphOrEnd: + return type == diTextEnd || type == diParagraph; + case diStartRowOrParagraph: + return type == diStartRow || type == diParagraph; + case diStartRowOrParagraphOrEnd: + return type == diStartRow || type == diParagraph || type == diTextEnd; + case diRunOrParagraphOrEnd: + return type == diRun || type == diParagraph || type == diTextEnd; + default: + return type == nTypeOrClass; + } + } + + /* Modifies run pointer to point to the next run, and modify the + * paragraph pointer if moving into the next paragraph. + * + * Returns TRUE if next run is found, otherwise returns FALSE. */ + BOOL ME_NextRun(ME_DisplayItem **para, ME_DisplayItem **run) + { + ME_DisplayItem *p = (*run)->next; + while (p->type != diTextEnd) + { + if (p->type == diParagraph) { + *para = p; + } else if (p->type == diRun) { + *run = p; + return TRUE; + } + p = p->next; + } + return FALSE; + } + + /* Modifies run pointer to point to the previous run, and modify the + * paragraph pointer if moving into the previous paragraph. + * + * Returns TRUE if previous run is found, otherwise returns FALSE. */ + BOOL ME_PrevRun(ME_DisplayItem **para, ME_DisplayItem **run) + { + ME_DisplayItem *p = (*run)->prev; + while (p->type != diTextStart) + { + if (p->type == diParagraph) { + if (p->member.para.prev_para->type == diParagraph) + *para = p->member.para.prev_para; + } else if (p->type == diRun) { + *run = p; + return TRUE; + } + p = p->prev; + } return FALSE; } diff --combined dll/win32/riched20/paint.c index 620ac69160c,2b01e3c2693..2b01e3c2693 --- a/dll/win32/riched20/paint.c +++ b/dll/win32/riched20/paint.c @@@ -413,7 -413,7 +413,7 @@@ static void ME_DrawRun(ME_Context *c, i return; start = ME_FindItemBack(rundi, diStartRow); - ME_GetSelection(c->editor, &nSelFrom, &nSelTo); + ME_GetSelectionOfs(c->editor, &nSelFrom, &nSelTo); /* Draw selected end-of-paragraph mark */ if (run->nFlags & MERF_ENDPARA) @@@ -461,19 -461,21 +461,21 @@@ } } - static const struct {unsigned width_num : 4, width_den : 4, pen_style : 4, dble : 1;} border_details[] = { - /* none */ {0, 1, PS_SOLID, FALSE}, - /* 3/4 */ {3, 4, PS_SOLID, FALSE}, - /* 1 1/2 */ {3, 2, PS_SOLID, FALSE}, - /* 2 1/4 */ {9, 4, PS_SOLID, FALSE}, - /* 3 */ {3, 1, PS_SOLID, FALSE}, - /* 4 1/2 */ {9, 2, PS_SOLID, FALSE}, - /* 6 */ {6, 1, PS_SOLID, FALSE}, - /* 3/4 double */ {3, 4, PS_SOLID, TRUE}, - /* 1 1/2 double */ {3, 2, PS_SOLID, TRUE}, - /* 2 1/4 double */ {9, 4, PS_SOLID, TRUE}, - /* 3/4 gray */ {3, 4, PS_DOT /* FIXME */, FALSE}, - /* 1 1/2 dashed */ {3, 2, PS_DASH, FALSE}, + /* The documented widths are in points (72 dpi), but converting them to + * 96 dpi (standard display resolution) avoids dealing with fractions. */ + static const struct {unsigned width : 8, pen_style : 4, dble : 1;} border_details[] = { + /* none */ {0, PS_SOLID, FALSE}, + /* 3/4 */ {1, PS_SOLID, FALSE}, + /* 1 1/2 */ {2, PS_SOLID, FALSE}, + /* 2 1/4 */ {3, PS_SOLID, FALSE}, + /* 3 */ {4, PS_SOLID, FALSE}, + /* 4 1/2 */ {6, PS_SOLID, FALSE}, + /* 6 */ {8, PS_SOLID, FALSE}, + /* 3/4 double */ {1, PS_SOLID, TRUE}, + /* 1 1/2 double */ {2, PS_SOLID, TRUE}, + /* 2 1/4 double */ {3, PS_SOLID, TRUE}, + /* 3/4 gray */ {1, PS_DOT /* FIXME */, FALSE}, + /* 1 1/2 dashed */ {2, PS_DASH, FALSE}, }; static const COLORREF pen_colors[16] = { @@@ -487,25 -489,20 +489,20 @@@ /* Dark gray */ RGB(0x80, 0x80, 0x80), /* Light gray */ RGB(0xc0, 0xc0, 0xc0), }; - static int ME_GetBorderPenWidth(ME_TextEditor* editor, int idx) + static int ME_GetBorderPenWidth(ME_Context* c, int idx) { - int width; + int width = border_details[idx].width; + + if (c->dpi.cx != 96) + width = MulDiv(width, c->dpi.cx, 96); + + if (c->editor->nZoomNumerator != 0) + width = MulDiv(width, c->editor->nZoomNumerator, c->editor->nZoomDenominator); - if (editor->nZoomNumerator == 0) - { - width = border_details[idx].width_num + border_details[idx].width_den / 2; - width /= border_details[idx].width_den; - } - else - { - width = border_details[idx].width_num * editor->nZoomNumerator; - width += border_details[idx].width_den * editor->nZoomNumerator / 2; - width /= border_details[idx].width_den * editor->nZoomDenominator; - } return width; } - int ME_GetParaBorderWidth(ME_TextEditor* editor, int flags) + int ME_GetParaBorderWidth(ME_Context* c, int flags) { int idx = (flags >> 8) & 0xF; int width; @@@ -515,34 -512,11 +512,11 @@@ FIXME("Unsupported border value %d\n", idx); return 0; } - width = ME_GetBorderPenWidth(editor, idx); + width = ME_GetBorderPenWidth(c, idx); if (border_details[idx].dble) width = width * 2 + 1; return width; } - int ME_GetParaLineSpace(ME_Context* c, ME_Paragraph* para) - { - int sp = 0, ls = 0; - if (!(para->pFmt->dwMask & PFM_LINESPACING)) return 0; - - /* FIXME: how to compute simply the line space in ls ??? */ - /* FIXME: does line spacing include the line itself ??? */ - switch (para->pFmt->bLineSpacingRule) - { - case 0: sp = ls; break; - case 1: sp = (3 * ls) / 2; break; - case 2: sp = 2 * ls; break; - case 3: sp = ME_twips2pointsY(c, para->pFmt->dyLineSpacing); if (sp < ls) sp = ls; break; - case 4: sp = ME_twips2pointsY(c, para->pFmt->dyLineSpacing); break; - case 5: sp = para->pFmt->dyLineSpacing / 20; break; - default: FIXME("Unsupported spacing rule value %d\n", para->pFmt->bLineSpacingRule); - } - if (c->editor->nZoomNumerator == 0) - return sp; - else - return sp * c->editor->nZoomNumerator / c->editor->nZoomDenominator; - } - static void ME_DrawParaDecoration(ME_Context* c, ME_Paragraph* para, int y, RECT* bounds) { int idx, border_width, top_border, bottom_border; @@@ -588,7 -562,7 +562,7 @@@ */ if (para->pFmt->wBorders & 0x00B0) FIXME("Unsupported border flags %x\n", para->pFmt->wBorders); - border_width = ME_GetParaBorderWidth(c->editor, para->pFmt->wBorders); + border_width = ME_GetParaBorderWidth(c, para->pFmt->wBorders); if (para->pFmt->wBorders & 4) top_border = border_width; if (para->pFmt->wBorders & 8) bottom_border = border_width; } @@@ -630,7 -604,7 +604,7 @@@ rightEdge = c->pt.x + max(c->editor->sizeWindow.cx, c->editor->nTotalWidth); - pen_width = ME_GetBorderPenWidth(c->editor, idx); + pen_width = ME_GetBorderPenWidth(c, idx); pen = CreatePen(border_details[idx].pen_style, pen_width, pencr); oldpen = SelectObject(c->hDC, pen); MoveToEx(c->hDC, 0, 0, &pt); @@@ -1036,17 -1010,21 +1010,21 @@@ void ME_ScrollAbs(ME_TextEditor *editor if (editor->horz_si.nPos != x) { x = min(x, editor->horz_si.nMax); x = max(x, editor->horz_si.nMin); - ITextHost_TxSetScrollPos(editor->texthost, SB_HORZ, x, TRUE); scrollX = editor->horz_si.nPos - x; editor->horz_si.nPos = x; + if (editor->horz_si.nMax > 0xFFFF) /* scale to 16-bit value */ + x = MulDiv(x, 0xFFFF, editor->horz_si.nMax); + ITextHost_TxSetScrollPos(editor->texthost, SB_HORZ, x, TRUE); } if (editor->vert_si.nPos != y) { y = min(y, editor->vert_si.nMax - (int)editor->vert_si.nPage); y = max(y, editor->vert_si.nMin); - ITextHost_TxSetScrollPos(editor->texthost, SB_VERT, y, TRUE); scrollY = editor->vert_si.nPos - y; editor->vert_si.nPos = y; + if (editor->vert_si.nMax > 0xFFFF) /* scale to 16-bit value */ + y = MulDiv(y, 0xFFFF, editor->vert_si.nMax); + ITextHost_TxSetScrollPos(editor->texthost, SB_VERT, y, TRUE); } if (abs(scrollX) > editor->sizeWindow.cx || @@@ -1061,22 -1039,28 +1039,28 @@@ if (editor->hWnd) { LONG winStyle = GetWindowLongW(editor->hWnd, GWL_STYLE); - bScrollBarIsVisible = (winStyle & WS_HSCROLL) != 0; - bScrollBarWillBeVisible = (editor->nTotalWidth > editor->sizeWindow.cx - && (editor->styleFlags & WS_HSCROLL)) - || (editor->styleFlags & ES_DISABLENOSCROLL); - if (bScrollBarIsVisible != bScrollBarWillBeVisible) - ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ, - bScrollBarWillBeVisible); + if (editor->styleFlags & WS_HSCROLL) + { + bScrollBarIsVisible = (winStyle & WS_HSCROLL) != 0; + bScrollBarWillBeVisible = (editor->nTotalWidth > editor->sizeWindow.cx + && (editor->styleFlags & WS_HSCROLL)) + || (editor->styleFlags & ES_DISABLENOSCROLL); + if (bScrollBarIsVisible != bScrollBarWillBeVisible) + ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ, + bScrollBarWillBeVisible); + } - bScrollBarIsVisible = (winStyle & WS_VSCROLL) != 0; - bScrollBarWillBeVisible = (editor->nTotalLength > editor->sizeWindow.cy - && (editor->styleFlags & WS_VSCROLL) - && (editor->styleFlags & ES_MULTILINE)) - || (editor->styleFlags & ES_DISABLENOSCROLL); - if (bScrollBarIsVisible != bScrollBarWillBeVisible) - ITextHost_TxShowScrollBar(editor->texthost, SB_VERT, - bScrollBarWillBeVisible); + if (editor->styleFlags & WS_VSCROLL) + { + bScrollBarIsVisible = (winStyle & WS_VSCROLL) != 0; + bScrollBarWillBeVisible = (editor->nTotalLength > editor->sizeWindow.cy + && (editor->styleFlags & WS_VSCROLL) + && (editor->styleFlags & ES_MULTILINE)) + || (editor->styleFlags & ES_DISABLENOSCROLL); + if (bScrollBarIsVisible != bScrollBarWillBeVisible) + ITextHost_TxShowScrollBar(editor->texthost, SB_VERT, + bScrollBarWillBeVisible); + } } ME_UpdateScrollBar(editor); } @@@ -1136,6 -1120,7 +1120,7 @@@ void ME_UpdateScrollBar(ME_TextEditor * si.cbSize = sizeof(si); si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; + si.nMin = 0; if (editor->styleFlags & ES_DISABLENOSCROLL) si.fMask |= SIF_DISABLENOSCROLL; @@@ -1150,20 -1135,25 +1135,25 @@@ return; } - si.nMin = 0; si.nMax = editor->nTotalWidth; si.nPos = editor->horz_si.nPos; si.nPage = editor->sizeWindow.cx; - if (si.nMin != editor->horz_si.nMin || - si.nMax != editor->horz_si.nMax || + if (si.nMax != editor->horz_si.nMax || si.nPage != editor->horz_si.nPage) { TRACE("min=%d max=%d page=%d\n", si.nMin, si.nMax, si.nPage); - editor->horz_si.nMin = si.nMin; editor->horz_si.nMax = si.nMax; editor->horz_si.nPage = si.nPage; - if (bScrollBarWillBeVisible || bScrollBarWasVisible) { + if ((bScrollBarWillBeVisible || bScrollBarWasVisible) && + editor->styleFlags & WS_HSCROLL) + { + if (si.nMax > 0xFFFF) + { + /* Native scales the scrollbar info to 16-bit external values. */ + si.nPos = MulDiv(si.nPos, 0xFFFF, si.nMax); + si.nMax = 0xFFFF; + } if (editor->hWnd) { SetScrollInfo(editor->hWnd, SB_HORZ, &si, TRUE); } else { @@@ -1175,14 -1165,17 +1165,17 @@@ } } - if (si.fMask & SIF_DISABLENOSCROLL) { - bScrollBarWillBeVisible = TRUE; - } else if (!(editor->styleFlags & WS_HSCROLL)) { - bScrollBarWillBeVisible = FALSE; - } + if (editor->styleFlags & WS_HSCROLL) + { + if (si.fMask & SIF_DISABLENOSCROLL) { + bScrollBarWillBeVisible = TRUE; + } else if (!(editor->styleFlags & WS_HSCROLL)) { + bScrollBarWillBeVisible = FALSE; + } - if (bScrollBarWasVisible != bScrollBarWillBeVisible) - ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ, bScrollBarWillBeVisible); + if (bScrollBarWasVisible != bScrollBarWillBeVisible) + ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ, bScrollBarWillBeVisible); + } /* Update vertical scrollbar */ bScrollBarWasVisible = editor->vert_si.nMax > editor->vert_si.nPage; @@@ -1201,15 -1194,21 +1194,21 @@@ si.nPos = editor->vert_si.nPos; si.nPage = editor->sizeWindow.cy; - if (si.nMin != editor->vert_si.nMin || - si.nMax != editor->vert_si.nMax || + if (si.nMax != editor->vert_si.nMax || si.nPage != editor->vert_si.nPage) { TRACE("min=%d max=%d page=%d\n", si.nMin, si.nMax, si.nPage); - editor->vert_si.nMin = si.nMin; editor->vert_si.nMax = si.nMax; editor->vert_si.nPage = si.nPage; - if (bScrollBarWillBeVisible || bScrollBarWasVisible) { + if ((bScrollBarWillBeVisible || bScrollBarWasVisible) && + editor->styleFlags & WS_VSCROLL) + { + if (si.nMax > 0xFFFF) + { + /* Native scales the scrollbar info to 16-bit external values. */ + si.nPos = MulDiv(si.nPos, 0xFFFF, si.nMax); + si.nMax = 0xFFFF; + } if (editor->hWnd) { SetScrollInfo(editor->hWnd, SB_VERT, &si, TRUE); } else { @@@ -1221,15 -1220,18 +1220,18 @@@ } } - if (si.fMask & SIF_DISABLENOSCROLL) { - bScrollBarWillBeVisible = TRUE; - } else if (!(editor->styleFlags & WS_VSCROLL)) { - bScrollBarWillBeVisible = FALSE; - } + if (editor->styleFlags & WS_VSCROLL) + { + if (si.fMask & SIF_DISABLENOSCROLL) { + bScrollBarWillBeVisible = TRUE; + } else if (!(editor->styleFlags & WS_VSCROLL)) { + bScrollBarWillBeVisible = FALSE; + } - if (bScrollBarWasVisible != bScrollBarWillBeVisible) - ITextHost_TxShowScrollBar(editor->texthost, SB_VERT, - bScrollBarWillBeVisible); + if (bScrollBarWasVisible != bScrollBarWillBeVisible) + ITextHost_TxShowScrollBar(editor->texthost, SB_VERT, + bScrollBarWillBeVisible); + } } void ME_EnsureVisible(ME_TextEditor *editor, ME_Cursor *pCursor) @@@ -1242,11 -1244,24 +1244,24 @@@ assert(pRow); assert(pPara); - x = pRun->pt.x + ME_PointFromChar(editor, pRun, pCursor->nOffset); - if (x > editor->horz_si.nPos + editor->sizeWindow.cx) - x = x + 1 - editor->sizeWindow.cx; - else if (x > editor->horz_si.nPos) + if (editor->styleFlags & ES_AUTOHSCROLL) + { + x = pRun->pt.x + ME_PointFromChar(editor, pRun, pCursor->nOffset); + if (x > editor->horz_si.nPos + editor->sizeWindow.cx) + x = x + 1 - editor->sizeWindow.cx; + else if (x > editor->horz_si.nPos) + x = editor->horz_si.nPos; + + if (~editor->styleFlags & ES_AUTOVSCROLL) + { + ME_HScrollAbs(editor, x); + return; + } + } else { + if (~editor->styleFlags & ES_AUTOVSCROLL) + return; x = editor->horz_si.nPos; + } y = pPara->member.para.pt.y + pRow->member.row.pt.y; yheight = pRow->member.row.nHeight; @@@ -1267,7 -1282,7 +1282,7 @@@ ME_InvalidateSelection(ME_TextEditor *e int nStart, nEnd; int len = ME_GetTextLength(editor); - ME_GetSelection(editor, &nStart, &nEnd); + ME_GetSelectionOfs(editor, &nStart, &nEnd); /* if both old and new selection are 0-char (= caret only), then there's no (inverted) area to be repainted, neither old nor new */ if (nStart == nEnd && editor->nLastSelStart == editor->nLastSelEnd) @@@ -1300,7 -1315,7 +1315,7 @@@ ME_InvalidateMarkedParagraphs(editor); /* remember the last invalidated position */ - ME_GetSelection(editor, &editor->nLastSelStart, &editor->nLastSelEnd); + ME_GetSelectionOfs(editor, &editor->nLastSelStart, &editor->nLastSelEnd); ME_GetSelectionParas(editor, &editor->pLastSelStartPara, &editor->pLastSelEndPara); assert(editor->pLastSelStartPara->type == diParagraph); assert(editor->pLastSelEndPara->type == diParagraph); diff --combined dll/win32/riched20/para.c index 94ef7ae709f,b6319e73aa2..b6319e73aa2 --- a/dll/win32/riched20/para.c +++ b/dll/win32/riched20/para.c @@@ -335,6 -335,8 +335,8 @@@ ME_DisplayItem *ME_JoinParagraphs(ME_Te int i, shift; ME_UndoItem *undo = NULL; int end_len; + CHARFORMAT2W fmt; + ME_Cursor startCur, endCur; assert(tp->type == diParagraph); assert(tp->member.para.next_para); @@@ -351,12 -353,15 +353,15 @@@ end_len = pRun->member.run.strText->nLen; - { - /* null char format operation to store the original char format for the ENDPARA run */ - CHARFORMAT2W fmt; - ME_InitCharFormat2W(&fmt); - ME_SetCharFormat(editor, pNext->member.para.nCharOfs - end_len, end_len, &fmt); - } + /* null char format operation to store the original char format for the ENDPARA run */ + ME_InitCharFormat2W(&fmt); + endCur.pPara = pNext; + endCur.pRun = ME_FindItemFwd(pNext, diRun); + endCur.nOffset = 0; + startCur = endCur; + ME_PrevRun(&startCur.pPara, &startCur.pRun); + ME_SetCharFormat(editor, &startCur, &endCur, &fmt); + undo = ME_AddUndoItem(editor, diUndoSplitParagraph, pNext); if (undo) { diff --combined dll/win32/riched20/reader.c index b6a6f44f255,9f88cf77554..9f88cf77554 --- a/dll/win32/riched20/reader.c +++ b/dll/win32/riched20/reader.c @@@ -442,7 -442,11 +442,11 @@@ static void RTFUngetToken(RTF_Info *inf * increment the value to compensate for it being decremented * twice due to the RTFUngetToken. */ if(RTFCheckCM (info, rtfGroup, rtfEndGroup)) + { + info->stack[info->stackTop].style = info->style; + ME_AddRefStyle(info->style); info->stackTop++; + } } @@@ -783,7 -787,6 +787,6 @@@ static void ReadFontTbl(RTF_Info *info RTFFont *fp = NULL; char buf[rtfBufSiz], *bp; int old = -1; - const char *fn = "ReadFontTbl"; for (;;) { @@@ -799,19 -802,19 +802,19 @@@ else if (RTFCheckCM (info, rtfGroup, rtfBeginGroup)) old = 0; /* brace */ else /* can't tell! */ - ERR ( "%s: Cannot determine format\n", fn); + ERR ("cannot determine format\n"); } if (old == 0) /* need to find "{" here */ { if (!RTFCheckCM (info, rtfGroup, rtfBeginGroup)) - ERR ( "%s: missing \"{\"\n", fn); + ERR ("missing \"{\"\n"); RTFGetToken (info); /* yes, skip to next token */ if (info->rtfClass == rtfEOF) break; } fp = New (RTFFont); if (fp == NULL) { - ERR ( "%s: cannot allocate font entry\n", fn); + ERR ("cannot allocate font entry\n"); break; } @@@ -837,8 -840,8 +840,8 @@@ { default: /* ignore token but announce it */ - WARN ("%s: unknown token \"%s\"\n", - fn, info->rtfTextBuf); + WARN ("unknown token \"%s\"\n", + info->rtfTextBuf); break; case rtfFontFamily: fp->rtfFFamily = info->rtfMinor; @@@ -899,7 -902,7 +902,7 @@@ *bp = '\0'; fp->rtfFName = RTFStrSave (buf); if (fp->rtfFName == NULL) - ERR ( "%s: cannot allocate font name\n", fn); + ERR ("cannot allocate font name\n"); /* already have next token; don't read one */ /* at bottom of loop */ continue; @@@ -907,8 -910,7 +910,7 @@@ else { /* ignore token but announce it */ - WARN ( "%s: unknown token \"%s\"\n", - fn,info->rtfTextBuf); + WARN ("unknown token \"%s\"\n", info->rtfTextBuf); } RTFGetToken (info); if (info->rtfClass == rtfEOF) @@@ -920,7 -922,7 +922,7 @@@ { RTFGetToken (info); if (!RTFCheckCM (info, rtfGroup, rtfEndGroup)) - ERR ( "%s: missing \"}\"\n", fn); + ERR ("missing \"}\"\n"); if (info->rtfClass == rtfEOF) break; } @@@ -934,7 -936,7 +936,7 @@@ } } if (!fp || (fp->rtfFNum == -1)) - ERR( "%s: missing font number\n", fn); + ERR("missing font number\n"); /* * Could check other pieces of structure here, too, I suppose. */ @@@ -963,7 -965,6 +965,6 @@@ static void ReadColorTbl(RTF_Info *info { RTFColor *cp; int cnum = 0; - const char *fn = "ReadColorTbl"; int group_level = 1; for (;;) @@@ -986,27 -987,30 +987,30 @@@ cp = New (RTFColor); if (cp == NULL) { - ERR ( "%s: cannot allocate color entry\n", fn); + ERR ("cannot allocate color entry\n"); break; } cp->rtfCNum = cnum++; - cp->rtfCRed = cp->rtfCGreen = cp->rtfCBlue = -1; cp->rtfNextColor = info->colorList; info->colorList = cp; - while (RTFCheckCM (info, rtfControl, rtfColorName)) - { - switch (info->rtfMinor) - { - case rtfRed: cp->rtfCRed = info->rtfParam; break; - case rtfGreen: cp->rtfCGreen = info->rtfParam; break; - case rtfBlue: cp->rtfCBlue = info->rtfParam; break; - } - RTFGetToken (info); + if (!RTFCheckCM (info, rtfControl, rtfColorName)) + cp->rtfCRed = cp->rtfCGreen = cp->rtfCBlue = -1; + else { + cp->rtfCRed = cp->rtfCGreen = cp->rtfCBlue = 0; + do { + switch (info->rtfMinor) + { + case rtfRed: cp->rtfCRed = info->rtfParam & 0xFF; break; + case rtfGreen: cp->rtfCGreen = info->rtfParam & 0xFF; break; + case rtfBlue: cp->rtfCBlue = info->rtfParam & 0xFF; break; + } + RTFGetToken (info); + } while (RTFCheckCM (info, rtfControl, rtfColorName)); } if (info->rtfClass == rtfEOF) break; if (!RTFCheckCM (info, rtfText, ';')) - ERR ("%s: malformed entry\n", fn); + ERR ("malformed entry\n"); } RTFRouteToken (info); /* feed "}" back to router */ } @@@ -1022,7 -1026,6 +1026,6 @@@ static void ReadStyleSheet(RTF_Info *in RTFStyle *sp; RTFStyleElt *sep, *sepLast; char buf[rtfBufSiz], *bp; - const char *fn = "ReadStyleSheet"; int real_style; for (;;) @@@ -1034,7 -1037,7 +1037,7 @@@ break; sp = New (RTFStyle); if (sp == NULL) { - ERR ( "%s: cannot allocate stylesheet entry\n", fn); + ERR ("cannot allocate stylesheet entry\n"); break; } sp->rtfSName = NULL; @@@ -1048,7 -1051,7 +1051,7 @@@ sp->rtfExpanding = 0; info->styleList = sp; if (!RTFCheckCM (info, rtfGroup, rtfBeginGroup)) - ERR ( "%s: missing \"{\"\n", fn); + ERR ("missing \"{\"\n"); real_style = TRUE; for (;;) { @@@ -1060,7 -1063,7 +1063,7 @@@ { if (RTFCheckMM (info, rtfSpecialChar, rtfOptDest)) { RTFGetToken(info); - ERR( "%s: skipping optional destination\n", fn); + ERR("skipping optional destination\n"); RTFSkipGroup(info); info->rtfClass = rtfGroup; info->rtfMajor = rtfEndGroup; @@@ -1102,14 -1105,17 +1105,17 @@@ } sep = New (RTFStyleElt); if (sep == NULL) - ERR ( "%s: cannot allocate style element\n", fn); + { + ERR ("cannot allocate style element\n"); + break; + } sep->rtfSEClass = info->rtfClass; sep->rtfSEMajor = info->rtfMajor; sep->rtfSEMinor = info->rtfMinor; sep->rtfSEParam = info->rtfParam; sep->rtfSEText = RTFStrSave (info->rtfTextBuf); if (sep->rtfSEText == NULL) - ERR ( "%s: cannot allocate style element text\n", fn); + ERR ("cannot allocate style element text\n"); if (sepLast == NULL) sp->rtfSSEList = sep; /* first element */ else /* add to end */ @@@ -1123,7 -1129,7 +1129,7 @@@ * This passes over "{\*\keycode ... }, among * other things. A temporary (perhaps) hack. */ - ERR( "%s: skipping begin\n", fn); + ERR("skipping begin\n"); RTFSkipGroup (info); continue; } @@@ -1144,19 -1150,18 +1150,18 @@@ *bp = '\0'; sp->rtfSName = RTFStrSave (buf); if (sp->rtfSName == NULL) - ERR ( "%s: cannot allocate style name\n", fn); + ERR ("cannot allocate style name\n"); } else /* unrecognized */ { /* ignore token but announce it */ - WARN ( "%s: unknown token \"%s\"\n", - fn, info->rtfTextBuf); + WARN ("unknown token \"%s\"\n", info->rtfTextBuf); } } if (real_style) { RTFGetToken (info); if (!RTFCheckCM (info, rtfGroup, rtfEndGroup)) - ERR ( "%s: missing \"}\"\n", fn); + ERR ("missing \"}\"\n"); /* * Check over the style structure. A name is a must. * If no style number was specified, check whether it's the @@@ -1168,12 -1173,12 +1173,12 @@@ * Some German RTF writers use "Standard" instead of "Normal". */ if (sp->rtfSName == NULL) - ERR ( "%s: missing style name\n", fn); + ERR ("missing style name\n"); if (sp->rtfSNum < 0) { if (strncmp (buf, "Normal", 6) != 0 && strncmp (buf, "Standard", 8) != 0) - ERR ( "%s: missing style number\n", fn); + ERR ("missing style number\n"); sp->rtfSNum = rtfNormalStyleNum; } if (sp->rtfSNextPar == -1) /* if \snext not given, */ diff --combined dll/win32/riched20/richole.c index 326ecc537d5,5b6b2b666f7..5b6b2b666f7 --- a/dll/win32/riched20/richole.c +++ b/dll/win32/riched20/richole.c @@@ -315,16 -315,21 +315,21 @@@ IRichEditOle_fnGetClipboardData(IRichEd DWORD reco, LPDATAOBJECT *lplpdataobj) { IRichEditOleImpl *This = impl_from_IRichEditOle(me); - CHARRANGE tmpchrg; + ME_Cursor start; + int nChars; TRACE("(%p,%p,%d)\n",This, lpchrg, reco); if(!lplpdataobj) return E_INVALIDARG; if(!lpchrg) { - ME_GetSelection(This->editor, &tmpchrg.cpMin, &tmpchrg.cpMax); - lpchrg = &tmpchrg; + int nFrom, nTo, nStartCur = ME_GetSelectionOfs(This->editor, &nFrom, &nTo); + start = This->editor->pCursors[nStartCur]; + nChars = nTo - nFrom; + } else { + ME_CursorFromCharOfs(This->editor, lpchrg->cpMin, &start); + nChars = lpchrg->cpMax - lpchrg->cpMin; } - return ME_GetDataObject(This->editor, lpchrg, lplpdataobj); + return ME_GetDataObject(This->editor, &start, nChars, lplpdataobj); } static LONG WINAPI IRichEditOle_fnGetLinkCount(IRichEditOle *me) @@@ -383,11 -388,10 +388,10 @@@ IRichEditOle_fnInsertObject(IRichEditOl TRACE("(%p,%p)\n", This, reo); if (reo->cbStruct < sizeof(*reo)) return STG_E_INVALIDPARAMETER; - if (reo->poleobj) IOleObject_AddRef(reo->poleobj); - if (reo->pstg) IStorage_AddRef(reo->pstg); - if (reo->polesite) IOleClientSite_AddRef(reo->polesite); ME_InsertOLEFromCursor(This->editor, reo, 0); + ME_CommitUndo(This->editor); + ME_UpdateRepaint(This->editor); return S_OK; } @@@ -1725,6 -1729,11 +1729,11 @@@ void ME_GetOLEObjectSize(ME_Context *c if (run->ole_obj->sizel.cx != 0 || run->ole_obj->sizel.cy != 0) { convert_sizel(c, &run->ole_obj->sizel, pSize); + if (c->editor->nZoomNumerator != 0) + { + pSize->cx = MulDiv(pSize->cx, c->editor->nZoomNumerator, c->editor->nZoomDenominator); + pSize->cy = MulDiv(pSize->cy, c->editor->nZoomNumerator, c->editor->nZoomDenominator); + } return; } @@@ -1815,53 -1824,45 +1824,45 @@@ void ME_DrawOLE(ME_Context *c, int x, i GetObjectW(stgm.u.hBitmap, sizeof(dibsect), &dibsect); hMemDC = CreateCompatibleDC(c->hDC); SelectObject(hMemDC, stgm.u.hBitmap); - if (!has_size && c->editor->nZoomNumerator == 0) + if (has_size) { - sz.cx = dibsect.dsBm.bmWidth; - sz.cy = dibsect.dsBm.bmHeight; - BitBlt(c->hDC, x, y - dibsect.dsBm.bmHeight, - dibsect.dsBm.bmWidth, dibsect.dsBm.bmHeight, - hMemDC, 0, 0, SRCCOPY); + convert_sizel(c, &run->ole_obj->sizel, &sz); + } else { + sz.cx = MulDiv(dibsect.dsBm.bmWidth, c->dpi.cx, 96); + sz.cy = MulDiv(dibsect.dsBm.bmHeight, c->dpi.cy, 96); } - else + if (c->editor->nZoomNumerator != 0) { - if (has_size) - { - convert_sizel(c, &run->ole_obj->sizel, &sz); - } - else - { - sz.cx = MulDiv(dibsect.dsBm.bmWidth, - c->editor->nZoomNumerator, c->editor->nZoomDenominator); - sz.cy = MulDiv(dibsect.dsBm.bmHeight, - c->editor->nZoomNumerator, c->editor->nZoomDenominator); - } + sz.cx = MulDiv(sz.cx, c->editor->nZoomNumerator, c->editor->nZoomDenominator); + sz.cy = MulDiv(sz.cy, c->editor->nZoomNumerator, c->editor->nZoomDenominator); + } + if (sz.cx == dibsect.dsBm.bmWidth && sz.cy == dibsect.dsBm.bmHeight) + { + BitBlt(c->hDC, x, y - sz.cy, + dibsect.dsBm.bmWidth, dibsect.dsBm.bmHeight, + hMemDC, 0, 0, SRCCOPY); + } else { StretchBlt(c->hDC, x, y - sz.cy, sz.cx, sz.cy, - hMemDC, 0, 0, dibsect.dsBm.bmWidth, dibsect.dsBm.bmHeight, SRCCOPY); + hMemDC, 0, 0, dibsect.dsBm.bmWidth, + dibsect.dsBm.bmHeight, SRCCOPY); } if (!stgm.pUnkForRelease) DeleteObject(stgm.u.hBitmap); break; case TYMED_ENHMF: GetEnhMetaFileHeader(stgm.u.hEnhMetaFile, sizeof(emh), &emh); - if (!has_size && c->editor->nZoomNumerator == 0) + if (has_size) { - sz.cy = emh.rclBounds.bottom - emh.rclBounds.top; - sz.cx = emh.rclBounds.right - emh.rclBounds.left; + convert_sizel(c, &run->ole_obj->sizel, &sz); + } else { + sz.cy = MulDiv(emh.rclBounds.bottom - emh.rclBounds.top, c->dpi.cx, 96); + sz.cx = MulDiv(emh.rclBounds.right - emh.rclBounds.left, c->dpi.cy, 96); } - else + if (c->editor->nZoomNumerator != 0) { - if (has_size) - { - convert_sizel(c, &run->ole_obj->sizel, &sz); - } - else - { - sz.cy = MulDiv(emh.rclBounds.bottom - emh.rclBounds.top, - c->editor->nZoomNumerator, c->editor->nZoomDenominator); - sz.cx = MulDiv(emh.rclBounds.right - emh.rclBounds.left, - c->editor->nZoomNumerator, c->editor->nZoomDenominator); - } + sz.cx = MulDiv(sz.cx, c->editor->nZoomNumerator, c->editor->nZoomDenominator); + sz.cy = MulDiv(sz.cy, c->editor->nZoomNumerator, c->editor->nZoomDenominator); } + { RECT rc; diff --combined dll/win32/riched20/rtf.h index 3277301b3a2,d8ac32396a8..d8ac32396a8 --- a/dll/win32/riched20/rtf.h +++ b/dll/win32/riched20/rtf.h @@@ -1095,7 -1095,7 +1095,7 @@@ typedef void (*RTFFuncPtr) (RTF_Info *) /* RTF parser stack element */ struct tagRTFState { - CHARFORMAT2W fmt; + ME_Style *style; int codePage; int unicodeLength; }; diff --combined dll/win32/riched20/run.c index cf6c1fcb10f,cd282ec2d84..cd282ec2d84 --- a/dll/win32/riched20/run.c +++ b/dll/win32/riched20/run.c @@@ -347,27 -347,6 +347,6 @@@ ME_DisplayItem *ME_MakeRun(ME_Style *s return item; } - /****************************************************************************** - * ME_InsertRun - * - * Inserts a run at a given character position (offset). - */ - ME_DisplayItem *ME_InsertRun(ME_TextEditor *editor, int nCharOfs, ME_DisplayItem *pItem) - { - ME_Cursor tmp; - ME_DisplayItem *pDI; - - assert(pItem->type == diRun || pItem->type == diUndoInsertRun); - - ME_CursorFromCharOfs(editor, nCharOfs, &tmp); - pDI = ME_InsertRunAtCursor(editor, &tmp, pItem->member.run.style, - pItem->member.run.strText->szData, - pItem->member.run.strText->nLen, - pItem->member.run.nFlags); - - return pDI; - } - /****************************************************************************** * ME_InsertRunAtCursor * @@@ -571,9 -550,14 +550,14 @@@ int ME_CharFromPointCursor(ME_TextEdito static void ME_GetTextExtent(ME_Context *c, LPCWSTR szText, int nChars, ME_Style *s, SIZE *size) { HGDIOBJ hOldFont; - hOldFont = ME_SelectStyleFont(c, s); - GetTextExtentPoint32W(c->hDC, szText, nChars, size); - ME_UnselectStyleFont(c, s, hOldFont); + if (c->hDC) { + hOldFont = ME_SelectStyleFont(c, s); + GetTextExtentPoint32W(c->hDC, szText, nChars, size); + ME_UnselectStyleFont(c, s, hOldFont); + } else { + size->cx = 0; + size->cy = 0; + } } /****************************************************************************** @@@ -726,15 -710,13 +710,13 @@@ void ME_CalcRunExtent(ME_Context *c, co /****************************************************************************** * ME_SetSelectionCharFormat - * + * * Applies a style change, either to a current selection, or to insert cursor * (ie. the style next typed characters will use). - */ + */ void ME_SetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt) { - int nFrom, nTo; - ME_GetSelection(editor, &nFrom, &nTo); - if (nFrom == nTo) + if (!ME_IsSelection(editor)) { ME_Style *s; if (!editor->pBuffer->pCharStyle) @@@ -742,57 -724,85 +724,85 @@@ s = ME_ApplyStyle(editor->pBuffer->pCharStyle, pFmt); ME_ReleaseStyle(editor->pBuffer->pCharStyle); editor->pBuffer->pCharStyle = s; + } else { + ME_Cursor *from, *to; + ME_GetSelection(editor, &from, &to); + ME_SetCharFormat(editor, from, to, pFmt); } - else - ME_SetCharFormat(editor, nFrom, nTo-nFrom, pFmt); } /****************************************************************************** * ME_SetCharFormat - * + * * Applies a style change to the specified part of the text - */ - void ME_SetCharFormat(ME_TextEditor *editor, int nOfs, int nChars, CHARFORMAT2W *pFmt) + * + * The start and end cursors specify the part of the text. These cursors will + * be updated to stay valid, but this function may invalidate other + * non-selection cursors. The end cursor may be NULL to specify all the text + * following the start cursor. + * + * If no text is selected, then nothing is done. + */ + void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, CHARFORMAT2W *pFmt) { - ME_Cursor tmp, tmp2; ME_DisplayItem *para; + ME_DisplayItem *run; + ME_DisplayItem *end_run = NULL; - ME_CursorFromCharOfs(editor, nOfs, &tmp); - if (tmp.nOffset) - tmp.pRun = ME_SplitRunSimple(editor, tmp.pRun, tmp.nOffset); + if (end && start->pRun == end->pRun && start->nOffset == end->nOffset) + return; + + if (start->nOffset) + { + /* SplitRunSimple may or may not update the cursors, depending on whether they + * are selection cursors, but we need to make sure they are valid. */ + ME_DisplayItem *split_run = start->pRun; + int split_offset = start->nOffset; + start->pRun = ME_SplitRunSimple(editor, split_run, split_offset); + start->nOffset = 0; + if (end && end->pRun == split_run) + { + end->pRun = start->pRun; + end->nOffset -= split_offset; + } + } - ME_CursorFromCharOfs(editor, nOfs+nChars, &tmp2); - if (tmp2.nOffset) - tmp2.pRun = ME_SplitRunSimple(editor, tmp2.pRun, tmp2.nOffset); + if (end && end->nOffset) + { + end_run = end->pRun = ME_SplitRunSimple(editor, end->pRun, end->nOffset); + end->nOffset = 0; + } else if (end) { + end_run = end->pRun; + } - para = tmp.pPara; + run = start->pRun; + para = start->pPara; para->member.para.nFlags |= MEPF_REWRAP; - while(tmp.pRun != tmp2.pRun) + while(run != end_run) { ME_UndoItem *undo = NULL; - ME_Style *new_style = ME_ApplyStyle(tmp.pRun->member.run.style, pFmt); + ME_Style *new_style = ME_ApplyStyle(run->member.run.style, pFmt); /* ME_DumpStyle(new_style); */ undo = ME_AddUndoItem(editor, diUndoSetCharFormat, NULL); if (undo) { - undo->nStart = tmp.pRun->member.run.nCharOfs+para->member.para.nCharOfs; - undo->nLen = tmp.pRun->member.run.strText->nLen; - undo->di.member.ustyle = tmp.pRun->member.run.style; + undo->nStart = run->member.run.nCharOfs+para->member.para.nCharOfs; + undo->nLen = run->member.run.strText->nLen; + undo->di.member.ustyle = run->member.run.style; /* we'd have to addref undo...ustyle and release tmp...style but they'd cancel each other out so we can do nothing instead */ } else - ME_ReleaseStyle(tmp.pRun->member.run.style); - tmp.pRun->member.run.style = new_style; - tmp.pRun = ME_FindItemFwd(tmp.pRun, diRunOrParagraph); - if (tmp.pRun->type == diParagraph) + ME_ReleaseStyle(run->member.run.style); + run->member.run.style = new_style; + run = ME_FindItemFwd(run, diRunOrParagraph); + if (run && run->type == diParagraph) { - para = tmp.pRun; - tmp.pRun = ME_FindItemFwd(tmp.pRun, diRun); - if (tmp.pRun != tmp2.pRun) + para = run; + run = ME_FindItemFwd(run, diRun); + if (run != end_run) para->member.para.nFlags |= MEPF_REWRAP; } - assert(tmp.pRun); } } @@@ -842,20 -852,20 +852,20 @@@ void ME_GetDefaultCharFormat(ME_TextEdi /****************************************************************************** * ME_GetSelectionCharFormat - * + * * If selection exists, it returns all style elements that are set consistently - * in the whole selection. If not, it just returns the current style. - */ + * in the whole selection. If not, it just returns the current style. + */ void ME_GetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt) { - int nFrom, nTo; - ME_GetSelection(editor, &nFrom, &nTo); - if (nFrom == nTo && editor->pBuffer->pCharStyle) + ME_Cursor *from, *to; + if (!ME_IsSelection(editor) && editor->pBuffer->pCharStyle) { ME_CopyCharFormat(pFmt, &editor->pBuffer->pCharStyle->fmt); return; } - ME_GetCharFormat(editor, nFrom, nTo, pFmt); + ME_GetSelection(editor, &from, &to); + ME_GetCharFormat(editor, from, to, pFmt); } /****************************************************************************** @@@ -864,16 -874,17 +874,17 @@@ * Returns the style consisting of those attributes which are consistently set * in the whole character range. */ - void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nTo, CHARFORMAT2W *pFmt) + void ME_GetCharFormat(ME_TextEditor *editor, const ME_Cursor *from, + const ME_Cursor *to, CHARFORMAT2W *pFmt) { ME_DisplayItem *run, *run_end; - int nOffset, nOffset2; CHARFORMAT2W tmp; - ME_RunOfsFromCharOfs(editor, nFrom, NULL, &run, &nOffset); - if (nFrom == nTo) /* special case - if selection is empty, take previous char's formatting */ + run = from->pRun; + /* special case - if selection is empty, take previous char's formatting */ + if (from->pRun == to->pRun && from->nOffset == to->nOffset) { - if (!nOffset) + if (!from->nOffset) { ME_DisplayItem *tmp_run = ME_FindItemBack(run, diRunOrParagraph); if (tmp_run->type == diRun) { @@@ -884,10 -895,10 +895,10 @@@ ME_GetRunCharFormat(editor, run, pFmt); return; } - - if (nTo>nFrom) /* selection consists of chars from nFrom up to nTo-1 */ - nTo--; - ME_RunOfsFromCharOfs(editor, nTo, NULL, &run_end, &nOffset2); + + run_end = to->pRun; + if (!to->nOffset) + run_end = ME_FindItemBack(run_end, diRun); ME_GetRunCharFormat(editor, run, pFmt); diff --combined dll/win32/riched20/style.c index a3b532ebd43,bb2f808954a..bb2f808954a --- a/dll/win32/riched20/style.c +++ b/dll/win32/riched20/style.c @@@ -156,6 -156,7 +156,7 @@@ ME_Style *ME_MakeStyle(CHARFORMAT2W *st s->hFont = NULL; s->tm.tmAscent = -1; all_refs++; + TRACE_(richedit_style)("ME_MakeStyle %p, total refs=%d\n", s, all_refs); return s; } @@@ -449,6 -450,7 +450,7 @@@ void ME_AddRefStyle(ME_Style *s assert(s->nRefs>0); /* style with 0 references isn't supposed to exist */ s->nRefs++; all_refs++; + TRACE_(richedit_style)("ME_AddRefStyle %p, new refs=%d, total refs=%d\n", s, s->nRefs, all_refs); } void ME_ReleaseStyle(ME_Style *s) @@@ -465,16 -467,15 +467,15 @@@ ME_DestroyStyle(s); } - ME_Style *ME_GetInsertStyle(ME_TextEditor *editor, int nCursor) { + ME_Style *ME_GetInsertStyle(ME_TextEditor *editor, int nCursor) + { if (ME_IsSelection(editor)) { - ME_Cursor c; - int from, to; - + ME_Cursor *from, *to; + ME_GetSelection(editor, &from, &to); - ME_CursorFromCharOfs(editor, from, &c); - ME_AddRefStyle(c.pRun->member.run.style); - return c.pRun->member.run.style; + ME_AddRefStyle(from->pRun->member.run.style); + return from->pRun->member.run.style; } if (editor->pBuffer->pCharStyle) { ME_AddRefStyle(editor->pBuffer->pCharStyle); diff --combined dll/win32/riched20/table.c index 6c8ca76c4e7,cbfa2b3f771..cbfa2b3f771 --- a/dll/win32/riched20/table.c +++ b/dll/win32/riched20/table.c @@@ -70,6 -70,7 +70,7 @@@ static ME_DisplayItem* ME_InsertEndPara } tp = ME_SplitParagraph(editor, cursor->pRun, pStyle, eol_str, paraFlags); + ME_ReleaseStyle(pStyle); cursor->pPara = tp; cursor->pRun = ME_FindItemFwd(tp, diRun); return tp; @@@ -95,6 -96,7 +96,7 @@@ ME_DisplayItem* ME_InsertTableRowStartA editor->pCursors[0].nOffset = 0; editor->pCursors[1] = editor->pCursors[0]; startRowPara = ME_InsertTableRowStartFromCursor(editor); + savedCursor.pPara = ME_GetParagraph(savedCursor.pRun); editor->pCursors[0] = savedCursor; editor->pCursors[1] = editor->pCursors[0]; @@@ -121,8 -123,8 +123,8 @@@ ME_DisplayItem* ME_InsertTableCellFromCursor(ME_TextEditor *editor) { ME_DisplayItem *para; - WCHAR cr = '\r'; - ME_String *eol_str = ME_MakeStringN(&cr, 1); + WCHAR tab = '\t'; + ME_String *eol_str = ME_MakeStringN(&tab, 1); para = ME_InsertEndParaFromCursor(editor, 0, eol_str, MEPF_CELL); return para; } @@@ -273,13 -275,14 +275,14 @@@ BOOL ME_IsInTable(ME_DisplayItem *pItem } /* Table rows should either be deleted completely or not at all. */ - void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, int nOfs,int *nChars) + void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars) { - ME_Cursor c, c2; - ME_DisplayItem *this_para, *end_para; - ME_CursorFromCharOfs(editor, nOfs, &c); - this_para = c.pPara; - ME_CursorFromCharOfs(editor, nOfs + *nChars, &c2); + int nOfs = ME_GetCursorOfs(c); + ME_Cursor c2 = *c; + ME_DisplayItem *this_para = c->pPara; + ME_DisplayItem *end_para; + + ME_MoveCursorChars(editor, &c2, *nChars); end_para = c2.pPara; if (c2.pRun->member.run.nFlags & MERF_ENDPARA) { /* End offset might be in the middle of the end paragraph run. @@@ -355,27 -358,32 +358,32 @@@ this_para->member.para.pFmt->dwMask & PFM_TABLE && this_para->member.para.pFmt->wEffects & PFE_TABLE) { - pRun = c.pRun; + pRun = c->pRun; /* Find the next tab or end paragraph to use as a delete boundary */ while (!(pRun->member.run.nFlags & (MERF_TAB|MERF_ENDPARA))) pRun = ME_FindItemFwd(pRun, diRun); nCharsToBoundary = pRun->member.run.nCharOfs - - c.pRun->member.run.nCharOfs - - c.nOffset; + - c->pRun->member.run.nCharOfs + - c->nOffset; *nChars = min(*nChars, nCharsToBoundary); } else if (end_para->member.para.pFmt->dwMask & PFM_TABLE && end_para->member.para.pFmt->wEffects & PFE_TABLE) { /* The deletion starts from before the row, so don't join it with * previous non-empty paragraphs. */ + ME_DisplayItem *curPara; pRun = NULL; - if (nOfs > this_para->member.para.nCharOfs) + if (nOfs > this_para->member.para.nCharOfs) { pRun = ME_FindItemBack(end_para, diRun); - if (!pRun) + curPara = end_para->member.para.prev_para; + } + if (!pRun) { pRun = ME_FindItemFwd(end_para, diRun); + curPara = end_para; + } if (pRun) { - nCharsToBoundary = ME_GetParagraph(pRun)->member.para.nCharOfs + nCharsToBoundary = curPara->member.para.nCharOfs + pRun->member.run.nCharOfs - nOfs; if (nCharsToBoundary >= 0) @@@ -549,8 -557,8 +557,8 @@@ void ME_TabPressedInTable(ME_TextEdito ME_InvalidateSelection(editor); { int from, to; - from = ME_GetCursorOfs(editor, 0); - to = ME_GetCursorOfs(editor, 1); + from = ME_GetCursorOfs(&editor->pCursors[0]); + to = ME_GetCursorOfs(&editor->pCursors[1]); if (from <= to) { fromCursor = editor->pCursors[0]; diff --combined dll/win32/riched20/txthost.c index 8fabd8388d1,68f44372659..68f44372659 --- a/dll/win32/riched20/txthost.c +++ b/dll/win32/riched20/txthost.c @@@ -42,9 -42,9 +42,9 @@@ typedef struct ITextHostImpl BOOL bEmulateVersion10; } ITextHostImpl; - static ITextHostVtbl textHostVtbl; + static const ITextHostVtbl textHostVtbl; - ITextHost *ME_CreateTextHost(HWND hwnd, BOOL bEmulateVersion10) + ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10) { ITextHostImpl *texthost; texthost = CoTaskMemAlloc(sizeof(*texthost)); @@@ -59,7 -59,9 +59,9 @@@ editor = ME_MakeEditor((ITextHost*)texthost, bEmulateVersion10); editor->exStyleFlags = GetWindowLongW(hwnd, GWL_EXSTYLE); + editor->styleFlags |= GetWindowLongW(hwnd, GWL_STYLE) & ES_WANTRETURN; editor->hWnd = hwnd; /* FIXME: Remove editor's dependence on hWnd */ + editor->hwndParent = cs->hwndParent; SetWindowLongPtrW(hwnd, 0, (LONG_PTR)editor); } @@@ -448,9 -450,13 +450,13 @@@ HRESULT WINAPI ITextHostImpl_TxNotify(I void *pv) { ITextHostImpl *This = (ITextHostImpl *)iface; + ME_TextEditor *editor = (ME_TextEditor*)GetWindowLongPtrW(This->hWnd, 0); HWND hwnd = This->hWnd; - HWND parent = GetParent(hwnd); - UINT id = GetWindowLongW(hwnd, GWLP_ID); + UINT id; + + if (!editor || !editor->hwndParent) return S_OK; + + id = GetWindowLongW(hwnd, GWLP_ID); switch (iNotify) { @@@ -471,13 -477,13 +477,13 @@@ info->hwndFrom = hwnd; info->idFrom = id; info->code = iNotify; - SendMessageW(parent, WM_NOTIFY, id, (LPARAM)info); + SendMessageW(editor->hwndParent, WM_NOTIFY, id, (LPARAM)info); break; } case EN_UPDATE: /* Only sent when the window is visible. */ - if (!IsWindowVisible(This->hWnd)) + if (!IsWindowVisible(hwnd)) break; /* Fall through */ case EN_CHANGE: @@@ -487,7 -493,7 +493,7 @@@ case EN_MAXTEXT: case EN_SETFOCUS: case EN_VSCROLL: - SendMessageW(parent, WM_COMMAND, MAKEWPARAM(id, iNotify), (LPARAM)hwnd); + SendMessageW(editor->hwndParent, WM_COMMAND, MAKEWPARAM(id, iNotify), (LPARAM)hwnd); break; case EN_MSGFILTER: @@@ -528,159 -534,114 +534,114 @@@ HRESULT WINAPI ITextHostImpl_TxGetSelec #ifdef __i386__ /* thiscall functions are i386-specific */ #define THISCALL(func) __thiscall_ ## func - #define DEFINE_THISCALL_WRAPPER(func) \ + #define DEFINE_THISCALL_WRAPPER(func,args) \ extern typeof(func) THISCALL(func); \ - __ASM_GLOBAL_FUNC(__thiscall_ ## func, \ + __ASM_STDCALL_FUNC(__thiscall_ ## func, args, \ "popl %eax\n\t" \ "pushl %ecx\n\t" \ "pushl %eax\n\t" \ - "jmp " __ASM_NAME(#func) ) + "jmp " __ASM_NAME(#func) __ASM_STDCALL(args) ) #else /* __i386__ */ #define THISCALL(func) func - #define DEFINE_THISCALL_WRAPPER(func) /* nothing */ + #define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */ #endif /* __i386__ */ - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetDC); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxReleaseDC); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowScrollBar); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxEnableScrollBar); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollRange); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollPos); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxInvalidateRect); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxViewChange); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxCreateCaret); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowCaret); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCaretPos); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetTimer); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxKillTimer); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScrollWindowEx); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCapture); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetFocus); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCursor); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScreenToClient); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxClientToScreen); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxActivate); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxDeactivate); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetClientRect); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetViewInset); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetCharFormat); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetParaFormat); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSysColor); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetBackStyle); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetMaxLength); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetScrollBars); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPasswordChar); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetAcceleratorPos); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetExtent); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxCharFormatChange); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxParaFormatChange); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPropertyBits); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxNotify); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmGetContext); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmReleaseContext); - DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSelectionBarWidth); - - static ITextHostVtbl textHostVtbl = { - ITextHostImpl_QueryInterface, - ITextHostImpl_AddRef, - ITextHostImpl_Release, - THISCALL(ITextHostImpl_TxGetDC), - THISCALL(ITextHostImpl_TxReleaseDC), - THISCALL(ITextHostImpl_TxShowScrollBar), - THISCALL(ITextHostImpl_TxEnableScrollBar), - THISCALL(ITextHostImpl_TxSetScrollRange), - THISCALL(ITextHostImpl_TxSetScrollPos), - THISCALL(ITextHostImpl_TxInvalidateRect), - THISCALL(ITextHostImpl_TxViewChange), - THISCALL(ITextHostImpl_TxCreateCaret), - THISCALL(ITextHostImpl_TxShowCaret), - THISCALL(ITextHostImpl_TxSetCaretPos), - THISCALL(ITextHostImpl_TxSetTimer), - THISCALL(ITextHostImpl_TxKillTimer), - THISCALL(ITextHostImpl_TxScrollWindowEx), - THISCALL(ITextHostImpl_TxSetCapture), - THISCALL(ITextHostImpl_TxSetFocus), - THISCALL(ITextHostImpl_TxSetCursor), - THISCALL(ITextHostImpl_TxScreenToClient), - THISCALL(ITextHostImpl_TxClientToScreen), - THISCALL(ITextHostImpl_TxActivate), - THISCALL(ITextHostImpl_TxDeactivate), - THISCALL(ITextHostImpl_TxGetClientRect), - THISCALL(ITextHostImpl_TxGetViewInset), - THISCALL(ITextHostImpl_TxGetCharFormat), - THISCALL(ITextHostImpl_TxGetParaFormat), - THISCALL(ITextHostImpl_TxGetSysColor), - THISCALL(ITextHostImpl_TxGetBackStyle), - THISCALL(ITextHostImpl_TxGetMaxLength), - THISCALL(ITextHostImpl_TxGetScrollBars), - THISCALL(ITextHostImpl_TxGetPasswordChar), - THISCALL(ITextHostImpl_TxGetAcceleratorPos), - THISCALL(ITextHostImpl_TxGetExtent), - THISCALL(ITextHostImpl_OnTxCharFormatChange), - THISCALL(ITextHostImpl_OnTxParaFormatChange), - THISCALL(ITextHostImpl_TxGetPropertyBits), - THISCALL(ITextHostImpl_TxNotify), - THISCALL(ITextHostImpl_TxImmGetContext), - THISCALL(ITextHostImpl_TxImmReleaseContext), - THISCALL(ITextHostImpl_TxGetSelectionBarWidth), - }; + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetDC,4) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxReleaseDC,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowScrollBar,12) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxEnableScrollBar,12) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollRange,20) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollPos,16) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxInvalidateRect,12) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxViewChange,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxCreateCaret,16) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowCaret,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCaretPos,12) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetTimer,12) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxKillTimer,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScrollWindowEx,32) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCapture,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetFocus,4) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCursor,12) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScreenToClient,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxClientToScreen,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxActivate,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxDeactivate,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetClientRect,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetViewInset,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetCharFormat,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetParaFormat,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSysColor,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetBackStyle,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetMaxLength,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetScrollBars,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPasswordChar,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetAcceleratorPos,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetExtent,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxCharFormatChange,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxParaFormatChange,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPropertyBits,12) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxNotify,12) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmGetContext,4) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmReleaseContext,8) + DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSelectionBarWidth,8) #ifdef __i386__ /* thiscall functions are i386-specific */ #define STDCALL(func) __stdcall_ ## func - #define DEFINE_STDCALL_WRAPPER(num,func) \ + #define DEFINE_STDCALL_WRAPPER(num,func,args) \ extern typeof(func) __stdcall_ ## func; \ - __ASM_GLOBAL_FUNC(__stdcall_ ## func, \ + __ASM_STDCALL_FUNC(__stdcall_ ## func, args, \ "popl %eax\n\t" \ "popl %ecx\n\t" \ "pushl %eax\n\t" \ "movl (%ecx), %eax\n\t" \ "jmp *(4*(" #num "))(%eax)" ) - DEFINE_STDCALL_WRAPPER(3,ITextHostImpl_TxGetDC); - DEFINE_STDCALL_WRAPPER(4,ITextHostImpl_TxReleaseDC); - DEFINE_STDCALL_WRAPPER(5,ITextHostImpl_TxShowScrollBar); - DEFINE_STDCALL_WRAPPER(6,ITextHostImpl_TxEnableScrollBar); - DEFINE_STDCALL_WRAPPER(7,ITextHostImpl_TxSetScrollRange); - DEFINE_STDCALL_WRAPPER(8,ITextHostImpl_TxSetScrollPos); - DEFINE_STDCALL_WRAPPER(9,ITextHostImpl_TxInvalidateRect); - DEFINE_STDCALL_WRAPPER(10,ITextHostImpl_TxViewChange); - DEFINE_STDCALL_WRAPPER(11,ITextHostImpl_TxCreateCaret); - DEFINE_STDCALL_WRAPPER(12,ITextHostImpl_TxShowCaret); - DEFINE_STDCALL_WRAPPER(13,ITextHostImpl_TxSetCaretPos); - DEFINE_STDCALL_WRAPPER(14,ITextHostImpl_TxSetTimer); - DEFINE_STDCALL_WRAPPER(15,ITextHostImpl_TxKillTimer); - DEFINE_STDCALL_WRAPPER(16,ITextHostImpl_TxScrollWindowEx); - DEFINE_STDCALL_WRAPPER(17,ITextHostImpl_TxSetCapture); - DEFINE_STDCALL_WRAPPER(18,ITextHostImpl_TxSetFocus); - DEFINE_STDCALL_WRAPPER(19,ITextHostImpl_TxSetCursor); - DEFINE_STDCALL_WRAPPER(20,ITextHostImpl_TxScreenToClient); - DEFINE_STDCALL_WRAPPER(21,ITextHostImpl_TxClientToScreen); - DEFINE_STDCALL_WRAPPER(22,ITextHostImpl_TxActivate); - DEFINE_STDCALL_WRAPPER(23,ITextHostImpl_TxDeactivate); - DEFINE_STDCALL_WRAPPER(24,ITextHostImpl_TxGetClientRect); - DEFINE_STDCALL_WRAPPER(25,ITextHostImpl_TxGetViewInset); - DEFINE_STDCALL_WRAPPER(26,ITextHostImpl_TxGetCharFormat); - DEFINE_STDCALL_WRAPPER(27,ITextHostImpl_TxGetParaFormat); - DEFINE_STDCALL_WRAPPER(28,ITextHostImpl_TxGetSysColor); - DEFINE_STDCALL_WRAPPER(29,ITextHostImpl_TxGetBackStyle); - DEFINE_STDCALL_WRAPPER(30,ITextHostImpl_TxGetMaxLength); - DEFINE_STDCALL_WRAPPER(31,ITextHostImpl_TxGetScrollBars); - DEFINE_STDCALL_WRAPPER(32,ITextHostImpl_TxGetPasswordChar); - DEFINE_STDCALL_WRAPPER(33,ITextHostImpl_TxGetAcceleratorPos); - DEFINE_STDCALL_WRAPPER(34,ITextHostImpl_TxGetExtent); - DEFINE_STDCALL_WRAPPER(35,ITextHostImpl_OnTxCharFormatChange); - DEFINE_STDCALL_WRAPPER(36,ITextHostImpl_OnTxParaFormatChange); - DEFINE_STDCALL_WRAPPER(37,ITextHostImpl_TxGetPropertyBits); - DEFINE_STDCALL_WRAPPER(38,ITextHostImpl_TxNotify); - DEFINE_STDCALL_WRAPPER(39,ITextHostImpl_TxImmGetContext); - DEFINE_STDCALL_WRAPPER(40,ITextHostImpl_TxImmReleaseContext); - DEFINE_STDCALL_WRAPPER(41,ITextHostImpl_TxGetSelectionBarWidth); - - ITextHostVtbl itextHostStdcallVtbl = { + DEFINE_STDCALL_WRAPPER(3,ITextHostImpl_TxGetDC,4) + DEFINE_STDCALL_WRAPPER(4,ITextHostImpl_TxReleaseDC,8) + DEFINE_STDCALL_WRAPPER(5,ITextHostImpl_TxShowScrollBar,12) + DEFINE_STDCALL_WRAPPER(6,ITextHostImpl_TxEnableScrollBar,12) + DEFINE_STDCALL_WRAPPER(7,ITextHostImpl_TxSetScrollRange,20) + DEFINE_STDCALL_WRAPPER(8,ITextHostImpl_TxSetScrollPos,16) + DEFINE_STDCALL_WRAPPER(9,ITextHostImpl_TxInvalidateRect,12) + DEFINE_STDCALL_WRAPPER(10,ITextHostImpl_TxViewChange,8) + DEFINE_STDCALL_WRAPPER(11,ITextHostImpl_TxCreateCaret,16) + DEFINE_STDCALL_WRAPPER(12,ITextHostImpl_TxShowCaret,8) + DEFINE_STDCALL_WRAPPER(13,ITextHostImpl_TxSetCaretPos,12) + DEFINE_STDCALL_WRAPPER(14,ITextHostImpl_TxSetTimer,12) + DEFINE_STDCALL_WRAPPER(15,ITextHostImpl_TxKillTimer,8) + DEFINE_STDCALL_WRAPPER(16,ITextHostImpl_TxScrollWindowEx,32) + DEFINE_STDCALL_WRAPPER(17,ITextHostImpl_TxSetCapture,8) + DEFINE_STDCALL_WRAPPER(18,ITextHostImpl_TxSetFocus,4) + DEFINE_STDCALL_WRAPPER(19,ITextHostImpl_TxSetCursor,12) + DEFINE_STDCALL_WRAPPER(20,ITextHostImpl_TxScreenToClient,8) + DEFINE_STDCALL_WRAPPER(21,ITextHostImpl_TxClientToScreen,8) + DEFINE_STDCALL_WRAPPER(22,ITextHostImpl_TxActivate,8) + DEFINE_STDCALL_WRAPPER(23,ITextHostImpl_TxDeactivate,8) + DEFINE_STDCALL_WRAPPER(24,ITextHostImpl_TxGetClientRect,8) + DEFINE_STDCALL_WRAPPER(25,ITextHostImpl_TxGetViewInset,8) + DEFINE_STDCALL_WRAPPER(26,ITextHostImpl_TxGetCharFormat,8) + DEFINE_STDCALL_WRAPPER(27,ITextHostImpl_TxGetParaFormat,8) + DEFINE_STDCALL_WRAPPER(28,ITextHostImpl_TxGetSysColor,8) + DEFINE_STDCALL_WRAPPER(29,ITextHostImpl_TxGetBackStyle,8) + DEFINE_STDCALL_WRAPPER(30,ITextHostImpl_TxGetMaxLength,8) + DEFINE_STDCALL_WRAPPER(31,ITextHostImpl_TxGetScrollBars,8) + DEFINE_STDCALL_WRAPPER(32,ITextHostImpl_TxGetPasswordChar,8) + DEFINE_STDCALL_WRAPPER(33,ITextHostImpl_TxGetAcceleratorPos,8) + DEFINE_STDCALL_WRAPPER(34,ITextHostImpl_TxGetExtent,8) + DEFINE_STDCALL_WRAPPER(35,ITextHostImpl_OnTxCharFormatChange,8) + DEFINE_STDCALL_WRAPPER(36,ITextHostImpl_OnTxParaFormatChange,8) + DEFINE_STDCALL_WRAPPER(37,ITextHostImpl_TxGetPropertyBits,12) + DEFINE_STDCALL_WRAPPER(38,ITextHostImpl_TxNotify,12) + DEFINE_STDCALL_WRAPPER(39,ITextHostImpl_TxImmGetContext,4) + DEFINE_STDCALL_WRAPPER(40,ITextHostImpl_TxImmReleaseContext,8) + DEFINE_STDCALL_WRAPPER(41,ITextHostImpl_TxGetSelectionBarWidth,8) + + const ITextHostVtbl itextHostStdcallVtbl = { NULL, NULL, NULL, @@@ -726,3 -687,48 +687,48 @@@ }; #endif /* __i386__ */ + + static const ITextHostVtbl textHostVtbl = { + ITextHostImpl_QueryInterface, + ITextHostImpl_AddRef, + ITextHostImpl_Release, + THISCALL(ITextHostImpl_TxGetDC), + THISCALL(ITextHostImpl_TxReleaseDC), + THISCALL(ITextHostImpl_TxShowScrollBar), + THISCALL(ITextHostImpl_TxEnableScrollBar), + THISCALL(ITextHostImpl_TxSetScrollRange), + THISCALL(ITextHostImpl_TxSetScrollPos), + THISCALL(ITextHostImpl_TxInvalidateRect), + THISCALL(ITextHostImpl_TxViewChange), + THISCALL(ITextHostImpl_TxCreateCaret), + THISCALL(ITextHostImpl_TxShowCaret), + THISCALL(ITextHostImpl_TxSetCaretPos), + THISCALL(ITextHostImpl_TxSetTimer), + THISCALL(ITextHostImpl_TxKillTimer), + THISCALL(ITextHostImpl_TxScrollWindowEx), + THISCALL(ITextHostImpl_TxSetCapture), + THISCALL(ITextHostImpl_TxSetFocus), + THISCALL(ITextHostImpl_TxSetCursor), + THISCALL(ITextHostImpl_TxScreenToClient), + THISCALL(ITextHostImpl_TxClientToScreen), + THISCALL(ITextHostImpl_TxActivate), + THISCALL(ITextHostImpl_TxDeactivate), + THISCALL(ITextHostImpl_TxGetClientRect), + THISCALL(ITextHostImpl_TxGetViewInset), + THISCALL(ITextHostImpl_TxGetCharFormat), + THISCALL(ITextHostImpl_TxGetParaFormat), + THISCALL(ITextHostImpl_TxGetSysColor), + THISCALL(ITextHostImpl_TxGetBackStyle), + THISCALL(ITextHostImpl_TxGetMaxLength), + THISCALL(ITextHostImpl_TxGetScrollBars), + THISCALL(ITextHostImpl_TxGetPasswordChar), + THISCALL(ITextHostImpl_TxGetAcceleratorPos), + THISCALL(ITextHostImpl_TxGetExtent), + THISCALL(ITextHostImpl_OnTxCharFormatChange), + THISCALL(ITextHostImpl_OnTxParaFormatChange), + THISCALL(ITextHostImpl_TxGetPropertyBits), + THISCALL(ITextHostImpl_TxNotify), + THISCALL(ITextHostImpl_TxImmGetContext), + THISCALL(ITextHostImpl_TxImmReleaseContext), + THISCALL(ITextHostImpl_TxGetSelectionBarWidth), + }; diff --combined dll/win32/riched20/txtsrv.c index a6d81703528,7ab2af45162..7ab2af45162 --- a/dll/win32/riched20/txtsrv.c +++ b/dll/win32/riched20/txtsrv.c @@@ -37,17 -37,17 +37,17 @@@ #ifdef __i386__ /* thiscall functions are i386-specific */ #define THISCALL(func) __thiscall_ ## func - #define DEFINE_THISCALL_WRAPPER(func) \ + #define DEFINE_THISCALL_WRAPPER(func,args) \ extern typeof(func) THISCALL(func); \ - __ASM_GLOBAL_FUNC(__thiscall_ ## func, \ + __ASM_STDCALL_FUNC(__thiscall_ ## func, args, \ "popl %eax\n\t" \ "pushl %ecx\n\t" \ "pushl %eax\n\t" \ - "jmp " __ASM_NAME(#func) ) + "jmp " __ASM_NAME(#func) __ASM_STDCALL(args) ) #else /* __i386__ */ #define THISCALL(func) func - #define DEFINE_THISCALL_WRAPPER(func) /* nothing */ + #define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */ #endif /* __i386__ */ @@@ -87,6 -87,8 +87,8 @@@ HRESULT WINAPI CreateTextServices(IUnkn ITextImpl->pMyHost = pITextHost; ITextImpl->lpVtbl = &textservices_Vtbl; ITextImpl->editor = ME_MakeEditor(pITextHost, FALSE); + ITextImpl->editor->exStyleFlags = 0; + ITextImpl->editor->rcFormat = (RECT){0,0,0,0}; ME_HandleMessage(ITextImpl->editor, WM_CREATE, 0, 0, TRUE, &hres); if (pUnkOuter) @@@ -292,12 -294,14 +294,14 @@@ HRESULT WINAPI fnTextSrv_TxGetText(ITex length = ME_GetTextLength(This->editor); if (length) { + ME_Cursor start; BSTR bstr; bstr = SysAllocStringByteLen(NULL, length * sizeof(WCHAR)); if (bstr == NULL) return E_OUTOFMEMORY; - ME_GetTextW(This->editor, bstr , 0, length, FALSE); + ME_CursorFromCharOfs(This->editor, 0, &start); + ME_GetTextW(This->editor, bstr, length, &start, INT_MAX, FALSE); *pbstrText = bstr; } else { *pbstrText = NULL; @@@ -310,9 -314,11 +314,11 @@@ HRESULT WINAPI fnTextSrv_TxSetText(ITex LPCWSTR pszText) { ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ME_Cursor cursor; - ME_InternalDeleteText(This->editor, 0, ME_GetTextLength(This->editor), - FALSE); + ME_SetCursorToStart(This->editor, &cursor); + ME_InternalDeleteText(This->editor, &cursor, + ME_GetTextLength(This->editor), FALSE); ME_InsertTextFromCursor(This->editor, 0, pszText, -1, This->editor->pBuffer->pDefaultStyle); ME_SetSelection(This->editor, 0, 0); @@@ -387,24 -393,24 +393,24 @@@ HRESULT WINAPI fnTextSrv_TxGetCachedSiz return E_NOTIMPL; } - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSendMessage) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxDraw) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetHScroll) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetVScroll) - DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxSetCursor) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxQueryHitPoint) - DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceActivate) - DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceDeactivate) - DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIActivate) - DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIDeactivate) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetText) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSetText) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCurrentTargetX) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetBaseLinePos) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetNaturalSize) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetDropTarget) - DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxPropertyBitsChange) - DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCachedSize) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSendMessage,20) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxDraw,52) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetHScroll,24) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetVScroll,24) + DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxSetCursor,40) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxQueryHitPoint,44) + DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceActivate,8) + DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceDeactivate,4) + DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIActivate,4) + DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIDeactivate,4) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetText,8) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSetText,8) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCurrentTargetX,8) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetBaseLinePos,8) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetNaturalSize,36) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetDropTarget,8) + DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxPropertyBitsChange,12) + DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCachedSize,12) static const ITextServicesVtbl textservices_Vtbl = { diff --combined dll/win32/riched20/undo.c index c2f7125b621,8db971186ca..8db971186ca --- a/dll/win32/riched20/undo.c +++ b/dll/win32/riched20/undo.c @@@ -298,17 -298,28 +298,28 @@@ static void ME_PlayUndoItem(ME_TextEdit } case diUndoSetCharFormat: { - ME_SetCharFormat(editor, pUItem->nStart, pUItem->nLen, &pItem->member.ustyle->fmt); + ME_Cursor start, end; + ME_CursorFromCharOfs(editor, pUItem->nStart, &start); + end = start; + ME_MoveCursorChars(editor, &end, pUItem->nLen); + ME_SetCharFormat(editor, &start, &end, &pItem->member.ustyle->fmt); break; } case diUndoInsertRun: { - ME_InsertRun(editor, pItem->member.run.nCharOfs, pItem); + ME_Cursor tmp; + ME_CursorFromCharOfs(editor, pItem->member.run.nCharOfs, &tmp); + ME_InsertRunAtCursor(editor, &tmp, pItem->member.run.style, + pItem->member.run.strText->szData, + pItem->member.run.strText->nLen, + pItem->member.run.nFlags); break; } case diUndoDeleteRun: { - ME_InternalDeleteText(editor, pUItem->nStart, pUItem->nLen, TRUE); + ME_Cursor tmp; + ME_CursorFromCharOfs(editor, pUItem->nStart, &tmp); + ME_InternalDeleteText(editor, &tmp, pUItem->nLen, TRUE); break; } case diUndoJoinParagraphs: diff --combined dll/win32/riched20/wrap.c index 579f33ae19f,3b154904f58..3b154904f58 --- a/dll/win32/riched20/wrap.c +++ b/dll/win32/riched20/wrap.c @@@ -456,6 -456,29 +456,29 @@@ static ME_DisplayItem *ME_WrapHandleRun return p->next; } + static int ME_GetParaLineSpace(ME_Context* c, ME_Paragraph* para) + { + int sp = 0, ls = 0; + if (!(para->pFmt->dwMask & PFM_LINESPACING)) return 0; + + /* FIXME: how to compute simply the line space in ls ??? */ + /* FIXME: does line spacing include the line itself ??? */ + switch (para->pFmt->bLineSpacingRule) + { + case 0: sp = ls; break; + case 1: sp = (3 * ls) / 2; break; + case 2: sp = 2 * ls; break; + case 3: sp = ME_twips2pointsY(c, para->pFmt->dyLineSpacing); if (sp < ls) sp = ls; break; + case 4: sp = ME_twips2pointsY(c, para->pFmt->dyLineSpacing); break; + case 5: sp = para->pFmt->dyLineSpacing / 20; break; + default: FIXME("Unsupported spacing rule value %d\n", para->pFmt->bLineSpacingRule); + } + if (c->editor->nZoomNumerator == 0) + return sp; + else + return sp * c->editor->nZoomNumerator / c->editor->nZoomDenominator; + } + static void ME_PrepareParagraphForWrapping(ME_Context *c, ME_DisplayItem *tp); static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp) { @@@ -499,7 -522,7 +522,7 @@@ if (!(pFmt->dwMask & PFM_TABLE && pFmt->wEffects & PFE_TABLE) && pFmt->dwMask & PFM_BORDER) { - border = ME_GetParaBorderWidth(c->editor, tp->member.para.pFmt->wBorders); + border = ME_GetParaBorderWidth(c, tp->member.para.pFmt->wBorders); if (pFmt->wBorders & 1) { wc.nFirstMargin += border; wc.nLeftMargin += border; @@@ -580,7 -603,6 +603,6 @@@ BOOL ME_WrapMarkedParagraphs(ME_TextEdi ME_DisplayItem *item; ME_Context c; BOOL bModified = FALSE; - int yStart = -1; int totalWidth = 0; ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost)); @@@ -598,11 -620,7 +620,7 @@@ ME_WrapTextParagraph(&c, item); if (bRedraw) - { item->member.para.nFlags |= MEPF_REPAINT; - if (yStart == -1) - yStart = c.pt.y; - } bModified = bModified | bRedraw; @@@ -776,6 -794,8 +794,8 @@@ ME_SendRequestResize(ME_TextEditor *edi { REQRESIZE info; + info.nmhdr.hwndFrom = NULL; + info.nmhdr.idFrom = 0; info.nmhdr.code = EN_REQUESTRESIZE; info.rc = rc; info.rc.right = editor->nTotalWidth; diff --combined dll/win32/riched20/writer.c index 6cadbd44425,107fadfc70f..107fadfc70f --- a/dll/win32/riched20/writer.c +++ b/dll/win32/riched20/writer.c @@@ -762,23 -762,23 +762,23 @@@ ME_StreamOutRTFText(ME_OutStream *pStre } - static BOOL - ME_StreamOutRTF(ME_TextEditor *editor, ME_OutStream *pStream, int nStart, int nChars, int dwFormat) + static BOOL ME_StreamOutRTF(ME_TextEditor *editor, ME_OutStream *pStream, + const ME_Cursor *start, int nChars, int dwFormat) { - ME_DisplayItem *p, *pEnd, *pPara; - int nOffset, nEndLen; + ME_Cursor cursor = *start; + ME_DisplayItem *prev_para = cursor.pPara; + ME_Cursor endCur = cursor; - ME_RunOfsFromCharOfs(editor, nStart, &pPara, &p, &nOffset); - ME_RunOfsFromCharOfs(editor, nStart+nChars, NULL, &pEnd, &nEndLen); + ME_MoveCursorChars(editor, &endCur, nChars); if (!ME_StreamOutRTFHeader(pStream, dwFormat)) return FALSE; - if (!ME_StreamOutRTFFontAndColorTbl(pStream, p, pEnd)) + if (!ME_StreamOutRTFFontAndColorTbl(pStream, cursor.pRun, endCur.pRun)) return FALSE; - + /* TODO: stylesheet table */ - + /* FIXME: maybe emit something smarter for the generator? */ if (!ME_StreamOutPrint(pStream, "{\\*\\generator Wine Riched20 2.0.????;}")) return FALSE; @@@ -791,138 -791,129 +791,129 @@@ /* TODO: section formatting properties */ - if (!ME_StreamOutRTFParaProps(editor, pStream, ME_GetParagraph(p))) + if (!ME_StreamOutRTFParaProps(editor, pStream, cursor.pPara)) return FALSE; - while(1) - { - switch(p->type) + do { + if (cursor.pPara != prev_para) { - case diParagraph: - if (!editor->bEmulateVersion10) { /* v4.1 */ - if (p->member.para.nFlags & MEPF_ROWSTART) { - pStream->nNestingLevel++; - if (pStream->nNestingLevel == 1) { - if (!ME_StreamOutRTFTableProps(editor, pStream, p)) - return FALSE; - } - } else if (p->member.para.nFlags & MEPF_ROWEND) { - pStream->nNestingLevel--; - if (pStream->nNestingLevel >= 1) { - if (!ME_StreamOutPrint(pStream, "{\\*\\nesttableprops")) - return FALSE; - if (!ME_StreamOutRTFTableProps(editor, pStream, p)) - return FALSE; - if (!ME_StreamOutPrint(pStream, "\\nestrow}{\\nonesttables\\par}\r\n")) - return FALSE; - } else { - if (!ME_StreamOutPrint(pStream, "\\row \r\n")) - return FALSE; - } - } else if (!ME_StreamOutRTFParaProps(editor, pStream, p)) { - return FALSE; - } - } else { /* v1.0 - 3.0 */ - if (p->member.para.pFmt->dwMask & PFM_TABLE && - p->member.para.pFmt->wEffects & PFE_TABLE) - { - if (!ME_StreamOutRTFTableProps(editor, pStream, p)) + prev_para = cursor.pPara; + if (!editor->bEmulateVersion10) { /* v4.1 */ + if (cursor.pPara->member.para.nFlags & MEPF_ROWSTART) { + pStream->nNestingLevel++; + if (pStream->nNestingLevel == 1) { + if (!ME_StreamOutRTFTableProps(editor, pStream, cursor.pPara)) return FALSE; } - if (!ME_StreamOutRTFParaProps(editor, pStream, p)) - return FALSE; - } - pPara = p; - break; - case diRun: - if (p == pEnd && !nEndLen) - break; - TRACE("flags %xh\n", p->member.run.nFlags); - /* TODO: emit embedded objects */ - if (pPara->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND)) - break; - if (p->member.run.nFlags & MERF_GRAPHICS) { - FIXME("embedded objects are not handled\n"); - } else if (p->member.run.nFlags & MERF_TAB) { - if (editor->bEmulateVersion10 && /* v1.0 - 3.0 */ - pPara->member.para.pFmt->dwMask & PFM_TABLE && - pPara->member.para.pFmt->wEffects & PFE_TABLE) - { - if (!ME_StreamOutPrint(pStream, "\\cell ")) + } else if (cursor.pPara->member.para.nFlags & MEPF_ROWEND) { + pStream->nNestingLevel--; + if (pStream->nNestingLevel >= 1) { + if (!ME_StreamOutPrint(pStream, "{\\*\\nesttableprops")) return FALSE; - } else { - if (!ME_StreamOutPrint(pStream, "\\tab ")) + if (!ME_StreamOutRTFTableProps(editor, pStream, cursor.pPara)) return FALSE; - } - } else if (p->member.run.nFlags & MERF_ENDCELL) { - if (pStream->nNestingLevel > 1) { - if (!ME_StreamOutPrint(pStream, "\\nestcell ")) + if (!ME_StreamOutPrint(pStream, "\\nestrow}{\\nonesttables\\par}\r\n")) return FALSE; } else { - if (!ME_StreamOutPrint(pStream, "\\cell ")) - return FALSE; - } - nChars--; - } else if (p->member.run.nFlags & MERF_ENDPARA) { - if (pPara->member.para.pFmt->dwMask & PFM_TABLE && - pPara->member.para.pFmt->wEffects & PFE_TABLE && - !(pPara->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND|MEPF_CELL))) - { if (!ME_StreamOutPrint(pStream, "\\row \r\n")) return FALSE; - } else { - if (!ME_StreamOutPrint(pStream, "\r\n\\par")) - return FALSE; } - /* Skip as many characters as required by current line break */ - nChars = max(0, nChars - p->member.run.strText->nLen); - } else if (p->member.run.nFlags & MERF_ENDROW) { - if (!ME_StreamOutPrint(pStream, "\\line \r\n")) - return FALSE; - nChars--; - } else { - int nEnd; - - if (!ME_StreamOutPrint(pStream, "{")) - return FALSE; - TRACE("style %p\n", p->member.run.style); - if (!ME_StreamOutRTFCharProps(pStream, &p->member.run.style->fmt)) - return FALSE; - - nEnd = (p == pEnd) ? nEndLen : p->member.run.strText->nLen; - if (!ME_StreamOutRTFText(pStream, p->member.run.strText->szData + nOffset, nEnd - nOffset)) - return FALSE; - nOffset = 0; - if (!ME_StreamOutPrint(pStream, "}")) + } else if (!ME_StreamOutRTFParaProps(editor, pStream, cursor.pPara)) { + return FALSE; + } + } else { /* v1.0 - 3.0 */ + if (cursor.pPara->member.para.pFmt->dwMask & PFM_TABLE && + cursor.pPara->member.para.pFmt->wEffects & PFE_TABLE) + { + if (!ME_StreamOutRTFTableProps(editor, pStream, cursor.pPara)) return FALSE; } - break; - default: /* we missed the last item */ - assert(0); + if (!ME_StreamOutRTFParaProps(editor, pStream, cursor.pPara)) + return FALSE; + } } - if (p == pEnd) + + if (cursor.pRun == endCur.pRun && !endCur.nOffset) break; - p = ME_FindItemFwd(p, diRunOrParagraphOrEnd); - } + TRACE("flags %xh\n", cursor.pRun->member.run.nFlags); + /* TODO: emit embedded objects */ + if (cursor.pPara->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND)) + break; + if (cursor.pRun->member.run.nFlags & MERF_GRAPHICS) { + FIXME("embedded objects are not handled\n"); + } else if (cursor.pRun->member.run.nFlags & MERF_TAB) { + if (editor->bEmulateVersion10 && /* v1.0 - 3.0 */ + cursor.pPara->member.para.pFmt->dwMask & PFM_TABLE && + cursor.pPara->member.para.pFmt->wEffects & PFE_TABLE) + { + if (!ME_StreamOutPrint(pStream, "\\cell ")) + return FALSE; + } else { + if (!ME_StreamOutPrint(pStream, "\\tab ")) + return FALSE; + } + } else if (cursor.pRun->member.run.nFlags & MERF_ENDCELL) { + if (pStream->nNestingLevel > 1) { + if (!ME_StreamOutPrint(pStream, "\\nestcell ")) + return FALSE; + } else { + if (!ME_StreamOutPrint(pStream, "\\cell ")) + return FALSE; + } + nChars--; + } else if (cursor.pRun->member.run.nFlags & MERF_ENDPARA) { + if (cursor.pPara->member.para.pFmt->dwMask & PFM_TABLE && + cursor.pPara->member.para.pFmt->wEffects & PFE_TABLE && + !(cursor.pPara->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND|MEPF_CELL))) + { + if (!ME_StreamOutPrint(pStream, "\\row \r\n")) + return FALSE; + } else { + if (!ME_StreamOutPrint(pStream, "\r\n\\par")) + return FALSE; + } + /* Skip as many characters as required by current line break */ + nChars = max(0, nChars - cursor.pRun->member.run.strText->nLen); + } else if (cursor.pRun->member.run.nFlags & MERF_ENDROW) { + if (!ME_StreamOutPrint(pStream, "\\line \r\n")) + return FALSE; + nChars--; + } else { + int nEnd; + + if (!ME_StreamOutPrint(pStream, "{")) + return FALSE; + TRACE("style %p\n", cursor.pRun->member.run.style); + if (!ME_StreamOutRTFCharProps(pStream, &cursor.pRun->member.run.style->fmt)) + return FALSE; + + nEnd = (cursor.pRun == endCur.pRun) ? endCur.nOffset : cursor.pRun->member.run.strText->nLen; + if (!ME_StreamOutRTFText(pStream, cursor.pRun->member.run.strText->szData + cursor.nOffset, + nEnd - cursor.nOffset)) + return FALSE; + cursor.nOffset = 0; + if (!ME_StreamOutPrint(pStream, "}")) + return FALSE; + } + } while (cursor.pRun != endCur.pRun && ME_NextRun(&cursor.pPara, &cursor.pRun)); + if (!ME_StreamOutMove(pStream, "}\0", 2)) return FALSE; return TRUE; } - static BOOL - ME_StreamOutText(ME_TextEditor *editor, ME_OutStream *pStream, int nStart, int nChars, DWORD dwFormat) + static BOOL ME_StreamOutText(ME_TextEditor *editor, ME_OutStream *pStream, + const ME_Cursor *start, int nChars, DWORD dwFormat) { - ME_DisplayItem *item; + ME_Cursor cursor = *start; int nLen; UINT nCodePage = CP_ACP; char *buffer = NULL; int nBufLen = 0; BOOL success = TRUE; - ME_RunOfsFromCharOfs(editor, nStart, NULL, &item, &nStart); - - if (!item) + if (!cursor.pRun) return FALSE; if (dwFormat & SF_USECODEPAGE) @@@ -930,10 -921,10 +921,10 @@@ /* TODO: Handle SF_TEXTIZED */ - while (success && nChars && item) { - nLen = min(nChars, item->member.run.strText->nLen - nStart); + while (success && nChars && cursor.pRun) { + nLen = min(nChars, cursor.pRun->member.run.strText->nLen - cursor.nOffset); - if (!editor->bEmulateVersion10 && item->member.run.nFlags & MERF_ENDPARA) + if (!editor->bEmulateVersion10 && cursor.pRun->member.run.nFlags & MERF_ENDPARA) { static const WCHAR szEOL[2] = { '\r', '\n' }; @@@ -944,27 -935,27 +935,27 @@@ success = ME_StreamOutMove(pStream, "\r\n", 2); } else { if (dwFormat & SF_UNICODE) - success = ME_StreamOutMove(pStream, (const char *)(item->member.run.strText->szData + nStart), + success = ME_StreamOutMove(pStream, (const char *)(cursor.pRun->member.run.strText->szData + cursor.nOffset), sizeof(WCHAR) * nLen); else { int nSize; - nSize = WideCharToMultiByte(nCodePage, 0, item->member.run.strText->szData + nStart, + nSize = WideCharToMultiByte(nCodePage, 0, cursor.pRun->member.run.strText->szData + cursor.nOffset, nLen, NULL, 0, NULL, NULL); if (nSize > nBufLen) { FREE_OBJ(buffer); buffer = ALLOC_N_OBJ(char, nSize); nBufLen = nSize; } - WideCharToMultiByte(nCodePage, 0, item->member.run.strText->szData + nStart, + WideCharToMultiByte(nCodePage, 0, cursor.pRun->member.run.strText->szData + cursor.nOffset, nLen, buffer, nSize, NULL, NULL); success = ME_StreamOutMove(pStream, buffer, nSize); } } nChars -= nLen; - nStart = 0; - item = ME_FindItemFwd(item, diRun); + cursor.nOffset = 0; + cursor.pRun = ME_FindItemFwd(cursor.pRun, diRun); } FREE_OBJ(buffer); @@@ -972,24 -963,16 +963,16 @@@ } - LRESULT - ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, int nStart, int nTo, EDITSTREAM *stream) + LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, + const ME_Cursor *start, + int nChars, EDITSTREAM *stream) { ME_OutStream *pStream = ME_StreamOutInit(editor, stream); - if (nTo == -1) - { - nTo = ME_GetTextLength(editor); - /* Generate an end-of-paragraph at the end of SCF_ALL RTF output */ - if (dwFormat & SF_RTF) - nTo++; - } - TRACE("from %d to %d\n", nStart, nTo); - if (dwFormat & SF_RTF) - ME_StreamOutRTF(editor, pStream, nStart, nTo - nStart, dwFormat); + ME_StreamOutRTF(editor, pStream, start, nChars, dwFormat); else if (dwFormat & SF_TEXT || dwFormat & SF_TEXTIZED) - ME_StreamOutText(editor, pStream, nStart, nTo - nStart, dwFormat); + ME_StreamOutText(editor, pStream, start, nChars, dwFormat); if (!pStream->stream->dwError) ME_StreamOutFlush(pStream); return ME_StreamOutFree(pStream); @@@ -998,13 -981,19 +981,19 @@@ LRESULT ME_StreamOut(ME_TextEditor *editor, DWORD dwFormat, EDITSTREAM *stream) { - int nStart, nTo; + ME_Cursor start; + int nChars; - if (dwFormat & SFF_SELECTION) - ME_GetSelection(editor, &nStart, &nTo); - else { - nStart = 0; - nTo = -1; + if (dwFormat & SFF_SELECTION) { + int nStart, nTo; + start = editor->pCursors[ME_GetSelectionOfs(editor, &nStart, &nTo)]; + nChars = nTo - nStart; + } else { + ME_SetCursorToStart(editor, &start); + nChars = ME_GetTextLength(editor); + /* Generate an end-of-paragraph at the end of SCF_ALL RTF output */ + if (dwFormat & SF_RTF) + nChars++; } - return ME_StreamOutRange(editor, dwFormat, nStart, nTo, stream); + return ME_StreamOutRange(editor, dwFormat, &start, nChars, stream); } diff --combined dll/win32/rpcrt4/cproxy.c index 6c26d181978,9ce555f7146..9ce555f7146 --- a/dll/win32/rpcrt4/cproxy.c +++ b/dll/win32/rpcrt4/cproxy.c @@@ -2,6 -2,7 +2,7 @@@ * COM proxy implementation * * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies + * Copyright 2009 Alexandre Julliard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@@ -20,6 -21,9 +21,9 @@@ * TODO: Handle non-i386 architectures */ + #include "config.h" + #include "wine/port.h" + #include #define COBJMACROS @@@ -37,21 -41,19 +41,19 @@@ WINE_DEFAULT_DEBUG_CHANNEL(ole); - struct StublessThunk; - /* I don't know what MS's std proxy structure looks like, so this probably doesn't match, but that shouldn't matter */ typedef struct { const IRpcProxyBufferVtbl *lpVtbl; LPVOID *PVtbl; LONG RefCount; - const MIDL_STUBLESS_PROXY_INFO *stubless; const IID* piid; LPUNKNOWN pUnkOuter; + IUnknown *base_object; /* must be at offset 0x10 from PVtbl */ + IRpcProxyBuffer *base_proxy; PCInterfaceName name; LPPSFACTORYBUFFER pPSFactory; LPRPCCHANNELBUFFER pChannel; - struct StublessThunk *thunks; } StdProxyImpl; static const IRpcProxyBufferVtbl StdProxy_Vtbl; @@@ -62,66 -64,111 +64,111 @@@ #include "pshpack1.h" - struct StublessThunk { + struct thunk { BYTE push; DWORD index; - BYTE call; + BYTE jmp; LONG handler; - BYTE ret; - WORD bytes; - BYTE pad[3]; }; #include "poppack.h" - /* adjust the stack size since we don't use Windows's method */ - #define STACK_ADJUST sizeof(DWORD) - - #define FILL_STUBLESS(x,idx,stk) \ - x->push = 0x68; /* pushl [immediate] */ \ - x->index = (idx); \ - x->call = 0xe8; /* call [near] */ \ - x->handler = (char*)ObjectStubless - (char*)&x->ret; \ - x->ret = 0xc2; /* ret [immediate] */ \ - x->bytes = stk; \ - x->pad[0] = 0x8d; /* leal (%esi),%esi */ \ - x->pad[1] = 0x76; \ - x->pad[2] = 0x00; - - static HRESULT WINAPI ObjectStubless(DWORD index) + extern void call_stubless_func(void); + __ASM_GLOBAL_FUNC(call_stubless_func, + "pushl %esp\n\t" /* pointer to index */ + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") + "call " __ASM_NAME("ObjectStubless") __ASM_STDCALL(4) "\n\t" + "popl %edx\n\t" /* args size */ + __ASM_CFI(".cfi_adjust_cfa_offset -4\n\t") + "movl (%esp),%ecx\n\t" /* return address */ + "addl %edx,%esp\n\t" + "jmp *%ecx" ); + + HRESULT WINAPI ObjectStubless(DWORD *args) { - char *args = (char*)(&index + 2); - LPVOID iface = *(LPVOID*)args; + DWORD index = args[0]; + void **iface = (void **)args[2]; + const void **vtbl = (const void **)*iface; + const MIDL_STUBLESS_PROXY_INFO *stubless = *(const MIDL_STUBLESS_PROXY_INFO **)(vtbl - 2); + const PFORMAT_STRING fs = stubless->ProcFormatString + stubless->FormatStringOffset[index]; - ICOM_THIS_MULTI(StdProxyImpl,PVtbl,iface); + /* store bytes to remove from stack */ + args[0] = *(const WORD*)(fs + 8); + TRACE("(%p)->(%d)([%d bytes]) ret=%08x\n", iface, index, args[0], args[1]); + + return NdrClientCall2(stubless->pStubDesc, fs, args + 2); + } + + #define BLOCK_SIZE 1024 + #define MAX_BLOCKS 64 /* 64k methods should be enough for anybody */ - PFORMAT_STRING fs = This->stubless->ProcFormatString + This->stubless->FormatStringOffset[index]; - unsigned bytes = *(const WORD*)(fs+8) - STACK_ADJUST; - TRACE("(%p)->(%d)([%d bytes]) ret=%08x\n", iface, index, bytes, *(DWORD*)(args+bytes)); + static const struct thunk *method_blocks[MAX_BLOCKS]; - return NdrClientCall2(This->stubless->pStubDesc, fs, args); + static const struct thunk *allocate_block( unsigned int num ) + { + unsigned int i; + struct thunk *prev, *block; + + block = VirtualAlloc( NULL, BLOCK_SIZE * sizeof(*block), + MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE ); + if (!block) return NULL; + + for (i = 0; i < BLOCK_SIZE; i++) + { + block[i].push = 0x68; /* pushl */ + block[i].index = BLOCK_SIZE * num + i + 3; + block[i].jmp = 0xe9; /* jmp */ + block[i].handler = (char *)call_stubless_func - (char *)(&block[i].handler + 1); + } + VirtualProtect( block, BLOCK_SIZE * sizeof(*block), PAGE_EXECUTE_READ, NULL ); + prev = InterlockedCompareExchangePointer( (void **)&method_blocks[num], block, NULL ); + if (prev) /* someone beat us to it */ + { + VirtualFree( block, 0, MEM_RELEASE ); + block = prev; + } + return block; + } + + static BOOL fill_stubless_table( IUnknownVtbl *vtbl, DWORD num ) + { + const void **entry = (const void **)(vtbl + 1); + DWORD i, j; + + if (num - 3 > BLOCK_SIZE * MAX_BLOCKS) + { + FIXME( "%u methods not supported\n", num ); + return FALSE; + } + for (i = 0; i < (num - 3 + BLOCK_SIZE - 1) / BLOCK_SIZE; i++) + { + const struct thunk *block = method_blocks[i]; + if (!block && !(block = allocate_block( i ))) return FALSE; + for (j = 0; j < BLOCK_SIZE && j < num - 3 - i * BLOCK_SIZE; j++, entry++) + if (*entry == (LPVOID)-1) *entry = &block[j]; + } + return TRUE; } #else /* __i386__ */ - /* can't do that on this arch */ - struct StublessThunk { int dummy; }; - #define FILL_STUBLESS(x,idx,stk) \ - ERR("stubless proxies are not supported on this architecture\n"); - #define STACK_ADJUST 0 + static BOOL fill_stubless_table( IUnknownVtbl *vtbl, DWORD num ) + { + ERR("stubless proxies are not supported on this architecture\n"); + return FALSE; + } #endif /* __i386__ */ - HRESULT WINAPI StdProxy_Construct(REFIID riid, - LPUNKNOWN pUnkOuter, - const ProxyFileInfo *ProxyInfo, - int Index, - LPPSFACTORYBUFFER pPSFactory, - LPRPCPROXYBUFFER *ppProxy, - LPVOID *ppvObj) + HRESULT StdProxy_Construct(REFIID riid, + LPUNKNOWN pUnkOuter, + const ProxyFileInfo *ProxyInfo, + int Index, + LPPSFACTORYBUFFER pPSFactory, + LPRPCPROXYBUFFER *ppProxy, + LPVOID *ppvObj) { StdProxyImpl *This; - const MIDL_STUBLESS_PROXY_INFO *stubless = NULL; PCInterfaceName name = ProxyInfo->pNamesArray[Index]; CInterfaceProxyVtbl *vtbl = ProxyInfo->pProxyVtblList[Index]; @@@ -129,14 -176,12 +176,12 @@@ /* TableVersion = 2 means it is the stubless version of CInterfaceProxyVtbl */ if (ProxyInfo->TableVersion > 1) { - stubless = *(const void **)vtbl; + ULONG count = ProxyInfo->pStubVtblList[Index]->header.DispatchTableCount; vtbl = (CInterfaceProxyVtbl *)((const void **)vtbl + 1); - TRACE("stubless=%p\n", stubless); + TRACE("stubless vtbl %p: count=%d\n", vtbl->Vtbl, count ); + fill_stubless_table( (IUnknownVtbl *)vtbl->Vtbl, count ); } - TRACE("iid=%s\n", debugstr_guid(vtbl->header.piid)); - TRACE("vtbl=%p\n", vtbl->Vtbl); - if (!IsEqualGUID(vtbl->header.piid, riid)) { ERR("IID mismatch during proxy creation\n"); return RPC_E_UNEXPECTED; @@@ -145,51 -190,37 +190,37 @@@ This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(StdProxyImpl)); if (!This) return E_OUTOFMEMORY; - if (stubless) { - CInterfaceStubVtbl *svtbl = ProxyInfo->pStubVtblList[Index]; - unsigned long i, count = svtbl->header.DispatchTableCount; - /* Maybe the original vtbl is just modified directly to point at - * ObjectStublessClientXXX thunks in real Windows, but I don't like it - */ - TRACE("stubless thunks: count=%ld\n", count); - This->thunks = HeapAlloc(GetProcessHeap(),0,sizeof(struct StublessThunk)*count); - This->PVtbl = HeapAlloc(GetProcessHeap(),0,sizeof(LPVOID)*count); - for (i=0; ithunks[i]; - if (vtbl->Vtbl[i] == (LPVOID)-1) { - PFORMAT_STRING fs = stubless->ProcFormatString + stubless->FormatStringOffset[i]; - unsigned bytes = *(const WORD*)(fs+8) - STACK_ADJUST; - TRACE("method %ld: stacksize=%d\n", i, bytes); - FILL_STUBLESS(thunk, i, bytes) - This->PVtbl[i] = thunk; - } - else { - memset(thunk, 0, sizeof(struct StublessThunk)); - This->PVtbl[i] = vtbl->Vtbl[i]; - } - } - } - else - This->PVtbl = vtbl->Vtbl; - + if (!pUnkOuter) pUnkOuter = (IUnknown *)This; This->lpVtbl = &StdProxy_Vtbl; + This->PVtbl = vtbl->Vtbl; /* one reference for the proxy */ This->RefCount = 1; - This->stubless = stubless; This->piid = vtbl->header.piid; + This->base_object = NULL; + This->base_proxy = NULL; This->pUnkOuter = pUnkOuter; This->name = name; This->pPSFactory = pPSFactory; This->pChannel = NULL; + + if(ProxyInfo->pDelegatedIIDs && ProxyInfo->pDelegatedIIDs[Index]) + { + HRESULT r = create_proxy( ProxyInfo->pDelegatedIIDs[Index], NULL, + &This->base_proxy, (void **)&This->base_object ); + if (FAILED(r)) + { + HeapFree( GetProcessHeap(), 0, This ); + return r; + } + } + *ppProxy = (LPRPCPROXYBUFFER)&This->lpVtbl; *ppvObj = &This->PVtbl; - /* if there is no outer unknown then the caller will control the lifetime - * of the proxy object through the proxy buffer, so no need to increment the - * ref count of the proxy object */ - if (pUnkOuter) - IUnknown_AddRef((IUnknown *)*ppvObj); + IUnknown_AddRef((IUnknown *)*ppvObj); IPSFactoryBuffer_AddRef(pPSFactory); + TRACE( "iid=%s this %p proxy %p obj %p vtbl %p base proxy %p base obj %p\n", + debugstr_guid(riid), This, *ppProxy, *ppvObj, This->PVtbl, This->base_proxy, This->base_object ); return S_OK; } @@@ -200,11 -231,10 +231,10 @@@ static void StdProxy_Destruct(LPRPCPROX if (This->pChannel) IRpcProxyBuffer_Disconnect(iface); + if (This->base_object) IUnknown_Release( This->base_object ); + if (This->base_proxy) IRpcProxyBuffer_Release( This->base_proxy ); + IPSFactoryBuffer_Release(This->pPSFactory); - if (This->thunks) { - HeapFree(GetProcessHeap(),0,This->PVtbl); - HeapFree(GetProcessHeap(),0,This->thunks); - } HeapFree(GetProcessHeap(),0,This); } @@@ -259,6 -289,7 +289,7 @@@ static HRESULT WINAPI StdProxy_Connect( This->pChannel = pChannel; IRpcChannelBuffer_AddRef(pChannel); + if (This->base_proxy) IRpcProxyBuffer_Connect( This->base_proxy, pChannel ); return S_OK; } @@@ -267,6 -298,8 +298,8 @@@ static VOID WINAPI StdProxy_Disconnect( ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface); TRACE("(%p)->Disconnect()\n",This); + if (This->base_proxy) IRpcProxyBuffer_Disconnect( This->base_proxy ); + IRpcChannelBuffer_Release(This->pChannel); This->pChannel = NULL; } diff --combined dll/win32/rpcrt4/cpsf.c index bece899d964,ac1eccf56fa..ac1eccf56fa --- a/dll/win32/rpcrt4/cpsf.c +++ b/dll/win32/rpcrt4/cpsf.c @@@ -145,6 -145,41 +145,41 @@@ static const IPSFactoryBufferVtbl CStdP CStdPSFactory_CreateStub }; + + static void init_psfactory( CStdPSFactoryBuffer *psfac, const ProxyFileInfo **file_list ) + { + DWORD i, j, k; + + psfac->lpVtbl = &CStdPSFactory_Vtbl; + psfac->RefCount = 0; + psfac->pProxyFileList = file_list; + for (i = 0; file_list[i]; i++) + { + const PCInterfaceProxyVtblList *proxies = file_list[i]->pProxyVtblList; + const PCInterfaceStubVtblList *stubs = file_list[i]->pStubVtblList; + + for (j = 0; j < file_list[i]->TableSize; j++) + { + /* FIXME: i think that different vtables should be copied for + * async interfaces */ + void * const *pSrcRpcStubVtbl = (void * const *)&CStdStubBuffer_Vtbl; + void **pRpcStubVtbl = (void **)&stubs[j]->Vtbl; + + if (file_list[i]->pDelegatedIIDs && file_list[i]->pDelegatedIIDs[j]) + { + void **vtbl = proxies[j]->Vtbl; + if (file_list[i]->TableVersion > 1) vtbl++; + fill_delegated_proxy_table( (IUnknownVtbl *)vtbl, stubs[j]->header.DispatchTableCount ); + pSrcRpcStubVtbl = (void * const *)&CStdStubBuffer_Delegating_Vtbl; + } + + for (k = 0; k < sizeof(IRpcStubBufferVtbl)/sizeof(void *); k++) + if (!pRpcStubVtbl[k]) pRpcStubVtbl[k] = pSrcRpcStubVtbl[k]; + } + } + } + + /*********************************************************************** * NdrDllGetClassObject [RPCRT4.@] */ @@@ -158,35 -193,8 +193,8 @@@ HRESULT WINAPI NdrDllGetClassObject(REF pPSFactoryBuffer); *ppv = NULL; - if (!pPSFactoryBuffer->lpVtbl) { - const ProxyFileInfo **pProxyFileList2; - DWORD max_delegating_vtbl_size = 0; - pPSFactoryBuffer->lpVtbl = &CStdPSFactory_Vtbl; - pPSFactoryBuffer->RefCount = 0; - pPSFactoryBuffer->pProxyFileList = pProxyFileList; - for (pProxyFileList2 = pProxyFileList; *pProxyFileList2; pProxyFileList2++) { - int i; - for (i = 0; i < (*pProxyFileList2)->TableSize; i++) { - /* FIXME: i think that different vtables should be copied for - * async interfaces */ - void * const *pSrcRpcStubVtbl = (void * const *)&CStdStubBuffer_Vtbl; - void **pRpcStubVtbl = (void **)&(*pProxyFileList2)->pStubVtblList[i]->Vtbl; - unsigned int j; - - if ((*pProxyFileList2)->pDelegatedIIDs && (*pProxyFileList2)->pDelegatedIIDs[i]) { - pSrcRpcStubVtbl = (void * const *)&CStdStubBuffer_Delegating_Vtbl; - if ((*pProxyFileList2)->pStubVtblList[i]->header.DispatchTableCount > max_delegating_vtbl_size) - max_delegating_vtbl_size = (*pProxyFileList2)->pStubVtblList[i]->header.DispatchTableCount; - } + if (!pPSFactoryBuffer->lpVtbl) init_psfactory( pPSFactoryBuffer, pProxyFileList ); - for (j = 0; j < sizeof(IRpcStubBufferVtbl)/sizeof(void *); j++) - if (!pRpcStubVtbl[j]) - pRpcStubVtbl[j] = pSrcRpcStubVtbl[j]; - } - } - if(max_delegating_vtbl_size > 0) - create_delegating_vtbl(max_delegating_vtbl_size); - } if (pclsid && IsEqualGUID(rclsid, pclsid)) return IPSFactoryBuffer_QueryInterface((LPPSFACTORYBUFFER)pPSFactoryBuffer, iid, ppv); else { @@@ -207,7 -215,7 +215,7 @@@ */ HRESULT WINAPI NdrDllCanUnloadNow(CStdPSFactoryBuffer *pPSFactoryBuffer) { - return !(pPSFactoryBuffer->RefCount); + return pPSFactoryBuffer->RefCount != 0 ? S_FALSE : S_OK; } @@@ -266,7 -274,7 +274,7 @@@ HRESULT WINAPI NdrDllRegisterProxy(HMOD if (len && len < sizeof(module)) { TRACE("registering CLSID %s => %s\n", debugstr_w(clsid), debugstr_w(module)); if (RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key) == ERROR_SUCCESS) { - RegSetValueExW(subkey, NULL, 0, REG_SZ, (const BYTE *)psfactoryW, sizeof(psfactoryW)); + RegSetValueExW(key, NULL, 0, REG_SZ, (const BYTE *)psfactoryW, sizeof(psfactoryW)); if (RegCreateKeyW(key, inprocserverW, &subkey) == ERROR_SUCCESS) { RegSetValueExW(subkey, NULL, 0, REG_SZ, (LPBYTE)module, (strlenW(module)+1)*sizeof(WCHAR)); RegSetValueExW(subkey, threadingmodelW, 0, REG_SZ, (const BYTE *)bothW, sizeof(bothW)); diff --combined dll/win32/rpcrt4/cpsf.h index d8867d40e60,9cc046ff7ca..9cc046ff7ca --- a/dll/win32/rpcrt4/cpsf.h +++ b/dll/win32/rpcrt4/cpsf.h @@@ -21,36 -21,25 +21,25 @@@ #ifndef __WINE_CPSF_H #define __WINE_CPSF_H - HRESULT WINAPI StdProxy_Construct(REFIID riid, - LPUNKNOWN pUnkOuter, - const ProxyFileInfo *ProxyInfo, - int Index, - LPPSFACTORYBUFFER pPSFactory, - LPRPCPROXYBUFFER *ppProxy, - LPVOID *ppvObj); - - HRESULT WINAPI CStdStubBuffer_Construct(REFIID riid, - LPUNKNOWN pUnkServer, - PCInterfaceName name, - CInterfaceStubVtbl *vtbl, - LPPSFACTORYBUFFER pPSFactory, - LPRPCSTUBBUFFER *ppStub); - - HRESULT WINAPI CStdStubBuffer_Delegating_Construct(REFIID riid, - LPUNKNOWN pUnkServer, - PCInterfaceName name, - CInterfaceStubVtbl *vtbl, - REFIID delegating_iid, - LPPSFACTORYBUFFER pPSFactory, - LPRPCSTUBBUFFER *ppStub); + HRESULT StdProxy_Construct(REFIID riid, LPUNKNOWN pUnkOuter, const ProxyFileInfo *ProxyInfo, + int Index, LPPSFACTORYBUFFER pPSFactory, LPRPCPROXYBUFFER *ppProxy, + LPVOID *ppvObj); + + HRESULT CStdStubBuffer_Construct(REFIID riid, LPUNKNOWN pUnkServer, PCInterfaceName name, + CInterfaceStubVtbl *vtbl, LPPSFACTORYBUFFER pPSFactory, + LPRPCSTUBBUFFER *ppStub); + + HRESULT CStdStubBuffer_Delegating_Construct(REFIID riid, LPUNKNOWN pUnkServer, PCInterfaceName name, + CInterfaceStubVtbl *vtbl, REFIID delegating_iid, + LPPSFACTORYBUFFER pPSFactory, LPRPCSTUBBUFFER *ppStub); const MIDL_SERVER_INFO *CStdStubBuffer_GetServerInfo(IRpcStubBuffer *iface); const IRpcStubBufferVtbl CStdStubBuffer_Vtbl; const IRpcStubBufferVtbl CStdStubBuffer_Delegating_Vtbl; - void create_delegating_vtbl(DWORD num_methods); - + BOOL fill_delegated_proxy_table(IUnknownVtbl *vtbl, DWORD num); + HRESULT create_proxy(REFIID iid, IUnknown *pUnkOuter, IRpcProxyBuffer **pproxy, void **ppv); HRESULT create_stub(REFIID iid, IUnknown *pUnk, IRpcStubBuffer **ppstub); #endif /* __WINE_CPSF_H */ diff --combined dll/win32/rpcrt4/cstub.c index 85411cd81e9,95ac1d89af2..95ac1d89af2 --- a/dll/win32/rpcrt4/cstub.c +++ b/dll/win32/rpcrt4/cstub.c @@@ -2,6 -2,7 +2,7 @@@ * COM stub (CStdStubBuffer) implementation * * Copyright 2001 Ove KÃ¥ven, TransGaming Technologies + * Copyright 2009 Alexandre Julliard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@@ -61,12 -62,12 +62,12 @@@ static inline cstdstubbuffer_delegating return (cstdstubbuffer_delegating_t*)((char *)iface - FIELD_OFFSET(cstdstubbuffer_delegating_t, stub_buffer)); } - HRESULT WINAPI CStdStubBuffer_Construct(REFIID riid, - LPUNKNOWN pUnkServer, - PCInterfaceName name, - CInterfaceStubVtbl *vtbl, - LPPSFACTORYBUFFER pPSFactory, - LPRPCSTUBBUFFER *ppStub) + HRESULT CStdStubBuffer_Construct(REFIID riid, + LPUNKNOWN pUnkServer, + PCInterfaceName name, + CInterfaceStubVtbl *vtbl, + LPPSFACTORYBUFFER pPSFactory, + LPRPCSTUBBUFFER *ppStub) { CStdStubBuffer *This; IUnknown *pvServer; @@@ -113,20 -114,16 +114,16 @@@ typedef struc { DWORD ref; DWORD size; - void **methods; IUnknownVtbl vtbl; /* remaining entries in vtbl */ } ref_counted_vtbl; - static struct - { - ref_counted_vtbl *table; - } current_vtbl; + static ref_counted_vtbl *current_vtbl; static HRESULT WINAPI delegating_QueryInterface(IUnknown *pUnk, REFIID iid, void **ppv) { - *ppv = (void *)pUnk; + *ppv = pUnk; return S_OK; } @@@ -161,87 -158,137 +158,137 @@@ typedef struct } vtbl_method_t; #include "poppack.h" - static void fill_table(IUnknownVtbl *vtbl, void **methods, DWORD num) + #define BLOCK_SIZE 1024 + #define MAX_BLOCKS 64 /* 64k methods should be enough for anybody */ + + static const vtbl_method_t *method_blocks[MAX_BLOCKS]; + + static const vtbl_method_t *allocate_block( unsigned int num ) { - vtbl_method_t *method; - void **entry; - DWORD i; + unsigned int i; + vtbl_method_t *prev, *block; + + block = VirtualAlloc( NULL, BLOCK_SIZE * sizeof(*block), + MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE ); + if (!block) return NULL; + + for (i = 0; i < BLOCK_SIZE; i++) + { + block[i].mov1 = 0x0424448b; + block[i].mov2 = 0x408b; + block[i].sixteen = 0x10; + block[i].mov3 = 0x04244489; + block[i].mov4 = 0x008b; + block[i].mov5 = 0x808b; + block[i].offset = (BLOCK_SIZE * num + i + 3) << 2; + block[i].jmp = 0xe0ff; + block[i].pad[0] = 0x8d; + block[i].pad[1] = 0x76; + block[i].pad[2] = 0x00; + } + VirtualProtect( block, BLOCK_SIZE * sizeof(*block), PAGE_EXECUTE_READ, NULL ); + prev = InterlockedCompareExchangePointer( (void **)&method_blocks[num], block, NULL ); + if (prev) /* someone beat us to it */ + { + VirtualFree( block, 0, MEM_RELEASE ); + block = prev; + } + return block; + } + static BOOL fill_delegated_stub_table(IUnknownVtbl *vtbl, DWORD num) + { + const void **entry = (const void **)(vtbl + 1); + DWORD i, j; + + if (num - 3 > BLOCK_SIZE * MAX_BLOCKS) + { + FIXME( "%u methods not supported\n", num ); + return FALSE; + } vtbl->QueryInterface = delegating_QueryInterface; vtbl->AddRef = delegating_AddRef; vtbl->Release = delegating_Release; + for (i = 0; i < (num - 3 + BLOCK_SIZE - 1) / BLOCK_SIZE; i++) + { + const vtbl_method_t *block = method_blocks[i]; + if (!block && !(block = allocate_block( i ))) return FALSE; + for (j = 0; j < BLOCK_SIZE && j < num - 3 - i * BLOCK_SIZE; j++) *entry++ = &block[j]; + } + return TRUE; + } - method = (vtbl_method_t*)methods; - entry = (void**)(vtbl + 1); + BOOL fill_delegated_proxy_table(IUnknownVtbl *vtbl, DWORD num) + { + const void **entry = (const void **)(vtbl + 1); + DWORD i, j; - for(i = 3; i < num; i++) + if (num - 3 > BLOCK_SIZE * MAX_BLOCKS) + { + FIXME( "%u methods not supported\n", num ); + return FALSE; + } + vtbl->QueryInterface = IUnknown_QueryInterface_Proxy; + vtbl->AddRef = IUnknown_AddRef_Proxy; + vtbl->Release = IUnknown_Release_Proxy; + for (i = 0; i < (num - 3 + BLOCK_SIZE - 1) / BLOCK_SIZE; i++) { - *entry = method; - method->mov1 = 0x0424448b; - method->mov2 = 0x408b; - method->sixteen = 0x10; - method->mov3 = 0x04244489; - method->mov4 = 0x008b; - method->mov5 = 0x808b; - method->offset = i << 2; - method->jmp = 0xe0ff; - method->pad[0] = 0x8d; - method->pad[1] = 0x76; - method->pad[2] = 0x00; - - method++; - entry++; + const vtbl_method_t *block = method_blocks[i]; + if (!block && !(block = allocate_block( i ))) return FALSE; + for (j = 0; j < BLOCK_SIZE && j < num - 3 - i * BLOCK_SIZE; j++, entry++) + if (!*entry) *entry = &block[j]; } + return TRUE; } #else /* __i386__ */ - typedef struct {int dummy;} vtbl_method_t; - static void fill_table(IUnknownVtbl *vtbl, void **methods, DWORD num) + static BOOL fill_delegated_stub_table(IUnknownVtbl *vtbl, DWORD num) { ERR("delegated stubs are not supported on this architecture\n"); + return FALSE; + } + + BOOL fill_delegated_proxy_table(IUnknownVtbl *vtbl, DWORD num) + { + ERR("delegated proxies are not supported on this architecture\n"); + return FALSE; } #endif /* __i386__ */ - void create_delegating_vtbl(DWORD num_methods) + static IUnknownVtbl *get_delegating_vtbl(DWORD num_methods) { - TRACE("%d\n", num_methods); - if(num_methods <= 3) - { - ERR("should have more than %d methods\n", num_methods); - return; - } + IUnknownVtbl *ret; + + if (num_methods < 256) num_methods = 256; /* avoid frequent reallocations */ EnterCriticalSection(&delegating_vtbl_section); - if(!current_vtbl.table || num_methods > current_vtbl.table->size) + + if(!current_vtbl || num_methods > current_vtbl->size) { - DWORD size; - DWORD old_protect; - if(current_vtbl.table && current_vtbl.table->ref == 0) + ref_counted_vtbl *table = HeapAlloc(GetProcessHeap(), 0, + FIELD_OFFSET(ref_counted_vtbl, vtbl) + num_methods * sizeof(void*)); + if (!table) + { + LeaveCriticalSection(&delegating_vtbl_section); + return NULL; + } + + table->ref = 0; + table->size = num_methods; + fill_delegated_stub_table(&table->vtbl, num_methods); + + if (current_vtbl && current_vtbl->ref == 0) { TRACE("freeing old table\n"); - VirtualFree(current_vtbl.table->methods, 0, MEM_RELEASE); - HeapFree(GetProcessHeap(), 0, current_vtbl.table); + HeapFree(GetProcessHeap(), 0, current_vtbl); } - size = (num_methods - 3) * sizeof(vtbl_method_t); - current_vtbl.table = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(ref_counted_vtbl, vtbl) + num_methods * sizeof(void*)); - current_vtbl.table->ref = 0; - current_vtbl.table->size = num_methods; - current_vtbl.table->methods = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - fill_table(¤t_vtbl.table->vtbl, current_vtbl.table->methods, num_methods); - VirtualProtect(current_vtbl.table->methods, size, PAGE_EXECUTE_READ, &old_protect); + current_vtbl = table; } - LeaveCriticalSection(&delegating_vtbl_section); - } - static IUnknownVtbl *get_delegating_vtbl(void) - { - IUnknownVtbl *ret; - - EnterCriticalSection(&delegating_vtbl_section); - current_vtbl.table->ref++; - ret = ¤t_vtbl.table->vtbl; + current_vtbl->ref++; + ret = ¤t_vtbl->vtbl; LeaveCriticalSection(&delegating_vtbl_section); return ret; } @@@ -253,22 -300,21 +300,21 @@@ static void release_delegating_vtbl(IUn EnterCriticalSection(&delegating_vtbl_section); table->ref--; TRACE("ref now %d\n", table->ref); - if(table->ref == 0 && table != current_vtbl.table) + if(table->ref == 0 && table != current_vtbl) { TRACE("... and we're not current so free'ing\n"); - VirtualFree(current_vtbl.table->methods, 0, MEM_RELEASE); HeapFree(GetProcessHeap(), 0, table); } LeaveCriticalSection(&delegating_vtbl_section); } - HRESULT WINAPI CStdStubBuffer_Delegating_Construct(REFIID riid, - LPUNKNOWN pUnkServer, - PCInterfaceName name, - CInterfaceStubVtbl *vtbl, - REFIID delegating_iid, - LPPSFACTORYBUFFER pPSFactory, - LPRPCSTUBBUFFER *ppStub) + HRESULT CStdStubBuffer_Delegating_Construct(REFIID riid, + LPUNKNOWN pUnkServer, + PCInterfaceName name, + CInterfaceStubVtbl *vtbl, + REFIID delegating_iid, + LPPSFACTORYBUFFER pPSFactory, + LPRPCSTUBBUFFER *ppStub) { cstdstubbuffer_delegating_t *This; IUnknown *pvServer; @@@ -294,7 -340,7 +340,7 @@@ return E_OUTOFMEMORY; } - This->base_obj = get_delegating_vtbl(); + This->base_obj = get_delegating_vtbl( vtbl->header.DispatchTableCount ); r = create_stub(delegating_iid, (IUnknown*)&This->base_obj, &This->base_stub); if(FAILED(r)) { diff --combined dll/win32/rpcrt4/ndr_contexthandle.c index 15192a72878,cab0fc5d86e..cab0fc5d86e --- a/dll/win32/rpcrt4/ndr_contexthandle.c +++ b/dll/win32/rpcrt4/ndr_contexthandle.c @@@ -59,7 -59,7 +59,7 @@@ static CRITICAL_SECTION ndr_context_cs static struct context_handle_entry *get_context_entry(NDR_CCONTEXT CContext) { - struct context_handle_entry *che = (struct context_handle_entry*) CContext; + struct context_handle_entry *che = CContext; if (che->magic != NDR_CONTEXT_HANDLE_MAGIC) return NULL; @@@ -111,7 -111,7 +111,7 @@@ void WINAPI NDRCContextMarshall(NDR_CCO } else { - ndr_context_handle *wire_data = (ndr_context_handle *)pBuff; + ndr_context_handle *wire_data = pBuff; wire_data->attributes = 0; wire_data->uuid = GUID_NULL; } diff --combined dll/win32/rpcrt4/ndr_fullpointer.c index b686683f6f4,2bbd2b2b1aa..2bbd2b2b1aa --- a/dll/win32/rpcrt4/ndr_fullpointer.c +++ b/dll/win32/rpcrt4/ndr_fullpointer.c @@@ -161,6 -161,9 +161,9 @@@ int WINAPI NdrFullPointerQueryRefId(PFU { TRACE("(%p, 0x%x, %d, %p)\n", pXlatTables, RefId, QueryType, ppPointer); + if (!RefId) + return 1; + expand_pointer_table_if_necessary(pXlatTables, RefId); pXlatTables->NextRefId = max(RefId + 1, pXlatTables->NextRefId); diff --combined dll/win32/rpcrt4/ndr_marshall.c index d1b57fd187a,9946bd13d57..9946bd13d57 --- a/dll/win32/rpcrt4/ndr_marshall.c +++ b/dll/win32/rpcrt4/ndr_marshall.c @@@ -39,6 -39,7 +39,7 @@@ #include "ndr_misc.h" #include "rpcndr.h" + #include "ndrtypes.h" #include "wine/unicode.h" #include "wine/rpcfc.h" @@@ -113,6 -114,8 +114,8 @@@ WINE_DEFAULT_DEBUG_CHANNEL(ole) #define NDR_TABLE_SIZE 128 #define NDR_TABLE_MASK 127 + #define NDRSContextFromValue(user_context) (NDR_SCONTEXT)((char *)(user_context) - (char *)NDRSContextValue((NDR_SCONTEXT)NULL)) + static unsigned char *WINAPI NdrBaseTypeMarshall(PMIDL_STUB_MESSAGE, unsigned char *, PFORMAT_STRING); static unsigned char *WINAPI NdrBaseTypeUnmarshall(PMIDL_STUB_MESSAGE, unsigned char **, PFORMAT_STRING, unsigned char); static void WINAPI NdrBaseTypeBufferSize(PMIDL_STUB_MESSAGE, unsigned char *, PFORMAT_STRING); @@@ -548,7 -551,8 +551,8 @@@ PFORMAT_STRING ComputeConformanceOrVari } break; default: - FIXME("unknown conformance type %x\n", pFormat[0] & 0xf0); + FIXME("unknown conformance type %x, expect crash.\n", pFormat[0] & 0xf0); + goto finish_conf; } switch (pFormat[1]) { @@@ -935,7 -939,7 +939,7 @@@ static void PointerUnmarshall(PMIDL_STU if (type == RPC_FC_FP) NdrFullPointerInsertRefId(pStubMsg->FullPtrXlatTables, pointer_id, - base_ptr_val); + *pPointer); } TRACE("pointer=%p\n", *pPointer); @@@ -1778,7 -1782,7 +1782,7 @@@ static inline void array_compute_and_si break; case RPC_FC_C_CSTRING: case RPC_FC_C_WSTRING: - if (pFormat[0] == RPC_FC_C_CSTRING) + if (fc == RPC_FC_C_CSTRING) { TRACE("string=%s\n", debugstr_a((const char *)pMemory)); pStubMsg->ActualCount = strlen((const char *)pMemory)+1; @@@ -1789,7 -1793,7 +1793,7 @@@ pStubMsg->ActualCount = strlenW((LPCWSTR)pMemory)+1; } - if (fc == RPC_FC_STRING_SIZED) + if (pFormat[1] == RPC_FC_STRING_SIZED) pFormat = ComputeConformance(pStubMsg, pMemory, pFormat + 2, 0); else pStubMsg->MaxCount = pStubMsg->ActualCount; @@@ -2692,17 -2696,33 +2696,33 @@@ static unsigned char * ComplexMarshall( safe_copy_to_buffer(pStubMsg, pMemory, 4); pMemory += 4; break; + case RPC_FC_FLOAT: + TRACE("float=%f <= %p\n", *(float*)pMemory, pMemory); + safe_copy_to_buffer(pStubMsg, pMemory, sizeof(float)); + pMemory += sizeof(float); + break; case RPC_FC_HYPER: TRACE("longlong=%s <= %p\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory), pMemory); safe_copy_to_buffer(pStubMsg, pMemory, 8); pMemory += 8; break; + case RPC_FC_DOUBLE: + TRACE("double=%f <= %p\n", *(double*)pMemory, pMemory); + safe_copy_to_buffer(pStubMsg, pMemory, sizeof(double)); + pMemory += sizeof(double); + break; + case RPC_FC_RP: + case RPC_FC_UP: + case RPC_FC_OP: + case RPC_FC_FP: case RPC_FC_POINTER: { unsigned char *saved_buffer; int pointer_buffer_mark_set = 0; TRACE("pointer=%p <= %p\n", *(unsigned char**)pMemory, pMemory); TRACE("pStubMsg->Buffer before %p\n", pStubMsg->Buffer); + if (*pFormat != RPC_FC_POINTER) + pPointer = pFormat; if (*pPointer != RPC_FC_RP) ALIGN_POINTER_CLEAR(pStubMsg->Buffer, 4); saved_buffer = pStubMsg->Buffer; @@@ -2724,7 -2744,10 +2744,10 @@@ safe_buffer_increment(pStubMsg, 4); /* for pointer ID */ } TRACE("pStubMsg->Buffer after %p\n", pStubMsg->Buffer); - pPointer += 4; + if (*pFormat == RPC_FC_POINTER) + pPointer += 4; + else + pFormat += 4; pMemory += sizeof(void *); break; } @@@ -2821,16 -2844,32 +2844,32 @@@ static unsigned char * ComplexUnmarshal TRACE("long=%d => %p\n", *(DWORD*)pMemory, pMemory); pMemory += 4; break; + case RPC_FC_FLOAT: + safe_copy_from_buffer(pStubMsg, pMemory, sizeof(float)); + TRACE("float=%f => %p\n", *(float*)pMemory, pMemory); + pMemory += sizeof(float); + break; case RPC_FC_HYPER: safe_copy_from_buffer(pStubMsg, pMemory, 8); TRACE("longlong=%s => %p\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory), pMemory); pMemory += 8; break; + case RPC_FC_DOUBLE: + safe_copy_from_buffer(pStubMsg, pMemory, sizeof(double)); + TRACE("double=%f => %p\n", *(double*)pMemory, pMemory); + pMemory += sizeof(double); + break; + case RPC_FC_RP: + case RPC_FC_UP: + case RPC_FC_OP: + case RPC_FC_FP: case RPC_FC_POINTER: { unsigned char *saved_buffer; int pointer_buffer_mark_set = 0; TRACE("pointer => %p\n", pMemory); + if (*pFormat != RPC_FC_POINTER) + pPointer = pFormat; if (*pPointer != RPC_FC_RP) ALIGN_POINTER(pStubMsg->Buffer, 4); saved_buffer = pStubMsg->Buffer; @@@ -2852,7 -2891,10 +2891,10 @@@ if (*pPointer != RPC_FC_RP) safe_buffer_increment(pStubMsg, 4); /* for pointer ID */ } - pPointer += 4; + if (*pFormat == RPC_FC_POINTER) + pPointer += 4; + else + pFormat += 4; pMemory += sizeof(void *); break; } @@@ -2946,14 -2988,22 +2988,22 @@@ static unsigned char * ComplexBufferSiz case RPC_FC_LONG: case RPC_FC_ULONG: case RPC_FC_ENUM32: + case RPC_FC_FLOAT: safe_buffer_length_increment(pStubMsg, 4); pMemory += 4; break; case RPC_FC_HYPER: + case RPC_FC_DOUBLE: safe_buffer_length_increment(pStubMsg, 8); pMemory += 8; break; + case RPC_FC_RP: + case RPC_FC_UP: + case RPC_FC_OP: + case RPC_FC_FP: case RPC_FC_POINTER: + if (*pFormat != RPC_FC_POINTER) + pPointer = pFormat; if (!pStubMsg->IgnoreEmbeddedPointers) { int saved_buffer_length = pStubMsg->BufferLength; @@@ -2970,7 -3020,10 +3020,10 @@@ ALIGN_LENGTH(pStubMsg->BufferLength, 4); safe_buffer_length_increment(pStubMsg, 4); } - pPointer += 4; + if (*pFormat == RPC_FC_POINTER) + pPointer += 4; + else + pFormat += 4; pMemory += sizeof(void*); break; case RPC_FC_ALIGNM2: @@@ -3049,14 -3102,25 +3102,25 @@@ static unsigned char * ComplexFree(PMID case RPC_FC_ULONG: case RPC_FC_ENUM16: case RPC_FC_ENUM32: + case RPC_FC_FLOAT: pMemory += 4; break; case RPC_FC_HYPER: + case RPC_FC_DOUBLE: pMemory += 8; break; + case RPC_FC_RP: + case RPC_FC_UP: + case RPC_FC_OP: + case RPC_FC_FP: case RPC_FC_POINTER: + if (*pFormat != RPC_FC_POINTER) + pPointer = pFormat; NdrPointerFree(pStubMsg, *(unsigned char**)pMemory, pPointer); - pPointer += 4; + if (*pFormat == RPC_FC_POINTER) + pPointer += 4; + else + pFormat += 4; pMemory += sizeof(void *); break; case RPC_FC_ALIGNM2: @@@ -3137,17 -3201,25 +3201,25 @@@ static ULONG ComplexStructMemorySize(PM case RPC_FC_LONG: case RPC_FC_ULONG: case RPC_FC_ENUM32: + case RPC_FC_FLOAT: size += 4; safe_buffer_increment(pStubMsg, 4); break; case RPC_FC_HYPER: + case RPC_FC_DOUBLE: size += 8; safe_buffer_increment(pStubMsg, 8); break; + case RPC_FC_RP: + case RPC_FC_UP: + case RPC_FC_OP: + case RPC_FC_FP: case RPC_FC_POINTER: { unsigned char *saved_buffer; int pointer_buffer_mark_set = 0; + if (*pFormat != RPC_FC_POINTER) + pPointer = pFormat; if (*pPointer != RPC_FC_RP) ALIGN_POINTER(pStubMsg->Buffer, 4); saved_buffer = pStubMsg->Buffer; @@@ -3170,7 -3242,10 +3242,10 @@@ if (*pPointer != RPC_FC_RP) safe_buffer_increment(pStubMsg, 4); /* for pointer ID */ } - pPointer += 4; + if (*pFormat == RPC_FC_POINTER) + pPointer += 4; + else + pFormat += 4; size += sizeof(void *); break; } @@@ -3232,13 -3307,21 +3307,21 @@@ ULONG ComplexStructSize(PMIDL_STUB_MESS case RPC_FC_ULONG: case RPC_FC_ENUM16: case RPC_FC_ENUM32: + case RPC_FC_FLOAT: size += 4; break; case RPC_FC_HYPER: + case RPC_FC_DOUBLE: size += 8; break; + case RPC_FC_RP: + case RPC_FC_UP: + case RPC_FC_OP: + case RPC_FC_FP: case RPC_FC_POINTER: size += sizeof(void *); + if (*pFormat != RPC_FC_POINTER) + pFormat += 4; break; case RPC_FC_ALIGNM2: ALIGN_LENGTH(size, 2); @@@ -6687,10 -6770,19 +6770,19 @@@ static unsigned char *WINAPI NdrContext } TRACE("flags: 0x%02x\n", pFormat[1]); - if (pFormat[1] & 0x80) - NdrClientContextMarshall(pStubMsg, *(NDR_CCONTEXT **)pMemory, FALSE); + if (pStubMsg->IsClient) + { + if (pFormat[1] & HANDLE_PARAM_IS_VIA_PTR) + NdrClientContextMarshall(pStubMsg, *(NDR_CCONTEXT **)pMemory, FALSE); + else + NdrClientContextMarshall(pStubMsg, pMemory, FALSE); + } else - NdrClientContextMarshall(pStubMsg, pMemory, FALSE); + { + NDR_SCONTEXT ctxt = NDRSContextFromValue(pMemory); + NDR_RUNDOWN rundown = pStubMsg->StubDesc->apfnNdrRundownRoutines[pFormat[2]]; + NdrServerContextNewMarshall(pStubMsg, ctxt, rundown, pFormat); + } return NULL; } @@@ -6714,10 -6806,22 +6806,22 @@@ static unsigned char *WINAPI NdrContext } TRACE("flags: 0x%02x\n", pFormat[1]); - /* [out]-only or [ret] param */ - if ((pFormat[1] & 0x60) == 0x20) - **(NDR_CCONTEXT **)ppMemory = NULL; - NdrClientContextUnmarshall(pStubMsg, *(NDR_CCONTEXT **)ppMemory, pStubMsg->RpcMsg->Handle); + if (pStubMsg->IsClient) + { + /* [out]-only or [ret] param */ + if ((pFormat[1] & (HANDLE_PARAM_IS_IN|HANDLE_PARAM_IS_OUT)) == HANDLE_PARAM_IS_OUT) + **(NDR_CCONTEXT **)ppMemory = NULL; + NdrClientContextUnmarshall(pStubMsg, *(NDR_CCONTEXT **)ppMemory, pStubMsg->RpcMsg->Handle); + } + else + { + NDR_SCONTEXT ctxt; + ctxt = NdrServerContextNewUnmarshall(pStubMsg, pFormat); + if (pFormat[1] & HANDLE_PARAM_IS_VIA_PTR) + *(void **)ppMemory = NDRSContextValue(ctxt); + else + *(void **)ppMemory = *NDRSContextValue(ctxt); + } return NULL; } diff --combined dll/win32/rpcrt4/ndr_misc.h index c3beff4d725,b0150c3a2eb..b0150c3a2eb --- a/dll/win32/rpcrt4/ndr_misc.h +++ b/dll/win32/rpcrt4/ndr_misc.h @@@ -62,6 -62,6 +62,6 @@@ extern const NDR_BUFFERSIZE NdrBufferSi extern const NDR_MEMORYSIZE NdrMemorySizer[]; extern const NDR_FREE NdrFreer[]; - unsigned long ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat); + ULONG ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat); #endif /* __WINE_NDR_MISC_H */ diff --combined dll/win32/rpcrt4/ndr_ole.c index a3264e70122,a4c23c2c5c2..a4c23c2c5c2 --- a/dll/win32/rpcrt4/ndr_ole.c +++ b/dll/win32/rpcrt4/ndr_ole.c @@@ -369,6 -369,30 +369,30 @@@ void WINAPI NdrOleFree(void *NodeToFree COM_MemFree(NodeToFree); } + /*********************************************************************** + * Helper function to create a proxy. + * Probably similar to NdrpCreateProxy. + */ + HRESULT create_proxy(REFIID iid, IUnknown *pUnkOuter, IRpcProxyBuffer **pproxy, void **ppv) + { + CLSID clsid; + IPSFactoryBuffer *psfac; + HRESULT r; + + if(!LoadCOM()) return E_FAIL; + + r = COM_GetPSClsid( iid, &clsid ); + if(FAILED(r)) return r; + + r = COM_GetClassObject( &clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IPSFactoryBuffer, (void**)&psfac ); + if(FAILED(r)) return r; + + r = IPSFactoryBuffer_CreateProxy(psfac, pUnkOuter, iid, pproxy, ppv); + + IPSFactoryBuffer_Release(psfac); + return r; + } + /*********************************************************************** * Helper function to create a stub. * This probably looks very much like NdrpCreateStub. diff --combined dll/win32/rpcrt4/rpc_transport.c index b9077a3dc1a,2da72909c23..2da72909c23 --- a/dll/win32/rpcrt4/rpc_transport.c +++ b/dll/win32/rpcrt4/rpc_transport.c @@@ -762,7 -762,7 +762,7 @@@ typedef struct _RpcConnection_tc { RpcConnection common; int sock; - int cancel_fds[2]; + SOCKET cancel_fds[2]; } RpcConnection_tcp; static RpcConnection *rpcrt4_conn_tcp_alloc(void) @@@ -814,7 -814,7 +814,7 @@@ static RPC_STATUS rpcrt4_ncacn_ip_tcp_o for (ai_cur = ai; ai_cur; ai_cur = ai_cur->ai_next) { - int val; + char val; if (TRACE_ON(rpc)) { @@@ -1091,7 -1091,7 +1091,7 @@@ static int rpcrt4_conn_tcp_close(RpcCon static void rpcrt4_conn_tcp_cancel_call(RpcConnection *Connection) { RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection; - char dummy = 1; + SOCKET dummy = 1; TRACE("%p\n", Connection); @@@ -1271,7 -1271,7 +1271,7 @@@ static RpcServerProtseq *rpcrt4_protseq RpcServerProtseq_sock *ps = HeapAlloc(GetProcessHeap(), 0, sizeof(*ps)); if (ps) { - int fds[2]; + SOCKET fds[2]; if (!socketpair(PF_UNIX, SOCK_DGRAM, 0, fds)) { fcntl(fds[0], F_SETFL, O_NONBLOCK); diff --combined dll/win32/rsaenh/implglue.c index b73eba93ec6,7ecfc289ecf..7ecfc289ecf --- a/dll/win32/rsaenh/implglue.c +++ b/dll/win32/rsaenh/implglue.c @@@ -67,6 -67,18 +67,18 @@@ BOOL init_hash_impl(ALG_ID aiAlgid, HAS case CALG_SHA: A_SHAInit(&pHashContext->sha); break; + + case CALG_SHA_256: + SHA256_Init(&pHashContext->sha256); + break; + + case CALG_SHA_384: + SHA384_Init(&pHashContext->sha384); + break; + + case CALG_SHA_512: + SHA512_Init(&pHashContext->sha512); + break; } return TRUE; @@@ -93,6 -105,18 +105,18 @@@ BOOL update_hash_impl(ALG_ID aiAlgid, H A_SHAUpdate(&pHashContext->sha, pbData, dwDataLen); break; + case CALG_SHA_256: + SHA256_Update(&pHashContext->sha256, pbData, dwDataLen); + break; + + case CALG_SHA_384: + SHA384_Update(&pHashContext->sha384, pbData, dwDataLen); + break; + + case CALG_SHA_512: + SHA512_Update(&pHashContext->sha512, pbData, dwDataLen); + break; + default: SetLastError(NTE_BAD_ALGID); return FALSE; @@@ -123,6 -147,18 +147,18 @@@ BOOL finalize_hash_impl(ALG_ID aiAlgid A_SHAFinal(&pHashContext->sha, (PULONG)pbHashValue); break; + case CALG_SHA_256: + SHA256_Final(pbHashValue, &pHashContext->sha256); + break; + + case CALG_SHA_384: + SHA384_Final(pbHashValue, &pHashContext->sha384); + break; + + case CALG_SHA_512: + SHA512_Final(pbHashValue, &pHashContext->sha512); + break; + default: SetLastError(NTE_BAD_ALGID); return FALSE; diff --combined dll/win32/rsaenh/implglue.h index 5deaf53e58a,63553204c5b..63553204c5b --- a/dll/win32/rsaenh/implglue.h +++ b/dll/win32/rsaenh/implglue.h @@@ -25,6 -25,7 +25,7 @@@ #define __WINE_IMPLGLUE_H #include "tomcrypt.h" + #include "sha2.h" /* Next typedef copied from dlls/advapi32/crypt_md4.c */ typedef struct tagMD4_CTX { @@@ -57,6 -58,9 +58,9 @@@ typedef union tagHASH_CONTEXT MD4_CTX md4; MD5_CTX md5; SHA_CTX sha; + SHA256_CTX sha256; + SHA384_CTX sha384; + SHA512_CTX sha512; } HASH_CONTEXT; typedef union tagKEY_CONTEXT { diff --combined dll/win32/rsaenh/rsaenh.c index 665bc40056f,74ad392f2f2..74ad392f2f2 --- a/dll/win32/rsaenh/rsaenh.c +++ b/dll/win32/rsaenh/rsaenh.c @@@ -241,6 -241,9 +241,9 @@@ static const PROV_ENUMALGS_EX aProvEnum {CALG_AES_192, 192,192, 192,0, 8,"AES-192", 39,"Advanced Encryption Standard (AES-192)"}, {CALG_AES_256, 256,256, 256,0, 8,"AES-256", 39,"Advanced Encryption Standard (AES-256)"}, {CALG_SHA, 160,160, 160,CRYPT_FLAG_SIGNING, 6,"SHA-1", 30,"Secure Hash Algorithm (SHA-1)"}, + {CALG_SHA_256, 256,256, 256,CRYPT_FLAG_SIGNING, 6,"SHA-256", 30,"Secure Hash Algorithm (SHA-256)"}, + {CALG_SHA_384, 384,384, 384,CRYPT_FLAG_SIGNING, 6,"SHA-384", 30,"Secure Hash Algorithm (SHA-284)"}, + {CALG_SHA_512, 512,512, 512,CRYPT_FLAG_SIGNING, 6,"SHA-512", 30,"Secure Hash Algorithm (SHA-512)"}, {CALG_MD2, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD2", 23,"Message Digest 2 (MD2)"}, {CALG_MD4, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD4", 23,"Message Digest 4 (MD4)"}, {CALG_MD5, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD5", 23,"Message Digest 5 (MD5)"}, @@@ -1422,8 -1425,8 +1425,8 @@@ static BOOL build_hash_signature(BYTE * static const struct tagOIDDescriptor { ALG_ID aiAlgid; DWORD dwLen; - CONST BYTE abOID[18]; - } aOIDDescriptor[5] = { + CONST BYTE abOID[19]; + } aOIDDescriptor[8] = { { CALG_MD2, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 } }, { CALG_MD4, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, @@@ -1432,6 -1435,15 +1435,15 @@@ 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 } }, { CALG_SHA, 15, { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 } }, + { CALG_SHA_256, 19, { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, + 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, + 0x05, 0x00, 0x04, 0x20 } }, + { CALG_SHA_384, 19, { 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, + 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, + 0x05, 0x00, 0x04, 0x30 } }, + { CALG_SHA_384, 19, { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, + 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, + 0x05, 0x00, 0x04, 0x40 } }, { 0, 0, { 0 } } }; DWORD dwIdxOID, i, j; diff --combined dll/win32/rsaenh/rsaenh.rbuild index fab9eb9011a,49973032b7e..49973032b7e --- a/dll/win32/rsaenh/rsaenh.rbuild +++ b/dll/win32/rsaenh/rsaenh.rbuild @@@ -17,6 -17,7 +17,7 @@@ rc4.c rsa.c rsaenh.c + sha2.c version.rc wine crypt32 diff --combined dll/win32/shdocvw/dochost.c index e8982e4f12a,2196eb9c02e..2196eb9c02e --- a/dll/win32/shdocvw/dochost.c +++ b/dll/win32/shdocvw/dochost.c @@@ -21,9 -21,14 +21,14 @@@ #include "hlink.h" #include "exdispid.h" #include "mshtml.h" + #include "initguid.h" WINE_DEFAULT_DEBUG_CHANNEL(shdocvw); + DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0); + + #define DOCHOST_DOCCANNAVIGATE 0 + static ATOM doc_view_atom = 0; void push_dochost_task(DocHost *This, task_header_t *task, task_proc_t proc, BOOL send) @@@ -154,16 -159,23 +159,23 @@@ static void advise_prop_notif(DocHost * This->is_prop_notif = set; } + void set_doc_state(DocHost *This, READYSTATE doc_state) + { + This->doc_state = doc_state; + if(doc_state > This->ready_state) + This->ready_state = doc_state; + } + static void update_ready_state(DocHost *This, READYSTATE ready_state) { - if(ready_state > READYSTATE_LOADING && This->ready_state <= READYSTATE_LOADING) { + if(ready_state > READYSTATE_LOADING && This->doc_state <= READYSTATE_LOADING) notif_complete(This, DISPID_NAVIGATECOMPLETE2); - This->ready_state = ready_state; - } - if(ready_state == READYSTATE_COMPLETE && This->ready_state < READYSTATE_COMPLETE) { - This->ready_state = READYSTATE_COMPLETE; + if(ready_state == READYSTATE_COMPLETE && This->doc_state < READYSTATE_COMPLETE) { + set_doc_state(This, READYSTATE_COMPLETE); notif_complete(This, DISPID_DOCUMENTCOMPLETE); + }else { + set_doc_state(This, ready_state); } } @@@ -236,7 -248,7 +248,7 @@@ HRESULT dochost_object_available(DocHos if(SUCCEEDED(hres)) { if(ready_state == READYSTATE_COMPLETE) push_ready_state_task(This, READYSTATE_COMPLETE); - else + if(ready_state != READYSTATE_COMPLETE || This->doc_navigate) advise_prop_notif(This, TRUE); } @@@ -314,6 -326,11 +326,11 @@@ void deactivate_document(DocHost *This IHlinkTarget *hlink = NULL; HRESULT hres; + if(This->doc_navigate) { + IUnknown_Release(This->doc_navigate); + This->doc_navigate = NULL; + } + if(This->is_prop_notif) advise_prop_notif(This, FALSE); @@@ -425,8 -442,34 +442,34 @@@ static HRESULT WINAPI ClOleCommandTarge VARIANT *pvaOut) { DocHost *This = OLECMD_THIS(iface); - FIXME("(%p)->(%s %d %d %p %p)\n", This, debugstr_guid(pguidCmdGroup), nCmdID, - nCmdexecopt, pvaIn, pvaOut); + + TRACE("(%p)->(%s %d %d %p %p)\n", This, debugstr_guid(pguidCmdGroup), nCmdID, + nCmdexecopt, debugstr_variant(pvaIn), debugstr_variant(pvaOut)); + + if(!pguidCmdGroup) { + FIXME("Unimplemented cmdid %d\n", nCmdID); + return E_NOTIMPL; + } + + if(IsEqualGUID(pguidCmdGroup, &CGID_DocHostCmdPriv)) { + switch(nCmdID) { + case DOCHOST_DOCCANNAVIGATE: + if(!pvaIn || V_VT(pvaIn) != VT_UNKNOWN) + return E_INVALIDARG; + + if(This->doc_navigate) + IUnknown_Release(This->doc_navigate); + IUnknown_AddRef(V_UNKNOWN(pvaIn)); + This->doc_navigate = V_UNKNOWN(pvaIn); + return S_OK; + + default: + FIXME("unsupported command %d of CGID_DocHostCmdPriv\n", nCmdID); + return E_NOTIMPL; + } + } + + FIXME("Unimplemented group %s\n", debugstr_guid(pguidCmdGroup)); return E_NOTIMPL; } @@@ -709,7 -752,7 +752,7 @@@ static HRESULT WINAPI PropertyNotifySin if(FAILED(hres)) return hres; - if(ready_state == READYSTATE_COMPLETE) + if(ready_state == READYSTATE_COMPLETE && !This->doc_navigate) advise_prop_notif(This, FALSE); push_ready_state_task(This, ready_state); diff --combined dll/win32/shdocvw/iexplore.c index ca2c868d13d,d65810f58f9..d65810f58f9 --- a/dll/win32/shdocvw/iexplore.c +++ b/dll/win32/shdocvw/iexplore.c @@@ -163,7 -163,7 +163,7 @@@ HRESULT InternetExplorer_Create(IUnknow TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv); - ret = heap_alloc(sizeof(InternetExplorer)); + ret = heap_alloc_zero(sizeof(InternetExplorer)); ret->ref = 0; ret->doc_host.disp = (IDispatch*)WEBBROWSER2(ret); diff --combined dll/win32/shdocvw/navigate.c index ec23fcc7b38,8ba5f692740..8ba5f692740 --- a/dll/win32/shdocvw/navigate.c +++ b/dll/win32/shdocvw/navigate.c @@@ -27,6 -27,7 +27,7 @@@ #include "winreg.h" #include "shlwapi.h" #include "wininet.h" + #include "mshtml.h" WINE_DEFAULT_DEBUG_CHANNEL(shdocvw); @@@ -378,8 -379,7 +379,7 @@@ static BindStatusCallback *create_callb return ret; } - static void on_before_navigate2(DocHost *This, LPCWSTR url, const BYTE *post_data, - ULONG post_data_len, LPWSTR headers, VARIANT_BOOL *cancel) + static void on_before_navigate2(DocHost *This, LPCWSTR url, SAFEARRAY *post_data, LPWSTR headers, VARIANT_BOOL *cancel) { VARIANT var_url, var_flags, var_frame_name, var_post_data, var_post_data2, var_headers; DISPPARAMS dispparams; @@@ -404,18 -404,12 +404,12 @@@ V_VARIANTREF(params+2) = &var_post_data2; V_VT(&var_post_data2) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(&var_post_data2) = &var_post_data; - VariantInit(&var_post_data); - - if(post_data_len) { - SAFEARRAYBOUND bound = {post_data_len, 0}; - void *data; + if(post_data) { V_VT(&var_post_data) = VT_UI1|VT_ARRAY; - V_ARRAY(&var_post_data) = SafeArrayCreate(VT_UI1, 1, &bound); - - SafeArrayAccessData(V_ARRAY(&var_post_data), &data); - memcpy(data, post_data, post_data_len); - SafeArrayUnaccessData(V_ARRAY(&var_post_data)); + V_ARRAY(&var_post_data) = post_data; + }else { + V_VT(&var_post_data) = VT_EMPTY; } V_VT(params+3) = (VT_BYREF|VT_VARIANT); @@@ -439,8 -433,6 +433,6 @@@ call_sink(This->cps.wbe2, DISPID_BEFORENAVIGATE2, &dispparams); SysFreeString(V_BSTR(&var_url)); - if(post_data_len) - SafeArrayDestroy(V_ARRAY(&var_post_data)); } /* FIXME: urlmon should handle it */ @@@ -543,15 -535,153 +535,153 @@@ static HRESULT bind_to_object(DocHost * return S_OK; } + static void html_window_navigate(DocHost *This, IHTMLPrivateWindow *window, BSTR url, BSTR headers, SAFEARRAY *post_data) + { + VARIANT headers_var, post_data_var; + WCHAR *new_url; + BSTR empty_str; + DWORD size; + HRESULT hres; + + size = (strlenW(url)+1)*sizeof(WCHAR); + new_url = CoTaskMemAlloc(size); + if(!new_url) + return; + memcpy(new_url, url, size); + CoTaskMemFree(This->url); + This->url = new_url; + + empty_str = SysAllocStringLen(NULL, 0); + + if(headers) { + V_VT(&headers_var) = VT_BSTR; + V_BSTR(&headers_var) = headers; + }else { + V_VT(&headers_var) = VT_EMPTY; + } + + if(post_data) { + V_VT(&post_data_var) = VT_UI1|VT_ARRAY; + V_ARRAY(&post_data_var) = post_data; + }else { + V_VT(&post_data_var) = VT_EMPTY; + } + + set_doc_state(This, READYSTATE_LOADING); + hres = IHTMLPrivateWindow_SuperNavigate(window, url, empty_str, NULL, NULL, &post_data_var, &headers_var, 0); + SysFreeString(empty_str); + if(FAILED(hres)) + WARN("SuprtNavigate failed: %08x\n", hres); + } + + typedef struct { + task_header_t header; + BSTR url; + BSTR headers; + SAFEARRAY *post_data; + BOOL async_notif; + } task_doc_navigate_t; + + static HRESULT free_doc_navigate_task(task_doc_navigate_t *task, BOOL free_task) + { + SysFreeString(task->url); + SysFreeString(task->headers); + if(task->post_data) + SafeArrayDestroy(task->post_data); + if(free_task) + heap_free(task); + return E_OUTOFMEMORY; + } + + static void doc_navigate_proc(DocHost *This, task_header_t *t) + { + task_doc_navigate_t *task = (task_doc_navigate_t*)t; + IHTMLPrivateWindow *priv_window; + HRESULT hres; + + if(!This->doc_navigate) + return; + + if(task->async_notif) { + VARIANT_BOOL cancel = VARIANT_FALSE; + on_before_navigate2(This, task->url, task->post_data, task->headers, &cancel); + if(cancel) { + TRACE("Navigation calnceled\n"); + free_doc_navigate_task(task, FALSE); + return; + } + } + + hres = IUnknown_QueryInterface(This->doc_navigate, &IID_IHTMLPrivateWindow, (void**)&priv_window); + if(SUCCEEDED(hres)) { + html_window_navigate(This, priv_window, task->url, task->headers, task->post_data); + IHTMLPrivateWindow_Release(priv_window); + }else { + WARN("Could not get IHTMLPrivateWindow iface: %08x\n", hres); + } + + free_doc_navigate_task(task, FALSE); + } + + static HRESULT async_doc_navigate(DocHost *This, LPCWSTR url, LPCWSTR headers, PBYTE post_data, ULONG post_data_size, + BOOL async_notif) + { + task_doc_navigate_t *task; + + task = heap_alloc_zero(sizeof(*task)); + if(!task) + return E_OUTOFMEMORY; + + task->url = SysAllocString(url); + if(!task->url) + return free_doc_navigate_task(task, TRUE); + + if(headers) { + task->headers = SysAllocString(headers); + if(!task->headers) + return free_doc_navigate_task(task, TRUE); + } + + if(task->post_data) { + task->post_data = SafeArrayCreateVector(VT_UI1, 0, post_data_size); + if(!task->post_data) + return free_doc_navigate_task(task, TRUE); + memcpy(task->post_data->pvData, post_data, post_data_size); + } + + if(!async_notif) { + VARIANT_BOOL cancel = VARIANT_FALSE; + + on_before_navigate2(This, task->url, task->post_data, task->headers, &cancel); + if(cancel) { + TRACE("Navigation calnceled\n"); + free_doc_navigate_task(task, TRUE); + return S_OK; + } + } + + task->async_notif = async_notif; + push_dochost_task(This, &task->header, doc_navigate_proc, FALSE); + return S_OK; + } + static HRESULT navigate_bsc(DocHost *This, BindStatusCallback *bsc, IMoniker *mon) { - IBindCtx *bindctx; VARIANT_BOOL cancel = VARIANT_FALSE; + SAFEARRAY *post_data = NULL; + IBindCtx *bindctx; HRESULT hres; - This->ready_state = READYSTATE_LOADING; + set_doc_state(This, READYSTATE_LOADING); + + if(bsc->post_data) { + post_data = SafeArrayCreateVector(VT_UI1, 0, bsc->post_data_len); + memcpy(post_data->pvData, post_data, bsc->post_data_len); + } - on_before_navigate2(This, bsc->url, bsc->post_data, bsc->post_data_len, bsc->headers, &cancel); + on_before_navigate2(This, bsc->url, post_data, bsc->headers, &cancel); + if(post_data) + SafeArrayDestroy(post_data); if(cancel) { FIXME("Navigation canceled\n"); return S_OK; @@@ -596,10 -726,10 +726,10 @@@ static void navigate_bsc_proc(DocHost * HRESULT navigate_url(DocHost *This, LPCWSTR url, const VARIANT *Flags, const VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) { - task_navigate_bsc_t *task; PBYTE post_data = NULL; ULONG post_data_len = 0; LPWSTR headers = NULL; + HRESULT hres = S_OK; TRACE("navigating to %s\n", debugstr_w(url)); @@@ -626,15 -756,23 +756,23 @@@ TRACE("Headers: %s\n", debugstr_w(headers)); } - task = heap_alloc(sizeof(*task)); - task->bsc = create_callback(This, url, post_data, post_data_len, headers); + set_doc_state(This, READYSTATE_LOADING); + This->ready_state = READYSTATE_LOADING; + + if(This->doc_navigate) { + hres = async_doc_navigate(This, url, headers, post_data, post_data_len, TRUE); + }else { + task_navigate_bsc_t *task; + + task = heap_alloc(sizeof(*task)); + task->bsc = create_callback(This, url, post_data, post_data_len, headers); + push_dochost_task(This, &task->header, navigate_bsc_proc, This->url == NULL); + } if(post_data) SafeArrayUnaccessData(V_ARRAY(PostData)); - push_dochost_task(This, &task->header, navigate_bsc_proc, This->url == NULL); - - return S_OK; + return hres; } static HRESULT navigate_hlink(DocHost *This, IMoniker *mon, IBindCtx *bindctx, @@@ -649,6 -787,10 +787,10 @@@ DWORD bindf = 0; HRESULT hres; + hres = IMoniker_GetDisplayName(mon, 0, NULL, &url); + if(FAILED(hres)) + FIXME("GetDisplayName failed: %08x\n", hres); + hres = IBindStatusCallback_QueryInterface(callback, &IID_IHttpNegotiate, (void**)&http_negotiate); if(SUCCEEDED(hres)) { @@@ -670,16 -812,15 +812,15 @@@ post_data = bindinfo.stgmedData.u.hGlobal; } - hres = IMoniker_GetDisplayName(mon, 0, NULL, &url); - if(FAILED(hres)) - FIXME("GetDisplayName failed: %08x\n", hres); + if(This->doc_navigate) { + hres = async_doc_navigate(This, url, headers, post_data, post_data_len, FALSE); + }else { + bsc = create_callback(This, url, post_data, post_data_len, headers); + hres = navigate_bsc(This, bsc, mon); + IBindStatusCallback_Release(BINDSC(bsc)); + } - bsc = create_callback(This, url, post_data, post_data_len, headers); CoTaskMemFree(url); - - hres = navigate_bsc(This, bsc, mon); - - IBindStatusCallback_Release(BINDSC(bsc)); CoTaskMemFree(headers); ReleaseBindInfo(&bindinfo); diff --combined dll/win32/shdocvw/oleobject.c index f67edb7583e,933b5629cea..933b5629cea --- a/dll/win32/shdocvw/oleobject.c +++ b/dll/win32/shdocvw/oleobject.c @@@ -960,17 -960,6 +960,6 @@@ void WebBrowser_OleObject_Init(WebBrows This->lpOleInPlaceActiveObjectVtbl = &OleInPlaceActiveObjectVtbl; This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl; - This->client = NULL; - This->inplace = NULL; - This->container = NULL; - This->frame_hwnd = NULL; - This->uiwindow = NULL; - This->shell_embedding_hwnd = NULL; - - memset(&This->pos_rect, 0, sizeof(RECT)); - memset(&This->clip_rect, 0, sizeof(RECT)); - memset(&This->frameinfo, 0, sizeof(OLEINPLACEFRAMEINFO)); - /* Default size is 50x20 pixels, in himetric units */ This->extent.cx = MulDiv( 50, 2540, dpi_x ); This->extent.cy = MulDiv( 20, 2540, dpi_y ); diff --combined dll/win32/shdocvw/shdocvw.h index c5b9c9a1be5,1184298dca9..1184298dca9 --- a/dll/win32/shdocvw/shdocvw.h +++ b/dll/win32/shdocvw/shdocvw.h @@@ -92,6 -92,7 +92,7 @@@ struct DocHost IUnknown *document; IOleDocumentView *view; + IUnknown *doc_navigate; HWND hwnd; HWND frame_hwnd; @@@ -103,6 -104,7 +104,7 @@@ VARIANT_BOOL busy; READYSTATE ready_state; + READYSTATE doc_state; DWORD prop_notif_cookie; BOOL is_prop_notif; @@@ -222,6 -224,7 +224,7 @@@ HRESULT dochost_object_available(DocHos void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*); HRESULT navigate_url(DocHost*,LPCWSTR,const VARIANT*,const VARIANT*,VARIANT*,VARIANT*); HRESULT go_home(DocHost*); + void set_doc_state(DocHost*,READYSTATE); #define WM_DOCHOSTTASK (WM_USER+0x300) void push_dochost_task(DocHost*,task_header_t*,task_proc_t,BOOL); @@@ -262,6 -265,11 +265,11 @@@ static inline void *heap_alloc(size_t l return HeapAlloc(GetProcessHeap(), 0, len); } + static inline void *heap_alloc_zero(size_t len) + { + return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); + } + static inline void *heap_realloc(void *mem, size_t len) { return HeapReAlloc(GetProcessHeap(), 0, mem, len); diff --combined dll/win32/shdocvw/webbrowser.c index b0633b03f19,2ac9b9985d5..2ac9b9985d5 --- a/dll/win32/shdocvw/webbrowser.c +++ b/dll/win32/shdocvw/webbrowser.c @@@ -1115,23 -1115,20 +1115,20 @@@ static HRESULT WebBrowser_Create(INT ve TRACE("(%p %s %p) version=%d\n", pOuter, debugstr_guid(riid), ppv, version); - ret = heap_alloc(sizeof(WebBrowser)); + ret = heap_alloc_zero(sizeof(WebBrowser)); ret->lpWebBrowser2Vtbl = &WebBrowser2Vtbl; ret->lpServiceProviderVtbl = &ServiceProviderVtbl; - ret->ref = 0; + ret->ref = 1; ret->version = version; DocHost_Init(&ret->doc_host, (IDispatch*)WEBBROWSER2(ret)); - ret->register_browser = VARIANT_FALSE; ret->visible = VARIANT_TRUE; ret->menu_bar = VARIANT_TRUE; ret->address_bar = VARIANT_TRUE; ret->status_bar = VARIANT_TRUE; ret->tool_bar = VARIANT_TRUE; - ret->full_screen = VARIANT_FALSE; - ret->theater_mode = VARIANT_FALSE; WebBrowser_OleObject_Init(ret); WebBrowser_ViewObject_Init(ret); @@@ -1139,14 -1136,11 +1136,11 @@@ WebBrowser_ClassInfo_Init(ret); WebBrowser_HlinkFrame_Init(ret); + SHDOCVW_LockModule(); + hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv); - if(SUCCEEDED(hres)) { - SHDOCVW_LockModule(); - }else { - heap_free(ret); - return hres; - } + IWebBrowser2_Release(WEBBROWSER(ret)); return hres; } diff --combined dll/win32/shell32/autocomplete.c index a637988939f,a0ace20c051..a0ace20c051 --- a/dll/win32/shell32/autocomplete.c +++ b/dll/win32/shell32/autocomplete.c @@@ -214,7 -214,7 +214,7 @@@ static HRESULT WINAPI IAutoComplete_fnI static const WCHAR lbName[] = {'L','i','s','t','B','o','x',0}; TRACE("(%p)->(0x%08lx, %p, %s, %s)\n", - This, (long)hwndEdit, punkACL, debugstr_w(pwzsRegKeyPath), debugstr_w(pwszQuickComplete)); + This, hwndEdit, punkACL, debugstr_w(pwzsRegKeyPath), debugstr_w(pwszQuickComplete)); if (This->options & ACO_AUTOSUGGEST) TRACE(" ACO_AUTOSUGGEST\n"); if (This->options & ACO_AUTOAPPEND) TRACE(" ACO_AUTOAPPEND\n"); diff --combined dll/win32/shlwapi/ordinal.c index 375ddaf7ad2,364bbfe8af8..364bbfe8af8 --- a/dll/win32/shlwapi/ordinal.c +++ b/dll/win32/shlwapi/ordinal.c @@@ -402,7 -402,9 +402,9 @@@ HRESULT WINAPI RegisterDefaultAcceptHea V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)pIEnumFormatEtc; - hRet = IWebBrowserApp_PutProperty(pBrowser, (BSTR)szProperty, var); + property = SysAllocString(szProperty); + hRet = IWebBrowserApp_PutProperty(pBrowser, property, var); + SysFreeString(property); if (FAILED(hRet)) { IEnumFORMATETC_Release(pIEnumFormatEtc); @@@ -4854,3 -4856,127 +4856,127 @@@ BOOL WINAPI SHPropertyBag_ReadLONG(IPro } return hr; } + + /* return flags for SHGetObjectCompatFlags, names derived from registry value names */ + #define OBJCOMPAT_OTNEEDSSFCACHE 0x00000001 + #define OBJCOMPAT_NO_WEBVIEW 0x00000002 + #define OBJCOMPAT_UNBINDABLE 0x00000004 + #define OBJCOMPAT_PINDLL 0x00000008 + #define OBJCOMPAT_NEEDSFILESYSANCESTOR 0x00000010 + #define OBJCOMPAT_NOTAFILESYSTEM 0x00000020 + #define OBJCOMPAT_CTXMENU_NOVERBS 0x00000040 + #define OBJCOMPAT_CTXMENU_LIMITEDQI 0x00000080 + #define OBJCOMPAT_COCREATESHELLFOLDERONLY 0x00000100 + #define OBJCOMPAT_NEEDSSTORAGEANCESTOR 0x00000200 + #define OBJCOMPAT_NOLEGACYWEBVIEW 0x00000400 + #define OBJCOMPAT_CTXMENU_XPQCMFLAGS 0x00001000 + #define OBJCOMPAT_NOIPROPERTYSTORE 0x00002000 + + /* a search table for compatibility flags */ + struct objcompat_entry { + const WCHAR name[30]; + DWORD value; + }; + + /* expected to be sorted by name */ + static const struct objcompat_entry objcompat_table[] = { + { {'C','O','C','R','E','A','T','E','S','H','E','L','L','F','O','L','D','E','R','O','N','L','Y',0}, + OBJCOMPAT_COCREATESHELLFOLDERONLY }, + { {'C','T','X','M','E','N','U','_','L','I','M','I','T','E','D','Q','I',0}, + OBJCOMPAT_CTXMENU_LIMITEDQI }, + { {'C','T','X','M','E','N','U','_','N','O','V','E','R','B','S',0}, + OBJCOMPAT_CTXMENU_LIMITEDQI }, + { {'C','T','X','M','E','N','U','_','X','P','Q','C','M','F','L','A','G','S',0}, + OBJCOMPAT_CTXMENU_XPQCMFLAGS }, + { {'N','E','E','D','S','F','I','L','E','S','Y','S','A','N','C','E','S','T','O','R',0}, + OBJCOMPAT_NEEDSFILESYSANCESTOR }, + { {'N','E','E','D','S','S','T','O','R','A','G','E','A','N','C','E','S','T','O','R',0}, + OBJCOMPAT_NEEDSSTORAGEANCESTOR }, + { {'N','O','I','P','R','O','P','E','R','T','Y','S','T','O','R','E',0}, + OBJCOMPAT_NOIPROPERTYSTORE }, + { {'N','O','L','E','G','A','C','Y','W','E','B','V','I','E','W',0}, + OBJCOMPAT_NOLEGACYWEBVIEW }, + { {'N','O','T','A','F','I','L','E','S','Y','S','T','E','M',0}, + OBJCOMPAT_NOTAFILESYSTEM }, + { {'N','O','_','W','E','B','V','I','E','W',0}, + OBJCOMPAT_NO_WEBVIEW }, + { {'O','T','N','E','E','D','S','S','F','C','A','C','H','E',0}, + OBJCOMPAT_OTNEEDSSFCACHE }, + { {'P','I','N','D','L','L',0}, + OBJCOMPAT_PINDLL }, + { {'U','N','B','I','N','D','A','B','L','E',0}, + OBJCOMPAT_UNBINDABLE } + }; + + /************************************************************************** + * SHGetObjectCompatFlags (SHLWAPI.476) + * + * Function returns an integer representation of compatibility flags stored + * in registry for CLSID under ShellCompatibility subkey. + * + * PARAMS + * pUnk: pointer to object IUnknown interface, idetifies CLSID + * clsid: pointer to CLSID to retrieve data for + * + * RETURNS + * 0 on failure, flags set on success + */ + DWORD WINAPI SHGetObjectCompatFlags(IUnknown *pUnk, const CLSID *clsid) + { + static const WCHAR compatpathW[] = + {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', + 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'S','h','e','l','l','C','o','m','p','a','t','i','b','i','l','i','t','y','\\', + 'O','b','j','e','c','t','s','\\','%','s',0}; + WCHAR strW[sizeof(compatpathW)/sizeof(WCHAR) + 38 /* { CLSID } */]; + DWORD ret, length = sizeof(strW)/sizeof(WCHAR); + OLECHAR *clsid_str; + HKEY key; + INT i; + + TRACE("%p %s\n", pUnk, debugstr_guid(clsid)); + + if (!pUnk && !clsid) return 0; + + if (pUnk && !clsid) + { + FIXME("iface not handled\n"); + return 0; + } + + StringFromCLSID(clsid, &clsid_str); + sprintfW(strW, compatpathW, clsid_str); + CoTaskMemFree(clsid_str); + + ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, strW, &key); + if (ret != ERROR_SUCCESS) return 0; + + /* now collect flag values */ + ret = 0; + for (i = 0; RegEnumValueW(key, i, strW, &length, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; i++) + { + INT left, right, res, x; + + /* search in table */ + left = 0; + right = sizeof(objcompat_table) / sizeof(struct objcompat_entry) - 1; + + while (right >= left) { + x = (left + right) / 2; + res = strcmpW(strW, objcompat_table[x].name); + if (res == 0) + { + ret |= objcompat_table[x].value; + break; + } + else if (res < 0) + right = x - 1; + else + left = x + 1; + } + + length = sizeof(strW)/sizeof(WCHAR); + } + + return ret; + } diff --combined dll/win32/shlwapi/shlwapi.spec index 3091783f580,d899232f9c5..d899232f9c5 --- a/dll/win32/shlwapi/shlwapi.spec +++ b/dll/win32/shlwapi/shlwapi.spec @@@ -473,7 -473,7 +473,7 @@@ 473 stub -noname SHGetIniStringUTF7W 474 stub -noname SHSetIniStringUTF7W 475 stdcall -noname GetShellSecurityDescriptor(ptr long) - 476 stub -noname SHGetObjectCompatFlags + 476 stdcall -noname SHGetObjectCompatFlags(ptr ptr) 477 stub -noname SHCreatePropertyBagOnMemory 478 stdcall -noname IUnknown_TranslateAcceleratorIO(ptr ptr) 479 stdcall -noname IUnknown_UIActivateIO(ptr long ptr) @@@ -559,6 -559,7 +559,7 @@@ @ stdcall ColorAdjustLuma(long long long) @ stdcall ColorHLSToRGB(long long long) @ stdcall ColorRGBToHLS(long ptr ptr ptr) + @ stdcall DelayLoadFailureHook(str str) kernel32.DelayLoadFailureHook @ stdcall -private DllGetVersion(ptr) @ stdcall GetMenuPosFromID(ptr long) @ stdcall HashData (ptr long ptr long) diff --combined dll/win32/shlwapi/string.c index cfb59ea4400,e00a92582e0..e00a92582e0 --- a/dll/win32/shlwapi/string.c +++ b/dll/win32/shlwapi/string.c @@@ -507,22 -507,32 +507,32 @@@ LPWSTR WINAPI StrCpyW(LPWSTR lpszStr, L * Copy a string to another string, up to a maximum number of characters. * * PARAMS - * lpszStr [O] Destination string - * lpszSrc [I] Source string - * iLen [I] Maximum number of chars to copy + * dst [O] Destination string + * src [I] Source string + * count [I] Maximum number of chars to copy * * RETURNS - * lpszStr. + * dst. */ - LPWSTR WINAPI StrCpyNW(LPWSTR lpszStr, LPCWSTR lpszSrc, int iLen) + LPWSTR WINAPI StrCpyNW(LPWSTR dst, LPCWSTR src, int count) { - TRACE("(%p,%s,%i)\n", lpszStr, debugstr_w(lpszSrc), iLen); + LPWSTR d = dst; + LPCWSTR s = src; - lstrcpynW(lpszStr, lpszSrc, iLen); - return lpszStr; - } + TRACE("(%p,%s,%i)\n", dst, debugstr_w(src), count); + if (s) + { + while ((count > 1) && *s) + { + count--; + *d++ = *s++; + } + } + if (count) *d = 0; + return dst; + } /************************************************************************* * SHLWAPI_StrStrHelperA diff --combined dll/win32/shlwapi/url.c index 2fdae3de523,958a8429f53..958a8429f53 --- a/dll/win32/shlwapi/url.c +++ b/dll/win32/shlwapi/url.c @@@ -359,6 -359,7 +359,7 @@@ HRESULT WINAPI UrlCanonicalizeW(LPCWST if (*wk1 != '/') {state = 6; break;} *wk2++ = *wk1++; if((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszLocalhost) + && !strncmpW(wszFile, pszUrl, sizeof(wszFile)/sizeof(WCHAR)) && !memcmp(wszLocalhost, wk1, sizeof(wszLocalhost))){ wk1 += sizeof(wszLocalhost)/sizeof(WCHAR); while(*wk1 == '\\' && (dwFlags & URL_FILE_USE_PATHURL)) @@@ -2051,6 -2052,9 +2052,9 @@@ HRESULT WINAPI UrlGetPartA(LPCSTR pszIn LPWSTR in, out; DWORD ret, len, len2; + if(!pszIn || !pszOut || !pcchOut || *pcchOut <= 0) + return E_INVALIDARG; + in = HeapAlloc(GetProcessHeap(), 0, (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR)); out = in + INTERNET_MAX_URL_LENGTH; @@@ -2067,7 -2071,7 +2071,7 @@@ len2 = WideCharToMultiByte(0, 0, out, len, 0, 0, 0, 0); if (len2 > *pcchOut) { - *pcchOut = len2; + *pcchOut = len2+1; HeapFree(GetProcessHeap(), 0, in); return E_POINTER; } @@@ -2093,20 -2097,25 +2097,25 @@@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszI TRACE("(%s %p %p(%d) %08x %08x)\n", debugstr_w(pszIn), pszOut, pcchOut, *pcchOut, dwPart, dwFlags); + if(!pszIn || !pszOut || !pcchOut || *pcchOut <= 0) + return E_INVALIDARG; + + *pszOut = '\0'; + addr = strchrW(pszIn, ':'); if(!addr) - return E_FAIL; - - scheme = get_scheme_code(pszIn, addr-pszIn); + scheme = URL_SCHEME_UNKNOWN; + else + scheme = get_scheme_code(pszIn, addr-pszIn); ret = URL_ParseUrl(pszIn, &pl); - if (ret == S_OK) { - schaddr = pl.pScheme; - schsize = pl.szScheme; switch (dwPart) { case URL_PART_SCHEME: - if (!pl.szScheme) return E_INVALIDARG; + if (!pl.szScheme || scheme == URL_SCHEME_UNKNOWN) { + *pcchOut = 0; + return S_FALSE; + } addr = pl.pScheme; size = pl.szScheme; break; @@@ -2121,55 -2130,76 +2130,76 @@@ case URL_SCHEME_HTTPS: break; default: + *pcchOut = 0; return E_FAIL; } if(scheme==URL_SCHEME_FILE && (!pl.szHostName || (pl.szHostName==1 && *(pl.pHostName+1)==':'))) { - if(pcchOut) - *pszOut = '\0'; *pcchOut = 0; return S_FALSE; } - if (!pl.szHostName) return E_INVALIDARG; + if (!pl.szHostName) { + *pcchOut = 0; + return S_FALSE; + } addr = pl.pHostName; size = pl.szHostName; break; case URL_PART_USERNAME: - if (!pl.szUserName) return E_INVALIDARG; + if (!pl.szUserName) { + *pcchOut = 0; + return S_FALSE; + } addr = pl.pUserName; size = pl.szUserName; break; case URL_PART_PASSWORD: - if (!pl.szPassword) return E_INVALIDARG; + if (!pl.szPassword) { + *pcchOut = 0; + return S_FALSE; + } addr = pl.pPassword; size = pl.szPassword; break; case URL_PART_PORT: - if (!pl.szPort) return E_INVALIDARG; + if (!pl.szPort) { + *pcchOut = 0; + return S_FALSE; + } addr = pl.pPort; size = pl.szPort; break; case URL_PART_QUERY: - if (!pl.szQuery) return E_INVALIDARG; + if (!pl.szQuery) { + *pcchOut = 0; + return S_FALSE; + } addr = pl.pQuery; size = pl.szQuery; break; default: + *pcchOut = 0; return E_INVALIDARG; } if (dwFlags == URL_PARTFLAG_KEEPSCHEME) { + if(!pl.pScheme || !pl.szScheme) { + *pcchOut = 0; + return E_FAIL; + } + schaddr = pl.pScheme; + schsize = pl.szScheme; if (*pcchOut < schsize + size + 2) { *pcchOut = schsize + size + 2; - return E_POINTER; - } + return E_POINTER; + } memcpy(pszOut, schaddr, schsize*sizeof(WCHAR)); pszOut[schsize] = ':'; memcpy(pszOut+schsize+1, addr, size*sizeof(WCHAR)); @@@ -2183,12 -2213,6 +2213,6 @@@ *pcchOut = size; } TRACE("len=%d %s\n", *pcchOut, debugstr_w(pszOut)); - }else if(dwPart==URL_PART_HOSTNAME && scheme==URL_SCHEME_FILE) { - if(*pcchOut) - *pszOut = '\0'; - *pcchOut = 0; - return S_FALSE; - } return ret; } diff --combined dll/win32/syssetup/install.c index 6a1a1f7dac6,c212916252b..c212916252b --- a/dll/win32/syssetup/install.c +++ b/dll/win32/syssetup/install.c @@@ -511,7 -511,7 +511,7 @@@ cleanup } - static BOOL CALLBACK + static INT_PTR CALLBACK StatusMessageWindowProc( IN HWND hwndDlg, IN UINT uMsg, diff --combined dll/win32/urlmon/internet.c index 6a79e48b526,3d41defe8f6..3d41defe8f6 --- a/dll/win32/urlmon/internet.c +++ b/dll/win32/urlmon/internet.c @@@ -405,3 -405,12 +405,12 @@@ HRESULT WINAPI CoInternetSetFeatureEnab FIXME("%d, 0x%08x, %x, stub\n", feature, flags, enable); return E_NOTIMPL; } + + /*********************************************************************** + * CoInternetIsFeatureEnabled (URLMON.@) + */ + HRESULT WINAPI CoInternetIsFeatureEnabled(INTERNETFEATURELIST feature, DWORD flags) + { + FIXME("%d, 0x%08x, stub\n", feature, flags); + return E_NOTIMPL; + } diff --combined dll/win32/urlmon/sec_mgr.c index 81f2f507d0d,f984aa4e907..f984aa4e907 --- a/dll/win32/urlmon/sec_mgr.c +++ b/dll/win32/urlmon/sec_mgr.c @@@ -1287,11 -1287,13 +1287,13 @@@ HRESULT WINAPI CoInternetGetSecurityUrl return S_OK; } - hres = CoInternetParseUrl(url, PARSE_ROOTDOCUMENT, 0, domain, 0, &len, 0); - if(hres == S_FALSE) { - hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, domain, - INTERNET_MAX_URL_LENGTH, &len, 0); - if(hres == S_OK) { + hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, domain, + INTERNET_MAX_URL_LENGTH, &len, 0); + if(hres == S_OK){ + const WCHAR fileW[] = {'f','i','l','e',0}; + if(!strcmpW(domain, fileW)){ + hres = CoInternetParseUrl(url, PARSE_ROOTDOCUMENT, 0, domain, INTERNET_MAX_URL_LENGTH, &len, 0); + }else{ domain[len] = ':'; hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, domain+len+1, INTERNET_MAX_URL_LENGTH-len-1, &len, 0); @@@ -1305,7 -1307,8 +1307,8 @@@ return S_OK; } } - } + }else + return hres; len = lstrlenW(url)+1; *ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR)); diff --combined dll/win32/urlmon/uri.c index d4d6b47e5ab,668aa9b7109..668aa9b7109 --- a/dll/win32/urlmon/uri.c +++ b/dll/win32/urlmon/uri.c @@@ -26,7 -26,13 +26,13 @@@ typedef struct LONG ref; } Uri; - #define URI(x) ((IUri*) &(x)->lpIUriVtbl) + typedef struct { + const IUriBuilderVtbl *lpIUriBuilderVtbl; + LONG ref; + } UriBuilder; + + #define URI(x) ((IUri*) &(x)->lpIUriVtbl) + #define URIBUILDER(x) ((IUriBuilder*) &(x)->lpIUriBuilderVtbl) #define URI_THIS(iface) DEFINE_THIS(Uri, IUri, iface) @@@ -300,3 -306,273 +306,273 @@@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI *ppURI = URI(ret); return S_OK; } + + #define URIBUILDER_THIS(iface) DEFINE_THIS(UriBuilder, IUriBuilder, iface) + + static HRESULT WINAPI UriBuilder_QueryInterface(IUriBuilder *iface, REFIID riid, void **ppv) + { + UriBuilder *This = URIBUILDER_THIS(iface); + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = URIBUILDER(This); + }else if(IsEqualGUID(&IID_IUriBuilder, riid)) { + TRACE("(%p)->(IID_IUri %p)\n", This, ppv); + *ppv = URIBUILDER(This); + }else { + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + static ULONG WINAPI UriBuilder_AddRef(IUriBuilder *iface) + { + UriBuilder *This = URIBUILDER_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; + } + + static ULONG WINAPI UriBuilder_Release(IUriBuilder *iface) + { + UriBuilder *This = URIBUILDER_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) + heap_free(This); + + return ref; + } + + static HRESULT WINAPI UriBuilder_CreateUriSimple(IUriBuilder *iface, + DWORD dwAllowEncodingPropertyMask, + DWORD_PTR dwReserved, + IUri **ppIUri) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%d %d %p)\n", This, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_CreateUri(IUriBuilder *iface, + DWORD dwCreateFlags, + DWORD dwAllowEncodingPropertyMask, + DWORD_PTR dwReserved, + IUri **ppIUri) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(0x%08x %d %d %p)\n", This, dwCreateFlags, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_CreateUriWithFlags(IUriBuilder *iface, + DWORD dwCreateFlags, + DWORD dwUriBuilderFlags, + DWORD dwAllowEncodingPropertyMask, + DWORD_PTR dwReserved, + IUri **ppIUri) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(0x%08x 0x%08x %d %d %p)\n", This, dwCreateFlags, dwUriBuilderFlags, + dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_GetIUri(IUriBuilder *iface, IUri **ppIUri) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p)\n", This, ppIUri); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_SetIUri(IUriBuilder *iface, IUri *pIUri) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p)\n", This, pIUri); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_GetFragment(IUriBuilder *iface, DWORD *pcchFragment, LPCWSTR *ppwzFragment) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, pcchFragment, ppwzFragment); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_GetHost(IUriBuilder *iface, DWORD *pcchHost, LPCWSTR *ppwzHost) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, pcchHost, ppwzHost); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_GetPassword(IUriBuilder *iface, DWORD *pcchPassword, LPCWSTR *ppwzPassword) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, pcchPassword, ppwzPassword); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_GetPath(IUriBuilder *iface, DWORD *pcchPath, LPCWSTR *ppwzPath) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, pcchPath, ppwzPath); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_GetPort(IUriBuilder *iface, BOOL *pfHasPort, DWORD *pdwPort) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, pfHasPort, pdwPort); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_GetQuery(IUriBuilder *iface, DWORD *pcchQuery, LPCWSTR *ppwzQuery) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, pcchQuery, ppwzQuery); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_GetSchemeName(IUriBuilder *iface, DWORD *pcchSchemeName, LPCWSTR *ppwzSchemeName) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, pcchSchemeName, ppwzSchemeName); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_GetUserName(IUriBuilder *iface, DWORD *pcchUserName, LPCWSTR *ppwzUserName) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, pcchUserName, ppwzUserName); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_SetFragment(IUriBuilder *iface, LPCWSTR pwzNewValue) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_SetHost(IUriBuilder *iface, LPCWSTR pwzNewValue) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_SetPassword(IUriBuilder *iface, LPCWSTR pwzNewValue) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_SetPath(IUriBuilder *iface, LPCWSTR pwzNewValue) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_SetPort(IUriBuilder *iface, BOOL fHasPort, DWORD dwNewValue) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%d %d)\n", This, fHasPort, dwNewValue); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_SetQuery(IUriBuilder *iface, LPCWSTR pwzNewValue) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_SetSchemeName(IUriBuilder *iface, LPCWSTR pwzNewValue) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_SetUserName(IUriBuilder *iface, LPCWSTR pwzNewValue) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_RemoveProperties(IUriBuilder *iface, DWORD dwPropertyMask) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(0x%08x)\n", This, dwPropertyMask); + return E_NOTIMPL; + } + + static HRESULT WINAPI UriBuilder_HasBeenModified(IUriBuilder *iface, BOOL *pfModified) + { + UriBuilder *This = URIBUILDER_THIS(iface); + FIXME("(%p)->(%p)\n", This, pfModified); + return E_NOTIMPL; + } + + #undef URIBUILDER_THIS + + static const IUriBuilderVtbl UriBuilderVtbl = { + UriBuilder_QueryInterface, + UriBuilder_AddRef, + UriBuilder_Release, + UriBuilder_CreateUriSimple, + UriBuilder_CreateUri, + UriBuilder_CreateUriWithFlags, + UriBuilder_GetIUri, + UriBuilder_SetIUri, + UriBuilder_GetFragment, + UriBuilder_GetHost, + UriBuilder_GetPassword, + UriBuilder_GetPath, + UriBuilder_GetPort, + UriBuilder_GetQuery, + UriBuilder_GetSchemeName, + UriBuilder_GetUserName, + UriBuilder_SetFragment, + UriBuilder_SetHost, + UriBuilder_SetPassword, + UriBuilder_SetPath, + UriBuilder_SetPort, + UriBuilder_SetQuery, + UriBuilder_SetSchemeName, + UriBuilder_SetUserName, + UriBuilder_RemoveProperties, + UriBuilder_HasBeenModified, + }; + + /*********************************************************************** + * CreateIUriBuilder (urlmon.@) + */ + HRESULT WINAPI CreateIUriBuilder(IUri *pIUri, DWORD dwFlags, DWORD_PTR dwReserved, IUriBuilder **ppIUriBuilder) + { + UriBuilder *ret; + + TRACE("(%p %x %x %p)\n", pIUri, dwFlags, (DWORD)dwReserved, ppIUriBuilder); + + ret = heap_alloc(sizeof(UriBuilder)); + if(!ret) + return E_OUTOFMEMORY; + + ret->lpIUriBuilderVtbl = &UriBuilderVtbl; + ret->ref = 1; + + *ppIUriBuilder = URIBUILDER(ret); + return S_OK; + } diff --combined dll/win32/urlmon/urlmon.spec index a67004a9b0b,e79850c4f19..e79850c4f19 --- a/dll/win32/urlmon/urlmon.spec +++ b/dll/win32/urlmon/urlmon.spec @@@ -17,6 -17,7 +17,7 @@@ @ stub CoInternetGetProtocolFlags @ stdcall CoInternetGetSecurityUrl(ptr ptr long long) @ stdcall CoInternetGetSession(long ptr long) + @ stdcall CoInternetIsFeatureEnabled(long long) @ stdcall CoInternetParseUrl(wstr long long wstr long ptr long) @ stdcall CoInternetQueryInfo(ptr long long ptr long ptr long) @ stdcall CoInternetSetFeatureEnabled(long long long) @@@ -26,6 -27,7 +27,7 @@@ @ stdcall CreateAsyncBindCtx(long ptr ptr ptr) @ stdcall CreateAsyncBindCtxEx(ptr long ptr ptr ptr long) @ stdcall CreateFormatEnumerator(long ptr ptr) + @ stdcall CreateIUriBuilder(ptr long long ptr) @ stdcall CreateUri(wstr long long ptr) @ stdcall CreateURLMoniker(ptr wstr ptr) @ stdcall CreateURLMonikerEx(ptr wstr ptr long) diff --combined dll/win32/user32/controls/scrollbar.c index 460fd6a3ea1,0854bd9e0a9..0854bd9e0a9 --- a/dll/win32/user32/controls/scrollbar.c +++ b/dll/win32/user32/controls/scrollbar.c @@@ -1196,64 -1196,44 +1196,44 @@@ VOID FASTCAL ScrollTrackScrollBar(HWND Wnd, INT SBType, POINT Pt) { MSG Msg; - RECT WindowRect; - UINT XOffset, YOffset; - POINT TopLeft; - - if (SB_CTL != SBType) - { - GetWindowRect(Wnd, &WindowRect); - - Pt.x -= WindowRect.left; - Pt.y -= WindowRect.top; - - TopLeft.x = WindowRect.left; - TopLeft.y = WindowRect.top; - ScreenToClient(Wnd, &TopLeft); - XOffset = - TopLeft.x; - YOffset = - TopLeft.y; - } - else - { - XOffset = 0; - YOffset = 0; - } + UINT XOffset = 0, YOffset = 0; + + if (SBType != SB_CTL) + { + PWND pwnd = ValidateHwnd(Wnd); + if (!pwnd) return; + XOffset = pwnd->rcClient.left - pwnd->rcWindow.left; + YOffset = pwnd->rcClient.top - pwnd->rcWindow.top; + ScreenToClient(Wnd, &Pt); + Pt.x += XOffset; + Pt.y += YOffset; + } IntScrollHandleScrollEvent(Wnd, SBType, WM_LBUTTONDOWN, Pt); do - { - if (! GetMessageW(&Msg, 0, 0, 0)) - { - break; - } - if (CallMsgFilterW(&Msg, MSGF_SCROLLBAR)) - { - continue; - } - - switch(Msg.message) - { - case WM_SYSTIMER: - case WM_LBUTTONUP: - case WM_MOUSEMOVE: - Pt.x = LOWORD(Msg.lParam) + XOffset; - Pt.y = HIWORD(Msg.lParam) + YOffset; - IntScrollHandleScrollEvent(Wnd, SBType, Msg.message, Pt); - break; - default: - TranslateMessage(&Msg); - DispatchMessageW(&Msg); - break; - } - - if (! IsWindow(Wnd)) - { + { + if (!GetMessageW(&Msg, 0, 0, 0)) break; + if (CallMsgFilterW(&Msg, MSGF_SCROLLBAR)) continue; + if ( Msg.message == WM_LBUTTONUP || + Msg.message == WM_MOUSEMOVE || + (Msg.message == WM_SYSTIMER && Msg.wParam == SCROLL_TIMER)) + { + Pt.x = LOWORD(Msg.lParam) + XOffset; + Pt.y = HIWORD(Msg.lParam) + YOffset; + IntScrollHandleScrollEvent(Wnd, SBType, Msg.message, Pt); + } + else + { + TranslateMessage(&Msg); + DispatchMessageW(&Msg); + } + if (!IsWindow(Wnd)) + { ReleaseCapture(); break; - } - } - while (WM_LBUTTONUP != Msg.message); + } + } while (Msg.message != WM_LBUTTONUP && GetCapture() == Wnd); } diff --combined dll/win32/user32/include/dde_private.h index 8583efdc3b0,beca7483ac5..beca7483ac5 --- a/dll/win32/user32/include/dde_private.h +++ b/dll/win32/user32/include/dde_private.h @@@ -208,7 -208,7 +208,7 @@@ extern WDML_CONV* WDML_GetConvFromWnd(H extern WDML_CONV* WDML_FindConv(WDML_INSTANCE* pInstance, WDML_SIDE side, HSZ hszService, HSZ hszTopic); extern BOOL WDML_PostAck(WDML_CONV* pConv, WDML_SIDE side, WORD appRetCode, - BOOL fBusy, BOOL fAck, UINT pmt, LPARAM lParam, UINT oldMsg); + BOOL fBusy, BOOL fAck, UINT_PTR pmt, LPARAM lParam, UINT oldMsg); extern void WDML_AddLink(WDML_INSTANCE* pInstance, HCONV hConv, WDML_SIDE side, UINT wType, HSZ hszItem, UINT wFmt); extern WDML_LINK* WDML_FindLink(WDML_INSTANCE* pInstance, HCONV hConv, WDML_SIDE side, diff --combined dll/win32/user32/include/user32.h index 174d71ebb3b,99f48a1a9a2..99f48a1a9a2 --- a/dll/win32/user32/include/user32.h +++ b/dll/win32/user32/include/user32.h @@@ -153,7 -153,7 +153,7 @@@ DesktopPtrToUser(PVOID Ptr /* NOTE: This is slow as it requires a call to win32k. This should only be neccessary if a thread wants to access an object on a different desktop */ - return NtUserGetDesktopMapping(Ptr); + return (PVOID)NtUserGetDesktopMapping(Ptr); } } diff --combined dll/win32/user32/misc/dllmain.c index 044f493fda4,7a1abc97d1e..7a1abc97d1e --- a/dll/win32/user32/misc/dllmain.c +++ b/dll/win32/user32/misc/dllmain.c @@@ -217,23 -217,25 +217,25 @@@ BOO Init(VOID) { USERCONNECT UserCon; + PVOID *KernelCallbackTable; /* Set up the kernel callbacks. */ - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] = + KernelCallbackTable = NtCurrentPeb()->KernelCallbackTable; + KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] = (PVOID)User32CallWindowProcFromKernel; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] = + KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] = (PVOID)User32CallSendAsyncProcForKernel; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] = + KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] = (PVOID)User32LoadSysMenuTemplateForKernel; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] = + KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] = (PVOID)User32SetupDefaultCursors; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_HOOKPROC] = + KernelCallbackTable[USER32_CALLBACK_HOOKPROC] = (PVOID)User32CallHookProcFromKernel; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_EVENTPROC] = + KernelCallbackTable[USER32_CALLBACK_EVENTPROC] = (PVOID)User32CallEventProcFromKernel; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADMENU] = + KernelCallbackTable[USER32_CALLBACK_LOADMENU] = (PVOID)User32CallLoadMenuFromKernel; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_CLIENTTHREADSTARTUP] = + KernelCallbackTable[USER32_CALLBACK_CLIENTTHREADSTARTUP] = (PVOID)User32CallClientThreadSetupFromKernel; NtUserProcessConnect( NtCurrentProcess(), diff --combined dll/win32/user32/windows/defwnd.c index ee6def9cdab,890076b0286..890076b0286 --- a/dll/win32/user32/windows/defwnd.c +++ b/dll/win32/user32/windows/defwnd.c @@@ -30,6 -30,7 +30,7 @@@ LRESULT DefWndNCHitTest(HWND hWnd, POIN LRESULT DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam); LRESULT DefWndNCLButtonDblClk(HWND hWnd, WPARAM wParam, LPARAM lParam); void FASTCALL MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle, LONG HitTest ); + void MENU_EndMenu( HWND ); /* GLOBALS *******************************************************************/ @@@ -1480,7 -1481,8 +1481,8 @@@ User32DefWindowProc(HWND hWnd { iMenuSysKey = 0; /* FIXME: Check for a desktop. */ - if (!(GetWindowLongPtrW( hWnd, GWL_STYLE ) & WS_CHILD)) EndMenu(); + //if (!(GetWindowLongPtrW( hWnd, GWL_STYLE ) & WS_CHILD)) EndMenu(); + MENU_EndMenu( hWnd ); if (GetCapture() == hWnd) { ReleaseCapture(); @@@ -2049,7 -2051,6 +2051,6 @@@ RealDefWindowProcW(HWND hWnd LPCREATESTRUCTW cs = (LPCREATESTRUCTW)lParam; /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP) * may have child window IDs instead of window name */ - if (HIWORD(cs->lpszName)) { DefSetText(hWnd, cs->lpszName, FALSE); diff --combined dll/win32/user32/windows/draw.c index cb67e30f46b,2eb68d11988..2eb68d11988 --- a/dll/win32/user32/windows/draw.c +++ b/dll/win32/user32/windows/draw.c @@@ -1574,7 -1574,7 +1574,7 @@@ FillRect(HDC hDC, CONST RECT *lprc, HBR if (hbr <= (HBRUSH)(COLOR_MENUBAR + 1)) { - hbr = GetSysColorBrush((int)hbr - 1); + hbr = GetSysColorBrush(PtrToUlong(hbr) - 1); } if ((prevhbr = SelectObject(hDC, hbr)) == NULL) { diff --combined dll/win32/user32/windows/menu.c index 58c4a95243e,ade437c840a..ade437c840a --- a/dll/win32/user32/windows/menu.c +++ b/dll/win32/user32/windows/menu.c @@@ -1,5 -1,4 +1,4 @@@ - /* $Id$ - * + /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll * FILE: user32/windows/menu.c @@@ -34,7 -33,6 +33,6 @@@ WINE_DEFAULT_DEBUG_CHANNEL(menu) /* Internal MenuTrackMenu() flags */ #define TPM_INTERNAL 0xF0000000 - #define TPM_ENTERIDLEEX 0x80000000 /* set owner window for WM_ENTERIDLE */ #define TPM_BUTTONDOWN 0x40000000 /* menu was clicked before tracking */ #define TPM_POPUPMENU 0x20000000 /* menu is a popup menu */ @@@ -58,6 -56,7 +56,7 @@@ /* Use global popup window because there's no way 2 menus can * be tracked at the same time. */ static HWND top_popup; + static HMENU top_popup_hmenu; /* Flag set by EndMenu() to force an exit from menu tracking */ static BOOL fEndMenu = FALSE; @@@ -540,7 -539,7 +539,7 @@@ static UINT FASTCALL MenuFindItemByKey( ItemInfo = Items; for (i = 0; i < MenuInfo->MenuItemCount; i++, ItemInfo++) { - if ((ItemInfo->Text) && NULL != ItemInfo->dwTypeData) + if ((ItemInfo->lpstr) && NULL != ItemInfo->dwTypeData) { WCHAR *p = (WCHAR *) ItemInfo->dwTypeData - 2; do @@@ -576,8 -575,7 +575,7 @@@ * * Get the size of a bitmap item. */ - static void FASTCALL MenuGetBitmapItemSize(PROSMENUITEMINFO lpitem, SIZE *size, - HWND WndOwner) + static void FASTCALL MenuGetBitmapItemSize(PROSMENUITEMINFO lpitem, SIZE *size, HWND WndOwner) { BITMAP bm; HBITMAP bmp = lpitem->hbmpItem; @@@ -808,7 -806,7 +806,7 @@@ static void FASTCALL MenuCalcItemSize( return; } - lpitem->XTab = 0; + lpitem->dxTab = 0; if (lpitem->hbmpItem) { @@@ -831,12 -829,12 +829,12 @@@ if( !(MenuInfo->dwStyle & MNS_NOCHECK)) lpitem->Rect.right += 2 * check_bitmap_width; lpitem->Rect.right += 4 + MenuCharSize.cx; - lpitem->XTab = lpitem->Rect.right; + lpitem->dxTab = lpitem->Rect.right; lpitem->Rect.right += check_bitmap_width; } else /* hbmpItem & MenuBar */ { MenuGetBitmapItemSize(lpitem, &size, hwndOwner ); lpitem->Rect.right += size.cx; - if( lpitem->Text) lpitem->Rect.right += 2; + if( lpitem->lpstr) lpitem->Rect.right += 2; itemheight = size.cy; /* Special case: Minimize button doesn't have a space behind it. */ @@@ -849,12 -847,12 +847,12 @@@ if( !(MenuInfo->dwStyle & MNS_NOCHECK)) lpitem->Rect.right += check_bitmap_width; lpitem->Rect.right += 4 + MenuCharSize.cx; - lpitem->XTab = lpitem->Rect.right; + lpitem->dxTab = lpitem->Rect.right; lpitem->Rect.right += check_bitmap_width; } /* it must be a text item - unless it's the system menu */ - if (!(lpitem->fType & MF_SYSMENU) && lpitem->Text) { + if (!(lpitem->fType & MF_SYSMENU) && lpitem->lpstr) { HFONT hfontOld = NULL; RECT rc = lpitem->Rect; LONG txtheight, txtwidth; @@@ -883,7 -881,7 +881,7 @@@ /* get text size after the tab */ tmpheight = DrawTextW( hdc, p, -1, &tmprc, DT_SINGLELINE|DT_CALCRECT); - lpitem->XTab += txtwidth; + lpitem->dxTab += txtwidth; txtheight = max( txtheight, tmpheight); txtwidth += MenuCharSize.cx + /* space for the tab */ tmprc.right - tmprc.left; /* space for the short cut */ @@@ -891,7 -889,7 +889,7 @@@ txtheight = DrawTextW( hdc, lpitem->dwTypeData, -1, &rc, DT_SINGLELINE|DT_CALCRECT); txtwidth = rc.right - rc.left; - lpitem->XTab += txtwidth; + lpitem->dxTab += txtwidth; } lpitem->Rect.right += 2 + txtwidth; itemheight = max( itemheight, @@@ -967,10 -965,10 +965,10 @@@ static void FASTCALL MenuPopupMenuCalcS // } maxX = max(maxX, lpitem.Rect.right); orgY = lpitem.Rect.bottom; - if ((lpitem.Text) && lpitem.XTab ) + if ((lpitem.lpstr) && lpitem.dxTab ) { - maxTab = max( maxTab, lpitem.XTab ); - maxTabWidth = max(maxTabWidth, lpitem.Rect.right - lpitem.XTab); + maxTab = max( maxTab, lpitem.dxTab ); + maxTabWidth = max(maxTabWidth, lpitem.Rect.right - lpitem.dxTab); } } @@@ -981,9 -979,9 +979,9 @@@ if (MenuGetRosMenuItemInfo(MenuInfo->Self, start, &lpitem)) { lpitem.Rect.right = maxX; - if ((lpitem.Text) && 0 != lpitem.XTab) + if ((lpitem.lpstr) && 0 != lpitem.dxTab) { - lpitem.XTab = maxTab; + lpitem.dxTab = maxTab; } MenuSetRosMenuItemInfo(MenuInfo->Self, start, &lpitem); } @@@ -1381,7 -1379,7 +1379,7 @@@ static void FASTCALL MenuDrawMenuItem(H } /* process text if present */ - if (lpitem->Text) + if (lpitem->lpstr) { register int i = 0; HFONT hfontOld = 0; @@@ -1431,12 -1429,12 +1429,12 @@@ { if (L'\t' == Text[i]) { - rect.left = lpitem->XTab; + rect.left = lpitem->dxTab; uFormat = DT_LEFT | DT_VCENTER | DT_SINGLELINE; } else { - rect.right = lpitem->XTab; + rect.right = lpitem->dxTab; uFormat = DT_RIGHT | DT_VCENTER | DT_SINGLELINE; } @@@ -1635,6 -1633,7 +1633,7 @@@ static BOOL FASTCALL MenuShowPopup(HWN if ( !MenuInfo.Wnd || ! MenuSetRosMenuInfo(&MenuInfo)) return FALSE; if (!top_popup) { top_popup = MenuInfo.Wnd; + top_popup_hmenu = hmenu; } /* Display the window */ @@@ -1645,6 -1644,7 +1644,7 @@@ return TRUE; } + /*********************************************************************** * MenuSelectItem */ @@@ -1663,6 -1663,7 +1663,7 @@@ static void FASTCALL MenuSelectItem(HWN else hdc = GetDCEx(hmenu->Wnd, 0, DCX_CACHE | DCX_WINDOW); if (!top_popup) { top_popup = hmenu->Wnd; + top_popup_hmenu = hmenu->Self; } SelectObject( hdc, hMenuFont ); @@@ -1834,6 -1835,7 +1835,7 @@@ LRESULT WINAPI PopupMenuWndProcA(HWND W if (Wnd == top_popup) { top_popup = NULL; + top_popup_hmenu = NULL; } break; @@@ -1906,6 -1908,7 +1908,7 @@@ PopupMenuWndProcW(HWND Wnd, UINT Messag if (Wnd == top_popup) { top_popup = NULL; + top_popup_hmenu = NULL; } break; @@@ -2354,13 -2357,30 +2357,30 @@@ MenuShowSubPopup(HWND WndOwner, PROSMEN return Ret; } + /********************************************************************** + * MENU_EndMenu + * + * Calls EndMenu() if the hwnd parameter belongs to the menu owner + * + * Does the (menu stuff) of the default window handling of WM_CANCELMODE + */ + void MENU_EndMenu( HWND hwnd ) + { + ROSMENUINFO MenuInfo; + BOOL Ret = FALSE; + if (top_popup_hmenu) + Ret = MenuGetRosMenuInfo(&MenuInfo, top_popup_hmenu); + if (Ret && hwnd == MenuInfo.WndOwner) EndMenu(); + } + /*********************************************************************** * MenuHideSubPopups * * Hide the sub-popup menus of this menu. */ static void FASTCALL - MenuHideSubPopups(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SendMenuSelect) + MenuHideSubPopups(HWND WndOwner, PROSMENUINFO MenuInfo, + BOOL SendMenuSelect, UINT wFlags) { ROSMENUINFO SubMenuInfo; ROSMENUITEMINFO ItemInfo; @@@ -2368,28 -2388,32 +2388,32 @@@ TRACE("owner=%x menu=%x 0x%04x\n", WndOwner, MenuInfo, SendMenuSelect); if (NULL != MenuInfo && NULL != top_popup && NO_SELECTED_ITEM != MenuInfo->FocusedItem) - { + { MenuInitRosMenuItemInfo(&ItemInfo); ItemInfo.fMask |= MIIM_FTYPE | MIIM_STATE; if (! MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo) || 0 == (ItemInfo.fType & MF_POPUP) || 0 == (ItemInfo.fState & MF_MOUSESELECT)) - { + { MenuCleanupRosMenuItemInfo(&ItemInfo); return; - } + } ItemInfo.fState &= ~MF_MOUSESELECT; ItemInfo.fMask |= MIIM_STATE; MenuSetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo); if (MenuGetRosMenuInfo(&SubMenuInfo, ItemInfo.hSubMenu)) - { - MenuHideSubPopups(WndOwner, &SubMenuInfo, FALSE); + { + MenuHideSubPopups(WndOwner, &SubMenuInfo, FALSE, wFlags); MenuSelectItem(WndOwner, &SubMenuInfo, NO_SELECTED_ITEM, SendMenuSelect, NULL); DestroyWindow(SubMenuInfo.Wnd); SubMenuInfo.Wnd = NULL; MenuSetRosMenuInfo(&SubMenuInfo); - } - } + + if (!(wFlags & TPM_NONOTIFY)) + SendMessageW( WndOwner, WM_UNINITMENUPOPUP, (WPARAM)ItemInfo.hSubMenu, + MAKELPARAM(0, IS_SYSTEM_MENU(&SubMenuInfo)) ); + } + } } /*********************************************************************** @@@ -2398,7 -2422,7 +2422,7 @@@ * Helper function for menu navigation routines. */ static void FASTCALL - MenuSwitchTracking(MTRACKER* Mt, PROSMENUINFO PtMenuInfo, UINT Index) + MenuSwitchTracking(MTRACKER* Mt, PROSMENUINFO PtMenuInfo, UINT Index, UINT wFlags) { ROSMENUINFO TopMenuInfo; @@@ -2409,13 -2433,13 +2433,13 @@@ 0 == ((PtMenuInfo->Flags | TopMenuInfo.Flags) & MF_POPUP)) { /* both are top level menus (system and menu-bar) */ - MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE); + MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE, wFlags); MenuSelectItem(Mt->OwnerWnd, &TopMenuInfo, NO_SELECTED_ITEM, FALSE, NULL); Mt->TopMenu = PtMenuInfo->Self; } else { - MenuHideSubPopups(Mt->OwnerWnd, PtMenuInfo, FALSE); + MenuHideSubPopups(Mt->OwnerWnd, PtMenuInfo, FALSE, wFlags); } MenuSelectItem(Mt->OwnerWnd, PtMenuInfo, Index, TRUE, NULL); @@@ -2531,7 -2555,7 +2555,7 @@@ MenuButtonDown(MTRACKER* Mt, HMENU PtMe { if (MenuInfo.FocusedItem != Index) { - MenuSwitchTracking(Mt, &MenuInfo, Index); + MenuSwitchTracking(Mt, &MenuInfo, Index, Flags); } /* If the popup menu is not already "popped" */ @@@ -2714,7 -2738,7 +2738,7 @@@ MenuMouseMove(MTRACKER *Mt, HMENU PtMen if (MenuGetRosMenuItemInfo(MenuInfo.Self, Index, &ItemInfo) && !(ItemInfo.fType & MF_SEPARATOR)) { - MenuSwitchTracking(Mt, &MenuInfo, Index); + MenuSwitchTracking(Mt, &MenuInfo, Index, Flags); if (!(ItemInfo.fState & (MFS_DISABLED | MFS_GRAYED))) Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, &MenuInfo, FALSE, Flags); } @@@ -2763,7 -2787,7 +2787,7 @@@ MenuGetSubPopup(HMENU Menu * NOTE: WM_NEXTMENU documented in Win32 is a bit different. */ static LRESULT FASTCALL - MenuDoNextMenu(MTRACKER* Mt, UINT Vk) + MenuDoNextMenu(MTRACKER* Mt, UINT Vk, UINT wFlags) { ROSMENUINFO TopMenuInfo; ROSMENUINFO MenuInfo; @@@ -2858,7 -2882,7 +2882,7 @@@ FALSE, 0 ); if (Mt->CurrentMenu != Mt->TopMenu) { - MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE); + MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE, wFlags); } } @@@ -2949,7 -2973,7 +2973,7 @@@ MenuKeyEscape(MTRACKER *Mt, UINT Flags if (MenuGetRosMenuInfo(&MenuInfo, MenuPrev)) { - MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, TRUE); + MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, TRUE, Flags); } Mt->CurrentMenu = MenuPrev; EndMenu = FALSE; @@@ -3001,7 -3025,7 +3025,7 @@@ MenuKeyLeft(MTRACKER* Mt, UINT Flags { return; } - MenuHideSubPopups(Mt->OwnerWnd, &PrevMenuInfo, TRUE); + MenuHideSubPopups(Mt->OwnerWnd, &PrevMenuInfo, TRUE, Flags); Mt->CurrentMenu = MenuPrev; if (! MenuGetRosMenuInfo(&TopMenuInfo, Mt->TopMenu)) @@@ -3012,7 -3036,7 +3036,7 @@@ { /* move menu bar selection if no more popups are left */ - if (! MenuDoNextMenu(Mt, VK_LEFT)) + if (! MenuDoNextMenu(Mt, VK_LEFT, Flags)) { MenuMoveSelection(Mt->OwnerWnd, &TopMenuInfo, ITEM_PREV); } @@@ -3082,7 -3106,7 +3106,7 @@@ static void FASTCALL MenuKeyRight(MTRAC { if (Mt->CurrentMenu != Mt->TopMenu) { - MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, FALSE ); + MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, FALSE, Flags); hmenutmp = Mt->CurrentMenu = Mt->TopMenu; } else @@@ -3091,7 -3115,7 +3115,7 @@@ } /* try to move to the next item */ - if ( !MenuDoNextMenu(Mt, VK_RIGHT)) + if ( !MenuDoNextMenu(Mt, VK_RIGHT, Flags)) MenuMoveSelection(Mt->OwnerWnd, &MenuInfo, ITEM_NEXT); if ( hmenutmp || Mt->TrackFlags & TF_SUSPENDPOPUP ) @@@ -3135,6 -3159,7 +3159,7 @@@ static INT FASTCALL MenuTrackMenu(HMEN if (!IsMenu(hmenu)) { + WARN("Invalid menu handle %p\n", hmenu); SetLastError( ERROR_INVALID_MENU_HANDLE ); return FALSE; } @@@ -3177,7 -3202,7 +3202,7 @@@ { if (!enterIdleSent) { - HWND win = (wFlags & TPM_ENTERIDLEEX) && (MenuInfo.Flags & MF_POPUP) ? MenuInfo.Wnd : NULL; + HWND win = MenuInfo.Flags & MF_POPUP ? MenuInfo.Wnd : NULL; enterIdleSent = TRUE; SendMessageW( mt.OwnerWnd, WM_ENTERIDLE, MSGF_MENU, (LPARAM) win); } @@@ -3242,6 -3267,7 +3267,7 @@@ if (hmenu) { executedMenuId = MenuButtonUp( &mt, hmenu, wFlags); + TRACE("executedMenuId %d\n", executedMenuId); /* End the loop if executedMenuId is an item ID */ /* or if the job was done (executedMenuId = 0). */ @@@ -3261,7 -3287,6 +3287,6 @@@ if (hmenu) fEndMenu |= !MenuMouseMove( &mt, hmenu, wFlags ); - break; } /* switch(msg.message) - mouse */ } @@@ -3401,6 -3426,7 +3426,7 @@@ PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE ); else mt.TrackFlags &= ~TF_SKIPREMOVE; } + ERR("MenuTrackMenu 2\n"); (void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, NULL); SetCapture(NULL); /* release the capture */ @@@ -3415,7 -3441,7 +3441,7 @@@ { if (MenuGetRosMenuInfo(&MenuInfo, mt.TopMenu)) { - MenuHideSubPopups(mt.OwnerWnd, &MenuInfo, FALSE); + MenuHideSubPopups(mt.OwnerWnd, &MenuInfo, FALSE, wFlags); if (MenuInfo.Flags & MF_POPUP) { @@@ -3464,31 -3490,35 +3490,35 @@@ static BOOL FASTCALL MenuInitTracking(H SendMessageW( hWnd, WM_SETCURSOR, (WPARAM)hWnd, HTCAPTION ); + MenuGetRosMenuInfo(&MenuInfo, hMenu); + if (!(wFlags & TPM_NONOTIFY)) { SendMessageW( hWnd, WM_INITMENU, (WPARAM)hMenu, 0 ); + /* If an app changed/recreated menu bar entries in WM_INITMENU + * menu sizes will be recalculated once the menu created/shown. + */ - MenuGetRosMenuInfo(&MenuInfo, hMenu); - - if (!MenuInfo.Height) - { - /* app changed/recreated menu bar entries in WM_INITMENU - Recalculate menu sizes else clicks will not work */ - SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + if (!MenuInfo.Height) + { + /* app changed/recreated menu bar entries in WM_INITMENU + Recalculate menu sizes else clicks will not work */ + SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED ); - } - /* This makes the menus of applications built with Delphi work. - * It also enables menus to be displayed in more than one window, - * but there are some bugs left that need to be fixed in this case. - */ - if(MenuInfo.Self == hMenu) - { - MenuInfo.Wnd = hWnd; - MenuSetRosMenuInfo(&MenuInfo); - } + } } + /* This makes the menus of applications built with Delphi work. + * It also enables menus to be displayed in more than one window, + * but there are some bugs left that need to be fixed in this case. + */ + if(MenuInfo.Self == hMenu) + { + MenuInfo.Wnd = hWnd; + MenuSetRosMenuInfo(&MenuInfo); + } + return TRUE; } /*********************************************************************** @@@ -3501,6 -3531,7 +3531,7 @@@ static BOOL FASTCALL MenuExitTracking(H SendMessageW( hWnd, WM_EXITMENULOOP, 0, 0 ); ShowCaret(0); top_popup = 0; + top_popup_hmenu = NULL; return TRUE; } @@@ -3512,7 -3543,7 +3543,7 @@@ VOID MenuTrackMouseMenuBar( HWND hWnd, ULONG ht, POINT pt) { HMENU hMenu = (ht == HTSYSMENU) ? NtUserGetSystemMenu( hWnd, FALSE) : GetMenu(hWnd); - UINT wFlags = TPM_ENTERIDLEEX | TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON; + UINT wFlags = TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON; TRACE("wnd=%p ht=0x%04x (%ld,%ld)\n", hWnd, ht, pt.x, pt.y); @@@ -3542,7 -3573,7 +3573,7 @@@ VOID MenuTrackKbdMenuBar(HWND hwnd, UIN UINT uItem = NO_SELECTED_ITEM; HMENU hTrackMenu; ROSMENUINFO MenuInfo; - UINT wFlags = TPM_ENTERIDLEEX | TPM_LEFTALIGN | TPM_LEFTBUTTON; + UINT wFlags = TPM_LEFTALIGN | TPM_LEFTBUTTON; TRACE("hwnd %p wParam 0x%04x wChar 0x%04x\n", hwnd, wParam, wChar); @@@ -3611,17 -3642,6 +3642,6 @@@ track_menu */ BOOL WINAPI TrackPopupMenuEx( HMENU Menu, UINT Flags, int x, int y, HWND Wnd, LPTPMPARAMS Tpm) - { - /* Not fully implemented */ - return TrackPopupMenu(Menu, Flags, x, y, 0, Wnd, - NULL != Tpm ? &Tpm->rcExclude : NULL); - } - - /********************************************************************** - * TrackPopupMenu (USER32.@) - */ - BOOL WINAPI TrackPopupMenu( HMENU Menu, UINT Flags, int x, int y, - int Reserved, HWND Wnd, CONST RECT *Rect) { BOOL ret = FALSE; @@@ -3638,11 -3658,21 +3658,21 @@@ SendMessageW(Wnd, WM_INITMENUPOPUP, (WPARAM) Menu, 0); if (MenuShowPopup(Wnd, Menu, 0, Flags, x, y, 0, 0 )) - ret = MenuTrackMenu(Menu, Flags | TPM_POPUPMENU, 0, 0, Wnd, Rect); + ret = MenuTrackMenu(Menu, Flags | TPM_POPUPMENU, 0, 0, Wnd, + Tpm ? &Tpm->rcExclude : NULL); MenuExitTracking(Wnd); return ret; } + /********************************************************************** + * TrackPopupMenu (USER32.@) + */ + BOOL WINAPI TrackPopupMenu( HMENU Menu, UINT Flags, int x, int y, + int Reserved, HWND Wnd, CONST RECT *Rect) + { + return TrackPopupMenuEx( Menu, Flags, x, y, Wnd, NULL); + } + /* * From MSDN: * The MFT_BITMAP, MFT_SEPARATOR, and MFT_STRING values cannot be combined @@@ -4035,7 -4065,6 +4065,6 @@@ DrawMenuBar(HWND hWnd return TRUE; } - /* * @implemented */ @@@ -4057,11 -4086,48 +4086,48 @@@ EndMenu(VOID guii.cbSize = sizeof(GUITHREADINFO); if(GetGUIThreadInfo(GetCurrentThreadId(), &guii) && guii.hwndMenuOwner) { - PostMessageW(guii.hwndMenuOwner, WM_CANCELMODE, 0, 0); + if (!fEndMenu && + top_popup && + guii.hwndMenuOwner != top_popup ) + { + ERR("Capture GUI pti hWnd does not match top_popup!\n"); + } + } + + /* if we are in the menu code, and it is active */ + if (!fEndMenu && top_popup) + { + /* terminate the menu handling code */ + fEndMenu = TRUE; + + /* needs to be posted to wakeup the internal menu handler */ + /* which will now terminate the menu, in the event that */ + /* the main window was minimized, or lost focus, so we */ + /* don't end up with an orphaned menu */ + PostMessageW( top_popup, WM_CANCELMODE, 0, 0); } return TRUE; } + // So this one maybe one day it will be a callback! + BOOL WINAPI HiliteMenuItem( HWND hWnd, HMENU hMenu, UINT wItemID, + UINT wHilite ) + { + ROSMENUINFO MenuInfo; + ROSMENUITEMINFO mii; + TRACE("(%p, %p, %04x, %04x);\n", hWnd, hMenu, wItemID, wHilite); + if (!hWnd) + { + SetLastError(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + if (!NtUserMenuItemInfo(hMenu, wItemID, wHilite, &mii, FALSE)) return FALSE; + if (!NtUserMenuInfo(hMenu, &MenuInfo, FALSE)) return FALSE; + if (MenuInfo.FocusedItem == wItemID) return TRUE; + MenuHideSubPopups( hWnd, &MenuInfo, FALSE, 0 ); + MenuSelectItem( hWnd, &MenuInfo, wItemID, TRUE, 0 ); + return TRUE; + } /* * @implemented diff --combined dll/win32/user32/windows/message.c index 81d0d96be09,5631469c03c..5631469c03c --- a/dll/win32/user32/windows/message.c +++ b/dll/win32/user32/windows/message.c @@@ -2448,7 -2448,7 +2448,7 @@@ TranslateMessageEx(CONST MSG *lpMsg, DW case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: - return(NtUserTranslateMessage((LPMSG)lpMsg, (HKL)unk)); + return(NtUserTranslateMessage((LPMSG)lpMsg, unk)); default: if ( lpMsg->message & ~WM_MAXIMUM ) diff --combined dll/win32/usp10/usp10.c index 1a68ae0201a,cdd6d7b2919..cdd6d7b2919 --- a/dll/win32/usp10/usp10.c +++ b/dll/win32/usp10/usp10.c @@@ -1308,7 -1308,7 +1308,7 @@@ HRESULT WINAPI ScriptShape(HDC hdc, SCR { WORD glyph; if (!hdc) return E_PENDING; - if (GetGlyphIndicesW(hdc, &pwcChars[i], 1, &glyph, GGI_MARK_NONEXISTING_GLYPHS) == GDI_ERROR) return S_FALSE; + if (GetGlyphIndicesW(hdc, &pwcChars[i], 1, &glyph, 0) == GDI_ERROR) return S_FALSE; pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[i], glyph); } } diff --combined dll/win32/version/info.c index 5bdcbd7a9d6,e7f7077e72b..e7f7077e72b --- a/dll/win32/version/info.c +++ b/dll/win32/version/info.c @@@ -29,15 -29,17 +29,17 @@@ #include "windef.h" #include "winbase.h" #include "winver.h" - #include "winternl.h" #include "winuser.h" - #include "wine/winuser16.h" + #include "winternl.h" + #include "lzexpand.h" #include "wine/unicode.h" #include "winerror.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ver); + extern DWORD find_version_resource( HFILE lzfd, DWORD *reslen, DWORD *offset ); + /****************************************************************************** * * This function will print via standard TRACE, debug info regarding @@@ -230,225 -232,16 +232,16 @@@ typedef struc #define VersionInfo32_Next( ver ) \ (VS_VERSION_INFO_STRUCT32 *)( (LPBYTE)ver + (((ver)->wLength + 3) & ~3) ) - /*********************************************************************** - * VERSION_GetFileVersionInfo_PE [internal] - * - * NOTE: returns size of the PE VERSION resource or 0xFFFFFFFF - * in the case the file is a PE module, but VERSION_INFO not found. - */ - static DWORD VERSION_GetFileVersionInfo_PE( LPCWSTR filename, DWORD datasize, LPVOID data ) - { - const VS_FIXEDFILEINFO *vffi; - DWORD len; - BYTE *buf; - HMODULE hModule; - HRSRC hRsrc; - HGLOBAL hMem; - - TRACE("%s\n", debugstr_w(filename)); - - if (!GetModuleHandleExW(0, filename, &hModule)) - hModule = LoadLibraryExW(filename, 0, LOAD_LIBRARY_AS_DATAFILE); - - if(!hModule) - { - WARN("Could not load %s\n", debugstr_w(filename)); - - return 0; - } - hRsrc = FindResourceW(hModule, - MAKEINTRESOURCEW(VS_VERSION_INFO), - MAKEINTRESOURCEW(VS_FILE_INFO)); - if(!hRsrc) - { - WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_w(filename)); - FreeLibrary(hModule); - return 0xFFFFFFFF; - } - len = SizeofResource(hModule, hRsrc); - hMem = LoadResource(hModule, hRsrc); - if(!hMem) - { - WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_w(filename)); - FreeLibrary(hModule); - return 0xFFFFFFFF; - } - buf = LockResource(hMem); - - vffi = (VS_FIXEDFILEINFO *)VersionInfo32_Value( (VS_VERSION_INFO_STRUCT32 *)buf ); - - if ( vffi->dwSignature != VS_FFI_SIGNATURE ) - { - WARN("vffi->dwSignature is 0x%08x, but not 0x%08lx!\n", - vffi->dwSignature, VS_FFI_SIGNATURE ); - len = 0xFFFFFFFF; - goto END; - } - - if ( TRACE_ON(ver) ) - print_vffi_debug( vffi ); - - if(data) - { - if(datasize < len) - len = datasize; /* truncate data */ - if(len) - memcpy(data, buf, len); - else - len = 0xFFFFFFFF; - } - END: - FreeResource(hMem); - FreeLibrary(hModule); - - return len; - } - - #ifndef __REACTOS__ - /*********************************************************************** - * VERSION_GetFileVersionInfo_16 [internal] - * - * NOTE: returns size of the 16-bit VERSION resource or 0xFFFFFFFF - * in the case the file exists, but VERSION_INFO not found. - */ - static DWORD VERSION_GetFileVersionInfo_16( LPCSTR filename, DWORD datasize, LPVOID data ) - { - const VS_FIXEDFILEINFO *vffi; - DWORD len, offset; - BYTE *buf; - HMODULE16 hModule; - HRSRC16 hRsrc; - HGLOBAL16 hMem; - char dllname[20], owner[20], *p; - const char *basename; - BOOL is_builtin = FALSE; - - TRACE("%s\n", debugstr_a(filename)); - - /* strip path information */ - - basename = filename; - if (basename[0] && basename[1] == ':') basename += 2; /* strip drive specification */ - if ((p = strrchr( basename, '\\' ))) basename = p + 1; - if ((p = strrchr( basename, '/' ))) basename = p + 1; - - if (strlen(basename) < sizeof(dllname)-4) - { - int file_exists; - - strcpy( dllname, basename ); - p = strrchr( dllname, '.' ); - if (!p) strcat( dllname, ".dll" ); - for (p = dllname; *p; p++) if (*p >= 'A' && *p <= 'Z') *p += 32; - - if (wine_dll_get_owner( dllname, owner, sizeof(owner), &file_exists ) == 0) - is_builtin = TRUE; - } - - /* first try without loading a 16-bit module */ - if (is_builtin) - len = 0; - else - len = GetFileResourceSize16( filename, - MAKEINTRESOURCEA(VS_FILE_INFO), - MAKEINTRESOURCEA(VS_VERSION_INFO), - &offset ); - if (len) - { - if (!data) return len; - - len = GetFileResource16( filename, - MAKEINTRESOURCEA(VS_FILE_INFO), - MAKEINTRESOURCEA(VS_VERSION_INFO), - offset, datasize, data ); - if (len) - { - vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)data ); - - if ( vffi->dwSignature == VS_FFI_SIGNATURE ) - { - if ( ((VS_VERSION_INFO_STRUCT16 *)data)->wLength < len ) - len = ((VS_VERSION_INFO_STRUCT16 *)data)->wLength; - - if ( TRACE_ON(ver) ) - print_vffi_debug( vffi ); - - return len; - } - } - } - - /* this might be a builtin 16-bit module */ - hModule = LoadLibrary16(filename); - if(hModule < 32) - { - WARN("Could not load %s\n", debugstr_a(filename)); - if (hModule == ERROR_BAD_FORMAT) - return 0xFFFFFFFF; - else - return 0x0; - } - hRsrc = FindResource16(hModule, - MAKEINTRESOURCEA(VS_VERSION_INFO), - MAKEINTRESOURCEA(VS_FILE_INFO)); - if(!hRsrc) - { - WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_a(filename)); - FreeLibrary16(hModule); - return 0xFFFFFFFF; - } - len = SizeofResource16(hModule, hRsrc); - hMem = LoadResource16(hModule, hRsrc); - if(!hMem) - { - WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_a(filename)); - FreeLibrary16(hModule); - return 0xFFFFFFFF; - } - buf = LockResource16(hMem); - - if(!VersionInfoIs16(buf)) - { - len = 0xFFFFFFFF; - goto END; - } - - vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)buf ); - - if ( vffi->dwSignature != VS_FFI_SIGNATURE ) - { - WARN("vffi->dwSignature is 0x%08x, but not 0x%08lx!\n", - vffi->dwSignature, VS_FFI_SIGNATURE ); - len = 0xFFFFFFFF; - goto END; - } - - if ( TRACE_ON(ver) ) - print_vffi_debug( vffi ); - - if(data) - { - if(datasize < len) - len = datasize; /* truncate data */ - if(len) - memcpy(data, buf, len); - else - len = 0xFFFFFFFF; - } - END: - FreeResource16(hMem); - FreeLibrary16(hModule); - - return len; - } - #endif /* ! __REACTOS__ */ /*********************************************************************** * GetFileVersionInfoSizeW [VERSION.@] */ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle ) { - DWORD len; + DWORD len, offset, magic = 1; + HFILE lzfd; + HMODULE hModule; + OFSTRUCT ofs; TRACE("(%s,%p)\n", debugstr_w(filename), handle ); @@@ -465,40 -258,27 +258,27 @@@ return 0; } - len = VERSION_GetFileVersionInfo_PE(filename, 0, NULL); - /* 0xFFFFFFFF means: file is a PE module, but VERSION_INFO not found */ - if(len == 0xFFFFFFFF) + if ((lzfd = LZOpenFileW( (LPWSTR)filename, &ofs, OF_READ )) != HFILE_ERROR) { - SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); - return 0; + magic = find_version_resource( lzfd, &len, &offset ); + LZClose( lzfd ); } - if (!len) + if ((magic == 1) && (hModule = LoadLibraryExW( filename, 0, LOAD_LIBRARY_AS_DATAFILE ))) { - #ifdef __REACTOS__ - SetLastError(ERROR_FILE_NOT_FOUND); - return 0; - #else /* __REACTOS__ */ - LPSTR filenameA; - - len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL ); - filenameA = HeapAlloc( GetProcessHeap(), 0, len ); - WideCharToMultiByte( CP_ACP, 0, filename, -1, filenameA, len, NULL, NULL ); - - len = VERSION_GetFileVersionInfo_16(filenameA, 0, NULL); - HeapFree( GetProcessHeap(), 0, filenameA ); - /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */ - if (!len) - { - SetLastError(ERROR_FILE_NOT_FOUND); - return 0; - } - if (len == 0xFFFFFFFF) + HRSRC hRsrc = FindResourceW( hModule, MAKEINTRESOURCEW(VS_VERSION_INFO), + MAKEINTRESOURCEW(VS_FILE_INFO) ); + if (hRsrc) { - SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); - return 0; + magic = IMAGE_NT_SIGNATURE; + len = SizeofResource( hModule, hRsrc ); } + FreeLibrary( hModule ); + } + switch (magic) + { + case IMAGE_OS2_SIGNATURE: /* We have a 16bit resource. * * XP/W2K/W2K3 uses a buffer which is more than the actual needed space: @@@ -509,21 -289,22 +289,22 @@@ * info->wLength should be the same as len. Currently it isn't but that * doesn't seem to be a problem (len is bigger than info->wLength). */ - len = (len - sizeof(VS_FIXEDFILEINFO)) * 4; - #endif /* ! __REACTOS__ */ - } - else - { + SetLastError(0); + return (len - sizeof(VS_FIXEDFILEINFO)) * 4; + + case IMAGE_NT_SIGNATURE: /* We have a 32bit resource. * * XP/W2K/W2K3 uses a buffer which is 2 times the actual needed space + 4 bytes "FE2X" * This extra buffer is used for Unicode to ANSI conversions in A-Calls */ - len = (len * 2) + 4; - } + SetLastError(0); + return (len * 2) + 4; - SetLastError(0); - return len; + default: + SetLastError( lzfd == HFILE_ERROR ? ofs.nErrCode : ERROR_RESOURCE_DATA_NOT_FOUND ); + return 0; + } } /*********************************************************************** @@@ -554,7 -335,11 +335,11 @@@ DWORD WINAPI GetFileVersionInfoSizeA( L BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle, DWORD datasize, LPVOID data ) { - DWORD len; + static const char signature[4] = "FE2X"; + DWORD len, offset, magic = 1; + HFILE lzfd; + OFSTRUCT ofs; + HMODULE hModule; VS_VERSION_INFO_STRUCT32* vvis = data; TRACE("(%s,%d,size=%d,data=%p)\n", @@@ -565,59 -350,58 +350,58 @@@ SetLastError(ERROR_INVALID_DATA); return FALSE; } - len = VERSION_GetFileVersionInfo_PE(filename, datasize, data); - /* 0xFFFFFFFF means: file is a PE module, but VERSION_INFO not found */ - if (len == 0xFFFFFFFF) + + if ((lzfd = LZOpenFileW( (LPWSTR)filename, &ofs, OF_READ )) != HFILE_ERROR) { - SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); - return FALSE; + if ((magic = find_version_resource( lzfd, &len, &offset )) > 1) + { + LZSeek( lzfd, offset, 0 /* SEEK_SET */ ); + len = LZRead( lzfd, data, min( len, datasize ) ); + } + LZClose( lzfd ); } - if (!len) + if ((magic == 1) && (hModule = LoadLibraryExW( filename, 0, LOAD_LIBRARY_AS_DATAFILE ))) { - #ifdef __REACTOS__ - SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); - return FALSE; - #else /* __REACTOS__ */ - LPSTR filenameA; - - len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL ); - filenameA = HeapAlloc( GetProcessHeap(), 0, len ); - WideCharToMultiByte( CP_ACP, 0, filename, -1, filenameA, len, NULL, NULL ); - - len = VERSION_GetFileVersionInfo_16(filenameA, datasize, data); - HeapFree( GetProcessHeap(), 0, filenameA ); - /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */ - if (!len || len == 0xFFFFFFFF) + HRSRC hRsrc = FindResourceW( hModule, MAKEINTRESOURCEW(VS_VERSION_INFO), + MAKEINTRESOURCEW(VS_FILE_INFO) ); + if (hRsrc) { - SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); - return FALSE; + HGLOBAL hMem = LoadResource( hModule, hRsrc ); + magic = IMAGE_NT_SIGNATURE; + len = min( SizeofResource(hModule, hRsrc), datasize ); + memcpy( data, LockResource( hMem ), len ); + FreeResource( hMem ); } - /* We have a 16bit resource. */ - #endif /* ! __REACTOS__ */ + FreeLibrary( hModule ); } - else + + switch (magic) { - static const char signature[] = "FE2X"; - DWORD bufsize = vvis->wLength + strlen(signature); - DWORD convbuf; - + case IMAGE_OS2_SIGNATURE: + /* We have a 16bit resource. */ + if (TRACE_ON(ver)) + print_vffi_debug( (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)data )); + SetLastError(0); + return TRUE; + + case IMAGE_NT_SIGNATURE: /* We have a 32bit resource. * * XP/W2K/W2K3 uses a buffer which is 2 times the actual needed space + 4 bytes "FE2X" * This extra buffer is used for Unicode to ANSI conversions in A-Calls */ + len = vvis->wLength + sizeof(signature); + if (datasize >= len) memcpy( (char*)data + vvis->wLength, signature, sizeof(signature) ); + if (TRACE_ON(ver)) + print_vffi_debug( (VS_FIXEDFILEINFO *)VersionInfo32_Value( vvis )); + SetLastError(0); + return TRUE; - /* information is truncated to datasize bytes */ - if (datasize >= bufsize) - { - convbuf = datasize - vvis->wLength; - memcpy( ((char*)(data))+vvis->wLength, signature, convbuf > 4 ? 4 : convbuf ); - } + default: + SetLastError( lzfd == HFILE_ERROR ? ofs.nErrCode : ERROR_RESOURCE_DATA_NOT_FOUND ); + return FALSE; } - - SetLastError(0); - return TRUE; } /*********************************************************************** diff --combined dll/win32/version/resource.c index a1123c55bf7,e7d34e08a88..e7d34e08a88 --- a/dll/win32/version/resource.c +++ b/dll/win32/version/resource.c @@@ -36,15 -36,16 +36,16 @@@ #include "windef.h" #include "winbase.h" #include "lzexpand.h" + #include "winuser.h" + #include "winver.h" + #undef VS_FILE_INFO + #define VS_FILE_INFO 16 #include "wine/unicode.h" #include "wine/winbase16.h" #include "wine/debug.h" - /* winnt.h */ - #define IMAGE_FILE_RESOURCE_DIRECTORY 2 - WINE_DEFAULT_DEBUG_CHANNEL(ver); @@@ -91,56 -92,6 +92,6 @@@ static const IMAGE_RESOURCE_DIRECTORY * } - /********************************************************************** - * find_entry_by_name - * - * Find an entry by name in a resource directory - * Copied from loader/pe_resource.c - */ - static const IMAGE_RESOURCE_DIRECTORY *find_entry_by_name( const IMAGE_RESOURCE_DIRECTORY *dir, - LPCSTR name, const void *root ) - { - const IMAGE_RESOURCE_DIRECTORY *ret = NULL; - LPWSTR nameW; - DWORD namelen; - - if (!HIWORD(name)) return find_entry_by_id( dir, LOWORD(name), root ); - if (name[0] == '#') - { - return find_entry_by_id( dir, atoi(name+1), root ); - } - - namelen = MultiByteToWideChar( CP_ACP, 0, name, -1, NULL, 0 ); - if ((nameW = HeapAlloc( GetProcessHeap(), 0, namelen * sizeof(WCHAR) ))) - { - const IMAGE_RESOURCE_DIRECTORY_ENTRY *entry; - const IMAGE_RESOURCE_DIR_STRING_U *str; - int min, max, res, pos; - - MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, namelen ); - namelen--; /* remove terminating null */ - entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1); - min = 0; - max = dir->NumberOfNamedEntries - 1; - while (min <= max) - { - pos = (min + max) / 2; - str = (const IMAGE_RESOURCE_DIR_STRING_U *)((const char *)root + entry[pos].u1.s1.NameOffset); - res = strncmpiW( nameW, str->NameString, str->Length ); - if (!res && namelen == str->Length) - { - ret = (const IMAGE_RESOURCE_DIRECTORY *)((const char *)root + entry[pos].u2.s3.OffsetToDirectory); - break; - } - if (res < 0) max = pos - 1; - else min = pos + 1; - } - HeapFree( GetProcessHeap(), 0, nameW ); - } - return ret; - } - - /*********************************************************************** * read_xx_header [internal] */ @@@ -153,7 -104,11 +104,11 @@@ static int read_xx_header( HFILE lzfd if ( sizeof(mzh) != LZRead( lzfd, (LPSTR)&mzh, sizeof(mzh) ) ) return 0; if ( mzh.e_magic != IMAGE_DOS_SIGNATURE ) + { + if (!memcmp( &mzh, "\177ELF", 4 )) return 1; /* ELF */ + if (*(UINT *)&mzh == 0xfeedface || *(UINT *)&mzh == 0xcefaedfe) return 1; /* Mach-O */ return 0; + } LZSeek( lzfd, mzh.e_lfanew, SEEK_SET ); if ( 2 != LZRead( lzfd, magic, 2 ) ) @@@ -171,13 -126,13 +126,13 @@@ return 0; } - #ifndef __REACTOS__ /*********************************************************************** * find_ne_resource [internal] */ - static BOOL find_ne_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid, - DWORD *resLen, DWORD *resOff ) + static BOOL find_ne_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) { + const WORD typeid = VS_FILE_INFO | 0x8000; + const WORD resid = VS_VERSION_INFO | 0x8000; IMAGE_OS2_HEADER nehd; NE_TYPEINFO *typeInfo; NE_NAMEINFO *nameInfo; @@@ -210,55 -165,23 +165,23 @@@ /* Find resource */ typeInfo = (NE_TYPEINFO *)(resTab + 2); - - if (HIWORD(typeid) != 0) /* named type */ + while (typeInfo->type_id) { - BYTE len = strlen( typeid ); - while (typeInfo->type_id) - { - if (!(typeInfo->type_id & 0x8000)) - { - BYTE *p = resTab + typeInfo->type_id; - if ((*p == len) && !strncasecmp( (char*)p+1, typeid, len )) goto found_type; - } - typeInfo = (NE_TYPEINFO *)((char *)(typeInfo + 1) + - typeInfo->count * sizeof(NE_NAMEINFO)); - } + if (typeInfo->type_id == typeid) goto found_type; + typeInfo = (NE_TYPEINFO *)((char *)(typeInfo + 1) + + typeInfo->count * sizeof(NE_NAMEINFO)); } - else /* numeric type id */ - { - WORD id = LOWORD(typeid) | 0x8000; - while (typeInfo->type_id) - { - if (typeInfo->type_id == id) goto found_type; - typeInfo = (NE_TYPEINFO *)((char *)(typeInfo + 1) + - typeInfo->count * sizeof(NE_NAMEINFO)); - } - } - TRACE("No typeid entry found for %p\n", typeid ); + TRACE("No typeid entry found\n" ); HeapFree( GetProcessHeap(), 0, resTab ); return FALSE; found_type: nameInfo = (NE_NAMEINFO *)(typeInfo + 1); - if (HIWORD(resid) != 0) /* named resource */ - { - BYTE len = strlen( resid ); - for (count = typeInfo->count; count > 0; count--, nameInfo++) - { - BYTE *p = resTab + nameInfo->id; - if (nameInfo->id & 0x8000) continue; - if ((*p == len) && !strncasecmp( (char*)p+1, resid, len )) goto found_name; - } - } - else /* numeric resource id */ - { - WORD id = LOWORD(resid) | 0x8000; - for (count = typeInfo->count; count > 0; count--, nameInfo++) - if (nameInfo->id == id) goto found_name; - } - TRACE("No resid entry found for %p\n", typeid ); + for (count = typeInfo->count; count > 0; count--, nameInfo++) + if (nameInfo->id == resid) goto found_name; + + TRACE("No resid entry found\n" ); HeapFree( GetProcessHeap(), 0, resTab ); return FALSE; @@@ -270,13 -193,11 +193,11 @@@ HeapFree( GetProcessHeap(), 0, resTab ); return TRUE; } - #endif /* ! __REACTOS__ */ /*********************************************************************** * find_pe_resource [internal] */ - static BOOL find_pe_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid, - DWORD *resLen, DWORD *resOff ) + static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) { IMAGE_NT_HEADERS pehd; DWORD pehdoffset; @@@ -349,22 -270,22 +270,22 @@@ resDir = resSection + (resDataDir->VirtualAddress - sections[i].VirtualAddress); resPtr = resDir; - resPtr = find_entry_by_name( resPtr, typeid, resDir ); + resPtr = find_entry_by_id( resPtr, VS_FILE_INFO, resDir ); if ( !resPtr ) { - TRACE("No typeid entry found for %p\n", typeid ); + TRACE("No typeid entry found\n" ); goto done; } - resPtr = find_entry_by_name( resPtr, resid, resDir ); + resPtr = find_entry_by_id( resPtr, VS_VERSION_INFO, resDir ); if ( !resPtr ) { - TRACE("No resid entry found for %p\n", resid ); + TRACE("No resid entry found\n" ); goto done; } resPtr = find_entry_default( resPtr, resDir ); if ( !resPtr ) { - TRACE("No default language entry found for %p\n", resid ); + TRACE("No default language entry found\n" ); goto done; } @@@ -395,95 -316,21 +316,21 @@@ } - /************************************************************************* - * GetFileResourceSize [VER.2] + /*********************************************************************** + * find_version_resource [internal] */ - DWORD WINAPI GetFileResourceSize16( LPCSTR lpszFileName, LPCSTR lpszResType, - LPCSTR lpszResId, LPDWORD lpdwFileOffset ) + DWORD find_version_resource( HFILE lzfd, DWORD *reslen, DWORD *offset ) { - BOOL retv = FALSE; - HFILE lzfd; - OFSTRUCT ofs; - DWORD reslen; - - TRACE("(%s,type=%p,id=%p,off=%p)\n", - debugstr_a(lpszFileName), lpszResType, lpszResId, lpszResId ); + DWORD magic = read_xx_header( lzfd ); - lzfd = LZOpenFileA( (LPSTR)lpszFileName, &ofs, OF_READ ); - if ( lzfd < 0 ) return 0; - - switch ( read_xx_header( lzfd ) ) + switch (magic) { case IMAGE_OS2_SIGNATURE: - #ifdef __REACTOS__ - ERR("OS2 Images not supported under ReactOS at this time."); - retv = 0; - #else - retv = find_ne_resource( lzfd, lpszResType, lpszResId, - &reslen, lpdwFileOffset ); - #endif + if (!find_ne_resource( lzfd, reslen, offset )) magic = 0; break; - case IMAGE_NT_SIGNATURE: - retv = find_pe_resource( lzfd, lpszResType, lpszResId, - &reslen, lpdwFileOffset ); + if (!find_pe_resource( lzfd, reslen, offset )) magic = 0; break; } - - LZClose( lzfd ); - return retv? reslen : 0; - } - - - /************************************************************************* - * GetFileResource [VER.3] - */ - DWORD WINAPI GetFileResource16( LPCSTR lpszFileName, LPCSTR lpszResType, - LPCSTR lpszResId, DWORD dwFileOffset, - DWORD dwResLen, LPVOID lpvData ) - { - BOOL retv = FALSE; - HFILE lzfd; - OFSTRUCT ofs; - DWORD reslen = dwResLen; - - TRACE("(%s,type=%p,id=%p,off=%d,len=%d,data=%p)\n", - debugstr_a(lpszFileName), lpszResType, lpszResId, - dwFileOffset, dwResLen, lpvData ); - - lzfd = LZOpenFileA( (LPSTR)lpszFileName, &ofs, OF_READ ); - if ( lzfd < 0 ) return 0; - - if ( !dwFileOffset ) - { - switch ( read_xx_header( lzfd ) ) - { - case IMAGE_OS2_SIGNATURE: - #ifdef __REACTOS__ - ERR("OS2 Images not supported under ReactOS at this time."); - retv = 0; - #else - retv = find_ne_resource( lzfd, lpszResType, lpszResId, - &reslen, &dwFileOffset ); - #endif - break; - - case IMAGE_NT_SIGNATURE: - retv = find_pe_resource( lzfd, lpszResType, lpszResId, - &reslen, &dwFileOffset ); - break; - } - - if ( !retv ) - { - LZClose( lzfd ); - return 0; - } - } - - LZSeek( lzfd, dwFileOffset, SEEK_SET ); - reslen = LZRead( lzfd, lpvData, min( reslen, dwResLen ) ); - LZClose( lzfd ); - - return reslen; + return magic; } diff --combined dll/win32/win32.rbuild index 9ff3319d54f,ad862f5169e..ad862f5169e --- a/dll/win32/win32.rbuild +++ b/dll/win32/win32.rbuild @@@ -31,6 -31,9 +31,9 @@@ + + + diff --combined dll/win32/windowscodecs/info.c index f909d3a6b6e,2e558a80619..2e558a80619 --- a/dll/win32/windowscodecs/info.c +++ b/dll/win32/windowscodecs/info.c @@@ -726,6 -726,7 +726,7 @@@ typedef struct LONG ref; struct list objects; struct list *cursor; + CRITICAL_SECTION lock; /* Must be held when reading or writing cursor */ } ComponentEnum; typedef struct { @@@ -783,6 -784,8 +784,8 @@@ static ULONG WINAPI ComponentEnum_Relea list_remove(&cursor->entry); HeapFree(GetProcessHeap(), 0, cursor); } + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This); } @@@ -795,15 -798,17 +798,17 @@@ static HRESULT WINAPI ComponentEnum_Nex ComponentEnum *This = (ComponentEnum*)iface; int num_fetched=0; ComponentEnumItem *item; + HRESULT hr=S_OK; TRACE("(%p,%u,%p,%p)\n", iface, celt, rgelt, pceltFetched); + EnterCriticalSection(&This->lock); while (num_fetchedcursor) { - *pceltFetched = num_fetched; - return S_FALSE; + hr = S_FALSE; + break; } item = LIST_ENTRY(This->cursor, ComponentEnumItem, entry); IUnknown_AddRef(item->unk); @@@ -811,24 -816,31 +816,31 @@@ num_fetched++; This->cursor = list_next(&This->objects, This->cursor); } + LeaveCriticalSection(&This->lock); *pceltFetched = num_fetched; - return S_OK; + return hr; } static HRESULT WINAPI ComponentEnum_Skip(IEnumUnknown *iface, ULONG celt) { ComponentEnum *This = (ComponentEnum*)iface; int i; + HRESULT hr=S_OK; TRACE("(%p,%u)\n", iface, celt); + EnterCriticalSection(&This->lock); for (i=0; icursor) - return S_FALSE; + { + hr = S_FALSE; + break; + } This->cursor = list_next(&This->objects, This->cursor); } - return S_OK; + LeaveCriticalSection(&This->lock); + return hr; } static HRESULT WINAPI ComponentEnum_Reset(IEnumUnknown *iface) @@@ -837,7 -849,9 +849,9 @@@ TRACE("(%p)\n", iface); + EnterCriticalSection(&This->lock); This->cursor = list_head(&This->objects); + LeaveCriticalSection(&This->lock); return S_OK; } @@@ -847,6 -861,7 +861,7 @@@ static HRESULT WINAPI ComponentEnum_Clo ComponentEnum *new_enum; ComponentEnumItem *old_item, *new_item; HRESULT ret=S_OK; + struct list *old_cursor; new_enum = HeapAlloc(GetProcessHeap(), 0, sizeof(ComponentEnum)); if (!new_enum) @@@ -858,8 -873,14 +873,14 @@@ new_enum->IEnumUnknown_Vtbl = &ComponentEnumVtbl; new_enum->ref = 1; new_enum->cursor = NULL; - list_init(&new_enum->objects); + InitializeCriticalSection(&new_enum->lock); + new_enum->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ComponentEnum.lock"); + + EnterCriticalSection(&This->lock); + old_cursor = This->cursor; + LeaveCriticalSection(&This->lock); + LIST_FOR_EACH_ENTRY(old_item, &This->objects, ComponentEnumItem, entry) { new_item = HeapAlloc(GetProcessHeap(), 0, sizeof(ComponentEnumItem)); @@@ -871,7 -892,7 +892,7 @@@ new_item->unk = old_item->unk; list_add_tail(&new_enum->objects, &new_item->entry); IUnknown_AddRef(new_item->unk); - if (&old_item->entry == This->cursor) new_enum->cursor = &new_item->entry; + if (&old_item->entry == old_cursor) new_enum->cursor = &new_item->entry; } if (FAILED(ret)) @@@ -923,6 -944,8 +944,8 @@@ HRESULT CreateComponentEnumerator(DWOR This->IEnumUnknown_Vtbl = &ComponentEnumVtbl; This->ref = 1; list_init(&This->objects); + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ComponentEnum.lock"); for (category=categories; category->type && hr == S_OK; category++) { diff --combined dll/win32/windowscodecs/jpegformat.c index 6f788216fbe,017e6045790..017e6045790 --- a/dll/win32/windowscodecs/jpegformat.c +++ b/dll/win32/windowscodecs/jpegformat.c @@@ -570,7 -570,7 +570,7 @@@ HRESULT JpegDecoder_CreateInstance(IUnk HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) { - ERR("Trying to load JPEG picture, but JPEG supported not compiled in.\n"); + ERR("Trying to load JPEG picture, but JPEG support is not compiled in.\n"); return E_FAIL; } diff --combined dll/win32/windowscodecs/pngformat.c index 22b37b063f4,5af680e876c..5af680e876c --- a/dll/win32/windowscodecs/pngformat.c +++ b/dll/win32/windowscodecs/pngformat.c @@@ -1320,13 -1320,13 +1320,13 @@@ HRESULT PngEncoder_CreateInstance(IUnkn HRESULT PngDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) { - ERR("Trying to load PNG picture, but PNG supported not compiled in.\n"); + ERR("Trying to load PNG picture, but PNG support is not compiled in.\n"); return E_FAIL; } HRESULT PngEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) { - ERR("Trying to save PNG picture, but PNG supported not compiled in.\n"); + ERR("Trying to save PNG picture, but PNG support is not compiled in.\n"); return E_FAIL; } diff --combined dll/win32/wininet/http.c index 5b7459db6f7,57b73729a10..57b73729a10 --- a/dll/win32/wininet/http.c +++ b/dll/win32/wininet/http.c @@@ -1345,9 -1345,12 +1345,12 @@@ static WCHAR *HTTP_BuildProxyRequestUrl static BOOL HTTP_DealWithProxy(appinfo_t *hIC, http_session_t *lpwhs, http_request_t *lpwhr) { WCHAR buf[MAXHOSTNAME]; + WCHAR protoProxy[MAXHOSTNAME + 15]; + DWORD protoProxyLen = sizeof(protoProxy) / sizeof(protoProxy[0]); WCHAR proxy[MAXHOSTNAME + 15]; /* 15 == "http://" + sizeof(port#) + ":/\0" */ static WCHAR szNul[] = { 0 }; URL_COMPONENTSW UrlComponents; + static const WCHAR protoHttp[] = { 'h','t','t','p',0 }; static const WCHAR szHttp[] = { 'h','t','t','p',':','/','/',0 }; static const WCHAR szFormat[] = { 'h','t','t','p',':','/','/','%','s',0 }; @@@ -1356,11 -1359,13 +1359,13 @@@ UrlComponents.lpszHostName = buf; UrlComponents.dwHostNameLength = MAXHOSTNAME; + if (!INTERNET_FindProxyForProtocol(hIC->lpszProxy, protoHttp, protoProxy, &protoProxyLen)) + return FALSE; if( CSTR_EQUAL != CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, - hIC->lpszProxy,strlenW(szHttp),szHttp,strlenW(szHttp)) ) - sprintfW(proxy, szFormat, hIC->lpszProxy); + protoProxy,strlenW(szHttp),szHttp,strlenW(szHttp)) ) + sprintfW(proxy, szFormat, protoProxy); else - strcpyW(proxy, hIC->lpszProxy); + strcpyW(proxy, protoProxy); if( !InternetCrackUrlW(proxy, 0, 0, &UrlComponents) ) return FALSE; if( UrlComponents.dwHostNameLength == 0 ) @@@ -4253,8 -4258,6 +4258,6 @@@ DWORD HTTP_Connect(appinfo_t *hIC, LPCW } if(hIC->lpszProxy && hIC->dwAccessType == INTERNET_OPEN_TYPE_PROXY) { - if(strchrW(hIC->lpszProxy, ' ')) - FIXME("Several proxies not implemented.\n"); if(hIC->lpszProxyBypass) FIXME("Proxy bypass is ignored.\n"); } diff --combined dll/win32/wininet/internet.c index 45b6aa791f3,f4b8a0a3abd..f4b8a0a3abd --- a/dll/win32/wininet/internet.c +++ b/dll/win32/wininet/internet.c @@@ -362,6 -362,98 +362,98 @@@ static LONG INTERNET_SaveProxySettings return ERROR_SUCCESS; } + /*********************************************************************** + * INTERNET_FindProxyForProtocol + * + * Searches the proxy string for a proxy of the given protocol. + * Returns the found proxy, or the default proxy if none of the given + * protocol is found. + * + * PARAMETERS + * szProxy [In] proxy string to search + * proto [In] protocol to search for, e.g. "http" + * foundProxy [Out] found proxy + * foundProxyLen [In/Out] length of foundProxy buffer, in WCHARs + * + * RETURNS + * TRUE if a proxy is found, FALSE if not. If foundProxy is too short, + * *foundProxyLen is set to the required size in WCHARs, including the + * NULL terminator, and the last error is set to ERROR_INSUFFICIENT_BUFFER. + */ + BOOL INTERNET_FindProxyForProtocol(LPCWSTR szProxy, LPCWSTR proto, WCHAR *foundProxy, DWORD *foundProxyLen) + { + LPCWSTR ptr; + BOOL ret = FALSE; + + TRACE("(%s, %s)\n", debugstr_w(szProxy), debugstr_w(proto)); + + /* First, look for the specified protocol (proto=scheme://host:port) */ + for (ptr = szProxy; !ret && ptr && *ptr; ) + { + LPCWSTR end, equal; + + if (!(end = strchrW(ptr, ' '))) + end = ptr + strlenW(ptr); + if ((equal = strchrW(ptr, '=')) && equal < end && + equal - ptr == strlenW(proto) && + !strncmpiW(proto, ptr, strlenW(proto))) + { + if (end - equal > *foundProxyLen) + { + WARN("buffer too short for %s\n", + debugstr_wn(equal + 1, end - equal - 1)); + *foundProxyLen = end - equal; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + memcpy(foundProxy, equal + 1, (end - equal) * sizeof(WCHAR)); + foundProxy[end - equal] = 0; + ret = TRUE; + } + } + if (*end == ' ') + ptr = end + 1; + else + ptr = end; + } + if (!ret) + { + /* It wasn't found: look for no protocol */ + for (ptr = szProxy; !ret && ptr && *ptr; ) + { + LPCWSTR end, equal; + + if (!(end = strchrW(ptr, ' '))) + end = ptr + strlenW(ptr); + if (!(equal = strchrW(ptr, '='))) + { + if (end - ptr + 1 > *foundProxyLen) + { + WARN("buffer too short for %s\n", + debugstr_wn(ptr, end - ptr)); + *foundProxyLen = end - ptr + 1; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + else + { + memcpy(foundProxy, ptr, (end - ptr) * sizeof(WCHAR)); + foundProxy[end - ptr] = 0; + ret = TRUE; + } + } + if (*end == ' ') + ptr = end + 1; + else + ptr = end; + } + } + if (ret) + TRACE("found proxy for %s: %s\n", debugstr_w(proto), + debugstr_w(foundProxy)); + return ret; + } + /*********************************************************************** * InternetInitializeAutoProxyDll (WININET.@) * diff --combined dll/win32/wininet/internet.h index e45176bb2c0,8fcc0cf3565..8fcc0cf3565 --- a/dll/win32/wininet/internet.h +++ b/dll/win32/wininet/internet.h @@@ -422,6 -422,7 +422,7 @@@ VOID SendAsyncCallback(object_header_t VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength); + BOOL INTERNET_FindProxyForProtocol(LPCWSTR szProxy, LPCWSTR proto, WCHAR *foundProxy, DWORD *foundProxyLen); BOOL NETCON_connected(WININET_NETCONNECTION *connection); DWORD NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL); diff --combined dll/win32/ws2_32/misc/stubs.c index 408f28294a6,10dd98e1ded..10dd98e1ded --- a/dll/win32/ws2_32/misc/stubs.c +++ b/dll/win32/ws2_32/misc/stubs.c @@@ -30,7 -30,7 +30,7 @@@ getpeername(IN SOCKET s return SOCKET_ERROR; } - if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) + if (!ReferenceProviderByHandle((HANDLE)(ULONG_PTR)(s), &Provider)) { WSASetLastError(WSAENOTSOCK); return SOCKET_ERROR; diff --combined drivers/base/bootvid/bootvid.rbuild index fc9f3ec3bf5,0c996310194..0c996310194 --- a/drivers/base/bootvid/bootvid.rbuild +++ b/drivers/base/bootvid/bootvid.rbuild @@@ -6,7 -6,7 +6,7 @@@ . ntoskrnl hal - + bootvid.c bootdata.c diff --combined drivers/base/bootvid/i386/bootvid.c index c55ffc16255,3d0ae503167..3d0ae503167 --- a/drivers/base/bootvid/i386/bootvid.c +++ b/drivers/base/bootvid/i386/bootvid.c @@@ -355,7 -355,7 +355,7 @@@ BOOLEA NTAPI VidInitialize(IN BOOLEAN SetMode) { - ULONG Context = 0; + ULONG_PTR Context = 0; PHYSICAL_ADDRESS TranslatedAddress; PHYSICAL_ADDRESS NullAddress = {{0, 0}}, VgaAddress; ULONG AddressSpace = 1; diff --combined drivers/base/bootvid/i386/vga.c index e11aae77fab,eeb06fe8df5..eeb06fe8df5 --- a/drivers/base/bootvid/i386/vga.c +++ b/drivers/base/bootvid/i386/vga.c @@@ -319,8 -319,8 +319,8 @@@ VgaScroll(ULONG Scroll do { /* Write value in the new position so that we can do the scroll */ - WRITE_REGISTER_UCHAR((PUCHAR)j, - READ_REGISTER_UCHAR((PUCHAR)j + i)); + WRITE_REGISTER_UCHAR(UlongToPtr(j), + READ_REGISTER_UCHAR(UlongToPtr(j + i))); /* Move to the next memory location to write to */ j++; @@@ -1197,7 -1197,7 +1197,7 @@@ VidSolidColorFill(IN ULONG Left __outpw(0x3CE, 7); /* Calculate pixel position for the read */ - Offset = VgaBase + (Top * 80) + (PUCHAR)LeftOffset; + Offset = VgaBase + (Top * 80) + (PUCHAR)(ULONG_PTR)LeftOffset; /* Select the bitmask register and write the mask */ __outpw(0x3CE, (USHORT)lMask); @@@ -1221,7 -1221,7 +1221,7 @@@ if (Distance) { /* Calculate new pixel position */ - Offset = VgaBase + (Top * 80) + (PUCHAR)RightOffset; + Offset = VgaBase + (Top * 80) + (PUCHAR)(ULONG_PTR)RightOffset; Distance--; /* Select the bitmask register and write the mask */ @@@ -1247,7 -1247,7 +1247,7 @@@ if (Distance) { /* Calculate new pixel position */ - Offset = VgaBase + (Top * 80) + (PUCHAR)(LeftOffset + 1); + Offset = VgaBase + (Top * 80) + (PUCHAR)(ULONG_PTR)(LeftOffset + 1); /* Set the bitmask to 0xFF for all 4 planes */ __outpw(0x3CE, 0xFF08); diff --combined drivers/battery/battc/battc.c index 3a73bc9c56f,6a0b7220c1c..6a0b7220c1c --- a/drivers/battery/battc/battc.c +++ b/drivers/battery/battc/battc.c @@@ -51,26 -51,9 +51,9 @@@ BatteryClassSystemControl(PVOID ClassDa PIRP Irp, PVOID Disposition) { - NTSTATUS Status; - UNIMPLEMENTED - /* FIXME: Uncomment when WmiCompleteRequest is implemented */ - #if 0 - Status = STATUS_WMI_GUID_NOT_FOUND; - WmiCompleteRequest(DeviceObject, - Irp, - Status, - 0, - IO_NO_INCREMENT); - #else - Irp->IoStatus.Status = Status = STATUS_WMI_GUID_NOT_FOUND; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - #endif - - return Status; + return STATUS_WMI_GUID_NOT_FOUND; } BCLASSAPI diff --combined drivers/bus/acpi/acpi.rbuild index cbc124a26f5,c3e5b7dac90..c3e5b7dac90 --- a/drivers/bus/acpi/acpi.rbuild +++ b/drivers/bus/acpi/acpi.rbuild @@@ -7,6 -7,9 +7,9 @@@ + + + @@@ -26,6 -29,8 +29,8 @@@ osl.c acpienum.c + eval.c + interface.c pnp.c power.c buspdo.c diff --combined drivers/bus/acpi/busmgr/bus.c index 34aa0766c04,ae04c2cb31b..ae04c2cb31b --- a/drivers/bus/acpi/busmgr/bus.c +++ b/drivers/bus/acpi/busmgr/bus.c @@@ -58,6 -58,7 +58,7 @@@ KSPIN_LOCK acpi_bus_event_lock LIST_HEAD(acpi_bus_event_list); //DECLARE_WAIT_QUEUE_HEAD(acpi_bus_event_queue); KEVENT AcpiEventQueue; + KDPC event_dpc; static int @@@ -455,6 -456,21 +456,21 @@@ acpi_bus_get_perf_flags Event Management -------------------------------------------------------------------------- */ + void + acpi_bus_generate_event_dpc(PKDPC Dpc, + PVOID DeferredContext, + PVOID SystemArgument1, + PVOID SystemArgument2) + { + struct acpi_bus_event *event = SystemArgument1; + KIRQL OldIrql; + + KeAcquireSpinLock(&acpi_bus_event_lock, &OldIrql); + list_add_tail(&event->node, &acpi_bus_event_list); + KeReleaseSpinLock(&acpi_bus_event_lock, OldIrql); + + KeSetEvent(&AcpiEventQueue, IO_NO_INCREMENT, FALSE); + } int acpi_bus_generate_event ( @@@ -463,10 -479,8 +479,8 @@@ int data) { struct acpi_bus_event *event = NULL; - //unsigned long flags = 0; - KIRQL OldIrql; - DPRINT1("acpi_bus_generate_event"); + DPRINT("acpi_bus_generate_event"); if (!device) return_VALUE(AE_BAD_PARAMETER); @@@ -484,14 -498,8 +498,8 @@@ event->type = type; event->data = data; - //spin_lock_irqsave(&acpi_bus_event_lock, flags); - KeAcquireSpinLock(&acpi_bus_event_lock, &OldIrql); - list_add_tail(&event->node, &acpi_bus_event_list); - KeReleaseSpinLock(&acpi_bus_event_lock, OldIrql); - //spin_unlock_irqrestore(&acpi_bus_event_lock, flags); - - KeSetEvent(&AcpiEventQueue, IO_NO_INCREMENT, FALSE); - //wake_up_interruptible(&acpi_bus_event_queue); + if (!KeInsertQueueDpc(&event_dpc, event, NULL)) + ExFreePool(event); return_VALUE(0); } @@@ -506,7 -514,7 +514,7 @@@ acpi_bus_receive_event //DECLARE_WAITQUEUE(wait, current); - DPRINT1("acpi_bus_receive_event"); + DPRINT("acpi_bus_receive_event"); if (!event) return AE_BAD_PARAMETER; @@@ -1153,9 -1161,11 +1161,11 @@@ acpi_bus_add case ACPI_BUS_TYPE_SYSTEM: sprintf(device->pnp.bus_id, "%s", "ACPI"); break; + case ACPI_BUS_TYPE_POWER_BUTTONF: case ACPI_BUS_TYPE_POWER_BUTTON: sprintf(device->pnp.bus_id, "%s", "PWRF"); break; + case ACPI_BUS_TYPE_SLEEP_BUTTONF: case ACPI_BUS_TYPE_SLEEP_BUTTON: sprintf(device->pnp.bus_id, "%s", "SLPF"); break; @@@ -1262,9 -1272,15 +1272,15 @@@ hid = ACPI_THERMAL_HID; break; case ACPI_BUS_TYPE_POWER_BUTTON: + hid = ACPI_BUTTON_HID_POWER; + break; + case ACPI_BUS_TYPE_POWER_BUTTONF: hid = ACPI_BUTTON_HID_POWERF; break; case ACPI_BUS_TYPE_SLEEP_BUTTON: + hid = ACPI_BUTTON_HID_SLEEP; + break; + case ACPI_BUS_TYPE_SLEEP_BUTTONF: hid = ACPI_BUTTON_HID_SLEEPF; break; } @@@ -1326,7 -1342,9 +1342,9 @@@ */ switch (type) { case ACPI_BUS_TYPE_POWER_BUTTON: + case ACPI_BUS_TYPE_POWER_BUTTONF: case ACPI_BUS_TYPE_SLEEP_BUTTON: + case ACPI_BUS_TYPE_SLEEP_BUTTONF: break; default: status = AcpiAttachData(device->handle, @@@ -1530,16 -1548,40 +1548,40 @@@ acpi_bus_scan_fixed if (!root) return_VALUE(AE_NOT_FOUND); - /* - * Enumerate all fixed-feature devices. + /* If ACPI_FADT_POWER_BUTTON is set, then a control + * method power button is present. Otherwise, a fixed + * power button is present. */ if (AcpiGbl_FADT.Flags & ACPI_FADT_POWER_BUTTON) result = acpi_bus_add(&device, acpi_root, NULL, ACPI_BUS_TYPE_POWER_BUTTON); + else + { + /* Enable the fixed power button so we get notified if it is pressed */ + AcpiWriteBitRegister(ACPI_BITREG_POWER_BUTTON_ENABLE, 1); + result = acpi_bus_add(&device, acpi_root, + NULL, ACPI_BUS_TYPE_POWER_BUTTONF); + } + + /* This one is a bit more complicated and we do it wrong + * right now. If ACPI_FADT_SLEEP_BUTTON is set but no + * device object is present then no sleep button is present, but + * if the flags is clear and there is no device object then it is + * a fixed sleep button. If the flag is set and there is a device object + * the we have a control method button just like above. + */ if (AcpiGbl_FADT.Flags & ACPI_FADT_SLEEP_BUTTON) result = acpi_bus_add(&device, acpi_root, NULL, ACPI_BUS_TYPE_SLEEP_BUTTON); + else + { + /* Enable the fixed sleep button so we get notified if it is pressed */ + AcpiWriteBitRegister(ACPI_BITREG_SLEEP_BUTTON_ENABLE, 1); + + result = acpi_bus_add(&device, acpi_root, + NULL, ACPI_BUS_TYPE_SLEEP_BUTTONF); + } return_VALUE(result); } @@@ -1549,120 -1591,6 +1591,6 @@@ Initialization/Cleanup -------------------------------------------------------------------------- */ - static int - acpi_bus_init_irq (void) - { - ACPI_STATUS status = AE_OK; - ACPI_OBJECT arg = {ACPI_TYPE_INTEGER}; - ACPI_OBJECT_LIST arg_list = {1, &arg}; - //char *message = NULL; - - DPRINT("acpi_bus_init_irq"); - - /* - * Let the system know what interrupt model we are using by - * evaluating the \_PIC object, if exists. - */ - - //switch (acpi_irq_model) { - //case ACPI_IRQ_MODEL_PIC: - // message = "PIC"; - // break; - //case ACPI_IRQ_MODEL_IOAPIC: - // message = "IOAPIC"; - // break; - //case ACPI_IRQ_MODEL_IOSAPIC: - // message = "IOSAPIC"; - // break; - //default: - // DPRINT1("Unknown interrupt routing model\n"); - // return_VALUE(AE_NOT_FOUND); - //} - - //DPRINT("Using %s for interrupt routing\n", message); - - //arg.Integer.Value = acpi_irq_model; - - //status = AcpiEvaluateObject(NULL, "\\_PIC", &arg_list, NULL); - //if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) { - // ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PIC\n")); - // return_VALUE(AE_NOT_FOUND); - //} - - return_VALUE(0); - } - - - //void - //acpi_early_init (void) - //{ - // ACPI_STATUS status = AE_OK; - // - // DPRINT("acpi_early_init"); - // - // if (acpi_disabled) - // return_VOID; - // - /* enable workarounds, unless strict ACPI spec. compliance */ - // if (!acpi_strict) - // acpi_gbl_enable_interpreter_slack = TRUE; - // - // status = acpi_reallocate_root_table(); - // if (ACPI_FAILURE(status)) { - // printk(KERN_ERR PREFIX - // "Unable to reallocate ACPI tables\n"); - // goto error0; - // } - // - // status = acpi_initialize_subsystem(); - // if (ACPI_FAILURE(status)) { - // printk(KERN_ERR PREFIX - // "Unable to initialize the ACPI Interpreter\n"); - // goto error0; - // } - // - // status = acpi_load_tables(); - // if (ACPI_FAILURE(status)) { - // printk(KERN_ERR PREFIX - // "Unable to load the System Description Tables\n"); - // goto error0; - // } - // - //#ifdef CONFIG_X86 - // if (!acpi_ioapic) { - // /* compatible (0) means level (3) */ - // if (!(acpi_sci_flags & ACPI_MADT_TRIGGER_MASK)) { - // acpi_sci_flags &= ~ACPI_MADT_TRIGGER_MASK; - // acpi_sci_flags |= ACPI_MADT_TRIGGER_LEVEL; - // } - // /* Set PIC-mode SCI trigger type */ - // acpi_pic_sci_set_trigger(acpi_gbl_FADT.sci_interrupt, - // (acpi_sci_flags & ACPI_MADT_TRIGGER_MASK) >> 2); - // } else { - // /* - // * now that acpi_gbl_FADT is initialized, - // * update it with result from INT_SRC_OVR parsing - // */ - // acpi_gbl_FADT.sci_interrupt = acpi_sci_override_gsi; - // } - //#endif - // - // status = - // acpi_enable_subsystem(~ - // (ACPI_NO_HARDWARE_INIT | - // ACPI_NO_ACPI_ENABLE)); - // if (ACPI_FAILURE(status)) { - // printk(KERN_ERR PREFIX "Unable to enable ACPI\n"); - // goto error0; - // } - // - // return; - // - // error0: - // disable_acpi(); - // return; - //} - int acpi_bus_init (void) { @@@ -1671,6 -1599,8 +1599,8 @@@ DPRINT("acpi_bus_init"); + KeInitializeDpc(&event_dpc, acpi_bus_generate_event_dpc, NULL); + status = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION); if (ACPI_FAILURE(status)) { DPRINT1("Unable to start the ACPI Interpreter\n"); @@@ -1701,13 -1631,6 +1631,6 @@@ /* Initialize sleep structures */ //acpi_sleep_init(); - /* - * Get the system interrupt model and evaluate \_PIC. - */ - result = acpi_bus_init_irq(); - if (result) - goto error1; - /* * Register the for all standard device notifications. */ @@@ -1726,6 -1649,7 +1649,7 @@@ if (result) goto error2; + /* * Enumerate devices in the ACPI namespace. */ @@@ -1736,7 -1660,6 +1660,6 @@@ if (result) DPRINT1("acpi_bus_scan failed\n"); - //acpi_motherboard_init(); return_VALUE(0); /* Mimic structured exception handling */ diff --combined drivers/bus/acpi/busmgr/button.c index 5e3eb2b5f0f,9344a5f1f7d..9344a5f1f7d --- a/drivers/bus/acpi/busmgr/button.c +++ b/drivers/bus/acpi/busmgr/button.c @@@ -57,6 -57,11 +57,11 @@@ struct acpi_button UINT8 type; unsigned long pushed; }; + + struct acpi_device *power_button; + struct acpi_device *sleep_button; + struct acpi_device *lid_button; + /* -------------------------------------------------------------------------- Driver Interface -------------------------------------------------------------------------- */ @@@ -113,10 -118,6 +118,6 @@@ acpi_button_add ACPI_STATUS status = AE_OK; struct acpi_button *button = NULL; - static struct acpi_device *power_button; - static struct acpi_device *sleep_button; - static struct acpi_device *lid_button; - ACPI_FUNCTION_TRACE("acpi_button_add"); if (!device) diff --combined drivers/bus/acpi/buspdo.c index 4a9498e7ad4,84bd1d8fe11..84bd1d8fe11 --- a/drivers/bus/acpi/buspdo.c +++ b/drivers/bus/acpi/buspdo.c @@@ -8,6 -8,9 +8,9 @@@ #include #include + #include + #include + #define NDEBUG #include @@@ -33,9 -36,13 +36,13 @@@ Bus_PDO_PnP { NTSTATUS status; POWER_STATE state; + struct acpi_device *device = NULL; PAGED_CODE (); + if (DeviceData->AcpiHandle) + acpi_bus_get_device(DeviceData->AcpiHandle, &device); + // // NB: Because we are a bus enumerator, we have no one to whom we could // defer these irps. Therefore we do not pass them down but merely @@@ -45,7 -52,6 +52,6 @@@ switch (IrpStack->MinorFunction) { case IRP_MN_START_DEVICE: - // // Here we do what ever initialization and ``turning on'' that is // required to allow others to access this device. @@@ -59,6 -65,43 +65,43 @@@ break; } + DeviceData->InterfaceName.Length = 0; + + if (!device) + { + IoRegisterDeviceInterface(DeviceData->Common.Self, + &GUID_DEVICE_SYS_BUTTON, + NULL, + &DeviceData->InterfaceName); + } + else if (device->flags.hardware_id && + strstr(device->pnp.hardware_id, ACPI_THERMAL_HID)) + { + IoRegisterDeviceInterface(DeviceData->Common.Self, + &GUID_DEVICE_THERMAL_ZONE, + NULL, + &DeviceData->InterfaceName); + } + else if (device->flags.hardware_id && + strstr(device->pnp.hardware_id, ACPI_BUTTON_HID_LID)) + { + IoRegisterDeviceInterface(DeviceData->Common.Self, + &GUID_DEVICE_LID, + NULL, + &DeviceData->InterfaceName); + } + else if (device->flags.hardware_id && + strstr(device->pnp.hardware_id, ACPI_PROCESSOR_HID)) + { + IoRegisterDeviceInterface(DeviceData->Common.Self, + &GUID_DEVICE_PROCESSOR, + NULL, + &DeviceData->InterfaceName); + } + + if (DeviceData->InterfaceName.Length != 0) + IoSetDeviceInterfaceState(&DeviceData->InterfaceName, TRUE); + state.DeviceState = PowerDeviceD0; PoSetPowerState(DeviceData->Common.Self, DevicePowerState, state); DeviceData->Common.DevicePowerState = PowerDeviceD0; @@@ -68,6 -111,9 +111,9 @@@ case IRP_MN_STOP_DEVICE: + if (DeviceData->InterfaceName.Length != 0) + IoSetDeviceInterfaceState(&DeviceData->InterfaceName, FALSE); + // // Here we shut down the device and give up and unmap any resources // we acquired for the device. @@@ -176,6 -222,12 +222,12 @@@ break; + case IRP_MN_QUERY_INTERFACE: + + status = Bus_PDO_QueryInterface(DeviceData, Irp); + + break; + case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: @@@ -325,20 -377,17 +377,17 @@@ Bus_PDO_QueryDeviceCaps deviceCapabilities->UniqueID = device->flags.unique_id; deviceCapabilities->NoDisplayInUI = !device->status.show_in_ui; deviceCapabilities->Address = device->pnp.bus_address; - deviceCapabilities->RawDeviceOK = FALSE; } - else + + if (!device || + (device->flags.hardware_id && + (strstr(device->pnp.hardware_id, ACPI_BUTTON_HID_LID) || + strstr(device->pnp.hardware_id, ACPI_THERMAL_HID) || + strstr(device->pnp.hardware_id, ACPI_PROCESSOR_HID)))) { - deviceCapabilities->EjectSupported = FALSE; - deviceCapabilities->HardwareDisabled = FALSE; - deviceCapabilities->Removable = FALSE; - deviceCapabilities->SurpriseRemovalOK = FALSE; - deviceCapabilities->UniqueID = FALSE; - deviceCapabilities->NoDisplayInUI = FALSE; - deviceCapabilities->Address = 0; - - /* The ACPI driver will run fixed buttons */ - deviceCapabilities->RawDeviceOK = TRUE; + /* Allow ACPI to control the device if it is a lid button, + * a thermal zone, a processor, or a fixed feature button */ + deviceCapabilities->RawDeviceOK = TRUE; } deviceCapabilities->SilentInstall = FALSE; diff --combined drivers/bus/acpi/cmbatt/cmbatt.c index b8c59739d4e,747ac9ea952..747ac9ea952 --- a/drivers/bus/acpi/cmbatt/cmbatt.c +++ b/drivers/bus/acpi/cmbatt/cmbatt.c @@@ -18,34 -18,233 +18,233 @@@ PVOID CmBattPowerCallBackRegistration UNICODE_STRING GlobalRegistryPath; KTIMER CmBattWakeDpcTimerObject; KDPC CmBattWakeDpcObject; + PDEVICE_OBJECT AcAdapterPdo; + LARGE_INTEGER CmBattWakeDpcDelay; /* FUNCTIONS ******************************************************************/ VOID NTAPI - CmBattPowerCallBack(PCMBATT_DEVICE_EXTENSION DeviceExtension, - PVOID Argument1, - PVOID Argument2) + CmBattPowerCallBack(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG Action, + IN ULONG Value) { - UNIMPLEMENTED; + BOOLEAN Cancelled; + PDEVICE_OBJECT DeviceObject; + if (CmBattDebug & 0x10) + DbgPrint("CmBattPowerCallBack: action: %d, value: %d \n", Action, Value); + + /* Check if a transition is going to happen */ + if (Action == PO_CB_SYSTEM_STATE_LOCK) + { + /* We have just re-entered S0: call the wake DPC in 10 seconds */ + if (Value == 1) + { + if (CmBattDebug & 0x10) + DbgPrint("CmBattPowerCallBack: Calling CmBattWakeDpc after 10 seconds.\n"); + Cancelled = KeSetTimer(&CmBattWakeDpcTimerObject, CmBattWakeDpcDelay, &CmBattWakeDpcObject); + if (CmBattDebug & 0x10) + DbgPrint("CmBattPowerCallBack: timerCanceled = %d.\n", Cancelled); + } + else if (Value == 0) + { + /* We are exiting the S0 state: loop all devices to set the delay flag */ + if (CmBattDebug & 0x10) + DbgPrint("CmBattPowerCallBack: Delaying Notifications\n"); + for (DeviceObject = DeviceExtension->DeviceObject; + DeviceObject; + DeviceObject = DeviceObject->NextDevice) + { + /* Set the delay flag */ + DeviceExtension = DeviceObject->DeviceExtension; + DeviceExtension->DelayNotification = TRUE; + } + } + else if (CmBattDebug & 0x10) + { + /* Unknown value */ + DbgPrint("CmBattPowerCallBack: unknown argument2 = %08x\n"); + } + } } VOID NTAPI - CmBattWakeDpc(PKDPC Dpc, - PCMBATT_DEVICE_EXTENSION FdoExtension, - PVOID SystemArgument1, - PVOID SystemArgument2) + CmBattWakeDpc(IN PKDPC Dpc, + IN PCMBATT_DEVICE_EXTENSION FdoExtension, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2) { + PDEVICE_OBJECT CurrentObject; + BOOLEAN AcNotify = FALSE; + PCMBATT_DEVICE_EXTENSION DeviceExtension; + ULONG ArFlag; + if (CmBattDebug & 2) DbgPrint("CmBattWakeDpc: Entered.\n"); + + /* Loop all device objects */ + for (CurrentObject = FdoExtension->DeviceObject; + CurrentObject; + CurrentObject = CurrentObject->NextDevice) + { + /* Turn delay flag off, we're back in S0 */ + DeviceExtension = CurrentObject->DeviceExtension; + DeviceExtension->DelayNotification = 0; + + /* Check if this is an AC adapter */ + if (DeviceExtension->FdoType == CmBattAcAdapter) + { + /* Was there a pending notify? */ + if (DeviceExtension->ArFlag & CMBATT_AR_NOTIFY) + { + /* We'll send a notify on the next pass */ + AcNotify = TRUE; + DeviceExtension->ArFlag = 0; + if (CmBattDebug & 0x20) + DbgPrint("CmBattWakeDpc: AC adapter notified\n"); + } + } + } + + /* Loop the device objects again */ + for (CurrentObject = FdoExtension->DeviceObject; + CurrentObject; + CurrentObject = CurrentObject->NextDevice) + { + /* Check if this is a battery */ + DeviceExtension = CurrentObject->DeviceExtension; + if (DeviceExtension->FdoType == CmBattBattery) + { + /* Check what ARs are pending */ + ArFlag = DeviceExtension->ArFlag; + if (CmBattDebug & 0x20) + DbgPrint("CmBattWakeDpc: Performing delayed ARs: %01x\n", ArFlag); + /* Insert notification, clear the lock value */ + if (ArFlag & CMBATT_AR_INSERT) InterlockedExchange(&DeviceExtension->ArLockValue, 0); + + /* Removal, clear the battery tag */ + if (ArFlag & CMBATT_AR_REMOVE) DeviceExtension->Tag = 0; + + /* Notification (or AC/DC adapter change from first pass above) */ + if ((ArFlag & CMBATT_AR_NOTIFY) || (AcNotify)) + { + /* Notify the class driver */ + BatteryClassStatusNotify(DeviceExtension->ClassData); + } + } + } } VOID NTAPI - CmBattNotifyHandler(PCMBATT_DEVICE_EXTENSION DeviceExtension, - ULONG NotifyValue) + CmBattNotifyHandler(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG NotifyValue) { - UNIMPLEMENTED; + ULONG ArFlag; + PCMBATT_DEVICE_EXTENSION FdoExtension; + PDEVICE_OBJECT DeviceObject; + + if (CmBattDebug & (CMBATT_ACPI_ASSERT | CMBATT_PNP_INFO)) + DbgPrint("CmBattNotifyHandler: CmBatt 0x%08x Type %d Number %d Notify Value: %x\n", + DeviceExtension, + DeviceExtension->FdoType, + DeviceExtension->DeviceId, + NotifyValue); + + /* Check what kind of notification was received */ + switch (NotifyValue) + { + /* ACPI Specification says is sends a "Bus Check" when power source changes */ + case ACPI_BUS_CHECK: + + /* We treat it as possible physical change */ + DeviceExtension->ArFlag |= (CMBATT_AR_NOTIFY | CMBATT_AR_INSERT); + if ((DeviceExtension->Tag) && + (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_WARNING))) + DbgPrint("CmBattNotifyHandler: Received battery #%x insertion, but tag was not invalid.\n", + DeviceExtension->DeviceId); + break; + + /* Status of the battery has changed */ + case ACPI_BATT_NOTIFY_STATUS: + + /* All we'll do is notify the class driver */ + DeviceExtension->ArFlag |= CMBATT_AR_NOTIFY; + break; + + /* Information on the battery has changed, such as physical presence */ + case ACPI_DEVICE_CHECK: + case ACPI_BATT_NOTIFY_INFO: + + /* Reset all state and let the class driver re-evaluate it all */ + DeviceExtension->ArFlag |= (CMBATT_AR_NOTIFY | + CMBATT_AR_INSERT | + CMBATT_AR_REMOVE); + break; + + default: + + if (CmBattDebug & CMBATT_PNP_INFO) + DbgPrint("CmBattNotifyHandler: Unknown Notify Value: %x\n", NotifyValue); + } + + /* Check if we're supposed to delay the notification till later */ + if (DeviceExtension->DelayNotification) + { + /* We'll handle this when we get a status query later on */ + if (CmBattDebug & CMBATT_PNP_INFO) + DbgPrint("CmBattNotifyHandler: Notification delayed: ARs = %01x\n", + DeviceExtension->ArFlag); + return; + } + + /* We're going to handle this now */ + if (CmBattDebug & CMBATT_PNP_INFO) + DbgPrint("CmBattNotifyHandler: Performing ARs: %01x\n", DeviceExtension->ArFlag); + + /* Check if this is a battery or AC adapter notification */ + if (DeviceExtension->FdoType == CmBattBattery) + { + /* Reset the current trip point */ + DeviceExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY; + + /* Check what ARs have to be done */ + ArFlag = DeviceExtension->ArFlag; + + /* New battery inserted, reset lock value */ + if (ArFlag & CMBATT_AR_INSERT) InterlockedExchange(&DeviceExtension->ArLockValue, 0); + + /* Check if the battery may have been removed */ + if (ArFlag & CMBATT_AR_REMOVE) DeviceExtension->Tag = 0; + + /* Check if there's been any sort of change to the battery */ + if (ArFlag & CMBATT_AR_NOTIFY) + { + /* We'll probably end up re-evaluating _BIF and _BST */ + DeviceExtension->NotifySent = TRUE; + BatteryClassStatusNotify(DeviceExtension->ClassData); + } + } + else if (DeviceExtension->ArFlag & CMBATT_AR_NOTIFY) + { + /* The only known notification is AC/DC change. Loop device objects. */ + for (DeviceObject = DeviceExtension->FdoDeviceObject->DriverObject->DeviceObject; + DeviceObject; + DeviceObject = DeviceObject->NextDevice) + { + /* Is this a battery? */ + FdoExtension = DeviceObject->DeviceExtension; + if (FdoExtension->FdoType == CmBattBattery) + { + /* Send a notification to the class driver */ + FdoExtension->NotifySent = TRUE; + BatteryClassStatusNotify(FdoExtension->ClassData); + } + } + } + + /* ARs have been processed */ + DeviceExtension->ArFlag = 0; } VOID @@@ -74,7 -273,7 +273,7 @@@ CmBattUnload(IN PDRIVER_OBJECT DriverOb NTSTATUS NTAPI - CmBattVerifyStaticInfo(ULONG StaData, + CmBattVerifyStaticInfo(PCMBATT_DEVICE_EXTENSION DeviceExtension, ULONG BatteryTag) { UNIMPLEMENTED; @@@ -146,71 -345,896 +345,896 @@@ Complete NTSTATUS NTAPI - CmBattIoctl(PDEVICE_OBJECT DeviceObject, - PIRP Irp) + CmBattIoctl(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; + NTSTATUS Status; + PIO_STACK_LOCATION IoStackLocation; + ULONG IoControlCode, OutputBufferLength, InputBufferLength; + PAGED_CODE(); + if (CmBattDebug & 2) DbgPrint("CmBattIoctl\n"); + + /* Acquire the remove lock */ + Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, 0); + if (!NT_SUCCESS(Status)) + { + /* It's too late, fail */ + Irp->IoStatus.Status = STATUS_DEVICE_REMOVED; + IofCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_DEVICE_REMOVED; + } + + /* There's nothing to do for an AC adapter */ + if (DeviceExtension->FdoType == CmBattAcAdapter) + { + /* Pass it down, and release the remove lock */ + IoSkipCurrentIrpStackLocation(Irp); + Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp); + IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp); + return Status; + } + + /* Send to class driver */ + Status = BatteryClassIoctl(DeviceExtension->ClassData, Irp); + if (Status == STATUS_NOT_SUPPORTED) + { + /* Read IOCTL information from IRP stack */ + IoStackLocation = IoGetCurrentIrpStackLocation(Irp); + IoControlCode = IoStackLocation->Parameters.DeviceIoControl.IoControlCode; + OutputBufferLength = IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength; + InputBufferLength = IoStackLocation->Parameters.DeviceIoControl.InputBufferLength; + if (CmBattDebug & 4) + DbgPrint("CmBattIoctl: Received Direct Access IOCTL %x\n", IoControlCode); + + /* Handle internal IOCTLs */ + switch (IoControlCode) + { + case IOCTL_BATTERY_QUERY_UNIQUE_ID: + + /* Data is 4 bytes long */ + if (OutputBufferLength == sizeof(ULONG)) + { + /* Query it */ + Status = CmBattGetUniqueId(DeviceExtension->PdoDeviceObject, + Irp->AssociatedIrp.SystemBuffer); + if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ULONG); + } + else + { + /* Buffer size invalid */ + Status = STATUS_INVALID_BUFFER_SIZE; + } + break; + + case IOCTL_BATTERY_QUERY_STA: + + /* Data is 4 bytes long */ + if (OutputBufferLength == sizeof(ULONG)) + { + /* Query it */ + Status = CmBattGetStaData(DeviceExtension->PdoDeviceObject, + Irp->AssociatedIrp.SystemBuffer); + if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ULONG); + } + else + { + /* Buffer size invalid */ + Status = STATUS_INVALID_BUFFER_SIZE; + } + break; + + case IOCTL_BATTERY_QUERY_PSR: + + /* Data is 4 bytes long */ + if (OutputBufferLength == sizeof(ULONG)) + { + /* Do we have an AC adapter? */ + if (AcAdapterPdo) + { + /* Query it */ + Status = CmBattGetPsrData(AcAdapterPdo, + Irp->AssociatedIrp.SystemBuffer); + if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ULONG); + } + else + { + /* No adapter, just a battery, so fail */ + Status = STATUS_NO_SUCH_DEVICE; + } + } + else + { + /* Buffer size invalid */ + Status = STATUS_INVALID_BUFFER_SIZE; + } + break; + + case IOCTL_BATTERY_SET_TRIP_POINT: + + /* Data is 4 bytes long */ + if (InputBufferLength == sizeof(ULONG)) + { + /* Query it */ + Status = CmBattSetTripPpoint(DeviceExtension, + *(PULONG)Irp->AssociatedIrp.SystemBuffer); + Irp->IoStatus.Information = 0; + } + else + { + /* Buffer size invalid */ + Status = STATUS_INVALID_BUFFER_SIZE; + } + break; + + case IOCTL_BATTERY_QUERY_BIF: + + /* Data is 1060 bytes long */ + if (OutputBufferLength == sizeof(ACPI_BIF_DATA)) + { + /* Query it */ + Status = CmBattGetBifData(DeviceExtension, + Irp->AssociatedIrp.SystemBuffer); + if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ACPI_BIF_DATA); + } + else + { + /* Buffer size invalid */ + Status = STATUS_INVALID_BUFFER_SIZE; + } + break; + + case IOCTL_BATTERY_QUERY_BST: + + /* Data is 16 bytes long */ + if (OutputBufferLength == sizeof(ACPI_BST_DATA)) + { + /* Query it */ + Status = CmBattGetBstData(DeviceExtension, + Irp->AssociatedIrp.SystemBuffer); + if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ACPI_BST_DATA); + } + else + { + /* Buffer size invalid */ + Status = STATUS_INVALID_BUFFER_SIZE; + } + break; + + default: + + /* Unknown, let us pass it on to ACPI */ + if (CmBattDebug & 0xC) + DbgPrint("CmBattIoctl: Unknown IOCTL %x\n", IoControlCode); + break; + } + + /* Did someone pick it up? */ + if (Status != STATUS_NOT_SUPPORTED) + { + /* Complete the request */ + Irp->IoStatus.Status = Status; + IofCompleteRequest(Irp, IO_NO_INCREMENT); + } + else + { + /* Still unsupported, try ACPI */ + IoSkipCurrentIrpStackLocation(Irp); + Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp); + } + } + + /* Release the remove lock and return status */ + IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp); + return Status; } NTSTATUS NTAPI - CmBattQueryTag(PCMBATT_DEVICE_EXTENSION DeviceExtension, - PULONG BatteryTag) + CmBattQueryTag(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + OUT PULONG Tag) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PDEVICE_OBJECT PdoDevice; + ULONG StaData; + ULONG NewTag; + NTSTATUS Status; + PAGED_CODE(); + if (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_INFO)) + DbgPrint("CmBattQueryTag - Tag (%d), Battery %x, Device %d\n", + *Tag, DeviceExtension, DeviceExtension->DeviceId); + + /* Get PDO and clear notification flag */ + PdoDevice = DeviceExtension->PdoDeviceObject; + DeviceExtension->NotifySent = 0; + + /* Get _STA from PDO (we need the machine status, not the battery status) */ + Status = CmBattGetStaData(PdoDevice, &StaData); + if (NT_SUCCESS(Status)) + { + /* Is a battery present? */ + if (StaData & ACPI_STA_BATTERY_PRESENT) + { + /* Do we not have a tag yet? */ + if (!DeviceExtension->Tag) + { + /* Set the new tag value, reset tags if we reached the maximum */ + NewTag = DeviceExtension->TagData; + if (DeviceExtension->TagData++ == 0xFFFFFFFF) NewTag = 1; + DeviceExtension->Tag = NewTag; + if (CmBattDebug & CMBATT_GENERIC_INFO) + DbgPrint("CmBattQueryTag - New Tag: (%d)\n", DeviceExtension->Tag); + + /* Reset trip point data */ + DeviceExtension->TripPointOld = 0; + DeviceExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY; + + /* Clear AR lock and set new interrupt time */ + InterlockedExchange(&DeviceExtension->ArLockValue, 0); + DeviceExtension->InterruptTime = KeQueryInterruptTime(); + } + } + else + { + /* No battery, so no tag */ + DeviceExtension->Tag = 0; + Status = STATUS_NO_SUCH_DEVICE; + } + } + + /* Return the tag and status result */ + *Tag = DeviceExtension->Tag; + if (CmBattDebug & CMBATT_ACPI_WARNING) + DbgPrint("CmBattQueryTag: Returning Tag: 0x%x, status 0x%x\n", *Tag, Status); + return Status; } NTSTATUS NTAPI - CmBattDisableStatusNotify(PCMBATT_DEVICE_EXTENSION DeviceExtension) + CmBattDisableStatusNotify(IN PCMBATT_DEVICE_EXTENSION DeviceExtension) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PAGED_CODE(); + if (CmBattDebug & 0xA) DbgPrint("CmBattDisableStatusNotify\n"); + + /* Do we have a trip point */ + if (DeviceExtension->TripPointSet) + { + /* Is there a current value set? */ + if (DeviceExtension->TripPointValue) + { + /* Reset it back to 0 */ + DeviceExtension->TripPointValue = 0; + Status = CmBattSetTripPpoint(DeviceExtension, 0); + if (!NT_SUCCESS(Status)) + { + /* If it failed, set unknown/invalid value */ + DeviceExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY; + if (CmBattDebug & 8) + DbgPrint("CmBattDisableStatusNotify: SetTripPoint failed - %x\n", Status); + } + } + else + { + /* No trip point set, so this is a successful no-op */ + Status = STATUS_SUCCESS; + } + } + else + { + /* Nothing we can do */ + Status = STATUS_OBJECT_NAME_NOT_FOUND; + } + + /* Return status */ + return Status; } NTSTATUS NTAPI - CmBattSetStatusNotify(PCMBATT_DEVICE_EXTENSION DeviceExtension, - ULONG BatteryTag, - PBATTERY_NOTIFY BatteryNotify) + CmBattSetStatusNotify(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG BatteryTag, + IN PBATTERY_NOTIFY BatteryNotify) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + ACPI_BST_DATA BstData; + ULONG Capacity, NewTripPoint, TripPoint, DesignVoltage; + BOOLEAN Charging; + PAGED_CODE(); + if (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_INFO)) + DbgPrint("CmBattSetStatusNotify: Tag (%d) Target(0x%x)\n", + BatteryTag, BatteryNotify->LowCapacity); + + /* Update any ACPI evaluations */ + Status = CmBattVerifyStaticInfo(DeviceExtension, BatteryTag); + if (!NT_SUCCESS(Status)) return Status; + + /* Trip point not supported, fail */ + if (!DeviceExtension->TripPointSet) return STATUS_OBJECT_NAME_NOT_FOUND; + + /* Are both capacities known? */ + if ((BatteryNotify->HighCapacity == BATTERY_UNKNOWN_CAPACITY) || + (BatteryNotify->LowCapacity == BATTERY_UNKNOWN_CAPACITY)) + { + /* We can't set trip points without these */ + if (CmBattDebug & CMBATT_GENERIC_WARNING) + DbgPrint("CmBattSetStatusNotify: Failing request because of BATTERY_UNKNOWN_CAPACITY.\n"); + return STATUS_NOT_SUPPORTED; + } + + /* Is the battery charging? */ + Charging = DeviceExtension->BstData.State & ACPI_BATT_STAT_CHARGING; + if (Charging) + { + /* Then the trip point is when we hit the cap */ + Capacity = BatteryNotify->HighCapacity; + NewTripPoint = BatteryNotify->HighCapacity; + } + else + { + /* Otherwise it's when we discharge to the bottom */ + Capacity = BatteryNotify->LowCapacity; + NewTripPoint = BatteryNotify->LowCapacity; + } + + /* Do we have data in Amps or Watts? */ + if (DeviceExtension->BifData.PowerUnit == ACPI_BATT_POWER_UNIT_AMPS) + { + /* We need the voltage to do the conversion */ + DesignVoltage = DeviceExtension->BifData.DesignVoltage; + if ((DesignVoltage != BATTERY_UNKNOWN_VOLTAGE) && (DesignVoltage)) + { + /* Convert from mAh into Ah */ + TripPoint = 1000 * NewTripPoint; + if (Charging) + { + /* Scale the high trip point */ + NewTripPoint = (TripPoint + 500) / DesignVoltage + ((TripPoint + 500) % DesignVoltage != 0); + } + else + { + /* Scale the low trip point */ + NewTripPoint = (TripPoint - 500) / DesignVoltage - ((TripPoint - 500) % DesignVoltage == 0); + } + } + else + { + /* Without knowing the voltage, Amps are not enough data on consumption */ + Status = STATUS_NOT_SUPPORTED; + if (CmBattDebug & CMBATT_ACPI_WARNING) + DbgPrint("CmBattSetStatusNotify: Can't calculate BTP, DesignVoltage = 0x%08x\n", + DesignVoltage); + } + } + else if (Charging) + { + /* Make it trip just one past the charge cap */ + ++NewTripPoint; + } + else if (NewTripPoint > 0) + { + /* Make it trip just one below the drain cap */ + --NewTripPoint; + } + + /* Do we actually have a new trip point? */ + if (NewTripPoint == DeviceExtension->TripPointValue) + { + /* No, so there is no work to be done */ + if (CmBattDebug & CMBATT_GENERIC_STATUS) + DbgPrint("CmBattSetStatusNotify: Keeping original setting: %X\n", DeviceExtension->TripPointValue); + return STATUS_SUCCESS; + } + + /* Set the trip point with ACPI and check for success */ + DeviceExtension->TripPointValue = NewTripPoint; + Status = CmBattSetTripPpoint(DeviceExtension, NewTripPoint); + if (!(NewTripPoint) && (Capacity)) Status = STATUS_NOT_SUPPORTED; + if (!NT_SUCCESS(Status)) + { + /* We failed to set the trip point, or there wasn't one settable */ + DeviceExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY; + if (CmBattDebug & (CMBATT_GENERIC_WARNING | CMBATT_ACPI_WARNING)) + DbgPrint("CmBattSetStatusNotify: SetTripPoint failed - %x\n", Status); + return Status; + } + + /* Read the new BST data to see the latest state */ + Status = CmBattGetBstData(DeviceExtension, &BstData); + if (!NT_SUCCESS(Status)) + { + /* We'll return failure to the caller */ + if (CmBattDebug & (CMBATT_GENERIC_WARNING | CMBATT_ACPI_WARNING)) + DbgPrint("CmBattSetStatusNotify: GetBstData - %x\n", Status); + } + else if ((Charging) && (BstData.RemainingCapacity >= NewTripPoint)) + { + /* We are charging and our capacity is past the trip point, so trip now */ + if (CmBattDebug & CMBATT_GENERIC_WARNING) + DbgPrint("CmBattSetStatusNotify: Trip point already crossed (1): TP = %08x, remaining capacity = %08x\n", + NewTripPoint, BstData.RemainingCapacity); + CmBattNotifyHandler(DeviceExtension, ACPI_BATT_NOTIFY_STATUS); + } + else if ((BstData.RemainingCapacity) && (Capacity)) + { + /* We are discharging, and our capacity is below the trip point, trip now */ + if (CmBattDebug & CMBATT_GENERIC_WARNING) + DbgPrint("CmBattSetStatusNotify: Trip point already crossed (1): TP = %08x, remaining capacity = %08x\n", + NewTripPoint, BstData.RemainingCapacity); + CmBattNotifyHandler(DeviceExtension, ACPI_BATT_NOTIFY_STATUS); + } + + /* All should've went well if we got here, unless BST failed... return! */ + if (CmBattDebug & CMBATT_GENERIC_STATUS) + DbgPrint("CmBattSetStatusNotify: Want %X CurrentCap %X\n", + Capacity, DeviceExtension->RemainingCapacity); + if (CmBattDebug & CMBATT_ACPI_WARNING) + DbgPrint("CmBattSetStatusNotify: Set to: [%#08lx][%#08lx][%#08lx] Status %x\n", + BatteryNotify->PowerState, + BatteryNotify->LowCapacity, + BatteryNotify->HighCapacity); + return Status; } NTSTATUS NTAPI - CmBattGetBatteryStatus(PCMBATT_DEVICE_EXTENSION DeviceExtension, - ULONG BatteryTag) + CmBattGetBatteryStatus(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG Tag) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + ULONG PsrData = 0; + NTSTATUS Status; + ULONG BstState; + ULONG DesignVoltage, PresentRate, RemainingCapacity; + PAGED_CODE(); + if (CmBattDebug & CMBATT_GENERIC_INFO) + DbgPrint("CmBattGetBatteryStatus - CmBatt (%08x) Tag (%d)\n", DeviceExtension, Tag); + + /* Validate ACPI data */ + Status = CmBattVerifyStaticInfo(DeviceExtension, Tag); + if (!NT_SUCCESS(Status)) return Status; + + /* Check for delayed status notifications */ + if (DeviceExtension->DelayNotification) + { + /* Process them now and don't do any other work */ + CmBattNotifyHandler(DeviceExtension, ACPI_BATT_NOTIFY_STATUS); + return Status; + } + + /* Get _BST from ACPI */ + Status = CmBattGetBstData(DeviceExtension, &DeviceExtension->BstData); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + InterlockedExchange(&DeviceExtension->ArLockValue, 0); + return Status; + } + + /* Clear current BST information */ + DeviceExtension->State = 0; + DeviceExtension->RemainingCapacity = 0; + DeviceExtension->PresentVoltage = 0; + DeviceExtension->Rate = 0; + + /* Get battery state */ + BstState = DeviceExtension->BstData.State; + + /* Is the battery both charging and discharging? */ + if ((BstState & ACPI_BATT_STAT_DISCHARG) && (BstState & ACPI_BATT_STAT_CHARGING) && + (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_WARNING))) + DbgPrint("************************ ACPI BIOS BUG ********************\n* " + "CmBattGetBatteryStatus: Invalid state: _BST method returned 0x%08x for Battery State.\n" + "* One battery cannot be charging and discharging at the same time.\n", + BstState); + + /* Is the battery discharging? */ + if (BstState & ACPI_BATT_STAT_DISCHARG) + { + /* Set power state and check if it just started discharging now */ + DeviceExtension->State |= BATTERY_DISCHARGING; + if (!(DeviceExtension->State & ACPI_BATT_STAT_DISCHARG)) + { + /* Remember the time when the state changed */ + DeviceExtension->InterruptTime = KeQueryInterruptTime(); + } + } + else if (BstState & ACPI_BATT_STAT_CHARGING) + { + /* Battery is charging, update power state */ + DeviceExtension->State |= (BATTERY_CHARGING | BATTERY_POWER_ON_LINE); + } + + /* Is the battery in a critical state? */ + if (BstState & ACPI_BATT_STAT_CRITICAL) DeviceExtension->State |= BATTERY_CRITICAL; + + /* Read the voltage data */ + DeviceExtension->PresentVoltage = DeviceExtension->BstData.PresentVoltage; + + /* Check if we have an A/C adapter */ + if (AcAdapterPdo) + { + /* Query information on it */ + CmBattGetPsrData(AcAdapterPdo, &PsrData); + } + else + { + /* Otherwise, check if the battery is charging */ + if (BstState & ACPI_BATT_STAT_CHARGING) + { + /* Then we'll assume there's a charger */ + PsrData = 1; + } + else + { + /* Assume no charger */ + PsrData = 0; + } + } + + /* Is there a charger? */ + if (PsrData) + { + /* Set the power state flag to reflect this */ + DeviceExtension->State |= BATTERY_POWER_ON_LINE; + if (CmBattDebug & (CMBATT_GENERIC_INFO | CMBATT_GENERIC_STATUS)) + DbgPrint("CmBattGetBatteryStatus: AC adapter is connected\n"); + } + else if (CmBattDebug & (CMBATT_GENERIC_INFO | CMBATT_GENERIC_STATUS)) + { + DbgPrint("CmBattGetBatteryStatus: AC adapter is NOT connected\n"); + } + + /* Get some data we'll need */ + DesignVoltage = DeviceExtension->BifData.DesignVoltage; + PresentRate = DeviceExtension->BstData.PresentRate; + RemainingCapacity = DeviceExtension->BstData.RemainingCapacity; + + /* Check if we have battery data in Watts instead of Amps */ + if (DeviceExtension->BifData.PowerUnit == ACPI_BATT_POWER_UNIT_WATTS) + { + /* Get the data from the BST */ + DeviceExtension->RemainingCapacity = RemainingCapacity; + DeviceExtension->Rate = PresentRate; + + /* Check if the rate is invalid */ + if (PresentRate > CM_MAX_VALUE) + { + /* Set an unknown rate and don't touch the old value */ + DeviceExtension->Rate = BATTERY_UNKNOWN_RATE; + if ((PresentRate != CM_UNKNOWN_VALUE) && (CmBattDebug & CMBATT_ACPI_WARNING)) + { + DbgPrint("CmBattGetBatteryStatus - Rate is greater than CM_MAX_VALUE\n"); + DbgPrint("---------------------- PresentRate = 0x%08x\n", PresentRate); + } + } + } + else if ((DesignVoltage != CM_UNKNOWN_VALUE) && (DesignVoltage)) + { + /* We have voltage data, what about capacity? */ + if (RemainingCapacity == CM_UNKNOWN_VALUE) + { + /* Unable to calculate it */ + DeviceExtension->RemainingCapacity = BATTERY_UNKNOWN_CAPACITY; + if (CmBattDebug & CMBATT_ACPI_WARNING) + { + DbgPrint("CmBattGetBatteryStatus - Can't calculate RemainingCapacity \n"); + DbgPrint("---------------------- RemainingCapacity = CM_UNKNOWN_VALUE\n"); + } + } + else + { + /* Compute the capacity with the information we have */ + DeviceExtension->RemainingCapacity = (DesignVoltage * RemainingCapacity + 500) / 1000; + } + + /* Check if we have a rate */ + if (PresentRate != CM_UNKNOWN_VALUE) + { + /* Make sure the rate isn't too large */ + if (PresentRate > (-500 / DesignVoltage)) + { + /* It is, so set unknown state */ + DeviceExtension->Rate = BATTERY_UNKNOWN_RATE; + if (CmBattDebug & CMBATT_ACPI_WARNING) + { + DbgPrint("CmBattGetBatteryStatus - Can't calculate Rate \n"); + DbgPrint("---------------------- Overflow: PresentRate = 0x%08x\n", PresentRate); + } + } + + /* Compute the rate */ + DeviceExtension->Rate = (PresentRate * DesignVoltage + 500) / 1000; + } + else + { + /* We don't have a rate, so set unknown value */ + DeviceExtension->Rate = BATTERY_UNKNOWN_RATE; + if (CmBattDebug & CMBATT_ACPI_WARNING) + { + DbgPrint("CmBattGetBatteryStatus - Can't calculate Rate \n"); + DbgPrint("---------------------- Present Rate = CM_UNKNOWN_VALUE\n"); + } + } + } + else + { + /* We have no rate, and no capacity, set unknown values */ + DeviceExtension->Rate = BATTERY_UNKNOWN_RATE; + DeviceExtension->RemainingCapacity = BATTERY_UNKNOWN_CAPACITY; + if (CmBattDebug & CMBATT_ACPI_WARNING) + { + DbgPrint("CmBattGetBatteryStatus - Can't calculate RemainingCapacity and Rate \n"); + DbgPrint("---------------------- DesignVoltage = 0x%08x\n", DesignVoltage); + } + } + + /* Check if we have an unknown rate */ + if (DeviceExtension->Rate == BATTERY_UNKNOWN_RATE) + { + /* The battery is discharging but we don't know by how much... this is bad! */ + if ((BstState & ACPI_BATT_STAT_DISCHARG) && + (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_WARNING))) + DbgPrint("CmBattGetBatteryStatus: battery rate is unkown when battery is not charging!\n"); + } + else if (DeviceExtension->State & BATTERY_DISCHARGING) + { + /* The battery is discharging, so treat the rate as a negative rate */ + DeviceExtension->Rate = -DeviceExtension->Rate; + } + else if (!(DeviceExtension->State & BATTERY_CHARGING) && (DeviceExtension->Rate)) + { + /* We are not charging, not discharging, but have a rate? Ignore it! */ + if (CmBattDebug & CMBATT_GENERIC_WARNING) + DbgPrint("CmBattGetBatteryStatus: battery is not charging or discharging, but rate = %x\n", + DeviceExtension->Rate); + DeviceExtension->Rate = 0; + } + + /* Done */ + return STATUS_SUCCESS; } NTSTATUS NTAPI - CmBattQueryInformation(PCMBATT_DEVICE_EXTENSION DeviceExtension, - ULONG BatteryTag, - BATTERY_QUERY_INFORMATION_LEVEL Level, - OPTIONAL LONG AtRate, - PVOID Buffer, - ULONG BufferLength, - PULONG ReturnedLength) + CmBattQueryInformation(IN PCMBATT_DEVICE_EXTENSION FdoExtension, + IN ULONG Tag, + IN BATTERY_QUERY_INFORMATION_LEVEL InfoLevel, + IN OPTIONAL LONG AtRate, + IN PVOID Buffer, + IN ULONG BufferLength, + OUT PULONG ReturnedLength) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PVOID QueryData = NULL; + ULONG QueryLength = 0; + ULONG RemainingTime = 0; + ANSI_STRING TempString; + UNICODE_STRING TempString2; + WCHAR InfoBuffer[256]; + WCHAR TempBuffer[256]; + UNICODE_STRING InfoString; + ULONG RemainingCapacity; + BATTERY_REPORTING_SCALE BatteryReportingScale[2]; + LONG Rate; + PAGED_CODE(); + if (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_INFO)) + DbgPrint("CmBattQueryInformation - Tag (%d) Device %d, Informationlevel %d\n", + Tag, + FdoExtension->DeviceId, + InfoLevel); + + /* Check ACPI Data */ + Status = CmBattVerifyStaticInfo(FdoExtension, Tag); + if (!NT_SUCCESS(Status)) return Status; + + /* Check what caller wants */ + switch (InfoLevel) + { + case BatteryInformation: + /* Just return our static information */ + QueryData = &FdoExtension->BatteryInformation; + QueryLength = sizeof(BATTERY_INFORMATION); + break; + + case BatteryGranularityInformation: + + /* Return our static information, we have two scales */ + BatteryReportingScale[0].Granularity = FdoExtension->BatteryCapacityGranularity1; + BatteryReportingScale[0].Capacity = FdoExtension->BatteryInformation.DefaultAlert1; + BatteryReportingScale[1].Granularity = FdoExtension->BatteryCapacityGranularity2; + BatteryReportingScale[1].Capacity = FdoExtension->BatteryInformation.DesignedCapacity; + QueryData = BatteryReportingScale; + QueryLength = sizeof(BATTERY_REPORTING_SCALE) * 2; + break; + + case BatteryEstimatedTime: + + /* Check if it's been more than 2 1/2 minutes since the last change */ + if ((KeQueryInterruptTime() - 150000000) > (FdoExtension->InterruptTime)) + { + /* Get new battery status */ + CmBattGetBatteryStatus(FdoExtension, FdoExtension->Tag); + + /* If the caller didn't specify a rate, use our static one */ + Rate = AtRate; + if (!Rate) Rate = FdoExtension->Rate; + + /* If we don't have a valid negative rate, use unknown value */ + if (Rate >= 0) Rate = BATTERY_UNKNOWN_RATE; + + /* Grab the remaining capacity */ + RemainingCapacity = FdoExtension->RemainingCapacity; + + /* See if we don't know one or the other */ + if ((Rate == BATTERY_UNKNOWN_RATE) || + (RemainingCapacity == BATTERY_UNKNOWN_CAPACITY)) + { + /* If the battery is discharging, we can't give out a time */ + if ((FdoExtension->BstData.State & ACPI_BATT_STAT_DISCHARG) && + (CmBattDebug & CMBATT_GENERIC_WARNING)) + DbgPrint("CmBattQueryInformation: Can't calculate EstimatedTime.\n"); + + /* Check if we don't have a rate and capacity is going down */ + if ((FdoExtension->Rate == BATTERY_UNKNOWN_RATE) && + (FdoExtension->BstData.State & ACPI_BATT_STAT_DISCHARG)) + { + /* We have to fail, since we lack data */ + Status = STATUS_INVALID_DEVICE_REQUEST; + if (CmBattDebug & CMBATT_GENERIC_WARNING) + DbgPrint("---------------------- PresentRate = BATTERY_UNKNOWN_RATE\n"); + } + + /* If we don't have capacity, the rate is useless */ + if (RemainingCapacity == BATTERY_UNKNOWN_CAPACITY) + { + /* We have to fail the request */ + Status = STATUS_INVALID_DEVICE_REQUEST; + if (CmBattDebug & CMBATT_GENERIC_WARNING) + DbgPrint("---------------------- RemainingCapacity = BATTERY_UNKNOWN_CAPACITY\n"); + } + } + else + { + /* We have data, but is it valid? */ + if (RemainingCapacity > 0x123456) + { + /* The capacity seems bogus, so don't use it */ + if (CmBattDebug & CMBATT_ACPI_WARNING) + DbgPrint("CmBattQueryInformation: Data Overflow in calculating Remaining Capacity.\n"); + } + else + { + /* Compute the remaining time in seconds, based on rate */ + RemainingTime = (RemainingCapacity * 3600) / -Rate; + } + } + } + + /* Return the remaining time */ + QueryData = &RemainingTime; + QueryLength = sizeof(ULONG); + break; + + case BatteryDeviceName: + + /* Build the model number string */ + RtlInitAnsiString(&TempString, FdoExtension->ModelNumber); + + /* Convert it to Unicode */ + InfoString.Buffer = InfoBuffer; + InfoString.MaximumLength = sizeof(InfoBuffer); + Status = RtlAnsiStringToUnicodeString(&InfoString, &TempString, 0); + + /* Return the unicode buffer */ + QueryData = InfoString.Buffer; + QueryLength = InfoString.Length; + break; + + case BatteryTemperature: + case BatteryManufactureDate: + + /* We don't support these */ + Status = STATUS_INVALID_DEVICE_REQUEST; + break; + + case BatteryManufactureName: + + /* Build the OEM info string */ + RtlInitAnsiString(&TempString, FdoExtension->OemInfo); + + /* Convert it to Unicode */ + InfoString.Buffer = InfoBuffer; + InfoString.MaximumLength = sizeof(InfoBuffer); + Status = RtlAnsiStringToUnicodeString(&InfoString, &TempString, 0); + + /* Return the unicode buffer */ + QueryData = InfoString.Buffer; + QueryLength = InfoString.Length; + break; + + case BatteryUniqueID: + + /* Build the serial number string */ + RtlInitAnsiString(&TempString, FdoExtension->SerialNumber); + + /* Convert it to Unicode */ + InfoString.Buffer = InfoBuffer; + InfoString.MaximumLength = sizeof(InfoBuffer); + RtlAnsiStringToUnicodeString(&InfoString, &TempString, 0); + + /* Setup a temporary string for concatenation */ + TempString2.Buffer = TempBuffer; + TempString2.MaximumLength = sizeof(TempBuffer); + + /* Check if there's an OEM string */ + if (FdoExtension->OemInfo[0]) + { + /* Build the OEM info string */ + RtlInitAnsiString(&TempString, FdoExtension->OemInfo); + + /* Convert it to Unicode and append it */ + RtlAnsiStringToUnicodeString(&TempString2, &TempString, 0); + RtlAppendUnicodeStringToString(&InfoString, &TempString2); + } + + /* Build the model number string */ + RtlInitAnsiString(&TempString, FdoExtension->ModelNumber); + + /* Convert it to Unicode and append it */ + RtlAnsiStringToUnicodeString(&TempString2, &TempString, 0); + RtlAppendUnicodeStringToString(&InfoString, &TempString2); + + /* Return the final appended string */ + QueryData = InfoString.Buffer; + QueryLength = InfoString.Length; + break; + + default: + + /* Everything else is unknown */ + Status = STATUS_INVALID_PARAMETER; + break; + } + + /* Return the required length and check if the caller supplied enough */ + *ReturnedLength = QueryLength; + if (BufferLength < QueryLength) Status = STATUS_BUFFER_TOO_SMALL; + + /* Copy the data if there's enough space and it exists */ + if ((NT_SUCCESS(Status)) && (QueryData)) RtlCopyMemory(Buffer, QueryData, QueryLength); + + /* Return function result */ + return Status; } NTSTATUS NTAPI - CmBattQueryStatus(PCMBATT_DEVICE_EXTENSION DeviceExtension, - ULONG BatteryTag, - PBATTERY_STATUS BatteryStatus) + CmBattQueryStatus(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG Tag, + IN PBATTERY_STATUS BatteryStatus) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PAGED_CODE(); + if (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_INFO)) + DbgPrint("CmBattQueryStatus - Tag (%d) Device %x\n", Tag, DeviceExtension->DeviceId); + + /* Query ACPI information */ + Status = CmBattGetBatteryStatus(DeviceExtension, Tag); + if (NT_SUCCESS(Status)) + { + BatteryStatus->PowerState = DeviceExtension->State; + BatteryStatus->Capacity = DeviceExtension->RemainingCapacity; + BatteryStatus->Voltage = DeviceExtension->PresentVoltage; + BatteryStatus->Rate = DeviceExtension->Rate; + } + + /* Return status */ + if (CmBattDebug & (CMBATT_GENERIC_INFO)) + DbgPrint("CmBattQueryStatus: Returning [%#08lx][%#08lx][%#08lx][%#08lx]\n", + BatteryStatus->PowerState, + BatteryStatus->Capacity, + BatteryStatus->Voltage, + BatteryStatus->Rate); + return Status; } NTSTATUS @@@ -233,28 -1257,24 +1257,24 @@@ DriverEntry(IN PDRIVER_OBJECT DriverObj { /* Fail if we're out of memory this early */ if (CmBattDebug & CMBATT_GENERIC_WARNING) - { DbgPrint("CmBatt: Couldn't allocate pool for registry path."); - } return STATUS_INSUFFICIENT_RESOURCES; } /* Buffer allocated, copy the string */ RtlCopyUnicodeString(&GlobalRegistryPath, RegistryPath); if (CmBattDebug & CMBATT_GENERIC_INFO) - { DbgPrint("CmBatt DriverEntry - Obj (%08x) Path \"%ws\"\n", DriverObject, RegistryPath->Buffer); - } /* Setup the major dispatchers */ - DriverObject->MajorFunction[0] = CmBattOpenClose; - DriverObject->MajorFunction[2] = CmBattOpenClose; - DriverObject->MajorFunction[14] = CmBattIoctl; - DriverObject->MajorFunction[22] = CmBattPowerDispatch; - DriverObject->MajorFunction[27] = CmBattPnpDispatch; - DriverObject->MajorFunction[23] = CmBattSystemControl; + DriverObject->MajorFunction[IRP_MJ_CREATE] = CmBattOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = CmBattOpenClose; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CmBattIoctl; + DriverObject->MajorFunction[IRP_MJ_POWER] = CmBattPowerDispatch; + DriverObject->MajorFunction[IRP_MJ_PNP] = CmBattPnpDispatch; + DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = CmBattSystemControl; /* And the unload routine */ DriverObject->DriverUnload = CmBattUnload; @@@ -276,9 -1296,7 +1296,7 @@@ /* No callback, fail */ CmBattPowerCallBackObject = 0; if (CmBattDebug & CMBATT_GENERIC_WARNING) - { DbgPrint("CmBattRegisterPowerCallBack: failed status=0x%08x\n", Status); - } } else { @@@ -296,9 -1314,7 +1314,7 @@@ { ObfDereferenceObject(CmBattPowerCallBackObject); if (CmBattDebug & CMBATT_GENERIC_WARNING) - { DbgPrint("CmBattRegisterPowerCallBack: ExRegisterCallback failed.\n"); - } } /* All good */ diff --combined drivers/bus/acpi/cmbatt/cmbatt.h index f3583f8dd1b,8f952d20200..8f952d20200 --- a/drivers/bus/acpi/cmbatt/cmbatt.h +++ b/drivers/bus/acpi/cmbatt/cmbatt.h @@@ -11,8 -11,27 +11,27 @@@ #include #include #include + #include #include + #define IOCTL_BATTERY_QUERY_UNIQUE_ID \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x101, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294404 + + #define IOCTL_BATTERY_QUERY_STA \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x102, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294408 + + #define IOCTL_BATTERY_QUERY_PSR \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x103, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x29440C + + #define IOCTL_BATTERY_SET_TRIP_POINT \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x104, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294410 + + #define IOCTL_BATTERY_QUERY_BIF \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x105, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294414 + + #define IOCTL_BATTERY_QUERY_BST \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x106, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294418 + #define CMBATT_GENERIC_STATUS 0x01 #define CMBATT_GENERIC_INFO 0x02 #define CMBATT_GENERIC_WARNING 0x04 @@@ -29,6 -48,25 +48,25 @@@ typedef enum _CMBATT_EXTENSION_TYP CmBattBattery } CMBATT_EXTENSION_TYPE; + #define ACPI_BUS_CHECK 0x00 + #define ACPI_DEVICE_CHECK 0x01 + + #define ACPI_STA_PRESENT 0x01 + #define ACPI_STA_ENABLED 0x02 + #define ACPI_STA_SHOW_UI 0x04 + #define ACPI_STA_FUNCTIONAL 0x08 + #define ACPI_STA_BATTERY_PRESENT 0x10 + + #define ACPI_BATT_NOTIFY_STATUS 0x80 + #define ACPI_BATT_NOTIFY_INFO 0x81 + + #define ACPI_BATT_STAT_DISCHARG 0x0001 + #define ACPI_BATT_STAT_CHARGING 0x0002 + #define ACPI_BATT_STAT_CRITICAL 0x0004 + + #define CM_MAX_VALUE 0x7FFFFFFF + #define CM_UNKNOWN_VALUE 0xFFFFFFFF + typedef struct _ACPI_BST_DATA { ULONG State; @@@ -37,6 -75,9 +75,9 @@@ ULONG PresentVoltage; } ACPI_BST_DATA, *PACPI_BST_DATA; + #define ACPI_BATT_POWER_UNIT_WATTS 0x0 + #define ACPI_BATT_POWER_UNIT_AMPS 0x1 + typedef struct _ACPI_BIF_DATA { ULONG PowerUnit; @@@ -54,6 -95,10 +95,10 @@@ CHAR OemInfo[256]; } ACPI_BIF_DATA, *PACPI_BIF_DATA; + #define CMBATT_AR_NOTIFY 0x01 + #define CMBATT_AR_INSERT 0x02 + #define CMBATT_AR_REMOVE 0x04 + typedef struct _CMBATT_DEVICE_EXTENSION { CMBATT_EXTENSION_TYPE FdoType; @@@ -66,18 -111,17 +111,17 @@@ PIRP PowerIrp; POWER_STATE PowerState; WMILIB_CONTEXT WmiLibInfo; - ULONG WaitWakeEnable; - ULONG WmiCount; - KEVENT WmiEvent; + BOOLEAN WaitWakeEnable; + IO_REMOVE_LOCK RemoveLock; ULONG DeviceId; PUNICODE_STRING DeviceName; - ACPI_INTERFACE_STANDARD2 AcpiInterface; - BOOLEAN DelayAr; - BOOLEAN DelayedArFlag; + ACPI_INTERFACE_STANDARD AcpiInterface; + BOOLEAN DelayNotification; + BOOLEAN ArFlag; PVOID ClassData; BOOLEAN Started; BOOLEAN NotifySent; - ULONG ArLock; + LONG ArLockValue; ULONG TagData; ULONG Tag; ULONG ModelNumberLength; @@@ -93,7 -137,7 +137,7 @@@ ULONG RemainingCapacity; ULONG PresentVoltage; ULONG Rate; - BATTERY_INFORMATION StaticBatteryInformation; + BATTERY_INFORMATION BatteryInformation; ULONG BatteryCapacityGranularity1; ULONG BatteryCapacityGranularity2; BOOLEAN TripPointSet; @@@ -129,5 -173,110 +173,110 @@@ CmBattSystemControl PDEVICE_OBJECT DeviceObject, PIRP Irp ); - + + NTSTATUS + NTAPI + CmBattGetBstData( + PCMBATT_DEVICE_EXTENSION DeviceExtension, + PACPI_BST_DATA BstData + ); + + NTSTATUS + NTAPI + CmBattGetPsrData( + PDEVICE_OBJECT DeviceObject, + PULONG PsrData + ); + + NTSTATUS + NTAPI + CmBattGetStaData( + PDEVICE_OBJECT DeviceObject, + PULONG StaData + ); + + NTSTATUS + NTAPI + CmBattGetBifData( + PCMBATT_DEVICE_EXTENSION DeviceExtension, + PACPI_BIF_DATA BifData + ); + + NTSTATUS + NTAPI + CmBattSetTripPpoint( + PCMBATT_DEVICE_EXTENSION DeviceExtension, + ULONG AlarmValue + ); + + VOID + NTAPI + CmBattNotifyHandler( + IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG NotifyValue + ); + + NTSTATUS + NTAPI + CmBattWmiDeRegistration( + PCMBATT_DEVICE_EXTENSION DeviceExtension + ); + + NTSTATUS + NTAPI + CmBattWmiRegistration( + PCMBATT_DEVICE_EXTENSION DeviceExtension + ); + + NTSTATUS + NTAPI + CmBattGetUniqueId( + PDEVICE_OBJECT DeviceObject, + PULONG UniqueId + ); + + NTSTATUS + NTAPI + CmBattQueryInformation( + IN PCMBATT_DEVICE_EXTENSION FdoExtension, + IN ULONG Tag, + IN BATTERY_QUERY_INFORMATION_LEVEL InfoLevel, + IN OPTIONAL LONG AtRate, + IN PVOID Buffer, + IN ULONG BufferLength, + OUT PULONG ReturnedLength + ); + + NTSTATUS + NTAPI + CmBattQueryStatus( + IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG Tag, + IN PBATTERY_STATUS BatteryStatus + ); + + NTSTATUS + NTAPI + CmBattSetStatusNotify( + IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG BatteryTag, + IN PBATTERY_NOTIFY BatteryNotify + ); + + NTSTATUS + NTAPI + CmBattDisableStatusNotify( + IN PCMBATT_DEVICE_EXTENSION DeviceExtension + ); + + NTSTATUS + NTAPI + CmBattQueryTag( + IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + OUT PULONG Tag + ); + + extern PDEVICE_OBJECT AcAdapterPdo; + extern ULONG CmBattDebug; + /* EOF */ diff --combined drivers/bus/acpi/cmbatt/cmbatt.rbuild index c8a09e31b44,34c85adccf1..34c85adccf1 --- a/drivers/bus/acpi/cmbatt/cmbatt.rbuild +++ b/drivers/bus/acpi/cmbatt/cmbatt.rbuild @@@ -4,10 -4,12 +4,12 @@@ ntoskrnl hal battc + wmilib . cmbatt.c cmexec.c cmbpnp.c cmbwmi.c cmbatt.rc + cmbatt.h diff --combined drivers/bus/acpi/cmbatt/cmbpnp.c index 3a56dce87f0,55d3ae63d49..55d3ae63d49 --- a/drivers/bus/acpi/cmbatt/cmbpnp.c +++ b/drivers/bus/acpi/cmbatt/cmbpnp.c @@@ -12,95 -12,864 +12,864 @@@ /* FUNCTIONS ******************************************************************/ + VOID + NTAPI + CmBattWaitWakeLoop(IN PDEVICE_OBJECT DeviceObject, + IN UCHAR MinorFunction, + IN POWER_STATE PowerState, + IN PVOID Context, + IN PIO_STATUS_BLOCK IoStatusBlock) + { + NTSTATUS Status; + PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; + if (CmBattDebug & 0x20) DbgPrint("CmBattWaitWakeLoop: Entered.\n"); + + /* Check for success */ + if ((NT_SUCCESS(IoStatusBlock->Status)) && (DeviceExtension->WaitWakeEnable)) + { + /* Request a new power IRP */ + if (CmBattDebug & 2) DbgPrint("CmBattWaitWakeLoop: completed successfully\n"); + Status = PoRequestPowerIrp(DeviceObject, + MinorFunction, + PowerState, + CmBattWaitWakeLoop, + Context, + &DeviceExtension->PowerIrp); + if (CmBattDebug & 2) + DbgPrint("CmBattWaitWakeLoop: PoRequestPowerIrp: status = 0x%08x.\n", + Status); + } + else + { + /* Clear the power IRP, we failed */ + if (CmBattDebug & 0xC) + DbgPrint("CmBattWaitWakeLoop: failed: status = 0x%08x.\n", + IoStatusBlock->Status); + DeviceExtension->PowerIrp = NULL; + } + } + NTSTATUS NTAPI - CmBattIoCompletion(PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PKEVENT Event) + CmBattIoCompletion(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PKEVENT Event) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + if (CmBattDebug & 2) DbgPrint("CmBattIoCompletion: Event (%x)\n", Event); + + /* Set the completion event */ + KeSetEvent(Event, IO_NO_INCREMENT, FALSE); + return STATUS_MORE_PROCESSING_REQUIRED; } NTSTATUS NTAPI - CmBattGetAcpiInterfaces(PDEVICE_OBJECT DeviceObject, - PACPI_INTERFACE_STANDARD2 *AcpiInterface) + CmBattGetAcpiInterfaces(IN PDEVICE_OBJECT DeviceObject, + IN OUT PACPI_INTERFACE_STANDARD AcpiInterface) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PIRP Irp; + NTSTATUS Status; + PIO_STACK_LOCATION IoStackLocation; + KEVENT Event; + + /* Allocate the IRP */ + Irp = IoAllocateIrp(DeviceObject->StackSize, 0); + if (!Irp) + { + /* Fail */ + if (CmBattDebug & 0xC) + DbgPrint("CmBattGetAcpiInterfaces: Failed to allocate Irp\n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Set default error code */ + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + + /* Build the query */ + IoStackLocation = IoGetNextIrpStackLocation(Irp); + IoStackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE; + IoStackLocation->Parameters.QueryInterface.InterfaceType = &GUID_ACPI_INTERFACE_STANDARD; + IoStackLocation->Parameters.QueryInterface.Size = sizeof(ACPI_INTERFACE_STANDARD); + IoStackLocation->Parameters.QueryInterface.Version = 1; + IoStackLocation->Parameters.QueryInterface.Interface = (PINTERFACE)AcpiInterface; + IoStackLocation->Parameters.QueryInterface.InterfaceSpecificData = NULL; + + /* Set default ACPI interface data */ + AcpiInterface->Size = sizeof(ACPI_INTERFACE_STANDARD); + AcpiInterface->Version = 1; + + /* Initialize our wait event */ + KeInitializeEvent(&Event, SynchronizationEvent, 0); + + /* Set the completion routine */ + IoCopyCurrentIrpStackLocationToNext(Irp); + IoSetCompletionRoutine(Irp, + (PVOID)CmBattIoCompletion, + &Event, + TRUE, + TRUE, + TRUE); + + /* Now call ACPI */ + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + /* Wait for completion */ + KeWaitForSingleObject(&Event, + Executive, + KernelMode, + FALSE, + NULL); + Status = Irp->IoStatus.Status; + } + + /* Free the IRP */ + IoFreeIrp(Irp); + + /* Return status */ + if (!(NT_SUCCESS(Status)) && (CmBattDebug & 0xC)) + DbgPrint("CmBattGetAcpiInterfaces: Could not get ACPI driver interfaces, status = %x\n", Status); + return Status; } VOID NTAPI - CmBattDestroyFdo(PDEVICE_OBJECT DeviceObject) + CmBattDestroyFdo(IN PDEVICE_OBJECT DeviceObject) { - UNIMPLEMENTED; + PAGED_CODE(); + if (CmBattDebug & 0x220) DbgPrint("CmBattDestroyFdo, Battery.\n"); + + /* Delete the device */ + IoDeleteDevice(DeviceObject); + if (CmBattDebug & 0x220) DbgPrint("CmBattDestroyFdo: done.\n"); } NTSTATUS NTAPI - CmBattRemoveDevice(PDEVICE_OBJECT DeviceObject, - PIRP Irp) + CmBattRemoveDevice(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PCMBATT_DEVICE_EXTENSION DeviceExtension; + PVOID Context; + DeviceExtension = DeviceObject->DeviceExtension; + if (CmBattDebug & 2) + DbgPrint("CmBattRemoveDevice: CmBatt (%x), Type %d, _UID %d\n", + DeviceExtension, + DeviceExtension->FdoType, + DeviceExtension->DeviceId); + + /* Make sure it's safe to go ahead */ + IoReleaseRemoveLockAndWait(&DeviceExtension->RemoveLock, 0); + + /* Check for pending power IRP */ + if (DeviceExtension->PowerIrp) + { + /* Cancel and clear */ + IoCancelIrp(DeviceExtension->PowerIrp); + DeviceExtension->PowerIrp = NULL; + } + + /* Check what type of FDO is being removed */ + Context = DeviceExtension->AcpiInterface.Context; + if (DeviceExtension->FdoType == CmBattBattery) + { + /* Unregister battery FDO */ + DeviceExtension->AcpiInterface.UnregisterForDeviceNotifications(Context, + (PVOID)CmBattNotifyHandler); + CmBattWmiDeRegistration(DeviceExtension); + if (!NT_SUCCESS(BatteryClassUnload(DeviceExtension->ClassData))) ASSERT(FALSE); + } + else + { + /* Unregister AC adapter FDO */ + DeviceExtension->AcpiInterface.UnregisterForDeviceNotifications(Context, + (PVOID)CmBattNotifyHandler); + CmBattWmiDeRegistration(DeviceExtension); + AcAdapterPdo = NULL; + } + + /* Detach and delete */ + IoDetachDevice(DeviceExtension->AttachedDevice); + IoDeleteDevice(DeviceExtension->DeviceObject); + return STATUS_SUCCESS; } NTSTATUS NTAPI - CmBattPowerDispatch(PDEVICE_OBJECT DeviceObject, - PIRP Irp) + CmBattPowerDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PIO_STACK_LOCATION IoStackLocation; + PCMBATT_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; + if (CmBattDebug & 0x210) DbgPrint("CmBattPowerDispatch\n"); + + /* Get stack location and device extension */ + IoStackLocation = IoGetCurrentIrpStackLocation(Irp); + DeviceExtension = DeviceObject->DeviceExtension; + switch (IoStackLocation->MinorFunction) + { + case IRP_MN_WAIT_WAKE: + if (CmBattDebug & 0x10) + DbgPrint("CmBattPowerDispatch: IRP_MN_WAIT_WAKE\n"); + break; + + case IRP_MN_POWER_SEQUENCE: + if (CmBattDebug & 0x10) + DbgPrint("CmBattPowerDispatch: IRP_MN_POWER_SEQUENCE\n"); + break; + + case IRP_MN_QUERY_POWER: + if (CmBattDebug & 0x10) + DbgPrint("CmBattPowerDispatch: IRP_MN_WAIT_WAKE\n"); + break; + + case IRP_MN_SET_POWER: + if (CmBattDebug & 0x10) + DbgPrint("CmBattPowerDispatch: IRP_MN_SET_POWER type: %d, State: %d \n", + IoStackLocation->Parameters.Power.Type, + IoStackLocation->Parameters.Power.State); + break; + + default: + + if (CmBattDebug & 1) + DbgPrint("CmBattPowerDispatch: minor %d\n", IoStackLocation->MinorFunction); + break; + } + + /* Start the next IRP and see if we're attached */ + PoStartNextPowerIrp(Irp); + if (DeviceExtension->AttachedDevice) + { + /* Call ACPI */ + IoSkipCurrentIrpStackLocation(Irp); + Status = PoCallDriver(DeviceExtension->AttachedDevice, Irp); + } + else + { + /* Complete the request here */ + Status = Irp->IoStatus.Status; + IofCompleteRequest(Irp, IO_NO_INCREMENT); + } + + /* Return status */ + return Status; } NTSTATUS NTAPI - CmBattCreateFdo(PDRIVER_OBJECT DriverObject, - PDEVICE_OBJECT DeviceObject, - ULONG DeviceExtensionSize, - PDEVICE_OBJECT *NewDeviceObject) + CmBattPnpDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PIO_STACK_LOCATION IoStackLocation; + PCMBATT_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; + KEVENT Event; + PAGED_CODE(); + + /* Get stack location and device extension */ + IoStackLocation = IoGetCurrentIrpStackLocation(Irp); + DeviceExtension = DeviceObject->DeviceExtension; + + /* Set default error */ + Status = STATUS_NOT_SUPPORTED; + + /* Try to acquire the lock before doing anything */ + Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, 0); + if (!NT_SUCCESS(Status)) + { + /* Complete the request */ + Irp->IoStatus.Status = STATUS_DEVICE_REMOVED; + IofCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_DEVICE_REMOVED; + } + + /* What's the operation? */ + switch (IoStackLocation->MinorFunction) + { + case IRP_MN_QUERY_PNP_DEVICE_STATE: + + /* Initialize our wait event */ + KeInitializeEvent(&Event, SynchronizationEvent, 0); + + /* Set the completion routine */ + IoCopyCurrentIrpStackLocationToNext(Irp); + IoSetCompletionRoutine(Irp, + (PVOID)CmBattIoCompletion, + &Event, + TRUE, + TRUE, + TRUE); + + /* Now call ACPI to inherit its PnP Device State */ + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + /* Wait for completion */ + KeWaitForSingleObject(&Event, + Executive, + KernelMode, + FALSE, + NULL); + Status = Irp->IoStatus.Status; + } + + /* However, a battery CAN be disabled */ + Irp->IoStatus.Information &= ~PNP_DEVICE_NOT_DISABLEABLE; + + /* Release the remove lock and complete the request */ + IoCompleteRequest(Irp, IO_NO_INCREMENT); + IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp); + return Status; + + case IRP_MN_SURPRISE_REMOVAL: + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_SURPRISE_REMOVAL\n"); + + /* Lock the device extension and set the handle count to invalid */ + ExAcquireFastMutex(&DeviceExtension->FastMutex); + DeviceExtension->HandleCount = -1; + ExReleaseFastMutex(&DeviceExtension->FastMutex); + Status = STATUS_SUCCESS; + break; + + case IRP_MN_START_DEVICE: + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_START_DEVICE\n"); + + /* Mark the extension as started */ + if (DeviceExtension->FdoType == CmBattBattery) DeviceExtension->Started = TRUE; + Status = STATUS_SUCCESS; + break; + + case IRP_MN_STOP_DEVICE: + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_STOP_DEVICE\n"); + + /* Mark the extension as stopped */ + if (DeviceExtension->FdoType == CmBattBattery) DeviceExtension->Started = FALSE; + Status = STATUS_SUCCESS; + break; + + case IRP_MN_QUERY_REMOVE_DEVICE: + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_REMOVE_DEVICE\n"); + + /* Lock the extension and get the current handle count */ + ExAcquireFastMutex(&DeviceExtension->FastMutex); + if (DeviceExtension->HandleCount == 0) + { + /* No handles. Mark it as invalid since it'll be removed */ + DeviceExtension->HandleCount = -1; + Status = STATUS_SUCCESS; + } + else if (DeviceExtension->HandleCount == -1) + { + /* Don't do anything, but this is strange since it's already removed */ + Status = STATUS_SUCCESS; + if (CmBattDebug & 4) + DbgPrint("CmBattPnpDispatch: Recieved two consecutive QUERY_REMOVE requests.\n"); + } + else + { + /* Fail because there's still open handles */ + Status = STATUS_UNSUCCESSFUL; + } + + /* Release the lock and return */ + ExReleaseFastMutex(&DeviceExtension->FastMutex); + break; + + case IRP_MN_REMOVE_DEVICE: + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_REMOVE_DEVICE\n"); + + /* Call the remove code */ + Status = CmBattRemoveDevice(DeviceObject, Irp); + break; + + case IRP_MN_CANCEL_REMOVE_DEVICE: + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_CANCEL_REMOVE_DEVICE\n"); + + /* Lock the extension and get the handle count */ + ExAcquireFastMutex(&DeviceExtension->FastMutex); + if (DeviceExtension->HandleCount == -1) + { + /* A remove was in progress, set the handle count back to 0 */ + DeviceExtension->HandleCount = 0; + } + else if (CmBattDebug & 2) + { + /* Nop, but warn about it */ + DbgPrint("CmBattPnpDispatch: Received CANCEL_REMOVE when OpenCount == %x\n", + DeviceExtension->HandleCount); + } + + /* Return success in all cases, and release the lock */ + Status = STATUS_SUCCESS; + ExReleaseFastMutex(&DeviceExtension->FastMutex); + break; + + case IRP_MN_QUERY_STOP_DEVICE: + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_STOP_DEVICE\n"); + + /* There's no real support for this */ + Status = STATUS_NOT_IMPLEMENTED; + break; + + case IRP_MN_CANCEL_STOP_DEVICE: + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_CANCEL_STOP_DEVICE\n"); + + /* There's no real support for this */ + Status = STATUS_NOT_IMPLEMENTED; + break; + + case IRP_MN_QUERY_CAPABILITIES: + + /* Initialize our wait event */ + KeInitializeEvent(&Event, SynchronizationEvent, 0); + + /* Set the completion routine */ + IoCopyCurrentIrpStackLocationToNext(Irp); + IoSetCompletionRoutine(Irp, + (PVOID)CmBattIoCompletion, + &Event, + TRUE, + TRUE, + TRUE); + + /* Now call ACPI */ + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + /* Wait for completion */ + KeWaitForSingleObject(&Event, + Executive, + KernelMode, + FALSE, + NULL); + Status = Irp->IoStatus.Status; + } + + /* Get the wake power state */ + DeviceExtension->PowerState.SystemState = IoStackLocation->Parameters.DeviceCapabilities.Capabilities->SystemWake; + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_CAPABILITIES %d Capabilities->SystemWake = %x\n", + DeviceExtension->FdoType, + DeviceExtension->PowerState); + + /* Check if it's invalid */ + if (DeviceExtension->PowerState.SystemState == PowerSystemUnspecified) + { + /* Wait wake is not supported in this scenario */ + DeviceExtension->WaitWakeEnable = FALSE; + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_CAPABILITIES Wake not supported.\n"); + } + else if (!(DeviceExtension->PowerIrp) && + (DeviceExtension->WaitWakeEnable)) + { + /* If it was requested in the registry, request the power IRP for it */ + PoRequestPowerIrp(DeviceExtension->DeviceObject, + 0, + DeviceExtension->PowerState, + CmBattWaitWakeLoop, + 0, + &DeviceExtension->PowerIrp); + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_CAPABILITIES wait/Wake irp sent.\n"); + } + + /* Release the remove lock and complete the request */ + IofCompleteRequest(Irp, IO_NO_INCREMENT); + IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp); + return Status; + + default: + /* Unsupported */ + if (CmBattDebug & 0x20) + DbgPrint("CmBattPnpDispatch: Unimplemented minor %0x\n", + IoStackLocation->MinorFunction); + break; + } + + /* Release the remove lock */ + IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp); + + /* Set IRP status if we have one */ + if (Status != STATUS_NOT_SUPPORTED) Irp->IoStatus.Status = Status; + + /* Did someone pick it up? */ + if ((NT_SUCCESS(Status)) || (Status == STATUS_NOT_SUPPORTED)) + { + /* Still unsupported, try ACPI */ + IoSkipCurrentIrpStackLocation(Irp); + Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp); + } + else + { + /* Complete the request */ + Status = Irp->IoStatus.Status; + IofCompleteRequest(Irp, IO_NO_INCREMENT); + } + + /* Release the remove lock and return status */ + return Status; } NTSTATUS NTAPI - CmBattPnpDispatch(PDEVICE_OBJECT DeviceObject, - PIRP Irp) + CmBattCreateFdo(IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject, + IN ULONG DeviceExtensionSize, + IN PDEVICE_OBJECT *NewDeviceObject) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PDEVICE_OBJECT FdoDeviceObject; + HANDLE KeyHandle; + PCMBATT_DEVICE_EXTENSION FdoExtension; + UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)]; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PVOID)Buffer; + NTSTATUS Status; + UNICODE_STRING KeyString; + ULONG UniqueId; + ULONG ResultLength; + PAGED_CODE(); + if (CmBattDebug & 0x220) DbgPrint("CmBattCreateFdo: Entered\n"); + + /* Get unique ID */ + Status = CmBattGetUniqueId(DeviceObject, &UniqueId); + if (!NT_SUCCESS(Status)) + { + /* Assume 0 */ + UniqueId = 0; + if (CmBattDebug & 2) + DbgPrint("CmBattCreateFdo: Error %x from _UID, assuming unit #0\n", Status); + } + + /* Create the FDO */ + Status = IoCreateDevice(DriverObject, + DeviceExtensionSize, + 0, + FILE_DEVICE_BATTERY, + FILE_DEVICE_SECURE_OPEN, + 0, + &FdoDeviceObject); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + if (CmBattDebug & 0xC) + DbgPrint("CmBattCreateFdo: error (0x%x) creating device object\n", Status); + return Status; + } + + /* Set FDO flags */ + FdoDeviceObject->Flags |= DO_BUFFERED_IO; + FdoDeviceObject->Flags |= DO_MAP_IO_BUFFER; + FdoDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + + /* Initialize the extension */ + FdoExtension = FdoDeviceObject->DeviceExtension; + RtlZeroMemory(FdoExtension, DeviceExtensionSize); + FdoExtension->DeviceObject = FdoDeviceObject; + FdoExtension->FdoDeviceObject = FdoDeviceObject; + FdoExtension->PdoDeviceObject = DeviceObject; + + /* Attach to ACPI */ + FdoExtension->AttachedDevice = IoAttachDeviceToDeviceStack(FdoDeviceObject, + DeviceObject); + if (!FdoExtension->AttachedDevice) + { + /* Destroy and fail */ + CmBattDestroyFdo(FdoExtension->FdoDeviceObject); + if (CmBattDebug & 0xC) + DbgPrint("CmBattCreateFdo: IoAttachDeviceToDeviceStack failed.\n"); + return STATUS_UNSUCCESSFUL; + } + + /* Get ACPI interface for EVAL */ + Status = CmBattGetAcpiInterfaces(FdoExtension->AttachedDevice, + &FdoExtension->AcpiInterface); + if (!FdoExtension->AttachedDevice) + { + /* Detach, destroy, and fail */ + IoDetachDevice(FdoExtension->AttachedDevice); + CmBattDestroyFdo(FdoExtension->FdoDeviceObject); + if (CmBattDebug & 0xC) + DbgPrint("CmBattCreateFdo: Could not get ACPI interfaces: %x\n", Status); + return STATUS_UNSUCCESSFUL; + } + + /* Setup the rest of the extension */ + ExInitializeFastMutex(&FdoExtension->FastMutex); + IoInitializeRemoveLock(&FdoExtension->RemoveLock, 0, 0, 0); + FdoExtension->HandleCount = 0; + FdoExtension->WaitWakeEnable = FALSE; + FdoExtension->DeviceId = UniqueId; + FdoExtension->DeviceName = NULL; + FdoExtension->DelayNotification = FALSE; + FdoExtension->ArFlag = 0; + + /* Open the device key */ + Status = IoOpenDeviceRegistryKey(DeviceObject, + PLUGPLAY_REGKEY_DEVICE, + KEY_READ, + &KeyHandle); + if (NT_SUCCESS(Status)) + { + /* Read wait wake value */ + RtlInitUnicodeString(&KeyString, L"WaitWakeEnabled"); + Status = ZwQueryValueKey(KeyHandle, + &KeyString, + KeyValuePartialInformation, + PartialInfo, + sizeof(Buffer), + &ResultLength); + if (NT_SUCCESS(Status)) + { + /* Set value */ + FdoExtension->WaitWakeEnable = *(PULONG)PartialInfo->Data; + } + + /* Close the handle */ + ZwClose(KeyHandle); + } + + /* Return success and the new FDO */ + *NewDeviceObject = FdoDeviceObject; + if (CmBattDebug & 0x220) + DbgPrint("CmBattCreateFdo: Created FDO %x\n", FdoDeviceObject); + return STATUS_SUCCESS; } NTSTATUS NTAPI - CmBattAddBattery(PDRIVER_OBJECT DriverObject, - PDEVICE_OBJECT DeviceObject) + CmBattAddBattery(IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + BATTERY_MINIPORT_INFO MiniportInfo; + NTSTATUS Status; + PDEVICE_OBJECT FdoDeviceObject; + PCMBATT_DEVICE_EXTENSION FdoExtension; + PAGED_CODE(); + if (CmBattDebug & 0x220) + DbgPrint("CmBattAddBattery: pdo %x\n", DeviceObject); + + /* Create the FDO */ + Status = CmBattCreateFdo(DriverObject, + DeviceObject, + sizeof(CMBATT_DEVICE_EXTENSION), + &FdoDeviceObject); + if (!NT_SUCCESS(Status)) + { + if (CmBattDebug & 0xC) + DbgPrint("CmBattAddBattery: error (0x%x) creating Fdo\n", Status); + return Status; + } + + /* Build the FDO extensio, check if we support trip points */ + FdoExtension = FdoDeviceObject->DeviceExtension; + FdoExtension->FdoType = CmBattBattery; + FdoExtension->Started = 0; + FdoExtension->NotifySent = TRUE; + InterlockedExchange(&FdoExtension->ArLockValue, 0); + FdoExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY; + FdoExtension->Tag = 0; + FdoExtension->InterruptTime = KeQueryInterruptTime(); + FdoExtension->TripPointSet = CmBattSetTripPpoint(FdoExtension, 0) != + STATUS_OBJECT_NAME_NOT_FOUND; + + /* Setup the battery miniport information structure */ + RtlZeroMemory(&MiniportInfo, sizeof(MiniportInfo)); + MiniportInfo.Pdo = DeviceObject; + MiniportInfo.MajorVersion = BATTERY_CLASS_MAJOR_VERSION; + MiniportInfo.MinorVersion = BATTERY_CLASS_MINOR_VERSION; + MiniportInfo.Context = FdoExtension; + MiniportInfo.QueryTag = (PVOID)CmBattQueryTag; + MiniportInfo.QueryInformation = (PVOID)CmBattQueryInformation; + MiniportInfo.SetInformation = NULL; + MiniportInfo.QueryStatus = (PVOID)CmBattQueryStatus; + MiniportInfo.SetStatusNotify = (PVOID)CmBattSetStatusNotify; + MiniportInfo.DisableStatusNotify = (PVOID)CmBattDisableStatusNotify; + MiniportInfo.DeviceName = FdoExtension->DeviceName; + + /* Register with the class driver */ + Status = BatteryClassInitializeDevice(&MiniportInfo, &FdoExtension->ClassData); + if (!NT_SUCCESS(Status)) + { + IoDetachDevice(FdoExtension->AttachedDevice); + CmBattDestroyFdo(FdoExtension->FdoDeviceObject); + if (CmBattDebug & 0xC) + DbgPrint("CmBattAddBattery: error (0x%x) registering with class\n", Status); + return Status; + } + + /* Register WMI */ + Status = CmBattWmiRegistration(FdoExtension); + if (!NT_SUCCESS(Status)) + { + if (CmBattDebug & 0xC) + DbgPrint("CmBattAddBattery: Could not register as a WMI provider, status = %Lx\n", Status); + return Status; + } + + /* Register ACPI */ + Status = FdoExtension->AcpiInterface.RegisterForDeviceNotifications(FdoExtension->AcpiInterface.Context, + (PVOID)CmBattNotifyHandler, + FdoExtension); + if (!NT_SUCCESS(Status)) + { + CmBattWmiDeRegistration(FdoExtension); + BatteryClassUnload(FdoExtension->ClassData); + IoDetachDevice(FdoExtension->AttachedDevice); + CmBattDestroyFdo(FdoExtension->FdoDeviceObject); + if (CmBattDebug & 0xC) + DbgPrint("CmBattAddBattery: Could not register for battery notify, status = %Lx\n", Status); + } + + /* Return status */ + return Status; } NTSTATUS NTAPI - CmBattAddAcAdapter(PDRIVER_OBJECT DriverObject, - PDEVICE_OBJECT DeviceObject) + CmBattAddAcAdapter(IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PdoDeviceObject) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PDEVICE_OBJECT FdoDeviceObject; + NTSTATUS Status; + PCMBATT_DEVICE_EXTENSION DeviceExtension; + PAGED_CODE(); + if (CmBattDebug & 0x220) + DbgPrint("CmBattAddAcAdapter: pdo %x\n", PdoDeviceObject); + + /* Check if we already have an AC adapter */ + if (AcAdapterPdo) + { + /* Don't do anything */ + if (CmBattDebug & 0xC) + DbgPrint("CmBatt: Second AC adapter found. Current version of driver only supports 1 aadapter.\n"); + } + else + { + /* Set this as the AC adapter's PDO */ + AcAdapterPdo = PdoDeviceObject; + } + + /* Create the FDO for the adapter */ + Status = CmBattCreateFdo(DriverObject, + PdoDeviceObject, + sizeof(CMBATT_DEVICE_EXTENSION), + &FdoDeviceObject); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + if (CmBattDebug & 0xC) + DbgPrint("CmBattAddAcAdapter: error (0x%x) creating Fdo\n", Status); + return Status; + } + + /* Set the type and do WMI registration */ + DeviceExtension = FdoDeviceObject->DeviceExtension; + DeviceExtension->FdoType = CmBattAcAdapter; + Status = CmBattWmiRegistration(DeviceExtension); + if (!NT_SUCCESS(Status)) + { + /* We can go on without WMI */ + if (CmBattDebug & 0xC) + DbgPrint("CmBattAddBattery: Could not register as a WMI provider, status = %Lx\n", Status); + } + + /* Register with ACPI */ + Status = DeviceExtension->AcpiInterface.RegisterForDeviceNotifications(DeviceExtension->AcpiInterface.Context, + (PVOID)CmBattNotifyHandler, + DeviceExtension); + if (!(NT_SUCCESS(Status)) && (CmBattDebug & 0xC)) + DbgPrint("CmBattAddAcAdapter: Could not register for power notify, status = %Lx\n", Status); + + /* Send the first manual notification */ + CmBattNotifyHandler(DeviceExtension, ACPI_BATT_NOTIFY_STATUS); + return STATUS_SUCCESS; } NTSTATUS NTAPI - CmBattAddDevice(PDRIVER_OBJECT DriverObject, - PDEVICE_OBJECT DeviceObject) + CmBattAddDevice(IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PdoDeviceObject) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + HANDLE KeyHandle; + ULONG ResultLength; + UNICODE_STRING KeyString; + UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)]; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PVOID)Buffer; + ULONG PowerSourceType; + PAGED_CODE(); + if (CmBattDebug & 0x220) + DbgPrint("CmBattAddDevice: Entered with pdo %x\n", PdoDeviceObject); + + /* Make sure we have a PDO */ + if (!PdoDeviceObject) + { + /* Should not be having as one */ + if (CmBattDebug & 0x24) DbgPrint("CmBattAddDevice: Asked to do detection\n"); + return STATUS_NO_MORE_ENTRIES; + } + + /* Open the driver key */ + Status = IoOpenDeviceRegistryKey(PdoDeviceObject, + PLUGPLAY_REGKEY_DRIVER, + KEY_READ, + &KeyHandle); + if (!NT_SUCCESS(Status)) + { + if (CmBattDebug & 0xC) + DbgPrint("CmBattAddDevice: Could not get the software branch: %x\n", Status); + return Status; + } + + /* Read the power source type */ + RtlInitUnicodeString(&KeyString, L"PowerSourceType"); + Status = ZwQueryValueKey(KeyHandle, + &KeyString, + KeyValuePartialInformation, + PartialInfo, + sizeof(Buffer), + &ResultLength); + ZwClose(KeyHandle); + if (!NT_SUCCESS(Status)) + { + /* We need the data, fail without it */ + if (CmBattDebug & 0xC) + DbgPrint("CmBattAddDevice: Could not read the power type identifier: %x\n", Status); + return Status; + } + + /* Check what kind of power source this is */ + PowerSourceType = *(PULONG)PartialInfo->Data; + if (PowerSourceType == 1) + { + /* Create an AC adapter */ + Status = CmBattAddAcAdapter(DriverObject, PdoDeviceObject); + } + else if (PowerSourceType == 0) + { + /* Create a battery */ + Status = CmBattAddBattery(DriverObject, PdoDeviceObject); + } + else + { + /* Unknown type, fail */ + if (CmBattDebug & 0xC) + DbgPrint("CmBattAddDevice: Invalid POWER_SOURCE_TYPE == %d \n", PowerSourceType); + return STATUS_UNSUCCESSFUL; + } + + /* Return whatever the FDO creation routine did */ + return Status; } /* EOF */ diff --combined drivers/bus/acpi/cmbatt/cmbwmi.c index 3609e17d5ff,1274f04280b..1274f04280b --- a/drivers/bus/acpi/cmbatt/cmbwmi.c +++ b/drivers/bus/acpi/cmbatt/cmbwmi.c @@@ -10,8 -10,46 +10,46 @@@ #include "cmbatt.h" + /* GLOBALS ********************************************************************/ + + WMIGUIDREGINFO CmBattWmiGuidList[1] = + { + {&GUID_POWER_DEVICE_WAKE_ENABLE, 1, 0} + }; + /* FUNCTIONS ******************************************************************/ + PCHAR + NTAPI + WMIMinorFunctionString(IN UCHAR MinorFunction) + { + switch (MinorFunction) + { + case IRP_MN_CHANGE_SINGLE_INSTANCE: + return "IRP_MN_CHANGE_SINGLE_INSTANCE"; + case IRP_MN_CHANGE_SINGLE_ITEM: + return "IRP_MN_CHANGE_SINGLE_ITEM"; + case IRP_MN_DISABLE_COLLECTION: + return "IRP_MN_DISABLE_COLLECTION"; + case IRP_MN_DISABLE_EVENTS: + return "IRP_MN_DISABLE_EVENTS"; + case IRP_MN_ENABLE_COLLECTION: + return "IRP_MN_ENABLE_COLLECTION"; + case IRP_MN_ENABLE_EVENTS: + return "IRP_MN_ENABLE_EVENTS"; + case IRP_MN_EXECUTE_METHOD: + return "IRP_MN_EXECUTE_METHOD"; + case IRP_MN_QUERY_ALL_DATA: + return "IRP_MN_QUERY_ALL_DATA"; + case IRP_MN_QUERY_SINGLE_INSTANCE: + return "IRP_MN_QUERY_SINGLE_INSTANCE"; + case IRP_MN_REGINFO: + return "IRP_MN_REGINFO"; + default: + return "IRP_MN_?????"; + } + } + NTSTATUS NTAPI CmBattQueryWmiRegInfo(PDEVICE_OBJECT DeviceObject, @@@ -69,27 -107,115 +107,115 @@@ CmBattSetWmiDataItem(PDEVICE_OBJECT Dev NTSTATUS NTAPI - CmBattWmiDeRegistration(PCMBATT_DEVICE_EXTENSION DeviceExtension) + CmBattWmiDeRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PAGED_CODE(); + + /* De-register */ + return IoWMIRegistrationControl(DeviceExtension->FdoDeviceObject, + WMIREG_ACTION_DEREGISTER); } NTSTATUS NTAPI - CmBattWmiRegistration(PCMBATT_DEVICE_EXTENSION DeviceExtension) + CmBattWmiRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PAGED_CODE(); + + /* GUID information */ + DeviceExtension->WmiLibInfo.GuidCount = sizeof(CmBattWmiGuidList) / + sizeof(WMIGUIDREGINFO); + DeviceExtension->WmiLibInfo.GuidList = CmBattWmiGuidList; + + /* Callbacks */ + DeviceExtension->WmiLibInfo.QueryWmiRegInfo = CmBattQueryWmiRegInfo; + DeviceExtension->WmiLibInfo.QueryWmiDataBlock = CmBattQueryWmiDataBlock; + DeviceExtension->WmiLibInfo.SetWmiDataBlock = CmBattSetWmiDataBlock; + DeviceExtension->WmiLibInfo.SetWmiDataItem = CmBattSetWmiDataItem; + DeviceExtension->WmiLibInfo.ExecuteWmiMethod = NULL; + DeviceExtension->WmiLibInfo.WmiFunctionControl = NULL; + + /* Register */ + return IoWMIRegistrationControl(DeviceExtension->FdoDeviceObject, + WMIREG_ACTION_REGISTER); } NTSTATUS NTAPI - CmBattSystemControl(PDEVICE_OBJECT DeviceObject, - PIRP Irp) + CmBattSystemControl(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PCMBATT_DEVICE_EXTENSION DeviceExtension; + PWMILIB_CONTEXT WmiLibContext; + SYSCTL_IRP_DISPOSITION Disposition = IrpForward; + PAGED_CODE(); + if (CmBattDebug & 2) + DbgPrint("CmBatt: SystemControl: %s\n", + WMIMinorFunctionString(IoGetCurrentIrpStackLocation(Irp)->MinorFunction)); + + /* Acquire the remove lock */ + DeviceExtension = DeviceObject->DeviceExtension; + Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, 0); + if (!NT_SUCCESS(Status)) + { + /* It's too late, fail */ + Irp->IoStatus.Status = STATUS_DEVICE_REMOVED; + IofCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_DEVICE_REMOVED; + } + + /* What kind of device is this? */ + WmiLibContext = &DeviceExtension->WmiLibInfo; + if (DeviceExtension->FdoType == CmBattBattery) + { + /* For batteries, let the class driver handle it */ + Status = BatteryClassSystemControl(DeviceExtension->ClassData, + WmiLibContext, + DeviceObject, + Irp, + &Disposition); + } + else + { + /* Otherwise, call the wmi library directly */ + Status = WmiSystemControl(WmiLibContext, + DeviceObject, + Irp, + &Disposition); + } + + /* Check what happened */ + switch (Disposition) + { + case IrpNotCompleted: + + /* Complete it here */ + if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Not Completed.\n"); + IofCompleteRequest(Irp, IO_NO_INCREMENT); + break; + + case IrpForward: + + /* Forward it to ACPI */ + if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Forward.\n"); + IoSkipCurrentIrpStackLocation(Irp); + Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp); + break; + + case IrpProcessed: + + /* Nothing to do */ + if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Processed.\n"); + break; + + default: + ASSERT(FALSE); + } + + /* Release the lock and return */ + IoReleaseRemoveLock(&DeviceExtension->RemoveLock, 0); + return Status; } /* EOF */ diff --combined drivers/bus/acpi/cmbatt/cmexec.c index a41865c5e4c,beb646ab509..beb646ab509 --- a/drivers/bus/acpi/cmbatt/cmexec.c +++ b/drivers/bus/acpi/cmbatt/cmexec.c @@@ -14,71 -14,313 +14,313 @@@ NTSTATUS NTAPI - GetDwordElement(PACPI_METHOD_ARGUMENT Argument, - PULONG Value) + GetDwordElement(IN PACPI_METHOD_ARGUMENT Argument, + OUT PULONG Value) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + + /* Must have an integer */ + if (Argument->Type != ACPI_METHOD_ARGUMENT_INTEGER) + { + /* Not an integer, fail */ + Status = STATUS_ACPI_INVALID_DATA; + if (CmBattDebug & 0x4C) + DbgPrint("GetDwordElement: Object contained wrong data type - %d\n", + Argument->Type); + } + else + { + /* Read the integer value */ + *Value = Argument->Argument; + Status = STATUS_SUCCESS; + } + + /* Return status */ + return Status; } NTSTATUS NTAPI - GetStringElement(PACPI_METHOD_ARGUMENT Argument, - PCHAR Value) + GetStringElement(IN PACPI_METHOD_ARGUMENT Argument, + OUT PCHAR Value) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + + /* Must have a string of buffer */ + if ((Argument->Type == ACPI_METHOD_ARGUMENT_STRING) || + (Argument->Type == ACPI_METHOD_ARGUMENT_BUFFER)) + { + /* String must be less than 256 characters */ + if (Argument->DataLength < 256) + { + /* Copy the buffer */ + RtlCopyMemory(Value, Argument->Data, Argument->DataLength); + Status = STATUS_SUCCESS; + } + else + { + /* The buffer is too small (the string is too large) */ + Status = STATUS_BUFFER_TOO_SMALL; + if (CmBattDebug & 0x4C) + DbgPrint("GetStringElement: return buffer not big enough - %d\n", Argument->DataLength); + } + } + else + { + /* Not valid string data */ + Status = STATUS_ACPI_INVALID_DATA; + if (CmBattDebug & 0x4C) + DbgPrint("GetStringElement: Object contained wrong data type - %d\n", Argument->Type); + } + + /* Return the status */ + return Status; } NTSTATUS NTAPI - CmBattGetPsrData(PDEVICE_OBJECT DeviceObject, - PULONG PsrData) + CmBattSendDownStreamIrp(IN PDEVICE_OBJECT DeviceObject, + IN ULONG IoControlCode, + IN PVOID InputBuffer, + IN ULONG InputBufferLength, + IN PACPI_EVAL_OUTPUT_BUFFER OutputBuffer, + IN ULONG OutputBufferLength) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PIRP Irp; + NTSTATUS Status; + KEVENT Event; + IO_STATUS_BLOCK IoStatusBlock; + PAGED_CODE(); + + /* Initialize our wait event */ + KeInitializeEvent(&Event, SynchronizationEvent, 0); + + /* Allocate the IRP */ + Irp = IoBuildDeviceIoControlRequest(IoControlCode, + DeviceObject, + InputBuffer, + InputBufferLength, + OutputBuffer, + OutputBufferLength, + 0, + &Event, + &IoStatusBlock); + if (!Irp) + { + /* No IRP, fail */ + if (CmBattDebug & 0x4C) + DbgPrint("CmBattSendDownStreamIrp: Failed to allocate Irp\n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Call ACPI */ + if (CmBattDebug & 0x40) + DbgPrint("CmBattSendDownStreamIrp: Irp %x [Tid] %x\n", + Irp, KeGetCurrentThread()); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + /* Wait for completion */ + KeWaitForSingleObject(&Event, + Executive, + KernelMode, + FALSE, + NULL); + Status = Irp->IoStatus.Status; + } + + /* Check if caller wanted output */ + if (OutputBuffer) + { + /* Make sure it's valid ACPI output buffer */ + if ((OutputBuffer->Signature != ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE) || + !(OutputBuffer->Count)) + { + /* It isn't, so set failure code */ + Status = STATUS_ACPI_INVALID_DATA; + } + } + + /* Return status */ + if (CmBattDebug & 0x40) + DbgPrint("CmBattSendDownStreamIrp: Irp %x completed %x! [Tid] %x\n", + Irp, Status, KeGetCurrentThread()); + return Status; } NTSTATUS NTAPI - CmBattGetBifData(PCMBATT_DEVICE_EXTENSION DeviceExtension, - PACPI_BIF_DATA BifData) + CmBattGetPsrData(IN PDEVICE_OBJECT DeviceObject, + OUT PULONG PsrData) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + ACPI_EVAL_OUTPUT_BUFFER OutputBuffer; + ACPI_EVAL_INPUT_BUFFER InputBuffer; + PAGED_CODE(); + if (CmBattDebug & 0x40) + DbgPrint("CmBattGetPsrData: Entered with Pdo %x Tid %x\n", + DeviceObject, KeGetCurrentThread()); + + /* Initialize to zero */ + ASSERT(PsrData != NULL); + *PsrData = 0; + + /* Request the _PSR method */ + *(PULONG)InputBuffer.MethodName = 'RSP_'; + InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE; + + /* Send it to ACPI */ + Status = CmBattSendDownStreamIrp(DeviceObject, + IOCTL_ACPI_EVAL_METHOD, + &InputBuffer, + sizeof(InputBuffer), + &OutputBuffer, + sizeof(OutputBuffer)); + if (NT_SUCCESS(Status)) + { + /* Read the result */ + Status = GetDwordElement(OutputBuffer.Argument, PsrData); + if (CmBattDebug & 0x440) + DbgPrint("CmBattGetPsrData: _PSR method returned %x \n", *PsrData); + } + else if (CmBattDebug & 0x44C) + { + /* Failure */ + DbgPrint("CmBattGetPsrData: Failed _PSR method - Status (0x%x)\n", Status); + } + + /* Return status */ + return Status; } NTSTATUS NTAPI - CmBattGetBstData(PCMBATT_DEVICE_EXTENSION DeviceExtension, - PACPI_BST_DATA BstData) + CmBattGetStaData(IN PDEVICE_OBJECT DeviceObject, + OUT PULONG StaData) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; - } + NTSTATUS Status; + ACPI_EVAL_OUTPUT_BUFFER OutputBuffer; + ACPI_EVAL_INPUT_BUFFER InputBuffer; + PAGED_CODE(); + if (CmBattDebug & 0x40) + DbgPrint("CmBattGetStaData: Entered with Pdo %x Tid %x\n", + DeviceObject, KeGetCurrentThread()); + + /* Initialize to zero */ + ASSERT(StaData != NULL); + *StaData = 0; + + /* Request the _PSR method */ + *(PULONG)InputBuffer.MethodName = 'ATS_'; + InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE; + + /* Send it to ACPI */ + Status = CmBattSendDownStreamIrp(DeviceObject, + IOCTL_ACPI_EVAL_METHOD, + &InputBuffer, + sizeof(InputBuffer), + &OutputBuffer, + sizeof(OutputBuffer)); + if (NT_SUCCESS(Status)) + { + /* Read the result */ + Status = GetDwordElement(OutputBuffer.Argument, StaData); + if (CmBattDebug & 0x440) + DbgPrint("CmBattGetStaData: _STA method returned %x \n", *StaData); + } + else if (CmBattDebug & 0x44C) + { + /* Failure */ + DbgPrint("CmBattGetStaData: Failed _STA method - Status (0x%x)\n", Status); + Status = STATUS_NO_SUCH_DEVICE; + } + + /* Return status */ + return Status; + } NTSTATUS NTAPI - CmBattGetStaData(PDEVICE_OBJECT DeviceObject, - PULONG StaData) + CmBattGetUniqueId(IN PDEVICE_OBJECT DeviceObject, + OUT PULONG UniqueId) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + ACPI_EVAL_OUTPUT_BUFFER OutputBuffer; + ACPI_EVAL_INPUT_BUFFER InputBuffer; + PAGED_CODE(); + if (CmBattDebug & 0x40) + DbgPrint("CmBattGetUniqueId: Entered with Pdo %x Tid %x\n", + DeviceObject, KeGetCurrentThread()); + + /* Initialize to zero */ + ASSERT(UniqueId != NULL); + *UniqueId = 0; + + /* Request the _PSR method */ + *(PULONG)InputBuffer.MethodName = 'DIU_'; + InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE; + + /* Send it to ACPI */ + Status = CmBattSendDownStreamIrp(DeviceObject, + IOCTL_ACPI_EVAL_METHOD, + &InputBuffer, + sizeof(InputBuffer), + &OutputBuffer, + sizeof(OutputBuffer)); + if (NT_SUCCESS(Status)) + { + /* Read the result */ + Status = GetDwordElement(OutputBuffer.Argument, UniqueId); + if (CmBattDebug & 0x440) + DbgPrint("CmBattGetUniqueId: _UID method returned %x \n", *UniqueId); + } + else if (CmBattDebug & 0x44C) + { + /* Failure */ + DbgPrint("CmBattGetUniqueId: Failed _UID method - Status (0x%x)\n", Status); + Status = STATUS_NO_SUCH_DEVICE; + } + + /* Return status */ + return Status; } NTSTATUS NTAPI - CmBattGetUniqueId(PDEVICE_OBJECT DeviceObject, - PULONG UniqueId) + CmBattSetTripPpoint(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG AlarmValue) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER InputBuffer; + PAGED_CODE(); + if (CmBattDebug & 0x440) + DbgPrint("CmBattSetTripPpoint: _BTP Alarm Value %x Device %x Tid %x\n", + AlarmValue, DeviceExtension->DeviceId, KeGetCurrentThread); + + /* Request the _BTP method */ + *(PULONG)InputBuffer.MethodName = 'PTB_'; + InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE; + InputBuffer.IntegerArgument = AlarmValue; + + /* Send it to ACPI */ + Status = CmBattSendDownStreamIrp(DeviceExtension->AttachedDevice, + IOCTL_ACPI_EVAL_METHOD, + &InputBuffer, + sizeof(InputBuffer), + NULL, + 0); + if (!(NT_SUCCESS(Status)) && (CmBattDebug & 0x440)) + DbgPrint("CmBattSetTripPpoint: Failed _BTP method on device %x - Status (0x%x)\n", + DeviceExtension->DeviceId, Status); + + /* Return status */ + return Status; } NTSTATUS NTAPI - CmBattSetTripPpoint(PCMBATT_DEVICE_EXTENSION DeviceExtension, - ULONG AlarmValue) + CmBattGetBifData(PCMBATT_DEVICE_EXTENSION DeviceExtension, + PACPI_BIF_DATA BifData) { UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; @@@ -86,15 -328,11 +328,11 @@@ NTSTATUS NTAPI - CmBattSendDownStreamIrp(PDEVICE_OBJECT DeviceObject, - ULONG IoControlCode, - PVOID InputBuffer, - ULONG InputBufferLength, - PACPI_EVAL_OUTPUT_BUFFER OutputBuffer, - ULONG OutputBufferLength) + CmBattGetBstData(PCMBATT_DEVICE_EXTENSION DeviceExtension, + PACPI_BST_DATA BstData) { UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; } - + /* EOF */ diff --combined drivers/bus/acpi/compbatt/compbatt.c index 00000000000,03d587c46ad..03d587c46ad mode 000000,100644..100644 --- a/drivers/bus/acpi/compbatt/compbatt.c +++ b/drivers/bus/acpi/compbatt/compbatt.c @@@ -1,0 -1,168 +1,168 @@@ + /* + * PROJECT: ReactOS Composite Battery Driver + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/drivers/bus/acpi/compbatt/compbatt.c + * PURPOSE: Main Initialization Code and IRP Handling + * PROGRAMMERS: ReactOS Portable Systems Group + */ + + /* INCLUDES *******************************************************************/ + + #include "compbatt.h" + + /* GLOBALS ********************************************************************/ + + ULONG CompBattDebug; + + /* FUNCTIONS ******************************************************************/ + + NTSTATUS + NTAPI + CompBattOpenClose(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattSystemControl(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattMonitorIrpComplete(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PKEVENT Event) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattMonitorIrpCompleteWorker(IN PCOMPBATT_BATTERY_ENTRY BatteryData) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattRecalculateTag(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattIoctl(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattQueryTag(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension, + OUT PULONG Tag) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattDisableStatusNotify(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattSetStatusNotify(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG BatteryTag, + IN PBATTERY_NOTIFY BatteryNotify) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattGetBatteryStatus(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG Tag) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattQueryStatus(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension, + IN ULONG Tag, + IN PBATTERY_STATUS BatteryStatus) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattGetBatteryInformation(OUT PBATTERY_INFORMATION BatteryInformation, + IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattGetBatteryGranularity(OUT PBATTERY_REPORTING_SCALE ReportingScale, + IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattGetEstimatedTime(OUT PULONG Time, + IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattQueryInformation(IN PCOMPBATT_DEVICE_EXTENSION FdoExtension, + IN ULONG Tag, + IN BATTERY_QUERY_INFORMATION_LEVEL InfoLevel, + IN OPTIONAL LONG AtRate, + IN PVOID Buffer, + IN ULONG BufferLength, + OUT PULONG ReturnedLength) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + DriverEntry(IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + /* EOF */ diff --combined drivers/bus/acpi/compbatt/compbatt.h index 00000000000,701f1362641..701f1362641 mode 000000,100644..100644 --- a/drivers/bus/acpi/compbatt/compbatt.h +++ b/drivers/bus/acpi/compbatt/compbatt.h @@@ -1,0 -1,57 +1,57 @@@ + /* + * PROJECT: ReactOS Composite Battery Driver + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/drivers/bus/acpi/compbatt/compbatt.h + * PURPOSE: Main Header File + * PROGRAMMERS: ReactOS Portable Systems Group + */ + + #include + #include + #include + #include + + typedef struct _COMPBATT_BATTERY_ENTRY + { + LIST_ENTRY BatteryLink; + IO_REMOVE_LOCK RemoveLock; + PDEVICE_OBJECT DeviceObject; + PIRP Irp; + WORK_QUEUE_ITEM WorkItem; + BOOLEAN WaitFlag; + BATTERY_WAIT_STATUS WaitStatus; + union + { + BATTERY_WAIT_STATUS WorkerWaitStatus; + BATTERY_STATUS WorkerStatus; + }; + ULONG Tag; + ULONG Flags; + BATTERY_INFORMATION BatteryInformation; + BATTERY_STATUS BatteryStatus; + ULONGLONG InterruptTime; + UNICODE_STRING BatteryName; + } COMPBATT_BATTERY_ENTRY, *PCOMPBATT_BATTERY_ENTRY; + + typedef struct _COMPBATT_DEVICE_EXTENSION + { + PVOID ClassData; + ULONG NextTag; + LIST_ENTRY BatteryList; + FAST_MUTEX Lock; + ULONG Tag; + ULONG Flags; + BATTERY_INFORMATION BatteryInformation; + BATTERY_STATUS BatteryStatus; + ULONGLONG InterruptTime; + POWER_STATE PowerState; + ULONG LowCapacity; + ULONG HighCapacity; + PDEVICE_OBJECT AttachedDevice; + PDEVICE_OBJECT DeviceObject; + PVOID NotificationEntry; + } COMPBATT_DEVICE_EXTENSION, *PCOMPBATT_DEVICE_EXTENSION; + + extern ULONG CmBattDebug; + + /* EOF */ diff --combined drivers/bus/acpi/compbatt/compbatt.rbuild index 00000000000,6a92873c0e1..6a92873c0e1 mode 000000,100644..100644 --- a/drivers/bus/acpi/compbatt/compbatt.rbuild +++ b/drivers/bus/acpi/compbatt/compbatt.rbuild @@@ -1,0 -1,13 +1,13 @@@ + + + + ntoskrnl + hal + battc + . + compbatt.c + compmisc.c + comppnp.c + compbatt.rc + compbatt.h + diff --combined drivers/bus/acpi/compbatt/compbatt.rc index 00000000000,a7ec82048fc..a7ec82048fc mode 000000,100644..100644 --- a/drivers/bus/acpi/compbatt/compbatt.rc +++ b/drivers/bus/acpi/compbatt/compbatt.rc @@@ -1,0 -1,5 +1,5 @@@ + #define REACTOS_VERSION_DLL + #define REACTOS_STR_FILE_DESCRIPTION "Composite Battery Driver\0" + #define REACTOS_STR_INTERNAL_NAME "compbatt\0" + #define REACTOS_STR_ORIGINAL_FILENAME "compbatt.sys\0" + #include diff --combined drivers/bus/acpi/compbatt/compmisc.c index 00000000000,3f75d4b9abf..3f75d4b9abf mode 000000,100644..100644 --- a/drivers/bus/acpi/compbatt/compmisc.c +++ b/drivers/bus/acpi/compbatt/compmisc.c @@@ -1,0 -1,40 +1,40 @@@ + /* + * PROJECT: ReactOS Composite Battery Driver + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/drivers/bus/acpi/compbatt/compmisc.c + * PURPOSE: Miscellaneous Support Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + + /* INCLUDES *******************************************************************/ + + #include "compbatt.h" + + /* FUNCTIONS ******************************************************************/ + + NTSTATUS + NTAPI + BatteryIoctl(IN ULONG IoControlCode, + IN PDEVICE_OBJECT DeviceObject, + IN PVOID InputBuffer, + IN ULONG InputBufferLength, + IN PVOID OutputBuffer, + IN ULONG OutputBufferLength, + IN BOOLEAN InternalDeviceIoControl) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattGetDeviceObjectPointer(IN PCUNICODE_STRING DeviceName, + IN ACCESS_MASK DesiredAccess, + OUT PFILE_OBJECT *FileObject, + OUT PDEVICE_OBJECT *DeviceObject) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + /* EOF */ diff --combined drivers/bus/acpi/compbatt/comppnp.c index 00000000000,a767c18ab80..a767c18ab80 mode 000000,100644..100644 --- a/drivers/bus/acpi/compbatt/comppnp.c +++ b/drivers/bus/acpi/compbatt/comppnp.c @@@ -1,0 -1,95 +1,95 @@@ + /* + * PROJECT: ReactOS Composite Battery Driver + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/drivers/bus/acpi/compbatt/comppnp.c + * PURPOSE: Plug-and-Play IOCTL/IRP Handling + * PROGRAMMERS: ReactOS Portable Systems Group + */ + + /* INCLUDES *******************************************************************/ + + #include "compbatt.h" + + /* FUNCTIONS ******************************************************************/ + + NTSTATUS + NTAPI + CompBattPowerDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + PCOMPBATT_BATTERY_ENTRY + NTAPI + RemoveBatteryFromList(IN PCUNICODE_STRING BatteryName, + IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return NULL; + } + + BOOLEAN + NTAPI + IsBatteryAlreadyOnList(IN PCUNICODE_STRING BatteryName, + IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return FALSE; + } + + NTSTATUS + NTAPI + CompBattAddNewBattery(IN PCUNICODE_STRING BatteryName, + IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattRemoveBattery(IN PCUNICODE_STRING BatteryName, + IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattGetBatteries(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattPnpEventHandler(IN PDEVICE_INTERFACE_CHANGE_NOTIFICATION Notification, + IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattAddDevice(IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PdoDeviceObject) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + NTSTATUS + NTAPI + CompBattPnpDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + + /* EOF */ diff --combined drivers/bus/acpi/include/acpi_bus.h index d5fe9efccc6,d2dc22d02a9..d2dc22d02a9 --- a/drivers/bus/acpi/include/acpi_bus.h +++ b/drivers/bus/acpi/include/acpi_bus.h @@@ -73,6 -73,8 +73,8 @@@ enum acpi_bus_device_type ACPI_BUS_TYPE_SYSTEM, ACPI_BUS_TYPE_POWER_BUTTON, ACPI_BUS_TYPE_SLEEP_BUTTON, + ACPI_BUS_TYPE_POWER_BUTTONF, + ACPI_BUS_TYPE_SLEEP_BUTTONF, ACPI_BUS_DEVICE_TYPE_COUNT }; diff --combined drivers/bus/acpi/include/acpisys.h index 368ac97c83f,adf2a0c592a..adf2a0c592a --- a/drivers/bus/acpi/include/acpisys.h +++ b/drivers/bus/acpi/include/acpisys.h @@@ -39,6 -39,7 +39,7 @@@ typedef struct _PDO_DEVICE_DAT // Link point to hold all the PDOs for a single bus together LIST_ENTRY Link; ULONG InterfaceRefCount; + UNICODE_STRING InterfaceName; } PDO_DEVICE_DATA, *PPDO_DEVICE_DATA; @@@ -64,10 -65,6 +65,6 @@@ typedef struct _FDO_DEVICE_DAT // A synchronization for access to the device extension. FAST_MUTEX Mutex; - // The name returned from IoRegisterDeviceInterface, - // which is used as a handle for IoSetDeviceInterfaceState. - UNICODE_STRING InterfaceName; - } FDO_DEVICE_DATA, *PFDO_DEVICE_DATA; #define FDO_FROM_PDO(pdoData) \ @@@ -90,6 -87,11 +87,11 @@@ NTSTATU ACPIEnumerateDevices( PFDO_DEVICE_DATA DeviceExtension); + NTSTATUS + NTAPI + Bus_PDO_EvalMethod(PPDO_DEVICE_DATA DeviceData, + PIRP Irp); + NTSTATUS NTAPI Bus_CreateClose ( diff --combined drivers/bus/acpi/main.c index 3d1170eefd6,175ad53d728..175ad53d728 --- a/drivers/bus/acpi/main.c +++ b/drivers/bus/acpi/main.c @@@ -6,6 -6,9 +6,9 @@@ #include #include + #include + #include + #define NDEBUG #include @@@ -15,7 -18,8 +18,8 @@@ #endif - + extern struct acpi_device *sleep_button; + extern struct acpi_device *power_button; NTSTATUS NTAPI @@@ -29,7 -33,9 +33,9 @@@ Bus_AddDevice PDEVICE_OBJECT deviceObject = NULL; PFDO_DEVICE_DATA deviceData = NULL; PWCHAR deviceName = NULL; + #ifndef NDEBUG ULONG nameLength; + #endif PAGED_CODE (); @@@ -164,36 -170,159 +170,159 @@@ End NTSTATUS NTAPI - ACPIDispatchDeviceControl( + ACPIDispatchCreateClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; - DPRINT("Called. IRP is at (0x%X)\n", Irp); + IoCompleteRequest(Irp, IO_NO_INCREMENT); - Irp->IoStatus.Information = 0; + return STATUS_SUCCESS; + } - IrpSp = IoGetCurrentIrpStackLocation(Irp); - switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) { - default: - DPRINT("Unknown IOCTL 0x%X\n", IrpSp->Parameters.DeviceIoControl.IoControlCode); - Status = STATUS_NOT_IMPLEMENTED; - break; - } + VOID + NTAPI + ButtonWaitThread(PVOID Context) + { + PIRP Irp = Context; + int result; + struct acpi_bus_event event; + ULONG ButtonEvent; - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; + while (ACPI_SUCCESS(result = acpi_bus_receive_event(&event)) && + event.type != ACPI_BUTTON_NOTIFY_STATUS); - DPRINT("Completing IRP at 0x%X\n", Irp); + if (!ACPI_SUCCESS(result)) + { + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + } + else + { + if (strstr(event.bus_id, "PWRF")) + ButtonEvent = SYS_BUTTON_POWER; + else if (strstr(event.bus_id, "SLPF")) + ButtonEvent = SYS_BUTTON_SLEEP; + else + ButtonEvent = 0; + + RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &ButtonEvent, sizeof(ButtonEvent)); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(ULONG); + } - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + - DPRINT("Leaving. Status 0x%X\n", Status); + NTSTATUS + NTAPI + ACPIDispatchDeviceControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) + { + PIO_STACK_LOCATION irpStack; + NTSTATUS status = STATUS_NOT_SUPPORTED; + PCOMMON_DEVICE_DATA commonData; + ULONG Caps = 0; + HANDLE ThreadHandle; + + PAGED_CODE (); + + irpStack = IoGetCurrentIrpStackLocation (Irp); + ASSERT (IRP_MJ_DEVICE_CONTROL == irpStack->MajorFunction); + + commonData = (PCOMMON_DEVICE_DATA) DeviceObject->DeviceExtension; + + Irp->IoStatus.Information = 0; + + if (!commonData->IsFDO) + { + switch (irpStack->Parameters.DeviceIoControl.IoControlCode) + { + case IOCTL_ACPI_EVAL_METHOD: + status = Bus_PDO_EvalMethod((PPDO_DEVICE_DATA)commonData, + Irp); + break; + + case IOCTL_GET_SYS_BUTTON_CAPS: + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG)) + { + status = STATUS_BUFFER_TOO_SMALL; + break; + } + + if (wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"PNP0C0D")) + { + DPRINT1("Lid button reported to power manager\n"); + Caps |= SYS_BUTTON_LID; + } + else if (((PPDO_DEVICE_DATA)commonData)->AcpiHandle == NULL) + { + /* We have to return both at the same time because since we + * have a NULL handle we are the fixed feature DO and we will + * only be called once (not once per device) + */ + if (power_button) + { + DPRINT1("Fixed power button reported to power manager\n"); + Caps |= SYS_BUTTON_POWER; + } + if (sleep_button) + { + DPRINT1("Fixed sleep button reported to power manager\n"); + Caps |= SYS_BUTTON_SLEEP; + } + } + else if (wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"PNP0C0C")) + { + DPRINT1("Control method power button reported to power manager\n"); + Caps |= SYS_BUTTON_POWER; + } + else if (wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"PNP0C0E")) + { + DPRINT1("Control method sleep reported to power manager\n"); + Caps |= SYS_BUTTON_SLEEP; + } + else + { + DPRINT1("IOCTL_GET_SYS_BUTTON_CAPS sent to a non-button device\n"); + status = STATUS_INVALID_PARAMETER; + } + + if (Caps != 0) + { + RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &Caps, sizeof(Caps)); + Irp->IoStatus.Information = sizeof(Caps); + status = STATUS_SUCCESS; + } + break; + + case IOCTL_GET_SYS_BUTTON_EVENT: + PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, 0, 0, 0, ButtonWaitThread, Irp); + ZwClose(ThreadHandle); + + status = STATUS_PENDING; + break; + + default: + DPRINT1("Unsupported IOCTL: %x\n", irpStack->Parameters.DeviceIoControl.IoControlCode); + break; + } + } + else + DPRINT1("IOCTL sent to the ACPI FDO! Kill the caller!\n"); - return Status; + if (status != STATUS_PENDING) + { + Irp->IoStatus.Status = status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + else + IoMarkIrpPending(Irp); + + return status; } NTSTATUS @@@ -211,6 -340,8 +340,8 @@@ DriverEntry DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ACPIDispatchDeviceControl; DriverObject->MajorFunction [IRP_MJ_PNP] = Bus_PnP; DriverObject->MajorFunction [IRP_MJ_POWER] = Bus_Power; + DriverObject->MajorFunction [IRP_MJ_CREATE] = ACPIDispatchCreateClose; + DriverObject->MajorFunction [IRP_MJ_CLOSE] = ACPIDispatchCreateClose; DriverObject->DriverExtension->AddDevice = Bus_AddDevice; diff --combined drivers/bus/acpi/osl.c index f2549951e7e,a5df0c0d620..a5df0c0d620 --- a/drivers/bus/acpi/osl.c +++ b/drivers/bus/acpi/osl.c @@@ -576,7 -576,12 +576,12 @@@ AcpiOsWaitSemaphore DPRINT("Waiting for semaphore %p\n", Handle); ASSERT(Mutex); - ExAcquireFastMutex(Mutex); + /* HACK: We enter here at a high IRQL sometimes + * because we get called from DPCs and ISRs and + * we can't use a fast mutex at that IRQL */ + if (KeGetCurrentIrql() <= APC_LEVEL) + ExAcquireFastMutex(Mutex); + return AE_OK; } @@@ -590,7 -595,12 +595,12 @@@ AcpiOsSignalSemaphore DPRINT("AcpiOsSignalSemaphore %p\n",Handle); ASSERT(Mutex); - ExReleaseFastMutex(Mutex); + /* HACK: We enter here at a high IRQL sometimes + * because we get called from DPCs and ISRs and + * we can't use a fast mutex at that IRQL */ + if (KeGetCurrentIrql() <= APC_LEVEL) + ExReleaseFastMutex(Mutex); + return AE_OK; } diff --combined drivers/bus/isapnp/isapnp.c index 2c27302f8ab,37262c3aa87..37262c3aa87 --- a/drivers/bus/isapnp/isapnp.c +++ b/drivers/bus/isapnp/isapnp.c @@@ -153,7 -153,7 +153,7 @@@ static VOID WriteUlong(UCHAR Index, ULO } #endif - static __inline VOID SetReadDataPort(ULONG Port) + static __inline VOID SetReadDataPort(ULONG_PTR Port) { IsaPnPReadPort = (PUCHAR)Port; WriteUchar(0x00, (UCHAR) (Port >> 2)); @@@ -214,13 -214,13 +214,13 @@@ static VOID DeactivateLogicalDevice(UCH #define READ_DATA_PORT_STEP 32 /* Minimum is 4 */ - static ULONG FindNextReadPort(VOID) + static ULONG_PTR FindNextReadPort(VOID) { - ULONG Port; + ULONG_PTR Port; - Port = (ULONG)IsaPnPReadPort; + Port = (ULONG_PTR)IsaPnPReadPort; while (TRUE) { @@@ -260,7 -260,7 +260,7 @@@ static BOOLEAN IsolateReadDataPortSelect(VOID) { - ULONG Port; + ULONG_PTR Port; SendWait(); SendKey(); @@@ -333,7 -333,7 +333,7 @@@ static ULONG IsolatePnPCards(VOID KeStallExecutionProcessor(250); iteration++; SendWake(0x00); - SetReadDataPort((ULONG)IsaPnPReadPort); + SetReadDataPort((ULONG_PTR)IsaPnPReadPort); KeStallExecutionProcessor(1000); WriteAddress(0x01); KeStallExecutionProcessor(1000); @@@ -1304,7 -1304,7 +1304,7 @@@ static NTSTATUS BuildResourceLists(PISA do { Status = BuildResourceList(LogicalDevice, p, Priority); if (NT_SUCCESS(Status)) { - p = (PIO_RESOURCE_LIST)((ULONG)p + SingleListSize); + p = (PIO_RESOURCE_LIST)((ULONG_PTR)p + SingleListSize); Priority++; } } while (Status != STATUS_NOT_FOUND); @@@ -1476,7 -1476,7 +1476,7 @@@ ISAPNPQueryBusRelations CurrentEntry = CurrentEntry->Flink; } - Irp->IoStatus.Information = (ULONG)Relations; + Irp->IoStatus.Information = (ULONG_PTR)Relations; return Status; } diff --combined drivers/directx/dxg/ddhmg.c index 39e0721d339,caa5cafeb15..caa5cafeb15 --- a/drivers/directx/dxg/ddhmg.c +++ b/drivers/directx/dxg/ddhmg.c @@@ -24,7 -24,7 +24,7 @@@ BOO FASTCALL VerifyObjectOwner(PDD_ENTRY pEntry) { - DWORD Pid = (DWORD) PsGetCurrentProcessId() & 0xFFFFFFFC; + DWORD Pid = (DWORD)(DWORD_PTR)PsGetCurrentProcessId() & 0xFFFFFFFC; DWORD check = pEntry->ObjectOwner.ulObj & 0xFFFFFFFE; return ( (check == Pid) || (!check)); } @@@ -145,7 -145,7 +145,7 @@@ FASTCAL DdHmgLock(HANDLE DdHandle, UCHAR ObjectType, BOOLEAN LockOwned) { - DWORD Index = (DWORD)DdHandle & 0x1FFFFF; + DWORD Index = (DWORD)(DWORD_PTR)DdHandle & 0x1FFFFF; PDD_ENTRY pEntry = NULL; PVOID Object = NULL; diff --combined drivers/filesystems/ntfs/attrib.c index 95a5af6630b,e334ba98b00..e334ba98b00 --- a/drivers/filesystems/ntfs/attrib.c +++ b/drivers/filesystems/ntfs/attrib.c @@@ -88,7 -88,7 +88,7 @@@ FindRun (PNONRESIDENT_ATTRIBUTE NresAtt *lcn = 0; - for (run = (PUCHAR)((ULONG)NresAttr + NresAttr->RunArrayOffset); + for (run = (PUCHAR)((ULONG_PTR)NresAttr + NresAttr->RunArrayOffset); *run != 0; run += RunLength(run)) { *lcn += RunLCN(run); @@@ -248,7 -248,7 +248,7 @@@ NtfsDumpAttribute (PATTRIBUTE Attribute { Name.Length = Attribute->NameLength * sizeof(WCHAR); Name.MaximumLength = Name.Length; - Name.Buffer = (PWCHAR)((ULONG)Attribute + Attribute->NameOffset); + Name.Buffer = (PWCHAR)((ULONG_PTR)Attribute + Attribute->NameOffset); DbgPrint("'%wZ' ", &Name); } diff --combined drivers/input/i8042prt/keyboard.c index 3aa2b1b24b4,0550c907a29..0550c907a29 --- a/drivers/input/i8042prt/keyboard.c +++ b/drivers/input/i8042prt/keyboard.c @@@ -200,7 -200,7 +200,7 @@@ i8042PowerWorkItem /* Register GUID_DEVICE_SYS_BUTTON interface and report capability */ if (DeviceExtension->NewCaps != DeviceExtension->ReportedCaps) { - WaitingIrp = InterlockedExchangePointer(&DeviceExtension->PowerIrp, NULL); + WaitingIrp = InterlockedExchangePointer((PVOID)&DeviceExtension->PowerIrp, NULL); if (WaitingIrp) { /* Cancel the current power irp, as capability changed */ @@@ -255,7 -255,7 +255,7 @@@ } /* Directly complete the IOCTL_GET_SYS_BUTTON_EVENT Irp (if any) */ - WaitingIrp = InterlockedExchangePointer(&DeviceExtension->PowerIrp, NULL); + WaitingIrp = InterlockedExchangePointer((PVOID)&DeviceExtension->PowerIrp, NULL); if (WaitingIrp) { PULONG pEvent = (PULONG)WaitingIrp->AssociatedIrp.SystemBuffer; @@@ -413,7 -413,7 +413,7 @@@ i8042KbdDeviceControl else { WaitingIrp = InterlockedCompareExchangePointer( - &DeviceExtension->PowerIrp, + (PVOID)&DeviceExtension->PowerIrp, Irp, NULL); /* Check if an Irp is already pending */ @@@ -431,7 -431,7 +431,7 @@@ PowerKey = InterlockedExchange((PLONG)&DeviceExtension->LastPowerKey, 0); if (PowerKey != 0) { - (VOID)InterlockedCompareExchangePointer(&DeviceExtension->PowerIrp, NULL, Irp); + (VOID)InterlockedCompareExchangePointer((PVOID)&DeviceExtension->PowerIrp, NULL, Irp); *(PULONG)Irp->AssociatedIrp.SystemBuffer = PowerKey; Status = STATUS_SUCCESS; Irp->IoStatus.Status = Status; diff --combined drivers/network/afd/afd/connect.c index 567fca91bc8,3f47a05941a..3f47a05941a --- a/drivers/network/afd/afd/connect.c +++ b/drivers/network/afd/afd/connect.c @@@ -380,7 -380,18 +380,18 @@@ AfdStreamSocketConnect(PDEVICE_OBJECT D #endif if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS ) - return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0 ); + { + if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress ); + FCB->RemoteAddress = + TaCopyTransportAddress( &ConnectReq->RemoteAddress ); + + if( !FCB->RemoteAddress ) + Status = STATUS_NO_MEMORY; + else + Status = STATUS_SUCCESS; + + return UnlockAndMaybeComplete( FCB, Status, Irp, 0 ); + } switch( FCB->State ) { case SOCKET_STATE_CONNECTED: diff --combined drivers/network/afd/afd/write.c index a23036161de,aa1c9e371a5..aa1c9e371a5 --- a/drivers/network/afd/afd/write.c +++ b/drivers/network/afd/afd/write.c @@@ -229,7 -229,7 +229,7 @@@ AfdConnectedSocketWriteData(PDEVICE_OBJ PTDI_CONNECTION_INFORMATION TargetAddress; /* Check that the socket is bound */ - if( FCB->State != SOCKET_STATE_BOUND ) + if( FCB->State != SOCKET_STATE_BOUND || !FCB->RemoteAddress ) return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0 ); diff --combined drivers/network/dd/ne2000/include/ne2000.h index 0785c4187d2,4c4e28bdbcd..4c4e28bdbcd --- a/drivers/network/dd/ne2000/include/ne2000.h +++ b/drivers/network/dd/ne2000/include/ne2000.h @@@ -80,7 -80,7 +80,7 @@@ typedef struct _NIC_ADAPTE NDIS_MINIPORT_INTERRUPT Interrupt; /* I/O base address and interrupt number of adapter */ - ULONG IoBaseAddress; + ULONG_PTR IoBaseAddress; ULONG InterruptLevel; ULONG InterruptVector; BOOLEAN InterruptShared; @@@ -222,24 -222,24 +222,24 @@@ VOID NICUpdateCounters VOID NICReadDataAlign( PNIC_ADAPTER Adapter, PUSHORT Target, - ULONG Source, + ULONG_PTR Source, USHORT Length); VOID NICWriteDataAlign( PNIC_ADAPTER Adapter, - ULONG Target, + ULONG_PTR Target, PUSHORT Source, USHORT Length); VOID NICReadData( PNIC_ADAPTER Adapter, PUCHAR Target, - ULONG Source, + ULONG_PTR Source, USHORT Length); VOID NICWriteData( PNIC_ADAPTER Adapter, - ULONG Target, + ULONG_PTR Target, PUCHAR Source, USHORT Length); diff --combined drivers/network/dd/ne2000/ne2000/8390.c index c055d43f276,d7ceafba106..d7ceafba106 --- a/drivers/network/dd/ne2000/ne2000/8390.c +++ b/drivers/network/dd/ne2000/ne2000/8390.c @@@ -11,10 -11,10 +11,10 @@@ #include /* Null-terminated array of ports to probe. This is "semi-risky" (Don Becker). */ - ULONG ProbeAddressList[] = { 0x280, 0x300, 0x320, 0x340, 0x360, 0x380, 0 }; + ULONG_PTR ProbeAddressList[] = { 0x280, 0x300, 0x320, 0x340, 0x360, 0x380, 0 }; static BOOLEAN ProbeAddressForNIC( - ULONG address) + ULONG_PTR address) /* * FUNCTION: Probes an address for a NIC * ARGUMENTS: @@@ -129,7 -129,7 +129,7 @@@ static BOOLEAN NICTestRAM * Start at 1KB and test for every 1KB up to 64KB */ { - ULONG Base; + ULONG_PTR Base; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); diff --combined drivers/network/ndis/include/ndissys.h index d97f1f0ab41,10c6a26ede4..10c6a26ede4 --- a/drivers/network/ndis/include/ndissys.h +++ b/drivers/network/ndis/include/ndissys.h @@@ -59,6 -59,13 +59,13 @@@ NTAP ExGetCurrentProcessorCpuUsage( PULONG CpuUsage); + /* portability fixes */ + #ifdef _M_AMD64 + #define KfReleaseSpinLock KeReleaseSpinLock + #define KefAcquireSpinLockAtDpcLevel KeAcquireSpinLockAtDpcLevel + #define KefReleaseSpinLockFromDpcLevel KeReleaseSpinLockFromDpcLevel + #endif + #endif /* __NDISSYS_H */ /* EOF */ diff --combined drivers/network/ndis/ndis/io.c index b843997e6bd,0f809bf2890..0f809bf2890 --- a/drivers/network/ndis/ndis/io.c +++ b/drivers/network/ndis/ndis/io.c @@@ -106,7 -106,7 +106,7 @@@ NdisImmediateReadPortUchar OUT PUCHAR Data) { NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - *Data = READ_PORT_UCHAR((PUCHAR)Port); // FIXME: What to do with WrapperConfigurationContext? + *Data = READ_PORT_UCHAR(UlongToPtr(Port)); // FIXME: What to do with WrapperConfigurationContext? } @@@ -121,7 -121,7 +121,7 @@@ NdisImmediateReadPortUlong OUT PULONG Data) { NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - *Data = READ_PORT_ULONG((PULONG)Port); // FIXME: What to do with WrapperConfigurationContext? + *Data = READ_PORT_ULONG(UlongToPtr(Port)); // FIXME: What to do with WrapperConfigurationContext? } @@@ -136,7 -136,7 +136,7 @@@ NdisImmediateReadPortUshort OUT PUSHORT Data) { NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - *Data = READ_PORT_USHORT((PUSHORT)Port); // FIXME: What to do with WrapperConfigurationContext? + *Data = READ_PORT_USHORT(UlongToPtr(Port)); // FIXME: What to do with WrapperConfigurationContext? } @@@ -151,7 -151,7 +151,7 @@@ NdisImmediateWritePortUchar IN UCHAR Data) { NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - WRITE_PORT_UCHAR((PUCHAR)Port, Data); // FIXME: What to do with WrapperConfigurationContext? + WRITE_PORT_UCHAR(UlongToPtr(Port), Data); // FIXME: What to do with WrapperConfigurationContext? } @@@ -166,7 -166,7 +166,7 @@@ NdisImmediateWritePortUlong IN ULONG Data) { NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - WRITE_PORT_ULONG((PULONG)Port, Data); // FIXME: What to do with WrapperConfigurationContext? + WRITE_PORT_ULONG(UlongToPtr(Port), Data); // FIXME: What to do with WrapperConfigurationContext? } @@@ -181,7 -181,7 +181,7 @@@ NdisImmediateWritePortUshort IN USHORT Data) { NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - WRITE_PORT_USHORT((PUSHORT)Port, Data); // FIXME: What to do with WrapperConfigurationContext? + WRITE_PORT_USHORT(UlongToPtr(Port), Data); // FIXME: What to do with WrapperConfigurationContext? } @@@ -880,7 -880,7 +880,7 @@@ NdisMRegisterIoPortRange if(AddressSpace) { ASSERT(TranslatedAddress.u.HighPart == 0); - *PortOffset = (PVOID) TranslatedAddress.u.LowPart; + *PortOffset = (PVOID)(ULONG_PTR)TranslatedAddress.QuadPart; NDIS_DbgPrint(MAX_TRACE, ("Returning 0x%x\n", *PortOffset)); return NDIS_STATUS_SUCCESS; } diff --combined drivers/network/ndis/ndis/miniport.c index 05c750d8ebe,2a9934c355e..2a9934c355e --- a/drivers/network/ndis/ndis/miniport.c +++ b/drivers/network/ndis/ndis/miniport.c @@@ -2109,6 -2109,7 +2109,7 @@@ NdisIDeviceIoControl PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension; PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); NDIS_STATUS Status = STATUS_NOT_SUPPORTED; + ULONG Written; Irp->IoStatus.Information = 0; @@@ -2121,7 -2122,8 +2122,8 @@@ *(PNDIS_OID)Irp->AssociatedIrp.SystemBuffer, Stack->Parameters.DeviceIoControl.OutputBufferLength, MmGetSystemAddressForMdl(Irp->MdlAddress), - &Irp->IoStatus.Information); + &Written); + Irp->IoStatus.Information = Written; break; default: diff --combined drivers/network/ndis/ndis/misc.c index f8b05a80849,dca3726dcba..dca3726dcba --- a/drivers/network/ndis/ndis/misc.c +++ b/drivers/network/ndis/ndis/misc.c @@@ -426,7 -426,7 +426,7 @@@ NdisInterlockedPopEntrySList * NDIS 5.0 */ { - return ExInterlockedPopEntrySList ( ListHead, Lock ); + return (PSINGLE_LIST_ENTRY)ExInterlockedPopEntrySList ( ListHead, Lock ); } @@@ -447,7 -447,7 +447,7 @@@ NdisInterlockedPushEntrySList * NDIS 5.0 */ { - return ExInterlockedPushEntrySList ( ListHead, ListEntry, Lock ); + return (PSINGLE_LIST_ENTRY)ExInterlockedPushEntrySList ( ListHead, (PSLIST_ENTRY)ListEntry, Lock ); } diff --combined drivers/network/tcpip/datalink/lan.c index fd0b818ac1b,890330e202d..890330e202d --- a/drivers/network/tcpip/datalink/lan.c +++ b/drivers/network/tcpip/datalink/lan.c @@@ -684,7 -684,7 +684,7 @@@ VOID LANTransmit if (Adapter->MTU < Size) { /* This is NOT a pointer. MSDN explicitly says so. */ NDIS_PER_PACKET_INFO_FROM_PACKET(NdisPacket, - TcpLargeSendPacketInfo) = (PVOID)((ULONG)Adapter->MTU); + TcpLargeSendPacketInfo) = (PVOID)((ULONG_PTR)Adapter->MTU); } TcpipAcquireSpinLock( &Adapter->Lock, &OldIrql ); diff --combined drivers/network/tcpip/tcpip/dispatch.c index fb77376d68f,f216ed5f678..f216ed5f678 --- a/drivers/network/tcpip/tcpip/dispatch.c +++ b/drivers/network/tcpip/tcpip/dispatch.c @@@ -688,7 -688,7 +688,7 @@@ NTSTATUS DispTdiQueryInformation AddressInfo = (PTDI_ADDRESS_INFO)MmGetSystemAddressForMdl(Irp->MdlAddress); Address = (PTA_IP_ADDRESS)&AddressInfo->Address; - switch ((ULONG)IrpSp->FileObject->FsContext2) { + switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) { case TDI_TRANSPORT_ADDRESS_FILE: AddrFile = (PADDRESS_FILE)TranContext->Handle.AddressHandle; @@@ -732,7 -732,7 +732,7 @@@ AddressInfo = (PTDI_CONNECTION_INFORMATION) MmGetSystemAddressForMdl(Irp->MdlAddress); - switch ((ULONG)IrpSp->FileObject->FsContext2) { + switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) { case TDI_TRANSPORT_ADDRESS_FILE: AddrFile = (PADDRESS_FILE)TranContext->Handle.AddressHandle; Endpoint = AddrFile ? AddrFile->Connection : NULL; @@@ -1039,12 -1039,16 +1039,16 @@@ NTSTATUS DispTdiSendDatagram (*((PADDRESS_FILE)Request.Handle.AddressHandle)->Send))); if( (*((PADDRESS_FILE)Request.Handle.AddressHandle)->Send != NULL) ) + { + ULONG DataUsed = 0; Status = (*((PADDRESS_FILE)Request.Handle.AddressHandle)->Send)( Request.Handle.AddressHandle, DgramInfo->SendDatagramInformation, DataBuffer, BufferSize, - &Irp->IoStatus.Information); + &DataUsed); + Irp->IoStatus.Information = DataUsed; + } else { Status = STATUS_UNSUCCESSFUL; ASSERT(FALSE); @@@ -1310,7 -1314,7 +1314,7 @@@ NTSTATUS DispTdiQueryInformationEx TranContext = (PTRANSPORT_CONTEXT)IrpSp->FileObject->FsContext; - switch ((ULONG)IrpSp->FileObject->FsContext2) { + switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) { case TDI_TRANSPORT_ADDRESS_FILE: Request.Handle.AddressHandle = TranContext->Handle.AddressHandle; break; @@@ -1485,7 -1489,7 +1489,7 @@@ NTSTATUS DispTdiSetInformationEx TranContext = (PTRANSPORT_CONTEXT)IrpSp->FileObject->FsContext; Info = (PTCP_REQUEST_SET_INFORMATION_EX)Irp->AssociatedIrp.SystemBuffer; - switch ((ULONG)IrpSp->FileObject->FsContext2) { + switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) { case TDI_TRANSPORT_ADDRESS_FILE: Request.Handle.AddressHandle = TranContext->Handle.AddressHandle; break; diff --combined drivers/serial/serenum/detect.c index 87af5890236,8391ddbd427..8391ddbd427 --- a/drivers/serial/serenum/detect.c +++ b/drivers/serial/serenum/detect.c @@@ -532,7 -532,7 +532,7 @@@ SerenumDetectLegacyDevice /* Fill the read buffer */ TRACE_(SERENUM, "Fill the read buffer\n"); - Status = ReadBytes(LowerDevice, Buffer, sizeof(Buffer)/sizeof(Buffer[0]), &Count); + Status = ReadBytes(LowerDevice, Buffer, sizeof(Buffer)/sizeof(Buffer[0]), (PVOID)&Count); if (!NT_SUCCESS(Status)) goto ByeBye; RtlInitUnicodeString(&DeviceId, L"Serenum\\Mouse"); diff --combined drivers/serial/serial/devctrl.c index f37002dfebd,2f8f563d6a0..2f8f563d6a0 --- a/drivers/serial/serial/devctrl.c +++ b/drivers/serial/serial/devctrl.c @@@ -802,7 -802,7 +802,7 @@@ SerialDeviceControl * as pending, it might be possible to complete the * Irp before pending it, leading to a crash! */ WaitingIrp = InterlockedCompareExchangePointer( - &DeviceExtension->WaitOnMaskIrp, + (PVOID)&DeviceExtension->WaitOnMaskIrp, Irp, NULL); diff --combined drivers/storage/class/class2/class2.c index 517ddd4061e,cb8d1f7108c..cb8d1f7108c --- a/drivers/storage/class/class2/class2.c +++ b/drivers/storage/class/class2/class2.c @@@ -1314,7 -1314,7 +1314,7 @@@ Return Value // of original IRP. // - nextIrpStack->Parameters.Others.Argument1 = (PVOID) irpCount; + nextIrpStack->Parameters.Others.Argument1 = (PVOID)(ULONG_PTR) irpCount; for (i = 0; i < irpCount; i++) { @@@ -1502,7 -1502,7 +1502,7 @@@ Return Value srb, irpStack->MajorFunction, irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL ? irpStack->Parameters.DeviceIoControl.IoControlCode : 0, - MAXIMUM_RETRIES - ((ULONG)irpStack->Parameters.Others.Argument4), + MAXIMUM_RETRIES - ((ULONG_PTR)irpStack->Parameters.Others.Argument4), &status); // @@@ -1517,7 -1517,7 +1517,7 @@@ retry = TRUE; } - if (retry && (irpStack->Parameters.Others.Argument4 = (PVOID)((ULONG)irpStack->Parameters.Others.Argument4-1))) { + if (retry && (irpStack->Parameters.Others.Argument4 = (PVOID)((ULONG_PTR)irpStack->Parameters.Others.Argument4-1))) { // // Retry request. @@@ -1654,7 -1654,7 +1654,7 @@@ Return Value srb, irpStack->MajorFunction, irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL ? irpStack->Parameters.DeviceIoControl.IoControlCode : 0, - MAXIMUM_RETRIES - ((ULONG)irpStack->Parameters.Others.Argument4), + MAXIMUM_RETRIES - ((ULONG_PTR)irpStack->Parameters.Others.Argument4), &status); // @@@ -1669,7 -1669,7 +1669,7 @@@ retry = TRUE; } - if (retry && (irpStack->Parameters.Others.Argument4 = (PVOID)((ULONG)irpStack->Parameters.Others.Argument4-1))) { + if (retry && (irpStack->Parameters.Others.Argument4 = (PVOID)((ULONG_PTR)irpStack->Parameters.Others.Argument4-1))) { // // Retry request. If the class driver has supplied a StartIo, diff --combined drivers/storage/floppy/floppy.c index 712f8d85468,05d15983fe9..05d15983fe9 --- a/drivers/storage/floppy/floppy.c +++ b/drivers/storage/floppy/floppy.c @@@ -520,7 -520,7 +520,7 @@@ static NTSTATUS NTAPI ConfigCallback(PV if(AddressSpace == 0) gControllerInfo[gNumberOfControllers].BaseAddress = MmMapIoSpace(TranslatedAddress, FDC_PORT_BYTES, MmNonCached); else - gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)TranslatedAddress.u.LowPart; + gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)(ULONG_PTR)TranslatedAddress.QuadPart; } else if(PartialDescriptor->Type == CmResourceTypeDma) diff --combined drivers/storage/ide/atapi/atapi.c index ddcd417eae8,fe3c9808c95..fe3c9808c95 --- a/drivers/storage/ide/atapi/atapi.c +++ b/drivers/storage/ide/atapi/atapi.c @@@ -2744,7 -2744,7 +2744,7 @@@ Return Value { PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension; - ULONG nativeModeAdapterTableIndex = (ULONG)Context; + ULONG nativeModeAdapterTableIndex = (ULONG_PTR)Context; ULONG channel; PUCHAR ioSpace; BOOLEAN atapiOnly, @@@ -6260,7 -6260,7 +6260,7 @@@ Return Value newStatus = ScsiPortInitialize(DriverObject, Argument2, &hwInitializationData, - (PVOID) i); + (PVOID)(ULONG_PTR)i); if (newStatus < statusToReturn) statusToReturn = newStatus; } diff --combined drivers/storage/scsiport/scsiport.c index be9fc55c237,3e3fb5488e8..3e3fb5488e8 --- a/drivers/storage/scsiport/scsiport.c +++ b/drivers/storage/scsiport/scsiport.c @@@ -552,7 -552,7 +552,7 @@@ ScsiPortGetDeviceBase(IN PVOID HwDevice /* i/o space */ if (AddressSpace != 0) - return((PVOID)TranslatedAddress.u.LowPart); + return((PVOID)(ULONG_PTR)TranslatedAddress.QuadPart); MappedAddress = MmMapIoSpace(TranslatedAddress, NumberOfBytes, @@@ -1223,8 -1223,8 +1223,8 @@@ CreatePortConfig PortConfig->AccessRanges = (PVOID)(PortConfig+1); /* Align to LONGLONG */ - PortConfig->AccessRanges = (PVOID)((ULONG)(PortConfig->AccessRanges) + 7); - PortConfig->AccessRanges = (PVOID)((ULONG)(PortConfig->AccessRanges) & ~7); + PortConfig->AccessRanges = (PVOID)((ULONG_PTR)(PortConfig->AccessRanges) + 7); + PortConfig->AccessRanges = (PVOID)((ULONG_PTR)(PortConfig->AccessRanges) & ~7); /* Copy the data */ RtlCopyMemory(PortConfig->AccessRanges, diff --combined drivers/storage/scsiport/scsiport.rbuild index 57750f9a6b0,556d742680f..556d742680f --- a/drivers/storage/scsiport/scsiport.rbuild +++ b/drivers/storage/scsiport/scsiport.rbuild @@@ -3,10 -3,11 +3,11 @@@ - + . ntoskrnl hal scsiport.c + stubs.c scsiport.rc diff --combined drivers/video/displays/framebuf_new/framebuf_new.rbuild index 991954e44e2,de7c4a1d3be..de7c4a1d3be --- a/drivers/video/displays/framebuf_new/framebuf_new.rbuild +++ b/drivers/video/displays/framebuf_new/framebuf_new.rbuild @@@ -10,10 -10,12 +10,12 @@@ pointer.c screen.c framebuf_new.rc - - -mrtd - -fno-builtin - -Wno-unused-variable - + + + -mrtd + -fno-builtin + -Wno-unused-variable + + driver.h diff --combined drivers/video/displays/vga/main/enable.c index 2d1a943ee76,80d032cddfb..80d032cddfb --- a/drivers/video/displays/vga/main/enable.c +++ b/drivers/video/displays/vga/main/enable.c @@@ -574,7 -574,7 +574,7 @@@ DrvGetModes(IN HANDLE Driver /* next DEVMODE entry */ OutputModes--; - DM = (PDEVMODEW) ( ((ULONG)DM) + sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE); + DM = (PDEVMODEW) ( ((ULONG_PTR)DM) + sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE); OutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE); } diff --combined drivers/video/font/bmfd/font.c index 4760fac40a9,3afdc4fb360..3afdc4fb360 --- a/drivers/video/font/bmfd/font.c +++ b/drivers/video/font/bmfd/font.c @@@ -389,7 -389,7 +389,7 @@@ BmfdQueryFontTree { PBMFD_FILE pfile = (PBMFD_FILE)iFile; PBMFD_FACE pface; - ULONG i, j, cjOffset, cjSize, cGlyphs, cRuns; + ULONG i, j, cjSize, cGlyphs, cRuns; CHAR ch, chFirst, ach[256]; WCHAR wc, awc[256]; PFD_GLYPHSET pGlyphSet; @@@ -475,14 -475,13 +475,13 @@@ pwcrun[0].wcLow = awc[0]; pwcrun[0].cGlyphs = 1; pwcrun[0].phg = phglyphs; - phglyphs[0] = (HGLYPH)pface->pCharTable; + phglyphs[0] = 0; /* Walk through all supported chars */ for (i = 1, j = 0; i < cGlyphs; i++) { - /* Use pointer to glyph entry as hglyph */ - cjOffset = (ach[i] - chFirst) * pface->cjEntrySize; - phglyphs[i] = (HGLYPH)(pface->pCharTable + cjOffset); + /* Use offset to glyph entry as hglyph */ + phglyphs[i] = (ach[i] - chFirst) * pface->cjEntrySize; /* Check whether we can append the wchar to a run */ if (awc[i] == awc[i - 1] + 1) diff --combined drivers/video/font/bmfd/glyph.c index fc88b45b710,a2ce39f157f..a2ce39f157f --- a/drivers/video/font/bmfd/glyph.c +++ b/drivers/video/font/bmfd/glyph.c @@@ -80,7 -80,7 +80,7 @@@ BmfdQueryGlyphAndBitmap ULONG cjSize) { PBMFD_FACE pface = pfont->pface; - PGLYPHENTRY pge = (PGLYPHENTRY)hg; + PGLYPHENTRY pge = (PGLYPHENTRY)(pface->pCharTable + hg); ULONG xSrc, ySrc, cxSrc, cySrc; ULONG xDst, yDst, cxDst, cyDst; ULONG xScale, yScale; diff --combined drivers/video/videoprt/agp.c index ff390af0932,768e6d92f0a..768e6d92f0a --- a/drivers/video/videoprt/agp.c +++ b/drivers/video/videoprt/agp.c @@@ -275,7 -275,7 +275,7 @@@ IntAgpCommitVirtual else /* ProcessHandle != NULL */ { /* Release some virtual memory */ - ULONG Size = Pages * PAGE_SIZE; + SIZE_T Size = Pages * PAGE_SIZE; ULONG OffsetInBytes = Offset * PAGE_SIZE; BaseAddress = (PVOID)((ULONG_PTR)VirtualMapping->MappedAddress + OffsetInBytes); @@@ -349,7 -349,7 +349,7 @@@ IntAgpFreeVirtual else /* ProcessHandle != NULL */ { /* Unmap the section view */ - ULONG Size = Pages * PAGE_SIZE; + SIZE_T Size = Pages * PAGE_SIZE; ULONG OffsetInBytes = Offset * PAGE_SIZE; BaseAddress = (PVOID)((ULONG_PTR)VirtualMapping->MappedAddress + OffsetInBytes); @@@ -400,7 -400,7 +400,7 @@@ IntAgpReleaseVirtual else /* ProcessHandle != NULL */ { /* Release the allocated virtual memory */ - ULONG Size = VirtualMapping->AgpMapping->NumberOfPages * PAGE_SIZE; + SIZE_T Size = VirtualMapping->AgpMapping->NumberOfPages * PAGE_SIZE; Status = ZwFreeVirtualMemory(VirtualMapping->ProcessHandle, &VirtualMapping->MappedAddress, &Size, MEM_RELEASE); @@@ -452,7 -452,7 +452,7 @@@ IntAgpReserveVirtual else /* ProcessHandle != NULL */ { /* Reserve memory for usermode */ - ULONG Size = AgpMapping->NumberOfPages * PAGE_SIZE; + SIZE_T Size = AgpMapping->NumberOfPages * PAGE_SIZE; MappedAddress = NULL; Status = ZwAllocateVirtualMemory(ProcessHandle, &MappedAddress, 0, &Size, MEM_RESERVE, PAGE_NOACCESS); diff --combined drivers/video/videoprt/int10.c index 7930c87ca72,5f5458aa89f..5f5458aa89f --- a/drivers/video/videoprt/int10.c +++ b/drivers/video/videoprt/int10.c @@@ -24,6 -24,7 +24,7 @@@ /* PRIVATE FUNCTIONS **********************************************************/ + #if defined(_M_IX86) VP_STATUS NTAPI IntInt10AllocateBuffer( IN PVOID Context, @@@ -190,6 -191,7 +191,7 @@@ IntInt10CallBios if (NT_SUCCESS(Status)) return NO_ERROR; return ERROR_INVALID_PARAMETER; } + #endif /* PUBLIC FUNCTIONS ***********************************************************/ @@@ -202,6 -204,7 +204,7 @@@ VideoPortInt10 IN PVOID HwDeviceExtension, IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments) { + #if defined(_M_IX86) CONTEXT BiosContext; NTSTATUS Status; PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess(); @@@ -243,4 -246,9 +246,9 @@@ IntDetachFromCSRSS(&CallingProcess, &ApcState); 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"); + return ERROR_INVALID_FUNCTION; + #endif } diff --combined drivers/video/videoprt/interrupt.c index 54a5b9566cb,b15ebdf974c..b15ebdf974c --- a/drivers/video/videoprt/interrupt.c +++ b/drivers/video/videoprt/interrupt.c @@@ -110,6 -110,7 +110,7 @@@ VP_STATU NTAPI VideoPortEnableInterrupt(IN PVOID HwDeviceExtension) { + #ifndef _M_AMD64 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; BOOLEAN InterruptValid; @@@ -133,6 -134,11 +134,11 @@@ /* Return to caller */ return NO_ERROR; + #else + /* FIXME: Function still present? If so what to use instead of HalEnableSystemInterrupt? */ + UNIMPLEMENTED; + return ERROR_INVALID_ACCESS; + #endif } /* @@@ -142,6 -148,7 +148,7 @@@ VP_STATU NTAPI VideoPortDisableInterrupt(IN PVOID HwDeviceExtension) { + #ifndef _M_AMD64 PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; /* Get the device extension */ @@@ -158,4 -165,9 +165,9 @@@ HalDisableSystemInterrupt(DeviceExtension->InterruptVector, 0); return NO_ERROR; + #else + /* FIXME: Function still present? If so what to use instead of HalDisableSystemInterrupt? */ + UNIMPLEMENTED; + return ERROR_INVALID_ACCESS; + #endif } diff --combined drivers/video/videoprt/resource.c index 2ed6417c2ef,b17edb75500..b17edb75500 --- a/drivers/video/videoprt/resource.c +++ b/drivers/video/videoprt/resource.c @@@ -163,7 -163,7 +163,7 @@@ IntVideoPortMapMemory if (Status) *Status = NO_ERROR; - return (PVOID)TranslatedAddress.u.LowPart; + return (PVOID)(ULONG_PTR)TranslatedAddress.u.LowPart; } /* user space */ @@@ -271,7 -271,7 +271,7 @@@ IntVideoPortUnmapMemory Status = ZwUnmapViewOfSection(NtCurrentProcess(), MappedAddress); if (!NT_SUCCESS(Status)) { - WARN_(VIDEOPRT, "Warning: Mapping for address 0x%x not found!\n", (ULONG)MappedAddress); + WARN_(VIDEOPRT, "Warning: Mapping for address 0x%p not found!\n", MappedAddress); } } diff --combined drivers/video/videoprt/services.c index fbf69a8aff2,5b9f3cf5036..5b9f3cf5036 --- a/drivers/video/videoprt/services.c +++ b/drivers/video/videoprt/services.c @@@ -43,6 -43,7 +43,7 @@@ VideoPortQueryServices switch (ServicesType) { + #if defined(_M_IX86) case VideoPortServicesInt10: if (Interface->Version >= VIDEO_PORT_INT10_INTERFACE_VERSION_1 || Interface->Size >= sizeof(VIDEO_PORT_INT10_INTERFACE)) @@@ -60,7 -61,7 +61,7 @@@ return NO_ERROR; } break; - + #endif case VideoPortServicesAGP: if ((Interface->Version == VIDEO_PORT_AGP_INTERFACE_VERSION_2 && Interface->Size >= sizeof(VIDEO_PORT_AGP_INTERFACE_2)) || diff --combined drivers/video/videoprt/videoprt.c index 19a64f7b53c,33c6fedc7f8..33c6fedc7f8 --- a/drivers/video/videoprt/videoprt.c +++ b/drivers/video/videoprt/videoprt.c @@@ -330,7 -330,7 +330,7 @@@ IntVideoPortFindAdapter { WCHAR DeviceVideoBuffer[20]; PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - ULONG Size; + SIZE_T Size; NTSTATUS Status; VIDEO_PORT_CONFIG_INFO ConfigInfo; SYSTEM_BASIC_INFORMATION SystemBasicInfo; diff --combined drivers/wdm/audio/legacy/wdmaud/interface.h index 211045cf0c9,aa5e7b25f28..aa5e7b25f28 --- a/drivers/wdm/audio/legacy/wdmaud/interface.h +++ b/drivers/wdm/audio/legacy/wdmaud/interface.h @@@ -26,7 -26,7 +26,7 @@@ typedef struc { KSSTREAM_HEADER Header; SOUND_DEVICE_TYPE DeviceType; - ULONG DeviceIndex; + ULONG_PTR DeviceIndex; HANDLE hDevice; ULONG DeviceCount; diff --combined hal/hal.rbuild index b846b042bf5,c81a61d1f22..c81a61d1f22 --- a/hal/hal.rbuild +++ b/hal/hal.rbuild @@@ -2,10 -2,16 +2,16 @@@ - - - - + + + + + + + + + + diff --combined hal/halx86/generic/amd64/systimer.S index 00000000000,1cb3b6e02a3..1cb3b6e02a3 mode 000000,100644..100644 --- a/hal/halx86/generic/amd64/systimer.S +++ b/hal/halx86/generic/amd64/systimer.S @@@ -1,0 -1,92 +1,92 @@@ + /* + * FILE: hal/halx86/generic/timer.S + * COPYRIGHT: See COPYING in the top level directory + * PURPOSE: System Timer Interrupt and Management + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + */ + + /* INCLUDES ******************************************************************/ + + #include + #include + + /* GLOBALS *******************************************************************/ + + .data + + .global MsgUnimplemented + MsgUnimplemented: + .asciz "WARNING: %s at %s:%d is UNIMPLEMENTED!\n" + + + /* FUNCTIONS *****************************************************************/ + + .text + .code64 + + PUBLIC HalpCalibrateStallExecution@0 + HalpCalibrateStallExecution@0: + + + PUBLIC HalpProfileInterrupt + HalpProfileInterrupt: + + + PUBLIC KeStallExecutionProcessor + KeStallExecutionProcessor: + + /* Get the number of microseconds required */ + jecxz Done + + /* Multiply by the stall factor */ + mov eax, gs:[KPCR_STALL_SCALE_FACTOR] + mul ecx + + /* Align to 16 bytes */ + .align 16 + + /* Jump to subtraction loop */ + jmp SubtractLoop + + /* Align to 16 bytes */ + .align 16 + + /* Subtract one count */ + SubtractLoop: + sub eax, 1 + jnz SubtractLoop + + Done: + /* Return */ + ret 4 + + + PUBLIC HalpQuery8254Counter + HalpQuery8254Counter: + + /* Save EFLAGS and disable interrupts */ + pushfq + cli + + /* Set timer data */ + mov al, 0 + out 0x43, al + jmp $+2 + + /* Read current timer */ + in al, 0x40 + jmp $+2 + movzx ecx, al + in al, 0x40 + mov ch, al + + /* Return it and restore interrupt state */ + mov eax, ecx + popfq + ret + + PUBLIC HalpClockInterrupt + HalpClockInterrupt: + UNIMPLEMENTED _HalpClockInterrupt + iret + diff --combined hal/halx86/generic/amd64/x86bios.c index 00000000000,3b43bf1d95f..3b43bf1d95f mode 000000,100644..100644 --- a/hal/halx86/generic/amd64/x86bios.c +++ b/hal/halx86/generic/amd64/x86bios.c @@@ -1,0 -1,289 +1,289 @@@ + /* + * PROJECT: ReactOS HAL + * LICENSE: GPL, See COPYING in the top level directory + * FILE: hal/halx86/generic/amd64/x86bios.c + * PURPOSE: + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + + /* INCLUDES ******************************************************************/ + + #include + //#define NDEBUG + #include + + #include "x86emu.h" + + /* This page serves as fallback for pages used by Mm */ + #define DEFAULT_PAGE 0x21 + + /* GLOBALS *******************************************************************/ + + BOOLEAN x86BiosIsInitialized; + LONG x86BiosBufferIsAllocated = 0; + PUCHAR x86BiosMemoryMapping; + + + VOID + NTAPI + DbgDumpPage(PUCHAR MemBuffer, USHORT Segment) + { + ULONG x, y, Offset; + + for (y = 0; y < 0x100; y++) + { + for (x = 0; x < 0x10; x++) + { + Offset = Segment * 16 + y * 16 + x; + DbgPrint("%02x ", MemBuffer[Offset]); + } + DbgPrint("\n"); + } + } + + VOID + NTAPI + HalInitializeBios(ULONG Unknown, PLOADER_PARAMETER_BLOCK LoaderBlock) + { + PPFN_NUMBER PfnArray; + PFN_NUMBER Pfn, Last; + PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; + PLIST_ENTRY ListEntry; + PMDL Mdl; + + /* Allocate an MDL for 1MB */ + Mdl = IoAllocateMdl(NULL, 0x100000, FALSE, FALSE, NULL); + if (!Mdl) + { + ASSERT(FALSE); + } + + /* Get pointer to the pfn array */ + PfnArray = MmGetMdlPfnArray(Mdl); + + /* Fill the array with low memory PFNs */ + for (Pfn = 0; Pfn < 0x100; Pfn++) + { + PfnArray[Pfn] = Pfn; + } + + /* Loop the memory descriptors */ + for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + ListEntry != &LoaderBlock->MemoryDescriptorListHead; + ListEntry = ListEntry->Flink) + { + /* Get the memory descriptor */ + Descriptor = CONTAINING_RECORD(ListEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + + /* Check if the memory is in the low range */ + if (Descriptor->BasePage < 0x100) + { + /* Check if the memory type is firmware */ + if (Descriptor->MemoryType != LoaderFirmwarePermanent && + Descriptor->MemoryType != LoaderSpecialMemory) + { + /* It's something else, so don't use it! */ + Last = min(Descriptor->BasePage + Descriptor->PageCount, 0x100); + for (Pfn = Descriptor->BasePage; Pfn < Last; Pfn++) + { + /* Set each page to the default page */ + PfnArray[Pfn] = DEFAULT_PAGE; + } + } + } + } + + Mdl->MdlFlags = MDL_PAGES_LOCKED; + + /* Map the MDL to system space */ + x86BiosMemoryMapping = MmGetSystemAddressForMdlSafe(Mdl, HighPagePriority); + ASSERT(x86BiosMemoryMapping); + + DPRINT1("memory: %p, %p\n", *(PVOID*)x86BiosMemoryMapping, *(PVOID*)(x86BiosMemoryMapping + 8)); + //DbgDumpPage(x86BiosMemoryMapping, 0xc351); + + x86BiosIsInitialized = TRUE; + + HalpBiosDisplayReset(); + } + + NTSTATUS + NTAPI + x86BiosAllocateBuffer( + ULONG *Size, + USHORT *Segment, + USHORT *Offset) + { + /* Check if the system is initialized and the buffer is large enough */ + if (!x86BiosIsInitialized || *Size > PAGE_SIZE) + { + /* Something was wrong, fail! */ + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Check if the buffer is already allocated */ + if (InterlockedBitTestAndSet(&x86BiosBufferIsAllocated, 0)) + { + /* Buffer was already allocated, fail */ + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* The buffer is sufficient, return hardcoded address and size */ + *Size = PAGE_SIZE; + *Segment = 0x2000; + *Offset = 0; + + return STATUS_SUCCESS;; + } + + NTSTATUS + NTAPI + x86BiosFreeBuffer( + USHORT Segment, + USHORT Offset) + { + /* Check if the system is initialized and if the address matches */ + if (!x86BiosIsInitialized || Segment != 0x2000 || Offset != 0) + { + /* Something was wrong, fail */ + return STATUS_INVALID_PARAMETER; + } + + /* Check if the buffer was allocated */ + if (!InterlockedBitTestAndReset(&x86BiosBufferIsAllocated, 0)) + { + /* It was not, fail */ + return STATUS_INVALID_PARAMETER; + } + + /* Buffer is freed, nothing more to do */ + return STATUS_SUCCESS;; + } + + NTSTATUS + NTAPI + x86BiosReadMemory( + USHORT Segment, + USHORT Offset, + PVOID Buffer, + ULONG Size) + { + ULONG_PTR Address; + + /* Calculate the physical address */ + Address = (Segment << 4) + Offset; + + /* Check if it's valid */ + if (!x86BiosIsInitialized || Address + Size > 0x100000) + { + /* Invalid */ + return STATUS_INVALID_PARAMETER; + } + + /* Copy the memory to the buffer */ + RtlCopyMemory(Buffer, x86BiosMemoryMapping + Address, Size); + + /* Return success */ + return STATUS_SUCCESS; + } + + NTSTATUS + NTAPI + x86BiosWriteMemory( + USHORT Segment, + USHORT Offset, + PVOID Buffer, + ULONG Size) + { + ULONG_PTR Address; + + /* Calculate the physical address */ + Address = (Segment << 4) + Offset; + + /* Check if it's valid */ + if (!x86BiosIsInitialized || Address + Size > 0x100000) + { + /* Invalid */ + return STATUS_INVALID_PARAMETER; + } + + /* Copy the memory from the buffer */ + RtlCopyMemory(x86BiosMemoryMapping + Address, Buffer, Size); + + /* Return success */ + return STATUS_SUCCESS; + } + + BOOLEAN + NTAPI + x86BiosCall( + ULONG InterruptNumber, + X86_BIOS_REGISTERS *Registers) + { + X86_VM_STATE VmState; + struct + { + USHORT Ip; + USHORT SegCs; + } *InterrupTable; + + /* Zero the VmState */ + RtlZeroMemory(&VmState, sizeof(VmState)); + + /* Copy the registers */ + VmState.BiosRegisters = *Registers; + + /* Set the physical memory buffer */ + VmState.MemBuffer = x86BiosMemoryMapping; + + /* Set Eflags */ + VmState.Registers.Eflags.Long = 0; // FIXME + + /* Setup stack */ + VmState.Registers.SegSs = 0; // FIXME + VmState.Registers.Sp = 0x2000 - 2; // FIXME + + /* Initialize IP from the interrupt vector table */ + InterrupTable = (PVOID)x86BiosMemoryMapping; + VmState.Registers.SegCs = InterrupTable[InterruptNumber].SegCs; + VmState.Registers.Eip = InterrupTable[InterruptNumber].Ip; + + /* Make the function return on IRET */ + VmState.Flags.ReturnOnIret = 1; + + /* Call the x86 emulator */ + x86Emulator(&VmState); + + /* Copy registers back to caller */ + *Registers = VmState.BiosRegisters; + + return TRUE; + } + + BOOLEAN + NTAPI + HalpBiosDisplayReset(VOID) + { + X86_BIOS_REGISTERS Registers; + ULONG OldEflags; + + /* Save flags and disable interrupts */ + OldEflags = __readeflags(); + _disable(); + + /* Set AH = 0 (Set video mode), AL = 0x12 (640x480x16 vga) */ + Registers.Eax = 0x12; + + /* Call INT 0x10 */ + x86BiosCall(0x10, &Registers); + + // FIXME: check result + + /* Restore previous flags */ + __writeeflags(OldEflags); + + return TRUE; + } + diff --combined hal/halx86/generic/cmos.c index a25c429c884,225b6e31600..225b6e31600 --- a/hal/halx86/generic/cmos.c +++ b/hal/halx86/generic/cmos.c @@@ -15,44 -15,9 +15,9 @@@ /* GLOBALS *******************************************************************/ - KSPIN_LOCK HalpSystemHardwareLock; UCHAR HalpCmosCenturyOffset; - ULONG HalpSystemHardwareFlags; - /* PRIVATE FUNCTIONS **********************************************************/ - - VOID - NTAPI - HalpAcquireSystemHardwareSpinLock(VOID) - { - ULONG Flags; - - /* Get flags and disable interrupts */ - Flags = __readeflags(); - _disable(); - - /* Acquire the lock */ - KxAcquireSpinLock(&HalpSystemHardwareLock); - - /* We have the lock, save the flags now */ - HalpSystemHardwareFlags = Flags; - } - - VOID - NTAPI - HalpReleaseCmosSpinLock(VOID) - { - ULONG Flags; - - /* Get the flags */ - Flags = HalpSystemHardwareFlags; - - /* Release the lock */ - KxReleaseSpinLock(&HalpSystemHardwareLock); - - /* Restore the flags */ - __writeeflags(Flags); - } + /* PRIVATE FUNCTIONS *********************************************************/ FORCEINLINE UCHAR diff --combined hal/halx86/generic/misc.c index d188d50afb7,4ddd30ee589..4ddd30ee589 --- a/hal/halx86/generic/misc.c +++ b/hal/halx86/generic/misc.c @@@ -245,3 -245,60 +245,60 @@@ KeFlushWriteBuffer(VOID // return; } + + #ifdef _M_IX86 + /* x86 fastcall wrappers */ + + #undef KeRaiseIrql + /* + * @implemented + */ + VOID + NTAPI + KeRaiseIrql(KIRQL NewIrql, + PKIRQL OldIrql) + { + /* Call the fastcall function */ + *OldIrql = KfRaiseIrql(NewIrql); + } + + #undef KeLowerIrql + /* + * @implemented + */ + VOID + NTAPI + KeLowerIrql(KIRQL NewIrql) + { + /* Call the fastcall function */ + KfLowerIrql(NewIrql); + } + + #undef KeAcquireSpinLock + /* + * @implemented + */ + VOID + NTAPI + KeAcquireSpinLock(PKSPIN_LOCK SpinLock, + PKIRQL OldIrql) + { + /* Call the fastcall function */ + *OldIrql = KfAcquireSpinLock(SpinLock); + } + + #undef KeReleaseSpinLock + /* + * @implemented + */ + VOID + NTAPI + KeReleaseSpinLock(PKSPIN_LOCK SpinLock, + KIRQL NewIrql) + { + /* Call the fastcall function */ + KfReleaseSpinLock(SpinLock, NewIrql); + } + + #endif + diff --combined hal/halx86/generic/spinlock.c index 059bbba83a5,1aab8d5a314..1aab8d5a314 --- a/hal/halx86/generic/spinlock.c +++ b/hal/halx86/generic/spinlock.c @@@ -8,29 -8,25 +8,25 @@@ /* INCLUDES ******************************************************************/ - /* Enable this (and the define in irq.S) to make UP HAL work for MP Kernel */ - /* #define CONFIG_SMP */ + /* This file is compiled twice. Once for UP and once for MP */ #include #define NDEBUG #include + #include + #undef KeAcquireSpinLock #undef KeReleaseSpinLock + /* GLOBALS *******************************************************************/ + + ULONG HalpSystemHardwareFlags; + KSPIN_LOCK HalpSystemHardwareLock; + /* FUNCTIONS *****************************************************************/ - /* - * @implemented - */ - VOID - NTAPI - KeAcquireSpinLock(PKSPIN_LOCK SpinLock, - PKIRQL OldIrql) - { - /* Call the fastcall function */ - *OldIrql = KfAcquireSpinLock(SpinLock); - } + #ifdef _M_IX86 /* * @implemented @@@ -49,18 -45,6 +45,6 @@@ KeAcquireSpinLockRaiseToSynch(PKSPIN_LO return OldIrql; } - /* - * @implemented - */ - VOID - NTAPI - KeReleaseSpinLock(PKSPIN_LOCK SpinLock, - KIRQL NewIrql) - { - /* Call the fastcall function */ - KfReleaseSpinLock(SpinLock, NewIrql); - } - /* * @implemented */ @@@ -228,27 -212,38 +212,38 @@@ KeTryToAcquireQueuedSpinLock(IN KSPIN_L return TRUE; } - #undef KeRaiseIrql - /* - * @implemented - */ + #endif + VOID NTAPI - KeRaiseIrql(KIRQL NewIrql, - PKIRQL OldIrql) + HalpAcquireSystemHardwareSpinLock(VOID) { - /* Call the fastcall function */ - *OldIrql = KfRaiseIrql(NewIrql); + ULONG Flags; + + /* Get flags and disable interrupts */ + Flags = __readeflags(); + _disable(); + + /* Acquire the lock */ + KxAcquireSpinLock(&HalpSystemHardwareLock); + + /* We have the lock, save the flags now */ + HalpSystemHardwareFlags = Flags; } - #undef KeLowerIrql - /* - * @implemented - */ VOID NTAPI - KeLowerIrql(KIRQL NewIrql) + HalpReleaseCmosSpinLock(VOID) { - /* Call the fastcall function */ - KfLowerIrql(NewIrql); + ULONG Flags; + + /* Get the flags */ + Flags = HalpSystemHardwareFlags; + + /* Release the lock */ + KxReleaseSpinLock(&HalpSystemHardwareLock); + + /* Restore the flags */ + __writeeflags(Flags); } + diff --combined hal/halx86/hal_generic.rbuild index 99528c96975,154379fa8a9..154379fa8a9 --- a/hal/halx86/hal_generic.rbuild +++ b/hal/halx86/hal_generic.rbuild @@@ -18,24 -18,35 +18,35 @@@ beep.c bios.c cmos.c + display.c dma.c drive.c - display.c halinit.c misc.c - portio.c profil.c reboot.c sysinfo.c - systimer.S timer.c - trap.S usage.c + + + portio.c + systimer.S + trap.S + + + + + x86bios.c + systimer.S + + hal.h + include include @@@ -59,19 -70,23 +70,23 @@@ display.c drive.c misc.c - pic.c - portio.c - processor.c profil.c reboot.c spinlock.c sysinfo.c - systimer.S timer.c usage.c + + + portio.c + systimer.S + + halinit_up.c + pic.c + processor.c diff --combined hal/halx86/hal_generic_mp.rbuild index 5bf819c953e,5063a045c1a..5063a045c1a --- a/hal/halx86/hal_generic_mp.rbuild +++ b/hal/halx86/hal_generic_mp.rbuild @@@ -7,6 -7,9 +7,9 @@@ + + spinlock.c + apic.c halinit_mp.c @@@ -14,7 -17,6 +17,6 @@@ ipi_mp.c mpconfig.c processor_mp.c - spinlock.c halmp.rc diff --combined hal/halx86/hal_generic_up.rbuild index 405da09c949,732a374b86c..732a374b86c --- a/hal/halx86/hal_generic_up.rbuild +++ b/hal/halx86/hal_generic_up.rbuild @@@ -7,9 -7,11 +7,11 @@@ + spinlock.c + + pic.c processor.c - spinlock.c diff --combined hal/halx86/halamd64.rbuild index 8b137891791,4a09aa2c838..4a09aa2c838 --- a/hal/halx86/halamd64.rbuild +++ b/hal/halx86/halamd64.rbuild @@@ -1,1 -1,27 +1,27 @@@ + + + + + + + include + include + + + + + hal_generic + hal_generic_up + ntoskrnl + + + + halinit_mp.c + halmp.rc + + + + + + diff --combined hal/halx86/halmps.rbuild index 05bab4161c1,ad17eac9002..ad17eac9002 --- a/hal/halx86/halmps.rbuild +++ b/hal/halx86/halmps.rbuild @@@ -14,10 -14,13 +14,13 @@@ ntoskrnl libcntpr - mps.S - mpsboot.asm - mpsirql.c - + + + mps.S + mpsboot.asm + mpsirql.c + + diff --combined hal/halx86/include/halp.h index 16c82dfabfc,6fd63fa3e17..6fd63fa3e17 --- a/hal/halx86/include/halp.h +++ b/hal/halx86/include/halp.h @@@ -681,100 -681,7 +681,7 @@@ HalpReleaseCmosSpinLock VOID ); - // - // This is duplicated from ke_x.h - // - #ifdef CONFIG_SMP - // - // Spinlock Acquisition at IRQL >= DISPATCH_LEVEL - // - FORCEINLINE - VOID - KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock) - { - /* Make sure that we don't own the lock already */ - if (((KSPIN_LOCK)KeGetCurrentThread() | 1) == *SpinLock) - { - /* We do, bugcheck! */ - KeBugCheckEx(SPIN_LOCK_ALREADY_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0); - } - - for (;;) - { - /* Try to acquire it */ - if (InterlockedBitTestAndSet((PLONG)SpinLock, 0)) - { - /* Value changed... wait until it's locked */ - while (*(volatile KSPIN_LOCK *)SpinLock == 1) - { - #ifdef DBG - /* On debug builds, we use a much slower but useful routine */ - //Kii386SpinOnSpinLock(SpinLock, 5); - - /* FIXME: Do normal yield for now */ - YieldProcessor(); - #else - /* Otherwise, just yield and keep looping */ - YieldProcessor(); - #endif - } - } - else - { - #ifdef DBG - /* On debug builds, we OR in the KTHREAD */ - *SpinLock = (KSPIN_LOCK)KeGetCurrentThread() | 1; - #endif - /* All is well, break out */ - break; - } - } - } - - // - // Spinlock Release at IRQL >= DISPATCH_LEVEL - // - FORCEINLINE - VOID - KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock) - { - #ifdef DBG - /* Make sure that the threads match */ - if (((KSPIN_LOCK)KeGetCurrentThread() | 1) != *SpinLock) - { - /* They don't, bugcheck */ - KeBugCheckEx(SPIN_LOCK_NOT_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0); - } - #endif - /* Clear the lock */ - InterlockedAnd((PLONG)SpinLock, 0); - } - - #else - - // - // Spinlock Acquire at IRQL >= DISPATCH_LEVEL - // - FORCEINLINE - VOID - KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock) - { - /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */ - UNREFERENCED_PARAMETER(SpinLock); - } - - // - // Spinlock Release at IRQL >= DISPATCH_LEVEL - // - FORCEINLINE - VOID - KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock) - { - /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */ - UNREFERENCED_PARAMETER(SpinLock); - } - #endif VOID FASTCALL diff --combined hal/halx86/mp/amd64/mps.S index 00000000000,35436520ae6..35436520ae6 mode 000000,100644..100644 --- a/hal/halx86/mp/amd64/mps.S +++ b/hal/halx86/mp/amd64/mps.S @@@ -1,0 -1,96 +1,96 @@@ + /* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/hal/amd64/generic/mps.S + * PURPOSE: Intel MultiProcessor specification support + * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net) + */ + + /* INCLUDES ******************************************************************/ + + #include + #include + + /* FUNCTIONS *****************************************************************/ + + #define BEFORE \ + cld; \ + push rax; \ + push rbx; \ + push rcx; \ + push rdx; \ + push rsi; \ + push rdi; \ + push fs; \ + push gs; \ + + #define AFTER \ + pop gs; \ + pop fs; \ + pop rdi; \ + pop rsi; \ + pop rdx; \ + pop rcx; \ + pop rbx; \ + pop rax; \ + + #ifdef CONFIG_SMP + PUBLIC MpsIpiInterrupt + MpsIpiInterrupt: + /* Save registers */ + BEFORE + + /* Call the C handler */ + call MpsIpiHandler + + /* Return to the caller */ + AFTER + iret + #endif + + PUBLIC MpsErrorInterrupt + MpsErrorInterrupt: + /* Save registers */ + BEFORE + + /* Call the C handler */ + call MpsErrorHandler + + /* Return to the caller */ + AFTER + iret + + + PUBLIC MpsSpuriousInterrupt + MpsSpuriousInterrupt: + /* Save registers */ + BEFORE + + /* Call the C handler */ + call MpsSpuriousHandler + + /* Return to the caller */ + AFTER + iret + + PUBLIC MpsTimerInterrupt + MpsTimerInterrupt: + /* Save registers */ + BEFORE + + mov ebx, 0xef + mov eax, 0xceafbeef + push rax + push rsp + push rbx + call MpsTimerHandler + pop rax + pop rax + pop rax + + /* Return to the caller */ + AFTER + iret + + + /* EOF */ diff --combined hal/halx86/mp/i386/mpsirql.c index de87b144d55,643369a552e..643369a552e --- a/hal/halx86/mp/i386/mpsirql.c +++ b/hal/halx86/mp/i386/mpsirql.c @@@ -144,29 -144,6 +144,6 @@@ KfLowerIrql (KIRQL NewIrql } - /********************************************************************** - * NAME EXPORTED - * KeLowerIrql - * - * DESCRIPTION - * Restores the irq level on the current processor - * - * ARGUMENTS - * NewIrql = Irql to lower to - * - * RETURN VALUE - * None - * - * NOTES - */ - #undef KeLowerIrql - VOID NTAPI - KeLowerIrql (KIRQL NewIrql) - { - KfLowerIrql (NewIrql); - } - - /********************************************************************** * NAME EXPORTED * KfRaiseIrql @@@ -215,33 -192,6 +192,6 @@@ KfRaiseIrql (KIRQL NewIrql return OldIrql; } - - /********************************************************************** - * NAME EXPORTED - * KeRaiseIrql - * - * DESCRIPTION - * Raises the hardware priority (irql) - * - * ARGUMENTS - * NewIrql = Irql to raise to - * OldIrql (OUT) = Caller supplied storage for the previous irql - * - * RETURN VALUE - * None - * - * NOTES - * Calls KfRaiseIrql - */ - #undef KeRaiseIrql - VOID NTAPI - KeRaiseIrql (KIRQL NewIrql, - PKIRQL OldIrql) - { - *OldIrql = KfRaiseIrql (NewIrql); - } - - /********************************************************************** * NAME EXPORTED * KeRaiseIrqlToDpcLevel diff --combined include/ddk/acpiioct.h index a51cc3dd4b4,d4d550feae1..d4d550feae1 --- a/include/ddk/acpiioct.h +++ b/include/ddk/acpiioct.h @@@ -159,7 -159,7 +159,7 @@@ typedef ACPI_ENUM_CHILDREN_OUTPUT_BUFFE #define ACPI_METHOD_SET_ARGUMENT_STRING( Argument, StrData ) \ { Argument->Type = ACPI_METHOD_ARGUMENT_STRING; \ - Argument->DataLength = strlen((PUCHAR)StrData) + sizeof(UCHAR); \ + Argument->DataLength = strlen((PCHAR)StrData) + sizeof(UCHAR); \ RtlCopyMemory(&Argument->Data[0],(PUCHAR)StrData,Argument->DataLength); } #define ACPI_METHOD_SET_ARGUMENT_BUFFER( Argument, BuffData, BuffLength ) \ diff --combined include/ddk/wdm.h index 319e62dd35f,7e97ea08c1d..7e97ea08c1d --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@@ -1915,6 -1915,12 +1915,12 @@@ NTSTATU typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK; + #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 /****************************************************************************** * Configuration Manager Types * @@@ -3152,6 -3158,12 +3158,12 @@@ typedef VOI (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 @@@ -3479,6 -3491,91 +3491,91 @@@ typedef struc 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; diff --combined include/dxsdk/dxsdk.rbuild index 8183bd34b30,1d91680f471..1d91680f471 --- a/include/dxsdk/dxsdk.rbuild +++ b/include/dxsdk/dxsdk.rbuild @@@ -3,6 -3,7 +3,7 @@@ amstream.idl austream.idl + bdatif.idl ddstream.idl dmodshow.idl mixerocx.idl diff --combined include/ndk/pstypes.h index 45e27f2d741,d423b7a2df2..d423b7a2df2 --- a/include/ndk/pstypes.h +++ b/include/ndk/pstypes.h @@@ -26,6 -26,7 +26,7 @@@ Author #include #include #include + #include #ifndef NTOS_MODE_USER #include #include @@@ -616,133 -617,6 +617,6 @@@ typedef struct _INITIAL_PE HANDLE Mutant; } INITIAL_PEB, *PINITIAL_PEB; - // - // Process Environment Block (PEB) - // - typedef struct _PEB - { - BOOLEAN InheritedAddressSpace; - BOOLEAN ReadImageFileExecOptions; - BOOLEAN BeingDebugged; - #if (NTDDI_VERSION >= NTDDI_WS03) - struct - { - BOOLEAN ImageUsesLargePages:1; - #if (NTDDI_VERSION >= NTDDI_LONGHORN) - BOOLEAN IsProtectedProcess:1; - BOOLEAN IsLegacyProcess:1; - BOOLEAN SpareBits:5; - #else - BOOLEAN SpareBits:7; - #endif - }; - #else - BOOLEAN SpareBool; - #endif - HANDLE Mutant; - PVOID ImageBaseAddress; - PPEB_LDR_DATA Ldr; - struct _RTL_USER_PROCESS_PARAMETERS *ProcessParameters; - PVOID SubSystemData; - PVOID ProcessHeap; - #if (NTDDI_VERSION >= NTDDI_LONGHORN) - struct _RTL_CRITICAL_SECTION *FastPebLock; - PVOID AltThunkSListPtr; - PVOID IFEOKey; - ULONG Spare; - union - { - PVOID* KernelCallbackTable; - PVOID UserSharedInfoPtr; - }; - ULONG SystemReserved[1]; - ULONG SpareUlong; - #else - PVOID FastPebLock; - PPEBLOCKROUTINE FastPebLockRoutine; - PPEBLOCKROUTINE FastPebUnlockRoutine; - ULONG EnvironmentUpdateCount; - PVOID* KernelCallbackTable; - PVOID EventLogSection; - PVOID EventLog; - #endif - PPEB_FREE_BLOCK FreeList; - ULONG TlsExpansionCounter; - PVOID TlsBitmap; - ULONG TlsBitmapBits[0x2]; - PVOID ReadOnlySharedMemoryBase; - PVOID ReadOnlySharedMemoryHeap; - PVOID* ReadOnlyStaticServerData; - PVOID AnsiCodePageData; - PVOID OemCodePageData; - PVOID UnicodeCaseTableData; - ULONG NumberOfProcessors; - ULONG NtGlobalFlag; - LARGE_INTEGER CriticalSectionTimeout; - ULONG HeapSegmentReserve; - ULONG HeapSegmentCommit; - ULONG HeapDeCommitTotalFreeThreshold; - ULONG HeapDeCommitFreeBlockThreshold; - ULONG NumberOfHeaps; - ULONG MaximumNumberOfHeaps; - PVOID* ProcessHeaps; - PVOID GdiSharedHandleTable; - PVOID ProcessStarterHelper; - ULONG GdiDCAttributeList; - #if (NTDDI_VERSION >= NTDDI_LONGHORN) - struct _RTL_CRITICAL_SECTION *LoaderLock; - #else - PVOID LoaderLock; - #endif - ULONG OSMajorVersion; - ULONG OSMinorVersion; - USHORT OSBuildNumber; - USHORT OSCSDVersion; - ULONG OSPlatformId; - ULONG ImageSubSystem; - ULONG ImageSubSystemMajorVersion; - ULONG ImageSubSystemMinorVersion; - ULONG ImageProcessAffinityMask; - ULONG GdiHandleBuffer[0x22]; - PPOST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; - struct _RTL_BITMAP *TlsExpansionBitmap; - ULONG TlsExpansionBitmapBits[0x20]; - ULONG SessionId; - #if (NTDDI_VERSION >= NTDDI_WINXP) - ULARGE_INTEGER AppCompatFlags; - ULARGE_INTEGER AppCompatFlagsUser; - PVOID pShimData; - PVOID AppCompatInfo; - UNICODE_STRING CSDVersion; - struct _ACTIVATION_CONTEXT_DATA *ActivationContextData; - struct _ASSEMBLY_STORAGE_MAP *ProcessAssemblyStorageMap; - struct _ACTIVATION_CONTEXT_DATA *SystemDefaultActivationContextData; - struct _ASSEMBLY_STORAGE_MAP *SystemAssemblyStorageMap; - ULONG MinimumStackCommit; - #endif - #if (NTDDI_VERSION >= NTDDI_WS03) - PVOID *FlsCallback; - LIST_ENTRY FlsListHead; - struct _RTL_BITMAP *FlsBitmap; - ULONG FlsBitmapBits[4]; - ULONG FlsHighIndex; - #endif - #if (NTDDI_VERSION >= NTDDI_LONGHORN) - PVOID WerRegistrationData; - PVOID WerShipAssertPtr; - #endif - } PEB, *PPEB; - - // - // GDI Batch Descriptor - // - typedef struct _GDI_TEB_BATCH - { - ULONG Offset; - HANDLE HDC; - ULONG Buffer[0x136]; - } GDI_TEB_BATCH, *PGDI_TEB_BATCH; - // // Initial TEB // @@@ -771,146 -645,50 +645,50 @@@ typedef struct _TEB_ACTIVE_FRAM PTEB_ACTIVE_FRAME_CONTEXT Context; } TEB_ACTIVE_FRAME, *PTEB_ACTIVE_FRAME; + typedef struct _CLIENT_ID32 + { + ULONG UniqueProcess; + ULONG UniqueThread; + } CLIENT_ID32, *PCLIENT_ID32; + + typedef struct _CLIENT_ID64 + { + ULONG64 UniqueProcess; + ULONG64 UniqueThread; + } CLIENT_ID64, *PCLIENT_ID64; + + #if (NTDDI_VERSION < NTDDI_WS03) + typedef struct _Wx86ThreadState + { + PULONG CallBx86Eip; + PVOID DeallocationCpu; + BOOLEAN UseKnownWx86Dll; + CHAR OleStubInvoked; + } Wx86ThreadState, *PWx86ThreadState; + #endif + + // + // Process Environment Block (PEB) // Thread Environment Block (TEB) // - typedef struct _TEB - { - NT_TIB Tib; - PVOID EnvironmentPointer; - CLIENT_ID ClientId; - PVOID ActiveRpcHandle; - PVOID ThreadLocalStoragePointer; - struct _PEB *ProcessEnvironmentBlock; - ULONG LastErrorValue; - ULONG CountOfOwnedCriticalSections; - PVOID CsrClientThread; - struct _W32THREAD* Win32ThreadInfo; - ULONG User32Reserved[0x1A]; - ULONG UserReserved[5]; - PVOID WOW32Reserved; - LCID CurrentLocale; - ULONG FpSoftwareStatusRegister; - PVOID SystemReserved1[0x36]; - LONG ExceptionCode; - struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; - #ifdef _WIN64 - UCHAR SpareBytes1[24]; - #else - UCHAR SpareBytes1[0x24]; - #endif - ULONG TxFsContext; - GDI_TEB_BATCH GdiTebBatch; - CLIENT_ID RealClientId; - PVOID GdiCachedProcessHandle; - ULONG GdiClientPID; - ULONG GdiClientTID; - PVOID GdiThreadLocalInfo; - SIZE_T Win32ClientInfo[62]; - PVOID glDispatchTable[0xE9]; - SIZE_T glReserved1[0x1D]; - PVOID glReserved2; - PVOID glSectionInfo; - PVOID glSection; - PVOID glTable; - PVOID glCurrentRC; - PVOID glContext; - NTSTATUS LastStatusValue; - UNICODE_STRING StaticUnicodeString; - WCHAR StaticUnicodeBuffer[0x105]; - PVOID DeallocationStack; - PVOID TlsSlots[0x40]; - LIST_ENTRY TlsLinks; - PVOID Vdm; - PVOID ReservedForNtRpc; - PVOID DbgSsReserved[0x2]; - ULONG HardErrorDisabled; + #include "peb_teb.h" + #ifdef _WIN64 - PVOID Instrumentation[11]; - #else - PVOID Instrumentation[9]; - #endif - GUID ActivityId; - PVOID SubProcessTag; - PVOID EtwTraceData; - #if (NTDDI_VERSION >= NTDDI_LONGHORN) - PVOID EtwLocalData; - #endif - PVOID WinSockData; - ULONG GdiBatchCount; - #if (NTDDI_VERSION >= NTDDI_LONGHORN) - BOOLEAN SpareBool0; - BOOLEAN SpareBool1; - BOOLEAN SpareBool2; - #else - BOOLEAN InDbgPrint; - BOOLEAN FreeStackOnTermination; - BOOLEAN HasFiberData; - #endif - UCHAR IdealProcessor; - ULONG GuaranteedStackBytes; - PVOID ReservedForPerf; - PVOID ReservedForOle; - ULONG WaitingOnLoaderLock; - #if (NTDDI_VERSION >= NTDDI_LONGHORN) - PVOID SavedPriorityState; - #else - ULONG SparePointer1; - #endif - ULONG SoftPatchPtr1; - ULONG SoftPatchPtr2; - PVOID *TlsExpansionSlots; - ULONG ImpersonationLocale; - ULONG IsImpersonating; - PVOID NlsCache; - PVOID pShimData; - ULONG HeapVirualAffinity; - PVOID CurrentTransactionHandle; - PTEB_ACTIVE_FRAME ActiveFrame; - #if (NTDDI_VERSION >= NTDDI_WS03) - PVOID FlsData; - #endif - #if (NTDDI_VERSION >= NTDDI_LONGHORN) - PVOID PreferredLangauges; - PVOID UserPrefLanguages; - PVOID MergedPrefLanguages; - ULONG MuiImpersonation; - union - { - struct - { - USHORT SpareCrossTebFlags:16; - }; - USHORT CrossTebFlags; - }; - union - { - struct - { - USHORT DbgSafeThunkCall:1; - USHORT DbgInDebugPrint:1; - USHORT DbgHasFiberData:1; - USHORT DbgSkipThreadAttach:1; - USHORT DbgWerInShipAssertCode:1; - USHORT DbgIssuedInitialBp:1; - USHORT DbgClonedThread:1; - USHORT SpareSameTebBits:9; - }; - USHORT SameTebFlags; - }; - PVOID TxnScopeEntercallback; - PVOID TxnScopeExitCAllback; - PVOID TxnScopeContext; - ULONG LockCount; - ULONG ProcessRundown; - ULONGLONG LastSwitchTime; - ULONGLONG TotalSwitchOutTime; - LARGE_INTEGER WaitReasonBitMap; - #else - UCHAR SafeThunkCall; - UCHAR BooleanSpare[3]; + // + // Explicit 32 bit PEB/TEB + // + #define EXPLICIT_32BIT + #include "peb_teb.h" + #undef EXPLICIT_32BIT + + // + // Explicit 64 bit PEB/TEB + // + #define EXPLICIT_64BIT + #include "peb_teb.h" + #undef EXPLICIT_64BIT #endif - } TEB, *PTEB; #ifdef NTOS_MODE_USER diff --combined include/ndk/rtlfuncs.h index debd1ee3154,210dd2fffc5..210dd2fffc5 --- a/include/ndk/rtlfuncs.h +++ b/include/ndk/rtlfuncs.h @@@ -25,6 -25,7 +25,7 @@@ Author #include #include #include + #include #include #include "in6addr.h" #include "inaddr.h" diff --combined include/ndk/rtltypes.h index 70aa3ed5bdc,aa6d8607fb6..aa6d8607fb6 --- a/include/ndk/rtltypes.h +++ b/include/ndk/rtltypes.h @@@ -23,7 -23,8 +23,8 @@@ Author // Dependencies // #include - #include + #include + #include // // Maximum Atom Length @@@ -760,6 -761,7 +761,7 @@@ typedef struct _RTL_CALLER_ALLOCATED_AC } RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED, *PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED; + #if (NTDDI_VERSION >= NTDDI_WS03) typedef struct _ACTIVATION_CONTEXT_STACK { PRTL_ACTIVATION_CONTEXT_STACK_FRAME ActiveFrame; @@@ -769,6 -771,15 +771,15 @@@ ULONG StackId; } ACTIVATION_CONTEXT_STACK, *PACTIVATION_CONTEXT_STACK; + #else + typedef struct _ACTIVATION_CONTEXT_STACK + { + ULONG Flags; + ULONG NextCookieSequenceNumber; + PVOID ActiveFrame; + LIST_ENTRY FrameListCache; + } ACTIVATION_CONTEXT_STACK, *PACTIVATION_CONTEXT_STACK; + #endif #endif diff --combined include/ndk/umtypes.h index 7e02d7664b8,95c1c8f2f53..95c1c8f2f53 --- a/include/ndk/umtypes.h +++ b/include/ndk/umtypes.h @@@ -151,6 -151,8 +151,8 @@@ typedef struct _CSTRIN CONST CHAR *Buffer; } CSTRING, *PCSTRING; + #endif + typedef struct _STRING32 { USHORT Length; USHORT MaximumLength; @@@ -167,7 -169,6 +169,6 @@@ typedef struct _STRING64 UNICODE_STRING64, *PUNICODE_STRING64, ANSI_STRING64, *PANSI_STRING64; - #endif typedef struct _OBJECT_ATTRIBUTES { diff --combined include/psdk/ntstatus.h index 933de41b892,688f996d3ff..688f996d3ff --- a/include/psdk/ntstatus.h +++ b/include/psdk/ntstatus.h @@@ -1,31 -1,1104 +1,1104 @@@ /* - * Win32 definitions for Windows NT + * ntstatus.h * - * Copyright 1996 Alexandre Julliard + * Windows NT status codes * - * 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 file is part of the w32api package. * - * 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. + * Contributors: + * Created by Casper S. Hornstrup + * + * 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. * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _NTSTATUS_ #define _NTSTATUS_ - #ifndef WIN32_NO_STATUS + #ifdef __cplusplus + extern "C" { + #endif + + #if !defined(STATUS_SUCCESS) + #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) + #endif /* !STATUS_SUCCESS */ + #define FACILITY_DEBUGGER 0x1 + #define FACILITY_RPC_RUNTIME 0x2 + #define FACILITY_RPC_STUBS 0x3 + #define FACILITY_IO_ERROR_CODE 0x4 + #define FACILITY_TERMINAL_SERVER 0xA + #define FACILITY_USB_ERROR_CODE 0x10 + #define FACILITY_HID_ERROR_CODE 0x11 + #define FACILITY_FIREWIRE_ERROR_CODE 0x12 + #define FACILITY_CLUSTER_ERROR_CODE 0x13 + #define FACILITY_ACPI_ERROR_CODE 0x14 + #define FACILITY_SXS_ERROR_CODE 0x15 + #define STATUS_SEVERITY_SUCCESS 0x0 + #define STATUS_SEVERITY_INFORMATIONAL 0x1 + #define STATUS_SEVERITY_WARNING 0x2 + #define STATUS_SEVERITY_ERROR 0x3 + #define STATUS_WAIT_0 ((NTSTATUS)0x00000000L) + #define STATUS_WAIT_1 ((NTSTATUS)0x00000001L) + #define STATUS_WAIT_2 ((NTSTATUS)0x00000002L) + #define STATUS_WAIT_3 ((NTSTATUS)0x00000003L) + #define STATUS_WAIT_63 ((NTSTATUS)0x0000003FL) + #define STATUS_ABANDONED ((NTSTATUS)0x00000080L) + #define STATUS_ABANDONED_WAIT_0 ((NTSTATUS)0x00000080L) + #define STATUS_ABANDONED_WAIT_63 ((NTSTATUS)0x000000BFL) + #define STATUS_USER_APC ((NTSTATUS)0x000000C0L) + #define STATUS_KERNEL_APC ((NTSTATUS)0x00000100L) + #define STATUS_ALERTED ((NTSTATUS)0x00000101L) + #define STATUS_TIMEOUT ((NTSTATUS)0x00000102L) + #define STATUS_PENDING ((NTSTATUS)0x00000103L) + #define STATUS_REPARSE ((NTSTATUS)0x00000104L) + #define STATUS_MORE_ENTRIES ((NTSTATUS)0x00000105L) + #define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS)0x00000106L) + #define STATUS_SOME_NOT_MAPPED ((NTSTATUS)0x00000107L) + #define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS)0x00000108L) + #define STATUS_VOLUME_MOUNTED ((NTSTATUS)0x00000109L) + #define STATUS_RXACT_COMMITTED ((NTSTATUS)0x0000010AL) + #define STATUS_NOTIFY_CLEANUP ((NTSTATUS)0x0000010BL) + #define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS)0x0000010CL) + #define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS)0x0000010DL) + #define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS)0x0000010EL) + #define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS)0x00000110L) + #define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS)0x00000111L) + #define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS)0x00000112L) + #define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS)0x00000113L) + #define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS)0x00000114L) + #define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS)0x00000115L) + #define STATUS_CRASH_DUMP ((NTSTATUS)0x00000116L) + #define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS)0x00000117L) + #define STATUS_REPARSE_OBJECT ((NTSTATUS)0x00000118L) + #define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS)0x00000119L) + #define STATUS_TRANSLATION_COMPLETE ((NTSTATUS)0x00000120L) + #define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS)0x00000121L) + #define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS)0x00000122L) + #define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS)0x00000123L) + #define STATUS_PROCESS_IN_JOB ((NTSTATUS)0x00000124L) + #define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS)0x40000000L) + #define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS)0x40000001L) + #define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS)0x40000002L) + #define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS)0x40000003L) + #define STATUS_RXACT_STATE_CREATED ((NTSTATUS)0x40000004L) + #define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS)0x40000005L) + #define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS)0x40000006L) + #define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS)0x40000007L) + #define STATUS_SERIAL_MORE_WRITES ((NTSTATUS)0x40000008L) + #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009L) + #define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS)0x4000000AL) + #define STATUS_FT_WRITE_RECOVERY ((NTSTATUS)0x4000000BL) + #define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS)0x4000000CL) + #define STATUS_NULL_LM_PASSWORD ((NTSTATUS)0x4000000DL) + #define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS)0x4000000EL) + #define STATUS_RECEIVE_PARTIAL ((NTSTATUS)0x4000000FL) + #define STATUS_RECEIVE_EXPEDITED ((NTSTATUS)0x40000010L) + #define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS)0x40000011L) + #define STATUS_EVENT_DONE ((NTSTATUS)0x40000012L) + #define STATUS_EVENT_PENDING ((NTSTATUS)0x40000013L) + #define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS)0x40000014L) + #define STATUS_FATAL_APP_EXIT ((NTSTATUS)0x40000015L) + #define STATUS_PREDEFINED_HANDLE ((NTSTATUS)0x40000016L) + #define STATUS_WAS_UNLOCKED ((NTSTATUS)0x40000017L) + #define STATUS_SERVICE_NOTIFICATION ((NTSTATUS)0x40000018L) + #define STATUS_WAS_LOCKED ((NTSTATUS)0x40000019L) + #define STATUS_LOG_HARD_ERROR ((NTSTATUS)0x4000001AL) + #define STATUS_ALREADY_WIN32 ((NTSTATUS)0x4000001BL) + #define STATUS_WX86_UNSIMULATE ((NTSTATUS)0x4000001CL) + #define STATUS_WX86_CONTINUE ((NTSTATUS)0x4000001DL) + #define STATUS_WX86_SINGLE_STEP ((NTSTATUS)0x4000001EL) + #define STATUS_WX86_BREAKPOINT ((NTSTATUS)0x4000001FL) + #define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS)0x40000020L) + #define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS)0x40000021L) + #define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS)0x40000022L) + #define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS)0x40000023L) + #define STATUS_NO_YIELD_PERFORMED ((NTSTATUS)0x40000024L) + #define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS)0x40000025L) + #define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS)0x40000026L) + #define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS)0x40000027L) + #define STATUS_WX86_CREATEWX86TIB ((NTSTATUS)0x40000028L) + #define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS)0x40000029L) + #define STATUS_HIBERNATED ((NTSTATUS)0x4000002AL) + #define STATUS_RESUME_HIBERNATION ((NTSTATUS)0x4000002BL) + #define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS)0x80000001L) + #define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS)0x80000002L) + #define STATUS_BREAKPOINT ((NTSTATUS)0x80000003L) + #define STATUS_SINGLE_STEP ((NTSTATUS)0x80000004L) + #define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005L) + #define STATUS_NO_MORE_FILES ((NTSTATUS)0x80000006L) + #define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS)0x80000007L) + #define STATUS_HANDLES_CLOSED ((NTSTATUS)0x8000000AL) + #define STATUS_NO_INHERITANCE ((NTSTATUS)0x8000000BL) + #define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS)0x8000000CL) + #define STATUS_PARTIAL_COPY ((NTSTATUS)0x8000000DL) + #define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS)0x8000000EL) + #define STATUS_DEVICE_POWERED_OFF ((NTSTATUS)0x8000000FL) + #define STATUS_DEVICE_OFF_LINE ((NTSTATUS)0x80000010L) + #define STATUS_DEVICE_BUSY ((NTSTATUS)0x80000011L) + #define STATUS_NO_MORE_EAS ((NTSTATUS)0x80000012L) + #define STATUS_INVALID_EA_NAME ((NTSTATUS)0x80000013L) + #define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS)0x80000014L) + #define STATUS_INVALID_EA_FLAG ((NTSTATUS)0x80000015L) + #define STATUS_VERIFY_REQUIRED ((NTSTATUS)0x80000016L) + #define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS)0x80000017L) + #define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS)0x80000018L) + #define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001AL) + #define STATUS_FILEMARK_DETECTED ((NTSTATUS)0x8000001BL) + #define STATUS_MEDIA_CHANGED ((NTSTATUS)0x8000001CL) + #define STATUS_BUS_RESET ((NTSTATUS)0x8000001DL) + #define STATUS_END_OF_MEDIA ((NTSTATUS)0x8000001EL) + #define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS)0x8000001FL) + #define STATUS_MEDIA_CHECK ((NTSTATUS)0x80000020L) + #define STATUS_SETMARK_DETECTED ((NTSTATUS)0x80000021L) + #define STATUS_NO_DATA_DETECTED ((NTSTATUS)0x80000022L) + #define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS)0x80000023L) + #define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS)0x80000024L) + #define STATUS_ALREADY_DISCONNECTED ((NTSTATUS)0x80000025L) + #define STATUS_LONGJUMP ((NTSTATUS)0x80000026L) + #define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS)0x80000027L) + #define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS)0x80000028L) + #define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS)0x80000029L) + #define STATUS_CLUSTER_NODE_ALREADY_UP ((NTSTATUS)0x80130001L) + #define STATUS_CLUSTER_NODE_ALREADY_DOWN ((NTSTATUS)0x80130002L) + #define STATUS_CLUSTER_NETWORK_ALREADY_ONLINE ((NTSTATUS)0x80130003L) + #define STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE ((NTSTATUS)0x80130004L) + #define STATUS_CLUSTER_NODE_ALREADY_MEMBER ((NTSTATUS)0x80130005L) + #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) + #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002L) + #define STATUS_INVALID_INFO_CLASS ((NTSTATUS)0xC0000003L) + #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) + #define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L) + #define STATUS_IN_PAGE_ERROR ((NTSTATUS)0xC0000006L) + #define STATUS_PAGEFILE_QUOTA ((NTSTATUS)0xC0000007L) + #define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008L) + #define STATUS_BAD_INITIAL_STACK ((NTSTATUS)0xC0000009L) + #define STATUS_BAD_INITIAL_PC ((NTSTATUS)0xC000000AL) + #define STATUS_INVALID_CID ((NTSTATUS)0xC000000BL) + #define STATUS_TIMER_NOT_CANCELED ((NTSTATUS)0xC000000CL) + #define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000DL) + #define STATUS_NO_SUCH_DEVICE ((NTSTATUS)0xC000000EL) + #define STATUS_NO_SUCH_FILE ((NTSTATUS)0xC000000FL) + #define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS)0xC0000010L) + #define STATUS_END_OF_FILE ((NTSTATUS)0xC0000011L) + #define STATUS_WRONG_VOLUME ((NTSTATUS)0xC0000012L) + #define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS)0xC0000013L) + #define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS)0xC0000014L) + #define STATUS_NONEXISTENT_SECTOR ((NTSTATUS)0xC0000015L) + #define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS)0xC0000016L) + #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017L) + #define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS)0xC0000018L) + #define STATUS_NOT_MAPPED_VIEW ((NTSTATUS)0xC0000019L) + #define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS)0xC000001AL) + #define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS)0xC000001BL) + #define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS)0xC000001CL) + #define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001DL) + #define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS)0xC000001EL) + #define STATUS_INVALID_VIEW_SIZE ((NTSTATUS)0xC000001FL) + #define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS)0xC0000020L) + #define STATUS_ALREADY_COMMITTED ((NTSTATUS)0xC0000021L) + #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) + #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L) + #define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS)0xC0000024L) + #define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS)0xC0000025L) + #define STATUS_INVALID_DISPOSITION ((NTSTATUS)0xC0000026L) + #define STATUS_UNWIND ((NTSTATUS)0xC0000027L) + #define STATUS_BAD_STACK ((NTSTATUS)0xC0000028L) + #define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS)0xC0000029L) + #define STATUS_NOT_LOCKED ((NTSTATUS)0xC000002AL) + #define STATUS_PARITY_ERROR ((NTSTATUS)0xC000002BL) + #define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS)0xC000002CL) + #define STATUS_NOT_COMMITTED ((NTSTATUS)0xC000002DL) + #define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS)0xC000002EL) + #define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS)0xC000002FL) + #define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS)0xC0000030L) + #define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS)0xC0000031L) + #define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS)0xC0000032L) + #define STATUS_OBJECT_NAME_INVALID ((NTSTATUS)0xC0000033L) + #define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L) + #define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS)0xC0000035L) + #define STATUS_PORT_DISCONNECTED ((NTSTATUS)0xC0000037L) + #define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS)0xC0000038L) + #define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039L) + #define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS)0xC000003AL) + #define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS)0xC000003BL) + #define STATUS_DATA_OVERRUN ((NTSTATUS)0xC000003CL) + #define STATUS_DATA_LATE_ERROR ((NTSTATUS)0xC000003DL) + #define STATUS_DATA_ERROR ((NTSTATUS)0xC000003EL) + #define STATUS_CRC_ERROR ((NTSTATUS)0xC000003FL) + #define STATUS_SECTION_TOO_BIG ((NTSTATUS)0xC0000040L) + #define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS)0xC0000041L) + #define STATUS_INVALID_PORT_HANDLE ((NTSTATUS)0xC0000042L) + #define STATUS_SHARING_VIOLATION ((NTSTATUS)0xC0000043L) + #define STATUS_QUOTA_EXCEEDED ((NTSTATUS)0xC0000044L) + #define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS)0xC0000045L) + #define STATUS_MUTANT_NOT_OWNED ((NTSTATUS)0xC0000046L) + #define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS)0xC0000047L) + #define STATUS_PORT_ALREADY_SET ((NTSTATUS)0xC0000048L) + #define STATUS_SECTION_NOT_IMAGE ((NTSTATUS)0xC0000049L) + #define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS)0xC000004AL) + #define STATUS_THREAD_IS_TERMINATING ((NTSTATUS)0xC000004BL) + #define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS)0xC000004CL) + #define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS)0xC000004DL) + #define STATUS_SECTION_PROTECTION ((NTSTATUS)0xC000004EL) + #define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS)0xC000004FL) + #define STATUS_EA_TOO_LARGE ((NTSTATUS)0xC0000050L) + #define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS)0xC0000051L) + #define STATUS_NO_EAS_ON_FILE ((NTSTATUS)0xC0000052L) + #define STATUS_EA_CORRUPT_ERROR ((NTSTATUS)0xC0000053L) + #define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS)0xC0000054L) + #define STATUS_LOCK_NOT_GRANTED ((NTSTATUS)0xC0000055L) + #define STATUS_DELETE_PENDING ((NTSTATUS)0xC0000056L) + #define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS)0xC0000057L) + #define STATUS_UNKNOWN_REVISION ((NTSTATUS)0xC0000058L) + #define STATUS_REVISION_MISMATCH ((NTSTATUS)0xC0000059L) + #define STATUS_INVALID_OWNER ((NTSTATUS)0xC000005AL) + #define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS)0xC000005BL) + #define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS)0xC000005CL) + #define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS)0xC000005DL) + #define STATUS_NO_LOGON_SERVERS ((NTSTATUS)0xC000005EL) + #define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS)0xC000005FL) + #define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS)0xC0000060L) + #define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS)0xC0000061L) + #define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS)0xC0000062L) + #define STATUS_USER_EXISTS ((NTSTATUS)0xC0000063L) + #define STATUS_NO_SUCH_USER ((NTSTATUS)0xC0000064L) + #define STATUS_GROUP_EXISTS ((NTSTATUS)0xC0000065L) + #define STATUS_NO_SUCH_GROUP ((NTSTATUS)0xC0000066L) + #define STATUS_MEMBER_IN_GROUP ((NTSTATUS)0xC0000067L) + #define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS)0xC0000068L) + #define STATUS_LAST_ADMIN ((NTSTATUS)0xC0000069L) + #define STATUS_WRONG_PASSWORD ((NTSTATUS)0xC000006AL) + #define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS)0xC000006BL) + #define STATUS_PASSWORD_RESTRICTION ((NTSTATUS)0xC000006CL) + #define STATUS_LOGON_FAILURE ((NTSTATUS)0xC000006DL) + #define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS)0xC000006EL) + #define STATUS_INVALID_LOGON_HOURS ((NTSTATUS)0xC000006FL) + #define STATUS_INVALID_WORKSTATION ((NTSTATUS)0xC0000070L) + #define STATUS_PASSWORD_EXPIRED ((NTSTATUS)0xC0000071L) + #define STATUS_ACCOUNT_DISABLED ((NTSTATUS)0xC0000072L) + #define STATUS_NONE_MAPPED ((NTSTATUS)0xC0000073L) + #define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS)0xC0000074L) + #define STATUS_LUIDS_EXHAUSTED ((NTSTATUS)0xC0000075L) + #define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS)0xC0000076L) + #define STATUS_INVALID_ACL ((NTSTATUS)0xC0000077L) + #define STATUS_INVALID_SID ((NTSTATUS)0xC0000078L) + #define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS)0xC0000079L) + #define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS)0xC000007AL) + #define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS)0xC000007BL) + #define STATUS_NO_TOKEN ((NTSTATUS)0xC000007CL) + #define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS)0xC000007DL) + #define STATUS_RANGE_NOT_LOCKED ((NTSTATUS)0xC000007EL) + #define STATUS_DISK_FULL ((NTSTATUS)0xC000007FL) + #define STATUS_SERVER_DISABLED ((NTSTATUS)0xC0000080L) + #define STATUS_SERVER_NOT_DISABLED ((NTSTATUS)0xC0000081L) + #define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS)0xC0000082L) + #define STATUS_GUIDS_EXHAUSTED ((NTSTATUS)0xC0000083L) + #define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS)0xC0000084L) + #define STATUS_AGENTS_EXHAUSTED ((NTSTATUS)0xC0000085L) + #define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS)0xC0000086L) + #define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS)0xC0000087L) + #define STATUS_NOT_MAPPED_DATA ((NTSTATUS)0xC0000088L) + #define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS)0xC0000089L) + #define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS)0xC000008AL) + #define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS)0xC000008BL) + #define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS)0xC000008CL) + #define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS)0xC000008DL) + #define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS)0xC000008EL) + #define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS)0xC000008FL) + #define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS)0xC0000090L) + #define STATUS_FLOAT_OVERFLOW ((NTSTATUS)0xC0000091L) + #define STATUS_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000092L) + #define STATUS_FLOAT_UNDERFLOW ((NTSTATUS)0xC0000093L) + #define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS)0xC0000094L) + #define STATUS_INTEGER_OVERFLOW ((NTSTATUS)0xC0000095L) + #define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS)0xC0000096L) + #define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS)0xC0000097L) + #define STATUS_FILE_INVALID ((NTSTATUS)0xC0000098L) + #define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS)0xC0000099L) + #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009AL) + #define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS)0xC000009BL) + #define STATUS_DEVICE_DATA_ERROR ((NTSTATUS)0xC000009CL) + #define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS)0xC000009DL) + #define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS)0xC000009EL) + #define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS)0xC000009FL) + #define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS)0xC00000A0L) + #define STATUS_WORKING_SET_QUOTA ((NTSTATUS)0xC00000A1L) + #define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS)0xC00000A2L) + #define STATUS_DEVICE_NOT_READY ((NTSTATUS)0xC00000A3L) + #define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS)0xC00000A4L) + #define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS)0xC00000A5L) + #define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS)0xC00000A6L) + #define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS)0xC00000A7L) + #define STATUS_BAD_TOKEN_TYPE ((NTSTATUS)0xC00000A8L) + #define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS)0xC00000A9L) + #define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS)0xC00000AAL) + #define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS)0xC00000ABL) + #define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS)0xC00000ACL) + #define STATUS_INVALID_PIPE_STATE ((NTSTATUS)0xC00000ADL) + #define STATUS_PIPE_BUSY ((NTSTATUS)0xC00000AEL) + #define STATUS_ILLEGAL_FUNCTION ((NTSTATUS)0xC00000AFL) + #define STATUS_PIPE_DISCONNECTED ((NTSTATUS)0xC00000B0L) + #define STATUS_PIPE_CLOSING ((NTSTATUS)0xC00000B1L) + #define STATUS_PIPE_CONNECTED ((NTSTATUS)0xC00000B2L) + #define STATUS_PIPE_LISTENING ((NTSTATUS)0xC00000B3L) + #define STATUS_INVALID_READ_MODE ((NTSTATUS)0xC00000B4L) + #define STATUS_IO_TIMEOUT ((NTSTATUS)0xC00000B5L) + #define STATUS_FILE_FORCED_CLOSED ((NTSTATUS)0xC00000B6L) + #define STATUS_PROFILING_NOT_STARTED ((NTSTATUS)0xC00000B7L) + #define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS)0xC00000B8L) + #define STATUS_COULD_NOT_INTERPRET ((NTSTATUS)0xC00000B9L) + #define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS)0xC00000BAL) + #define STATUS_NOT_SUPPORTED ((NTSTATUS)0xC00000BBL) + #define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS)0xC00000BCL) + #define STATUS_DUPLICATE_NAME ((NTSTATUS)0xC00000BDL) + #define STATUS_BAD_NETWORK_PATH ((NTSTATUS)0xC00000BEL) + #define STATUS_NETWORK_BUSY ((NTSTATUS)0xC00000BFL) + #define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS)0xC00000C0L) + #define STATUS_TOO_MANY_COMMANDS ((NTSTATUS)0xC00000C1L) + #define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS)0xC00000C2L) + #define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS)0xC00000C3L) + #define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS)0xC00000C4L) + #define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS)0xC00000C5L) + #define STATUS_PRINT_QUEUE_FULL ((NTSTATUS)0xC00000C6L) + #define STATUS_NO_SPOOL_SPACE ((NTSTATUS)0xC00000C7L) + #define STATUS_PRINT_CANCELLED ((NTSTATUS)0xC00000C8L) + #define STATUS_NETWORK_NAME_DELETED ((NTSTATUS)0xC00000C9L) + #define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS)0xC00000CAL) + #define STATUS_BAD_DEVICE_TYPE ((NTSTATUS)0xC00000CBL) + #define STATUS_BAD_NETWORK_NAME ((NTSTATUS)0xC00000CCL) + #define STATUS_TOO_MANY_NAMES ((NTSTATUS)0xC00000CDL) + #define STATUS_TOO_MANY_SESSIONS ((NTSTATUS)0xC00000CEL) + #define STATUS_SHARING_PAUSED ((NTSTATUS)0xC00000CFL) + #define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS)0xC00000D0L) + #define STATUS_REDIRECTOR_PAUSED ((NTSTATUS)0xC00000D1L) + #define STATUS_NET_WRITE_FAULT ((NTSTATUS)0xC00000D2L) + #define STATUS_PROFILING_AT_LIMIT ((NTSTATUS)0xC00000D3L) + #define STATUS_NOT_SAME_DEVICE ((NTSTATUS)0xC00000D4L) + #define STATUS_FILE_RENAMED ((NTSTATUS)0xC00000D5L) + #define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS)0xC00000D6L) + #define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS)0xC00000D7L) + #define STATUS_CANT_WAIT ((NTSTATUS)0xC00000D8L) + #define STATUS_PIPE_EMPTY ((NTSTATUS)0xC00000D9L) + #define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS)0xC00000DAL) + #define STATUS_CANT_TERMINATE_SELF ((NTSTATUS)0xC00000DBL) + #define STATUS_INVALID_SERVER_STATE ((NTSTATUS)0xC00000DCL) + #define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS)0xC00000DDL) + #define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS)0xC00000DEL) + #define STATUS_NO_SUCH_DOMAIN ((NTSTATUS)0xC00000DFL) + #define STATUS_DOMAIN_EXISTS ((NTSTATUS)0xC00000E0L) + #define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00000E1L) + #define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS)0xC00000E2L) + #define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS)0xC00000E3L) + #define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS)0xC00000E4L) + #define STATUS_INTERNAL_ERROR ((NTSTATUS)0xC00000E5L) + #define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS)0xC00000E6L) + #define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS)0xC00000E7L) + #define STATUS_INVALID_USER_BUFFER ((NTSTATUS)0xC00000E8L) + #define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS)0xC00000E9L) + #define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS)0xC00000EAL) + #define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS)0xC00000EBL) + #define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS)0xC00000ECL) + #define STATUS_NOT_LOGON_PROCESS ((NTSTATUS)0xC00000EDL) + #define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS)0xC00000EEL) + #define STATUS_INVALID_PARAMETER_1 ((NTSTATUS)0xC00000EFL) + #define STATUS_INVALID_PARAMETER_2 ((NTSTATUS)0xC00000F0L) + #define STATUS_INVALID_PARAMETER_3 ((NTSTATUS)0xC00000F1L) + #define STATUS_INVALID_PARAMETER_4 ((NTSTATUS)0xC00000F2L) + #define STATUS_INVALID_PARAMETER_5 ((NTSTATUS)0xC00000F3L) + #define STATUS_INVALID_PARAMETER_6 ((NTSTATUS)0xC00000F4L) + #define STATUS_INVALID_PARAMETER_7 ((NTSTATUS)0xC00000F5L) + #define STATUS_INVALID_PARAMETER_8 ((NTSTATUS)0xC00000F6L) + #define STATUS_INVALID_PARAMETER_9 ((NTSTATUS)0xC00000F7L) + #define STATUS_INVALID_PARAMETER_10 ((NTSTATUS)0xC00000F8L) + #define STATUS_INVALID_PARAMETER_11 ((NTSTATUS)0xC00000F9L) + #define STATUS_INVALID_PARAMETER_12 ((NTSTATUS)0xC00000FAL) + #define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS)0xC00000FBL) + #define STATUS_REDIRECTOR_STARTED ((NTSTATUS)0xC00000FCL) + #define STATUS_STACK_OVERFLOW ((NTSTATUS)0xC00000FDL) + #define STATUS_NO_SUCH_PACKAGE ((NTSTATUS)0xC00000FEL) + #define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS)0xC00000FFL) + #define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS)0xC0000100L) + #define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS)0xC0000101L) + #define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS)0xC0000102L) + #define STATUS_NOT_A_DIRECTORY ((NTSTATUS)0xC0000103L) + #define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS)0xC0000104L) + #define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS)0xC0000105L) + #define STATUS_NAME_TOO_LONG ((NTSTATUS)0xC0000106L) + #define STATUS_FILES_OPEN ((NTSTATUS)0xC0000107L) + #define STATUS_CONNECTION_IN_USE ((NTSTATUS)0xC0000108L) + #define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS)0xC0000109L) + #define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS)0xC000010AL) + #define STATUS_INVALID_LOGON_TYPE ((NTSTATUS)0xC000010BL) + #define STATUS_NO_GUID_TRANSLATION ((NTSTATUS)0xC000010CL) + #define STATUS_CANNOT_IMPERSONATE ((NTSTATUS)0xC000010DL) + #define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS)0xC000010EL) + #define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS)0xC000010FL) + #define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS)0xC0000110L) + #define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS)0xC0000111L) + #define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS)0xC0000112L) + #define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS)0xC0000113L) + #define STATUS_ABIOS_INVALID_LID ((NTSTATUS)0xC0000114L) + #define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS)0xC0000115L) + #define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS)0xC0000116L) + #define STATUS_NO_LDT ((NTSTATUS)0xC0000117L) + #define STATUS_INVALID_LDT_SIZE ((NTSTATUS)0xC0000118L) + #define STATUS_INVALID_LDT_OFFSET ((NTSTATUS)0xC0000119L) + #define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS)0xC000011AL) + #define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS)0xC000011BL) + #define STATUS_RXACT_INVALID_STATE ((NTSTATUS)0xC000011CL) + #define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS)0xC000011DL) + #define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS)0xC000011EL) + #define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS)0xC000011FL) + #define STATUS_CANCELLED ((NTSTATUS)0xC0000120L) + #define STATUS_CANNOT_DELETE ((NTSTATUS)0xC0000121L) + #define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS)0xC0000122L) + #define STATUS_FILE_DELETED ((NTSTATUS)0xC0000123L) + #define STATUS_SPECIAL_ACCOUNT ((NTSTATUS)0xC0000124L) + #define STATUS_SPECIAL_GROUP ((NTSTATUS)0xC0000125L) + #define STATUS_SPECIAL_USER ((NTSTATUS)0xC0000126L) + #define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS)0xC0000127L) + #define STATUS_FILE_CLOSED ((NTSTATUS)0xC0000128L) + #define STATUS_TOO_MANY_THREADS ((NTSTATUS)0xC0000129L) + #define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS)0xC000012AL) + #define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS)0xC000012BL) + #define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS)0xC000012CL) + #define STATUS_COMMITMENT_LIMIT ((NTSTATUS)0xC000012DL) + #define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS)0xC000012EL) + #define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS)0xC000012FL) + #define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS)0xC0000130L) + #define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS)0xC0000131L) + #define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS)0xC0000132L) + #define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS)0xC0000133L) + #define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS)0xC0000134L) + #define STATUS_DLL_NOT_FOUND ((NTSTATUS)0xC0000135L) + #define STATUS_OPEN_FAILED ((NTSTATUS)0xC0000136L) + #define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS)0xC0000137L) + #define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000138L) + #define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000139L) + #define STATUS_CONTROL_C_EXIT ((NTSTATUS)0xC000013AL) + #define STATUS_LOCAL_DISCONNECT ((NTSTATUS)0xC000013BL) + #define STATUS_REMOTE_DISCONNECT ((NTSTATUS)0xC000013CL) + #define STATUS_REMOTE_RESOURCES ((NTSTATUS)0xC000013DL) + #define STATUS_LINK_FAILED ((NTSTATUS)0xC000013EL) + #define STATUS_LINK_TIMEOUT ((NTSTATUS)0xC000013FL) + #define STATUS_INVALID_CONNECTION ((NTSTATUS)0xC0000140L) + #define STATUS_INVALID_ADDRESS ((NTSTATUS)0xC0000141L) + #define STATUS_DLL_INIT_FAILED ((NTSTATUS)0xC0000142L) + #define STATUS_MISSING_SYSTEMFILE ((NTSTATUS)0xC0000143L) + #define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS)0xC0000144L) + #define STATUS_APP_INIT_FAILURE ((NTSTATUS)0xC0000145L) + #define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS)0xC0000146L) + #define STATUS_NO_PAGEFILE ((NTSTATUS)0xC0000147L) + #define STATUS_INVALID_LEVEL ((NTSTATUS)0xC0000148L) + #define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS)0xC0000149L) + #define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS)0xC000014AL) + #define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014BL) + #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014CL) + #define STATUS_REGISTRY_IO_FAILED ((NTSTATUS)0xC000014DL) + #define STATUS_NO_EVENT_PAIR ((NTSTATUS)0xC000014EL) + #define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS)0xC000014FL) + #define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS)0xC0000150L) + #define STATUS_NO_SUCH_ALIAS ((NTSTATUS)0xC0000151L) + #define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS)0xC0000152L) + #define STATUS_MEMBER_IN_ALIAS ((NTSTATUS)0xC0000153L) + #define STATUS_ALIAS_EXISTS ((NTSTATUS)0xC0000154L) + #define STATUS_LOGON_NOT_GRANTED ((NTSTATUS)0xC0000155L) + #define STATUS_TOO_MANY_SECRETS ((NTSTATUS)0xC0000156L) + #define STATUS_SECRET_TOO_LONG ((NTSTATUS)0xC0000157L) + #define STATUS_INTERNAL_DB_ERROR ((NTSTATUS)0xC0000158L) + #define STATUS_FULLSCREEN_MODE ((NTSTATUS)0xC0000159L) + #define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS)0xC000015AL) + #define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS)0xC000015BL) + #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015CL) + #define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000015DL) + #define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS)0xC000015EL) + #define STATUS_FT_MISSING_MEMBER ((NTSTATUS)0xC000015FL) + #define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS)0xC0000160L) + #define STATUS_ILLEGAL_CHARACTER ((NTSTATUS)0xC0000161L) + #define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS)0xC0000162L) + #define STATUS_UNDEFINED_CHARACTER ((NTSTATUS)0xC0000163L) + #define STATUS_FLOPPY_VOLUME ((NTSTATUS)0xC0000164L) + #define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS)0xC0000165L) + #define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS)0xC0000166L) + #define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS)0xC0000167L) + #define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS)0xC0000168L) + #define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS)0xC0000169L) + #define STATUS_DISK_OPERATION_FAILED ((NTSTATUS)0xC000016AL) + #define STATUS_DISK_RESET_FAILED ((NTSTATUS)0xC000016BL) + #define STATUS_SHARED_IRQ_BUSY ((NTSTATUS)0xC000016CL) + #define STATUS_FT_ORPHANING ((NTSTATUS)0xC000016DL) + #define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS)0xC000016EL) + #define STATUS_PARTITION_FAILURE ((NTSTATUS)0xC0000172L) + #define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS)0xC0000173L) + #define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS)0xC0000174L) + #define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS)0xC0000175L) + #define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS)0xC0000176L) + #define STATUS_EOM_OVERFLOW ((NTSTATUS)0xC0000177L) + #define STATUS_NO_MEDIA ((NTSTATUS)0xC0000178L) + #define STATUS_NO_SUCH_MEMBER ((NTSTATUS)0xC000017AL) + #define STATUS_INVALID_MEMBER ((NTSTATUS)0xC000017BL) + #define STATUS_KEY_DELETED ((NTSTATUS)0xC000017CL) + #define STATUS_NO_LOG_SPACE ((NTSTATUS)0xC000017DL) + #define STATUS_TOO_MANY_SIDS ((NTSTATUS)0xC000017EL) + #define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000017FL) + #define STATUS_KEY_HAS_CHILDREN ((NTSTATUS)0xC0000180L) + #define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS)0xC0000181L) + #define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS)0xC0000182L) + #define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS)0xC0000183L) + #define STATUS_INVALID_DEVICE_STATE ((NTSTATUS)0xC0000184L) + #define STATUS_IO_DEVICE_ERROR ((NTSTATUS)0xC0000185L) + #define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS)0xC0000186L) + #define STATUS_BACKUP_CONTROLLER ((NTSTATUS)0xC0000187L) + #define STATUS_LOG_FILE_FULL ((NTSTATUS)0xC0000188L) + #define STATUS_TOO_LATE ((NTSTATUS)0xC0000189L) + #define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS)0xC000018AL) + #define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS)0xC000018BL) + #define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS)0xC000018CL) + #define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS)0xC000018DL) + #define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS)0xC000018EL) + #define STATUS_EVENTLOG_CANT_START ((NTSTATUS)0xC000018FL) + #define STATUS_TRUST_FAILURE ((NTSTATUS)0xC0000190L) + #define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS)0xC0000191L) + #define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS)0xC0000192L) + #define STATUS_ACCOUNT_EXPIRED ((NTSTATUS)0xC0000193L) + #define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS)0xC0000194L) + #define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS)0xC0000195L) + #define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS)0xC0000196L) + #define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS)0xC0000197L) + #define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS)0xC0000198L) + #define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS)0xC0000199L) + #define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS)0xC000019AL) + #define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS)0xC000019BL) + #define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS)0xC000019CL) + #define STATUS_NO_USER_SESSION_KEY ((NTSTATUS)0xC0000202L) + #define STATUS_USER_SESSION_DELETED ((NTSTATUS)0xC0000203L) + #define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS)0xC0000204L) + #define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS)0xC0000205L) + #define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS)0xC0000206L) + #define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS)0xC0000207L) + #define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS)0xC0000208L) + #define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS)0xC0000209L) + #define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS)0xC000020AL) + #define STATUS_ADDRESS_CLOSED ((NTSTATUS)0xC000020BL) + #define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS)0xC000020CL) + #define STATUS_CONNECTION_RESET ((NTSTATUS)0xC000020DL) + #define STATUS_TOO_MANY_NODES ((NTSTATUS)0xC000020EL) + #define STATUS_TRANSACTION_ABORTED ((NTSTATUS)0xC000020FL) + #define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS)0xC0000210L) + #define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS)0xC0000211L) + #define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS)0xC0000212L) + #define STATUS_TRANSACTION_RESPONDED ((NTSTATUS)0xC0000213L) + #define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS)0xC0000214L) + #define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS)0xC0000215L) + #define STATUS_NOT_SERVER_SESSION ((NTSTATUS)0xC0000216L) + #define STATUS_NOT_CLIENT_SESSION ((NTSTATUS)0xC0000217L) + #define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS)0xC0000218L) + #define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS)0xC0000219L) + #define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS)0xC000021AL) + #define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS)0xC000021BL) + #define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS)0xC000021CL) + #define STATUS_VDM_HARD_ERROR ((NTSTATUS)0xC000021DL) + #define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS)0xC000021EL) + #define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS)0xC000021FL) + #define STATUS_MAPPED_ALIGNMENT ((NTSTATUS)0xC0000220L) + #define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS)0xC0000221L) + #define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS)0xC0000222L) + #define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS)0xC0000223L) + #define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS)0xC0000224L) + #define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L) + #define STATUS_NOT_TINY_STREAM ((NTSTATUS)0xC0000226L) + #define STATUS_RECOVERY_FAILURE ((NTSTATUS)0xC0000227L) + #define STATUS_STACK_OVERFLOW_READ ((NTSTATUS)0xC0000228L) + #define STATUS_FAIL_CHECK ((NTSTATUS)0xC0000229L) + #define STATUS_DUPLICATE_OBJECTID ((NTSTATUS)0xC000022AL) + #define STATUS_OBJECTID_EXISTS ((NTSTATUS)0xC000022BL) + #define STATUS_CONVERT_TO_LARGE ((NTSTATUS)0xC000022CL) + #define STATUS_RETRY ((NTSTATUS)0xC000022DL) + #define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS)0xC000022EL) + #define STATUS_ALLOCATE_BUCKET ((NTSTATUS)0xC000022FL) + #define STATUS_PROPSET_NOT_FOUND ((NTSTATUS)0xC0000230L) + #define STATUS_MARSHALL_OVERFLOW ((NTSTATUS)0xC0000231L) + #define STATUS_INVALID_VARIANT ((NTSTATUS)0xC0000232L) + #define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS)0xC0000233L) + #define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS)0xC0000234L) + #define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS)0xC0000235L) + #define STATUS_CONNECTION_REFUSED ((NTSTATUS)0xC0000236L) + #define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS)0xC0000237L) + #define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS)0xC0000238L) + #define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS)0xC0000239L) + #define STATUS_CONNECTION_INVALID ((NTSTATUS)0xC000023AL) + #define STATUS_CONNECTION_ACTIVE ((NTSTATUS)0xC000023BL) + #define STATUS_NETWORK_UNREACHABLE ((NTSTATUS)0xC000023CL) + #define STATUS_HOST_UNREACHABLE ((NTSTATUS)0xC000023DL) + #define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS)0xC000023EL) + #define STATUS_PORT_UNREACHABLE ((NTSTATUS)0xC000023FL) + #define STATUS_REQUEST_ABORTED ((NTSTATUS)0xC0000240L) + #define STATUS_CONNECTION_ABORTED ((NTSTATUS)0xC0000241L) + #define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS)0xC0000242L) + #define STATUS_USER_MAPPED_FILE ((NTSTATUS)0xC0000243L) + #define STATUS_AUDIT_FAILED ((NTSTATUS)0xC0000244L) + #define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS)0xC0000245L) + #define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS)0xC0000246L) + #define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS)0xC0000247L) + #define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS)0xC0000248L) + #define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS)0xC0000249L) + #define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS)0xC0000250L) + #define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS)0xC0000251L) + #define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS)0xC0000252L) + #define STATUS_LPC_REPLY_LOST ((NTSTATUS)0xC0000253L) + #define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS)0xC0000254L) + #define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS)0xC0000255L) + #define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS)0xC0000256L) + #define STATUS_PATH_NOT_COVERED ((NTSTATUS)0xC0000257L) + #define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS)0xC0000258L) + #define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS)0xC0000259L) + #define STATUS_PWD_TOO_SHORT ((NTSTATUS)0xC000025AL) + #define STATUS_PWD_TOO_RECENT ((NTSTATUS)0xC000025BL) + #define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS)0xC000025CL) + #define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS)0xC000025EL) + #define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS)0xC000025FL) + #define STATUS_INVALID_HW_PROFILE ((NTSTATUS)0xC0000260L) + #define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS)0xC0000261L) + #define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000262L) + #define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000263L) + #define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS)0xC0000264L) + #define STATUS_TOO_MANY_LINKS ((NTSTATUS)0xC0000265L) + #define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS)0xC0000266L) + #define STATUS_FILE_IS_OFFLINE ((NTSTATUS)0xC0000267L) + #define STATUS_EVALUATION_EXPIRATION ((NTSTATUS)0xC0000268L) + #define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS)0xC0000269L) + #define STATUS_LICENSE_VIOLATION ((NTSTATUS)0xC000026AL) + #define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS)0xC000026BL) + #define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS)0xC000026CL) + #define STATUS_DFS_UNAVAILABLE ((NTSTATUS)0xC000026DL) + #define STATUS_VOLUME_DISMOUNTED ((NTSTATUS)0xC000026EL) + #define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS)0xC000026FL) + #define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000270L) + #define STATUS_VALIDATE_CONTINUE ((NTSTATUS)0xC0000271L) + #define STATUS_NO_MATCH ((NTSTATUS)0xC0000272L) + #define STATUS_NO_MORE_MATCHES ((NTSTATUS)0xC0000273L) + #define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS)0xC0000275L) + #define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS)0xC0000276L) + #define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS)0xC0000277L) + #define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS)0xC0000278L) + #define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS)0xC0000279L) + #define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000280L) + #define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS)0xC0000281L) + #define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS)0xC0000282L) + #define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS)0xC0000283L) + #define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS)0xC0000284L) + #define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS)0xC0000285L) + #define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS)0xC0000286L) + #define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS)0xC0000287L) + #define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS)0x80000288L) + #define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS)0x80000289L) + #define STATUS_ENCRYPTION_FAILED ((NTSTATUS)0xC000028AL) + #define STATUS_DECRYPTION_FAILED ((NTSTATUS)0xC000028BL) + #define STATUS_RANGE_NOT_FOUND ((NTSTATUS)0xC000028CL) + #define STATUS_NO_RECOVERY_POLICY ((NTSTATUS)0xC000028DL) + #define STATUS_NO_EFS ((NTSTATUS)0xC000028EL) + #define STATUS_WRONG_EFS ((NTSTATUS)0xC000028FL) + #define STATUS_NO_USER_KEYS ((NTSTATUS)0xC0000290L) + #define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS)0xC0000291L) + #define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS)0xC0000292L) + #define STATUS_FILE_ENCRYPTED ((NTSTATUS)0xC0000293L) + #define STATUS_WAKE_SYSTEM ((NTSTATUS)0x40000294L) + #define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS)0xC0000295L) + #define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS)0xC0000296L) + #define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS)0xC0000297L) + #define STATUS_WMI_TRY_AGAIN ((NTSTATUS)0xC0000298L) + #define STATUS_SHARED_POLICY ((NTSTATUS)0xC0000299L) + #define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS)0xC000029AL) + #define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS)0xC000029BL) + #define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS)0xC000029CL) + #define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS)0xC000029DL) + #define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS)0xC000029EL) + #define STATUS_NO_TRACKING_SERVICE ((NTSTATUS)0xC000029FL) + #define STATUS_SERVER_SID_MISMATCH ((NTSTATUS)0xC00002A0L) + #define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS)0xC00002A1L) + #define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS)0xC00002A2L) + #define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS)0xC00002A3L) + #define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS)0xC00002A4L) + #define STATUS_DS_BUSY ((NTSTATUS)0xC00002A5L) + #define STATUS_DS_UNAVAILABLE ((NTSTATUS)0xC00002A6L) + #define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS)0xC00002A7L) + #define STATUS_DS_NO_MORE_RIDS ((NTSTATUS)0xC00002A8L) + #define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS)0xC00002A9L) + #define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS)0xC00002AAL) + #define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS)0xC00002ABL) + #define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS)0xC00002ACL) + #define STATUS_DS_CANT_ON_RDN ((NTSTATUS)0xC00002ADL) + #define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS)0xC00002AEL) + #define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS)0xC00002AFL) + #define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS)0xC00002B0L) + #define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS)0xC00002B1L) + #define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS)0xC00002B2L) + #define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS)0xC00002B3L) + #define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS)0xC00002B4L) + #define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS)0xC00002B5L) + #define STATUS_DEVICE_REMOVED ((NTSTATUS)0xC00002B6L) + #define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS)0xC00002B7L) + #define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS)0xC00002B8L) + #define STATUS_NOINTERFACE ((NTSTATUS)0xC00002B9L) + #define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00002C1L) + #define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS)0xC00002C2L) + #define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS)0xC00002C3L) + #define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS)0xC00002C4L) + #define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS)0xC00002C5L) + #define STATUS_WMI_READ_ONLY ((NTSTATUS)0xC00002C6L) + #define STATUS_WMI_SET_FAILURE ((NTSTATUS)0xC00002C7L) + #define STATUS_COMMITMENT_MINIMUM ((NTSTATUS)0xC00002C8L) + #define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS)0xC00002C9L) + #define STATUS_TRANSPORT_FULL ((NTSTATUS)0xC00002CAL) + #define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002CBL) + #define STATUS_ONLY_IF_CONNECTED ((NTSTATUS)0xC00002CCL) + #define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS)0xC00002CDL) + #define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS)0xC00002CEL) + #define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS)0xC00002CFL) + #define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS)0xC00002D0L) + #define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS)0xC00002D1L) + #define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS)0xC00002D2L) + #define STATUS_POWER_STATE_INVALID ((NTSTATUS)0xC00002D3L) + #define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS)0xC00002D4L) + #define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D5L) + #define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D6L) + #define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D7L) + #define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC00002D8L) + #define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D9L) + #define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS)0xC00002DAL) + #define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS)0xC00002DBL) + #define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS)0xC00002DCL) + #define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS)0xC00002DDL) + #define STATUS_INSUFFICIENT_POWER ((NTSTATUS)0xC00002DEL) + #define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS)0xC00002DFL) + #define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS)0xC00002E0L) + #define STATUS_DS_CANT_START ((NTSTATUS)0xC00002E1L) + #define STATUS_DS_INIT_FAILURE ((NTSTATUS)0xC00002E2L) + #define STATUS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002E3L) + #define STATUS_DS_GC_REQUIRED ((NTSTATUS)0xC00002E4L) + #define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS)0xC00002E5L) + #define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS)0xC00002E6L) + #define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS)0xC00002E7L) + #define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS)0xC00002E8L) + #define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS)0xC00002E9L) + #define STATUS_CANNOT_MAKE ((NTSTATUS)0xC00002EAL) + #define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS)0xC00002EBL) + #define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002ECL) + #define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002EDL) + #define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS)0xC00002EEL) + #define STATUS_NO_TGT_REPLY ((NTSTATUS)0xC00002EFL) + #define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS)0xC00002F0L) + #define STATUS_NO_IP_ADDRESSES ((NTSTATUS)0xC00002F1L) + #define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS)0xC00002F2L) + #define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS)0xC00002F3L) + #define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS)0xC00002F4L) + #define STATUS_MUST_BE_KDC ((NTSTATUS)0xC00002F5L) + #define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS)0xC00002F6L) + #define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS)0xC00002F7L) + #define STATUS_NO_PA_DATA ((NTSTATUS)0xC00002F8L) + #define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS)0xC00002F9L) + #define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS)0xC00002FAL) + #define STATUS_KDC_INVALID_REQUEST ((NTSTATUS)0xC00002FBL) + #define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS)0xC00002FCL) + #define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS)0xC00002FDL) + #define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FEL) + #define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FFL) + #define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS)0xC0000300L) + #define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS)0xC0000301L) + #define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS)0xC0000302L) + #define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS)0xC0000303L) + #define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS)0xC0000304L) + #define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS)0xC0000305L) + #define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS)0xC0000306L) + #define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS)0xC0000307L) + #define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS)0xC0000308L) + #define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS)0xC0000309L) + #define STATUS_CSS_REGION_MISMATCH ((NTSTATUS)0xC000030AL) + #define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS)0xC000030BL) + #define STATUS_PKINIT_FAILURE ((NTSTATUS)0xC0000320L) + #define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS)0xC0000321L) + #define STATUS_NO_KERB_KEY ((NTSTATUS)0xC0000322L) + #define STATUS_HOST_DOWN ((NTSTATUS)0xC0000350L) + #define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS)0xC0000351L) + #define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS)0xC0000352L) + #define STATUS_PORT_NOT_SET ((NTSTATUS)0xC0000353L) + #define STATUS_DEBUGGER_INACTIVE ((NTSTATUS)0xC0000354L) + #define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS)0xC0000355L) + #define STATUS_AUDITING_DISABLED ((NTSTATUS)0xC0000356L) + #define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS)0xC0000357L) + #define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC0000358L) + #define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS)0xC0000359L) + #define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS)0xC000035AL) + #define STATUS_BAD_BINDINGS ((NTSTATUS)0xC000035BL) + #define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS)0xC000035CL) + #define STATUS_APPHELP_BLOCK ((NTSTATUS)0xC000035DL) + #define STATUS_ALL_SIDS_FILTERED ((NTSTATUS)0xC000035EL) + #define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS)0xC000035FL) + #define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS)0xC0000361L) + #define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS)0xC0000362L) + #define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS)0xC0000363L) + #define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS)0xC0000364L) + #define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS)0xC0000365L) + #define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS)0xC0000366L) + #define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS)0x00000367L) + #define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000368L) + #define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS)0xC0000369L) + #define STATUS_MCA_OCCURED ((NTSTATUS)0xC000036AL) + #define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS)0xC000036BL) + #define STATUS_DRIVER_BLOCKED ((NTSTATUS)0xC000036CL) + #define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS)0xC000036DL) + #define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS)0xC000036EL) + #define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS)0xC000036FL) + #define STATUS_DS_SHUTTING_DOWN ((NTSTATUS)0x40000370L) + #define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS)0xC0000380L) + #define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS)0xC0000381L) + #define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS)0xC0000382L) + #define STATUS_SMARTCARD_NO_CARD ((NTSTATUS)0xC0000383L) + #define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS)0xC0000384L) + #define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS)0xC0000385L) + #define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS)0xC0000386L) + #define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS)0xC0000387L) + #define STATUS_DOWNGRADE_DETECTED ((NTSTATUS)0xC0000388L) + #define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS)0xC0000389L) + #define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS)0xC000038AL) + #define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS)0xC000038BL) + #define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS)0xC000038CL) + #define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS)0xC000038DL) + #define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS)0xC000038EL) + #define STATUS_ASSERTION_FAILURE ((NTSTATUS)0xC0000420L) + #define STATUS_CALLBACK_POP_STACK ((NTSTATUS)0xC0000423L) + #define STATUS_WOW_ASSERTION ((NTSTATUS)0xC0009898L) + #define RPC_NT_INVALID_STRING_BINDING ((NTSTATUS)0xC0020001L) + #define RPC_NT_WRONG_KIND_OF_BINDING ((NTSTATUS)0xC0020002L) + #define RPC_NT_INVALID_BINDING ((NTSTATUS)0xC0020003L) + #define RPC_NT_PROTSEQ_NOT_SUPPORTED ((NTSTATUS)0xC0020004L) + #define RPC_NT_INVALID_RPC_PROTSEQ ((NTSTATUS)0xC0020005L) + #define RPC_NT_INVALID_STRING_UUID ((NTSTATUS)0xC0020006L) + #define RPC_NT_INVALID_ENDPOINT_FORMAT ((NTSTATUS)0xC0020007L) + #define RPC_NT_INVALID_NET_ADDR ((NTSTATUS)0xC0020008L) + #define RPC_NT_NO_ENDPOINT_FOUND ((NTSTATUS)0xC0020009L) + #define RPC_NT_INVALID_TIMEOUT ((NTSTATUS)0xC002000AL) + #define RPC_NT_OBJECT_NOT_FOUND ((NTSTATUS)0xC002000BL) + #define RPC_NT_ALREADY_REGISTERED ((NTSTATUS)0xC002000CL) + #define RPC_NT_TYPE_ALREADY_REGISTERED ((NTSTATUS)0xC002000DL) + #define RPC_NT_ALREADY_LISTENING ((NTSTATUS)0xC002000EL) + #define RPC_NT_NO_PROTSEQS_REGISTERED ((NTSTATUS)0xC002000FL) + #define RPC_NT_NOT_LISTENING ((NTSTATUS)0xC0020010L) + #define RPC_NT_UNKNOWN_MGR_TYPE ((NTSTATUS)0xC0020011L) + #define RPC_NT_UNKNOWN_IF ((NTSTATUS)0xC0020012L) + #define RPC_NT_NO_BINDINGS ((NTSTATUS)0xC0020013L) + #define RPC_NT_NO_PROTSEQS ((NTSTATUS)0xC0020014L) + #define RPC_NT_CANT_CREATE_ENDPOINT ((NTSTATUS)0xC0020015L) + #define RPC_NT_OUT_OF_RESOURCES ((NTSTATUS)0xC0020016L) + #define RPC_NT_SERVER_UNAVAILABLE ((NTSTATUS)0xC0020017L) + #define RPC_NT_SERVER_TOO_BUSY ((NTSTATUS)0xC0020018L) + #define RPC_NT_INVALID_NETWORK_OPTIONS ((NTSTATUS)0xC0020019L) + #define RPC_NT_NO_CALL_ACTIVE ((NTSTATUS)0xC002001AL) + #define RPC_NT_CALL_FAILED ((NTSTATUS)0xC002001BL) + #define RPC_NT_CALL_FAILED_DNE ((NTSTATUS)0xC002001CL) + #define RPC_NT_PROTOCOL_ERROR ((NTSTATUS)0xC002001DL) + #define RPC_NT_UNSUPPORTED_TRANS_SYN ((NTSTATUS)0xC002001FL) + #define RPC_NT_UNSUPPORTED_TYPE ((NTSTATUS)0xC0020021L) + #define RPC_NT_INVALID_TAG ((NTSTATUS)0xC0020022L) + #define RPC_NT_INVALID_BOUND ((NTSTATUS)0xC0020023L) + #define RPC_NT_NO_ENTRY_NAME ((NTSTATUS)0xC0020024L) + #define RPC_NT_INVALID_NAME_SYNTAX ((NTSTATUS)0xC0020025L) + #define RPC_NT_UNSUPPORTED_NAME_SYNTAX ((NTSTATUS)0xC0020026L) + #define RPC_NT_UUID_NO_ADDRESS ((NTSTATUS)0xC0020028L) + #define RPC_NT_DUPLICATE_ENDPOINT ((NTSTATUS)0xC0020029L) + #define RPC_NT_UNKNOWN_AUTHN_TYPE ((NTSTATUS)0xC002002AL) + #define RPC_NT_MAX_CALLS_TOO_SMALL ((NTSTATUS)0xC002002BL) + #define RPC_NT_STRING_TOO_LONG ((NTSTATUS)0xC002002CL) + #define RPC_NT_PROTSEQ_NOT_FOUND ((NTSTATUS)0xC002002DL) + #define RPC_NT_PROCNUM_OUT_OF_RANGE ((NTSTATUS)0xC002002EL) + #define RPC_NT_BINDING_HAS_NO_AUTH ((NTSTATUS)0xC002002FL) + #define RPC_NT_UNKNOWN_AUTHN_SERVICE ((NTSTATUS)0xC0020030L) + #define RPC_NT_UNKNOWN_AUTHN_LEVEL ((NTSTATUS)0xC0020031L) + #define RPC_NT_INVALID_AUTH_IDENTITY ((NTSTATUS)0xC0020032L) + #define RPC_NT_UNKNOWN_AUTHZ_SERVICE ((NTSTATUS)0xC0020033L) + #define EPT_NT_INVALID_ENTRY ((NTSTATUS)0xC0020034L) + #define EPT_NT_CANT_PERFORM_OP ((NTSTATUS)0xC0020035L) + #define EPT_NT_NOT_REGISTERED ((NTSTATUS)0xC0020036L) + #define RPC_NT_NOTHING_TO_EXPORT ((NTSTATUS)0xC0020037L) + #define RPC_NT_INCOMPLETE_NAME ((NTSTATUS)0xC0020038L) + #define RPC_NT_INVALID_VERS_OPTION ((NTSTATUS)0xC0020039L) + #define RPC_NT_NO_MORE_MEMBERS ((NTSTATUS)0xC002003AL) + #define RPC_NT_NOT_ALL_OBJS_UNEXPORTED ((NTSTATUS)0xC002003BL) + #define RPC_NT_INTERFACE_NOT_FOUND ((NTSTATUS)0xC002003CL) + #define RPC_NT_ENTRY_ALREADY_EXISTS ((NTSTATUS)0xC002003DL) + #define RPC_NT_ENTRY_NOT_FOUND ((NTSTATUS)0xC002003EL) + #define RPC_NT_NAME_SERVICE_UNAVAILABLE ((NTSTATUS)0xC002003FL) + #define RPC_NT_INVALID_NAF_ID ((NTSTATUS)0xC0020040L) + #define RPC_NT_CANNOT_SUPPORT ((NTSTATUS)0xC0020041L) + #define RPC_NT_NO_CONTEXT_AVAILABLE ((NTSTATUS)0xC0020042L) + #define RPC_NT_INTERNAL_ERROR ((NTSTATUS)0xC0020043L) + #define RPC_NT_ZERO_DIVIDE ((NTSTATUS)0xC0020044L) + #define RPC_NT_ADDRESS_ERROR ((NTSTATUS)0xC0020045L) + #define RPC_NT_FP_DIV_ZERO ((NTSTATUS)0xC0020046L) + #define RPC_NT_FP_UNDERFLOW ((NTSTATUS)0xC0020047L) + #define RPC_NT_FP_OVERFLOW ((NTSTATUS)0xC0020048L) + #define RPC_NT_NO_MORE_ENTRIES ((NTSTATUS)0xC0030001L) + #define RPC_NT_SS_CHAR_TRANS_OPEN_FAIL ((NTSTATUS)0xC0030002L) + #define RPC_NT_SS_CHAR_TRANS_SHORT_FILE ((NTSTATUS)0xC0030003L) + #define RPC_NT_SS_IN_NULL_CONTEXT ((NTSTATUS)0xC0030004L) + #define RPC_NT_SS_CONTEXT_MISMATCH ((NTSTATUS)0xC0030005L) + #define RPC_NT_SS_CONTEXT_DAMAGED ((NTSTATUS)0xC0030006L) + #define RPC_NT_SS_HANDLES_MISMATCH ((NTSTATUS)0xC0030007L) + #define RPC_NT_SS_CANNOT_GET_CALL_HANDLE ((NTSTATUS)0xC0030008L) + #define RPC_NT_NULL_REF_POINTER ((NTSTATUS)0xC0030009L) + #define RPC_NT_ENUM_VALUE_OUT_OF_RANGE ((NTSTATUS)0xC003000AL) + #define RPC_NT_BYTE_COUNT_TOO_SMALL ((NTSTATUS)0xC003000BL) + #define RPC_NT_BAD_STUB_DATA ((NTSTATUS)0xC003000CL) + #define RPC_NT_CALL_IN_PROGRESS ((NTSTATUS)0xC0020049L) + #define RPC_NT_NO_MORE_BINDINGS ((NTSTATUS)0xC002004AL) + #define RPC_NT_GROUP_MEMBER_NOT_FOUND ((NTSTATUS)0xC002004BL) + #define EPT_NT_CANT_CREATE ((NTSTATUS)0xC002004CL) + #define RPC_NT_INVALID_OBJECT ((NTSTATUS)0xC002004DL) + #define RPC_NT_NO_INTERFACES ((NTSTATUS)0xC002004FL) + #define RPC_NT_CALL_CANCELLED ((NTSTATUS)0xC0020050L) + #define RPC_NT_BINDING_INCOMPLETE ((NTSTATUS)0xC0020051L) + #define RPC_NT_COMM_FAILURE ((NTSTATUS)0xC0020052L) + #define RPC_NT_UNSUPPORTED_AUTHN_LEVEL ((NTSTATUS)0xC0020053L) + #define RPC_NT_NO_PRINC_NAME ((NTSTATUS)0xC0020054L) + #define RPC_NT_NOT_RPC_ERROR ((NTSTATUS)0xC0020055L) + #define RPC_NT_UUID_LOCAL_ONLY ((NTSTATUS)0x40020056L) + #define RPC_NT_SEC_PKG_ERROR ((NTSTATUS)0xC0020057L) + #define RPC_NT_NOT_CANCELLED ((NTSTATUS)0xC0020058L) + #define RPC_NT_INVALID_ES_ACTION ((NTSTATUS)0xC0030059L) + #define RPC_NT_WRONG_ES_VERSION ((NTSTATUS)0xC003005AL) + #define RPC_NT_WRONG_STUB_VERSION ((NTSTATUS)0xC003005BL) + #define RPC_NT_INVALID_PIPE_OBJECT ((NTSTATUS)0xC003005CL) + #define RPC_NT_INVALID_PIPE_OPERATION ((NTSTATUS)0xC003005DL) + #define RPC_NT_WRONG_PIPE_VERSION ((NTSTATUS)0xC003005EL) + #define RPC_NT_PIPE_CLOSED ((NTSTATUS)0xC003005FL) + #define RPC_NT_PIPE_DISCIPLINE_ERROR ((NTSTATUS)0xC0030060L) + #define RPC_NT_PIPE_EMPTY ((NTSTATUS)0xC0030061L) + #define RPC_NT_INVALID_ASYNC_HANDLE ((NTSTATUS)0xC0020062L) + #define RPC_NT_INVALID_ASYNC_CALL ((NTSTATUS)0xC0020063L) + #define RPC_NT_SEND_INCOMPLETE ((NTSTATUS)0x400200AFL) + #define STATUS_ACPI_INVALID_OPCODE ((NTSTATUS)0xC0140001L) + #define STATUS_ACPI_STACK_OVERFLOW ((NTSTATUS)0xC0140002L) + #define STATUS_ACPI_ASSERT_FAILED ((NTSTATUS)0xC0140003L) + #define STATUS_ACPI_INVALID_INDEX ((NTSTATUS)0xC0140004L) + #define STATUS_ACPI_INVALID_ARGUMENT ((NTSTATUS)0xC0140005L) + #define STATUS_ACPI_FATAL ((NTSTATUS)0xC0140006L) + #define STATUS_ACPI_INVALID_SUPERNAME ((NTSTATUS)0xC0140007L) + #define STATUS_ACPI_INVALID_ARGTYPE ((NTSTATUS)0xC0140008L) + #define STATUS_ACPI_INVALID_OBJTYPE ((NTSTATUS)0xC0140009L) + #define STATUS_ACPI_INVALID_TARGETTYPE ((NTSTATUS)0xC014000AL) + #define STATUS_ACPI_INCORRECT_ARGUMENT_COUNT ((NTSTATUS)0xC014000BL) + #define STATUS_ACPI_ADDRESS_NOT_MAPPED ((NTSTATUS)0xC014000CL) + #define STATUS_ACPI_INVALID_EVENTTYPE ((NTSTATUS)0xC014000DL) + #define STATUS_ACPI_HANDLER_COLLISION ((NTSTATUS)0xC014000EL) + #define STATUS_ACPI_INVALID_DATA ((NTSTATUS)0xC014000FL) + #define STATUS_ACPI_INVALID_REGION ((NTSTATUS)0xC0140010L) + #define STATUS_ACPI_INVALID_ACCESS_SIZE ((NTSTATUS)0xC0140011L) + #define STATUS_ACPI_ACQUIRE_GLOBAL_LOCK ((NTSTATUS)0xC0140012L) + #define STATUS_ACPI_ALREADY_INITIALIZED ((NTSTATUS)0xC0140013L) + #define STATUS_ACPI_NOT_INITIALIZED ((NTSTATUS)0xC0140014L) + #define STATUS_ACPI_INVALID_MUTEX_LEVEL ((NTSTATUS)0xC0140015L) + #define STATUS_ACPI_MUTEX_NOT_OWNED ((NTSTATUS)0xC0140016L) + #define STATUS_ACPI_MUTEX_NOT_OWNER ((NTSTATUS)0xC0140017L) + #define STATUS_ACPI_RS_ACCESS ((NTSTATUS)0xC0140018L) + #define STATUS_ACPI_INVALID_TABLE ((NTSTATUS)0xC0140019L) + #define STATUS_ACPI_REG_HANDLER_FAILED ((NTSTATUS)0xC0140020L) + #define STATUS_ACPI_POWER_REQUEST_FAILED ((NTSTATUS)0xC0140021L) + #define STATUS_CTX_WINSTATION_NAME_INVALID ((NTSTATUS)0xC00A0001L) + #define STATUS_CTX_INVALID_PD ((NTSTATUS)0xC00A0002L) + #define STATUS_CTX_PD_NOT_FOUND ((NTSTATUS)0xC00A0003L) + #define STATUS_CTX_CDM_CONNECT ((NTSTATUS)0x400A0004L) + #define STATUS_CTX_CDM_DISCONNECT ((NTSTATUS)0x400A0005L) + #define STATUS_CTX_CLOSE_PENDING ((NTSTATUS)0xC00A0006L) + #define STATUS_CTX_NO_OUTBUF ((NTSTATUS)0xC00A0007L) + #define STATUS_CTX_MODEM_INF_NOT_FOUND ((NTSTATUS)0xC00A0008L) + #define STATUS_CTX_INVALID_MODEMNAME ((NTSTATUS)0xC00A0009L) + #define STATUS_CTX_RESPONSE_ERROR ((NTSTATUS)0xC00A000AL) + #define STATUS_CTX_MODEM_RESPONSE_TIMEOUT ((NTSTATUS)0xC00A000BL) + #define STATUS_CTX_MODEM_RESPONSE_NO_CARRIER ((NTSTATUS)0xC00A000CL) + #define STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE ((NTSTATUS)0xC00A000DL) + #define STATUS_CTX_MODEM_RESPONSE_BUSY ((NTSTATUS)0xC00A000EL) + #define STATUS_CTX_MODEM_RESPONSE_VOICE ((NTSTATUS)0xC00A000FL) + #define STATUS_CTX_TD_ERROR ((NTSTATUS)0xC00A0010L) + #define STATUS_CTX_LICENSE_CLIENT_INVALID ((NTSTATUS)0xC00A0012L) + #define STATUS_CTX_LICENSE_NOT_AVAILABLE ((NTSTATUS)0xC00A0013L) + #define STATUS_CTX_LICENSE_EXPIRED ((NTSTATUS)0xC00A0014L) + #define STATUS_CTX_WINSTATION_NOT_FOUND ((NTSTATUS)0xC00A0015L) + #define STATUS_CTX_WINSTATION_NAME_COLLISION ((NTSTATUS)0xC00A0016L) + #define STATUS_CTX_WINSTATION_BUSY ((NTSTATUS)0xC00A0017L) + #define STATUS_CTX_BAD_VIDEO_MODE ((NTSTATUS)0xC00A0018L) + #define STATUS_CTX_GRAPHICS_INVALID ((NTSTATUS)0xC00A0022L) + #define STATUS_CTX_NOT_CONSOLE ((NTSTATUS)0xC00A0024L) + #define STATUS_CTX_CLIENT_QUERY_TIMEOUT ((NTSTATUS)0xC00A0026L) + #define STATUS_CTX_CONSOLE_DISCONNECT ((NTSTATUS)0xC00A0027L) + #define STATUS_CTX_CONSOLE_CONNECT ((NTSTATUS)0xC00A0028L) + #define STATUS_CTX_SHADOW_DENIED ((NTSTATUS)0xC00A002AL) + #define STATUS_CTX_WINSTATION_ACCESS_DENIED ((NTSTATUS)0xC00A002BL) + #define STATUS_CTX_INVALID_WD ((NTSTATUS)0xC00A002EL) + #define STATUS_CTX_WD_NOT_FOUND ((NTSTATUS)0xC00A002FL) + #define STATUS_CTX_SHADOW_INVALID ((NTSTATUS)0xC00A0030L) + #define STATUS_CTX_SHADOW_DISABLED ((NTSTATUS)0xC00A0031L) + #define STATUS_RDP_PROTOCOL_ERROR ((NTSTATUS)0xC00A0032L) + #define STATUS_CTX_CLIENT_LICENSE_NOT_SET ((NTSTATUS)0xC00A0033L) + #define STATUS_CTX_CLIENT_LICENSE_IN_USE ((NTSTATUS)0xC00A0034L) + #define STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE ((NTSTATUS)0xC00A0035L) + #define STATUS_CTX_SHADOW_NOT_RUNNING ((NTSTATUS)0xC00A0036L) + #define STATUS_PNP_BAD_MPS_TABLE ((NTSTATUS)0xC0040035L) + #define STATUS_PNP_TRANSLATION_FAILED ((NTSTATUS)0xC0040036L) + #define STATUS_PNP_IRQ_TRANSLATION_FAILED ((NTSTATUS)0xC0040037L) + #define STATUS_SXS_SECTION_NOT_FOUND ((NTSTATUS)0xC0150001L) + #define STATUS_SXS_CANT_GEN_ACTCTX ((NTSTATUS)0xC0150002L) + #define STATUS_SXS_INVALID_ACTCTXDATA_FORMAT ((NTSTATUS)0xC0150003L) + #define STATUS_SXS_ASSEMBLY_NOT_FOUND ((NTSTATUS)0xC0150004L) + #define STATUS_SXS_MANIFEST_FORMAT_ERROR ((NTSTATUS)0xC0150005L) + #define STATUS_SXS_MANIFEST_PARSE_ERROR ((NTSTATUS)0xC0150006L) + #define STATUS_SXS_ACTIVATION_CONTEXT_DISABLED ((NTSTATUS)0xC0150007L) + #define STATUS_SXS_KEY_NOT_FOUND ((NTSTATUS)0xC0150008L) + #define STATUS_SXS_VERSION_CONFLICT ((NTSTATUS)0xC0150009L) + #define STATUS_SXS_WRONG_SECTION_TYPE ((NTSTATUS)0xC015000AL) + #define STATUS_SXS_THREAD_QUERIES_DISABLED ((NTSTATUS)0xC015000BL) + #define STATUS_SXS_ASSEMBLY_MISSING ((NTSTATUS)0xC015000CL) + #define STATUS_SXS_RELEASE_ACTIVATION_CONTEXT ((NTSTATUS)0x4015000DL) + #define STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET ((NTSTATUS)0xC015000EL) + #define STATUS_SXS_EARLY_DEACTIVATION ((NTSTATUS)0xC015000FL) + #define STATUS_SXS_INVALID_DEACTIVATION ((NTSTATUS)0xC0150010L) + #define STATUS_SXS_MULTIPLE_DEACTIVATION ((NTSTATUS)0xC0150011L) + #define STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY ((NTSTATUS)0xC0150012L) + #define STATUS_SXS_PROCESS_TERMINATION_REQUESTED ((NTSTATUS)0xC0150013L) + #define STATUS_CLUSTER_INVALID_NODE ((NTSTATUS)0xC0130001L) + #define STATUS_CLUSTER_NODE_EXISTS ((NTSTATUS)0xC0130002L) + #define STATUS_CLUSTER_JOIN_IN_PROGRESS ((NTSTATUS)0xC0130003L) + #define STATUS_CLUSTER_NODE_NOT_FOUND ((NTSTATUS)0xC0130004L) + #define STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND ((NTSTATUS)0xC0130005L) + #define STATUS_CLUSTER_NETWORK_EXISTS ((NTSTATUS)0xC0130006L) + #define STATUS_CLUSTER_NETWORK_NOT_FOUND ((NTSTATUS)0xC0130007L) + #define STATUS_CLUSTER_NETINTERFACE_EXISTS ((NTSTATUS)0xC0130008L) + #define STATUS_CLUSTER_NETINTERFACE_NOT_FOUND ((NTSTATUS)0xC0130009L) + #define STATUS_CLUSTER_INVALID_REQUEST ((NTSTATUS)0xC013000AL) + #define STATUS_CLUSTER_INVALID_NETWORK_PROVIDER ((NTSTATUS)0xC013000BL) + #define STATUS_CLUSTER_NODE_DOWN ((NTSTATUS)0xC013000CL) + #define STATUS_CLUSTER_NODE_UNREACHABLE ((NTSTATUS)0xC013000DL) + #define STATUS_CLUSTER_NODE_NOT_MEMBER ((NTSTATUS)0xC013000EL) + #define STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS ((NTSTATUS)0xC013000FL) + #define STATUS_CLUSTER_INVALID_NETWORK ((NTSTATUS)0xC0130010L) + #define STATUS_CLUSTER_NO_NET_ADAPTERS ((NTSTATUS)0xC0130011L) + #define STATUS_CLUSTER_NODE_UP ((NTSTATUS)0xC0130012L) + #define STATUS_CLUSTER_NODE_PAUSED ((NTSTATUS)0xC0130013L) + #define STATUS_CLUSTER_NODE_NOT_PAUSED ((NTSTATUS)0xC0130014L) + #define STATUS_CLUSTER_NO_SECURITY_CONTEXT ((NTSTATUS)0xC0130015L) + #define STATUS_CLUSTER_NETWORK_NOT_INTERNAL ((NTSTATUS)0xC0130016L) + #define STATUS_CLUSTER_POISONED ((NTSTATUS)0xC0130017L) /* - * Debug codes - */ + * Debug codes + */ #define DBG_EXCEPTION_HANDLED ((NTSTATUS)0x00010001) #define DBG_CONTINUE ((NTSTATUS)0x00010002) @@@ -42,1086 -1115,8 +1115,8 @@@ #define DBG_NO_STATE_CHANGE ((NTSTATUS)0xC0010001) #define DBG_APP_NOT_IDLE ((NTSTATUS)0xC0010002) - /* - * Exception codes - */ - - #define STATUS_SUCCESS ((NTSTATUS)0x00000000) - #define STATUS_SEVERITY_SUCCESS 0x0 - #define STATUS_SEVERITY_INFORMATIONAL 0x1 - #define STATUS_SEVERITY_WARNING 0x2 - #define STATUS_SEVERITY_ERROR 0x3 - - #define STATUS_WAIT_1 ((NTSTATUS)0x00000001) - #define STATUS_WAIT_2 ((NTSTATUS)0x00000002) - #define STATUS_WAIT_3 ((NTSTATUS)0x00000003) - #define STATUS_WAIT_63 ((NTSTATUS)0x0000003f) - #define STATUS_ABANDONED ((NTSTATUS)0x00000080) - #define STATUS_ABANDONED_WAIT_63 ((NTSTATUS)0x000000BF) - #define STATUS_USER_APC ((NTSTATUS)0x000000C0) - #define STATUS_KERNEL_APC ((NTSTATUS)0x00000100) - #define STATUS_ALERTED ((NTSTATUS)0x00000101) - #define STATUS_TIMEOUT ((NTSTATUS)0x00000102) - #define STATUS_PENDING ((NTSTATUS)0x00000103) - #define STATUS_REPARSE ((NTSTATUS)0x00000104) - #define STATUS_MORE_ENTRIES ((NTSTATUS)0x00000105) - #define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS)0x00000106) - #define STATUS_SOME_NOT_MAPPED ((NTSTATUS)0x00000107) - #define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS)0x00000108) - #define STATUS_VOLUME_MOUNTED ((NTSTATUS)0x00000109) - #define STATUS_RXACT_COMMITTED ((NTSTATUS)0x0000010A) - #define STATUS_NOTIFY_CLEANUP ((NTSTATUS)0x0000010B) - #define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS)0x0000010C) - #define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS)0x0000010D) - #define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS)0x0000010E) - #define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS)0x00000110) - #define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS)0x00000111) - #define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS)0x00000112) - #define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS)0x00000113) - #define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS)0x00000114) - #define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS)0x00000115) - #define STATUS_CRASH_DUMP ((NTSTATUS)0x00000116) - #define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS)0x00000117) - #define STATUS_REPARSE_OBJECT ((NTSTATUS)0x00000118) - #define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS)0x00000119) - #define STATUS_TRANSLATION_COMPLETE ((NTSTATUS)0x00000120) - #define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS)0x00000121) - #define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS)0x00000122) - #define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS)0x00000123) - #define STATUS_PROCESS_IN_JOB ((NTSTATUS)0x00000124) - #define STATUS_VOLSNAP_HIBERNATE_READY ((NTSTATUS)0x00000125) - #define STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY ((NTSTATUS)0x00000126) - - #define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS)0x40000000) - #define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS)0x40000001) - #define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS)0x40000002) - #define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS)0x40000003) - #define STATUS_RXACT_STATE_CREATED ((NTSTATUS)0x40000004) - #define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS)0x40000005) - #define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS)0x40000006) - #define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS)0x40000007) - #define STATUS_SERIAL_MORE_WRITES ((NTSTATUS)0x40000008) - #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009) - #define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS)0x4000000A) - #define STATUS_FT_WRITE_RECOVERY ((NTSTATUS)0x4000000B) - #define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS)0x4000000C) - #define STATUS_NULL_LM_PASSWORD ((NTSTATUS)0x4000000D) - #define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS)0x4000000E) - #define STATUS_RECEIVE_PARTIAL ((NTSTATUS)0x4000000F) - #define STATUS_RECEIVE_EXPEDITED ((NTSTATUS)0x40000010) - #define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS)0x40000011) - #define STATUS_EVENT_DONE ((NTSTATUS)0x40000012) - #define STATUS_EVENT_PENDING ((NTSTATUS)0x40000013) - #define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS)0x40000014) - #define STATUS_FATAL_APP_EXIT ((NTSTATUS)0x40000015) - #define STATUS_PREDEFINED_HANDLE ((NTSTATUS)0x40000016) - #define STATUS_WAS_UNLOCKED ((NTSTATUS)0x40000017) - #define STATUS_SERVICE_NOTIFICATION ((NTSTATUS)0x40000018) - #define STATUS_WAS_LOCKED ((NTSTATUS)0x40000019) - #define STATUS_LOG_HARD_ERROR ((NTSTATUS)0x4000001A) - #define STATUS_ALREADY_WIN32 ((NTSTATUS)0x4000001B) - #define STATUS_WX86_UNSIMULATE ((NTSTATUS)0x4000001C) - #define STATUS_WX86_CONTINUE ((NTSTATUS)0x4000001D) - #define STATUS_WX86_SINGLE_STEP ((NTSTATUS)0x4000001E) - #define STATUS_WX86_BREAKPOINT ((NTSTATUS)0x4000001F) - #define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS)0x40000020) - #define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS)0x40000021) - #define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS)0x40000022) - #define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS)0x40000023) - #define STATUS_NO_YIELD_PERFORMED ((NTSTATUS)0x40000024) - #define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS)0x40000025) - #define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS)0x40000026) - #define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS)0x40000027) - #define STATUS_WX86_CREATEWX86TIB ((NTSTATUS)0x40000028) - #define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS)0x40000029) - #define STATUS_HIBERNATED ((NTSTATUS)0x4000002A) - #define STATUS_RESUME_HIBERNATION ((NTSTATUS)0x4000002B) - #define STATUS_FIRMWARE_UPDATED ((NTSTATUS)0x4000002C) - #define STATUS_WAKE_SYSTEM ((NTSTATUS)0x40000294) - #define STATUS_DS_SHUTTING_DOWN ((NTSTATUS)0x40000370) - - #define RPC_NT_UUID_LOCAL_ONLY ((NTSTATUS)0x40020056) - #define RPC_NT_SEND_INCOMPLETE ((NTSTATUS)0x400200AF) - - #define STATUS_CTX_CDM_CONNECT ((NTSTATUS)0x400A0004) - #define STATUS_CTX_CDM_DISCONNECT ((NTSTATUS)0x400A0005) - - #define STATUS_SXS_RELEASE_ACTIVATION_CONTEXT ((NTSTATUS)0x4015000D) - - #define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS)0x80000001) - #define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS)0x80000002) - #define STATUS_BREAKPOINT ((NTSTATUS)0x80000003) - #define STATUS_SINGLE_STEP ((NTSTATUS)0x80000004) - #define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005) - #define STATUS_NO_MORE_FILES ((NTSTATUS)0x80000006) - #define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS)0x80000007) - - #define STATUS_HANDLES_CLOSED ((NTSTATUS)0x8000000A) - #define STATUS_NO_INHERITANCE ((NTSTATUS)0x8000000B) - #define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS)0x8000000C) - #define STATUS_PARTIAL_COPY ((NTSTATUS)0x8000000D) - #define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS)0x8000000E) - #define STATUS_DEVICE_POWERED_OFF ((NTSTATUS)0x8000000F) - #define STATUS_DEVICE_OFF_LINE ((NTSTATUS)0x80000010) - #define STATUS_DEVICE_BUSY ((NTSTATUS)0x80000011) - #define STATUS_NO_MORE_EAS ((NTSTATUS)0x80000012) - #define STATUS_INVALID_EA_NAME ((NTSTATUS)0x80000013) - #define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS)0x80000014) - #define STATUS_INVALID_EA_FLAG ((NTSTATUS)0x80000015) - #define STATUS_VERIFY_REQUIRED ((NTSTATUS)0x80000016) - #define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS)0x80000017) - #define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS)0x80000018) - #define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001A) - #define STATUS_FILEMARK_DETECTED ((NTSTATUS)0x8000001B) - #define STATUS_MEDIA_CHANGED ((NTSTATUS)0x8000001C) - #define STATUS_BUS_RESET ((NTSTATUS)0x8000001D) - #define STATUS_END_OF_MEDIA ((NTSTATUS)0x8000001E) - #define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS)0x8000001F) - #define STATUS_MEDIA_CHECK ((NTSTATUS)0x80000020) - #define STATUS_SETMARK_DETECTED ((NTSTATUS)0x80000021) - #define STATUS_NO_DATA_DETECTED ((NTSTATUS)0x80000022) - #define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS)0x80000023) - #define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS)0x80000024) - #define STATUS_ALREADY_DISCONNECTED ((NTSTATUS)0x80000025) - #define STATUS_LONGJUMP ((NTSTATUS)0x80000026) - #define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS)0x80000027) - #define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS)0x80000028) - #define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS)0x80000029) - #define STATUS_REGISTRY_HIVE_RECOVERED ((NTSTATUS)0x8000002A) - #define STATUS_DLL_MIGHT_BE_INSECURE ((NTSTATUS)0x8000002B) - #define STATUS_DLL_MIGHT_BE_INCOMPATIBLE ((NTSTATUS)0x8000002C) - - #define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS)0x80000288) - #define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS)0x80000289) - - #define STATUS_CLUSTER_NODE_ALREADY_UP ((NTSTATUS)0x80130001) - #define STATUS_CLUSTER_NODE_ALREADY_DOWN ((NTSTATUS)0x80130002) - #define STATUS_CLUSTER_NETWORK_ALREADY_ONLINE ((NTSTATUS)0x80130003) - #define STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE ((NTSTATUS)0x80130004) - #define STATUS_CLUSTER_NODE_ALREADY_MEMBER ((NTSTATUS)0x80130005) - - #define STATUS_WAIT_0 ((NTSTATUS)0x00000000) - #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001) - #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002) - #define STATUS_INVALID_INFO_CLASS ((NTSTATUS)0xC0000003) - #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004) - #define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005) - #define STATUS_IN_PAGE_ERROR ((NTSTATUS)0xC0000006) - #define STATUS_PAGEFILE_QUOTA ((NTSTATUS)0xC0000007) - #define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008) - #define STATUS_BAD_INITIAL_STACK ((NTSTATUS)0xC0000009) - #define STATUS_BAD_INITIAL_PC ((NTSTATUS)0xC000000A) - #define STATUS_INVALID_CID ((NTSTATUS)0xC000000B) - #define STATUS_TIMER_NOT_CANCELED ((NTSTATUS)0xC000000C) - #define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000D) - #define STATUS_NO_SUCH_DEVICE ((NTSTATUS)0xC000000E) - #define STATUS_NO_SUCH_FILE ((NTSTATUS)0xC000000F) - #define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS)0xC0000010) - #define STATUS_END_OF_FILE ((NTSTATUS)0xC0000011) - #define STATUS_WRONG_VOLUME ((NTSTATUS)0xC0000012) - #define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS)0xC0000013) - #define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS)0xC0000014) - #define STATUS_NONEXISTENT_SECTOR ((NTSTATUS)0xC0000015) - #define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS)0xC0000016) - #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017) - #define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS)0xC0000018) - #define STATUS_NOT_MAPPED_VIEW ((NTSTATUS)0xC0000019) - #define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS)0xC000001A) - #define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS)0xC000001B) - #define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS)0xC000001C) - #define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001D) - #define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS)0xC000001E) - #define STATUS_INVALID_VIEW_SIZE ((NTSTATUS)0xC000001F) - #define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS)0xC0000020) - #define STATUS_ALREADY_COMMITTED ((NTSTATUS)0xC0000021) - #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022) - #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023) - #define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS)0xC0000024) - #define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS)0xC0000025) - #define STATUS_INVALID_DISPOSITION ((NTSTATUS)0xC0000026) - #define STATUS_UNWIND ((NTSTATUS)0xC0000027) - #define STATUS_BAD_STACK ((NTSTATUS)0xC0000028) - #define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS)0xC0000029) - #define STATUS_NOT_LOCKED ((NTSTATUS)0xC000002A) - #define STATUS_PARITY_ERROR ((NTSTATUS)0xC000002B) - #define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS)0xC000002C) - #define STATUS_NOT_COMMITTED ((NTSTATUS)0xC000002D) - #define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS)0xC000002E) - #define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS)0xC000002F) - #define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS)0xC0000030) - #define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS)0xC0000031) - #define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS)0xC0000032) - #define STATUS_OBJECT_NAME_INVALID ((NTSTATUS)0xC0000033) - #define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034) - #define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS)0xC0000035) - #define STATUS_PORT_DISCONNECTED ((NTSTATUS)0xC0000037) - #define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS)0xC0000038) - #define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039) - #define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS)0xC000003A) - #define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS)0xC000003B) - #define STATUS_DATA_OVERRUN ((NTSTATUS)0xC000003C) - #define STATUS_DATA_LATE_ERROR ((NTSTATUS)0xC000003D) - #define STATUS_DATA_ERROR ((NTSTATUS)0xC000003E) - #define STATUS_CRC_ERROR ((NTSTATUS)0xC000003F) - #define STATUS_SECTION_TOO_BIG ((NTSTATUS)0xC0000040) - #define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS)0xC0000041) - #define STATUS_INVALID_PORT_HANDLE ((NTSTATUS)0xC0000042) - #define STATUS_SHARING_VIOLATION ((NTSTATUS)0xC0000043) - #define STATUS_QUOTA_EXCEEDED ((NTSTATUS)0xC0000044) - #define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS)0xC0000045) - #define STATUS_MUTANT_NOT_OWNED ((NTSTATUS)0xC0000046) - #define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS)0xC0000047) - #define STATUS_PORT_ALREADY_SET ((NTSTATUS)0xC0000048) - #define STATUS_SECTION_NOT_IMAGE ((NTSTATUS)0xC0000049) - #define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS)0xC000004A) - #define STATUS_THREAD_IS_TERMINATING ((NTSTATUS)0xC000004B) - #define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS)0xC000004C) - #define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS)0xC000004D) - #define STATUS_SECTION_PROTECTION ((NTSTATUS)0xC000004E) - #define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS)0xC000004F) - #define STATUS_EA_TOO_LARGE ((NTSTATUS)0xC0000050) - #define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS)0xC0000051) - #define STATUS_NO_EAS_ON_FILE ((NTSTATUS)0xC0000052) - #define STATUS_EA_CORRUPT_ERROR ((NTSTATUS)0xC0000053) - #define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS)0xC0000054) - #define STATUS_LOCK_NOT_GRANTED ((NTSTATUS)0xC0000055) - #define STATUS_DELETE_PENDING ((NTSTATUS)0xC0000056) - #define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS)0xC0000057) - #define STATUS_UNKNOWN_REVISION ((NTSTATUS)0xC0000058) - #define STATUS_REVISION_MISMATCH ((NTSTATUS)0xC0000059) - #define STATUS_INVALID_OWNER ((NTSTATUS)0xC000005A) - #define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS)0xC000005B) - #define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS)0xC000005C) - #define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS)0xC000005D) - #define STATUS_NO_LOGON_SERVERS ((NTSTATUS)0xC000005E) - #define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS)0xC000005F) - #define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS)0xC0000060) - #define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS)0xC0000061) - #define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS)0xC0000062) - #define STATUS_USER_EXISTS ((NTSTATUS)0xC0000063) - #define STATUS_NO_SUCH_USER ((NTSTATUS)0xC0000064) - #define STATUS_GROUP_EXISTS ((NTSTATUS)0xC0000065) - #define STATUS_NO_SUCH_GROUP ((NTSTATUS)0xC0000066) - #define STATUS_MEMBER_IN_GROUP ((NTSTATUS)0xC0000067) - #define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS)0xC0000068) - #define STATUS_LAST_ADMIN ((NTSTATUS)0xC0000069) - #define STATUS_WRONG_PASSWORD ((NTSTATUS)0xC000006A) - #define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS)0xC000006B) - #define STATUS_PASSWORD_RESTRICTION ((NTSTATUS)0xC000006C) - #define STATUS_LOGON_FAILURE ((NTSTATUS)0xC000006D) - #define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS)0xC000006E) - #define STATUS_INVALID_LOGON_HOURS ((NTSTATUS)0xC000006F) - #define STATUS_INVALID_WORKSTATION ((NTSTATUS)0xC0000070) - #define STATUS_PASSWORD_EXPIRED ((NTSTATUS)0xC0000071) - #define STATUS_ACCOUNT_DISABLED ((NTSTATUS)0xC0000072) - #define STATUS_NONE_MAPPED ((NTSTATUS)0xC0000073) - #define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS)0xC0000074) - #define STATUS_LUIDS_EXHAUSTED ((NTSTATUS)0xC0000075) - #define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS)0xC0000076) - #define STATUS_INVALID_ACL ((NTSTATUS)0xC0000077) - #define STATUS_INVALID_SID ((NTSTATUS)0xC0000078) - #define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS)0xC0000079) - #define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS)0xC000007A) - #define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS)0xC000007B) - #define STATUS_NO_TOKEN ((NTSTATUS)0xC000007C) - #define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS)0xC000007D) - #define STATUS_RANGE_NOT_LOCKED ((NTSTATUS)0xC000007E) - #define STATUS_DISK_FULL ((NTSTATUS)0xC000007F) - #define STATUS_SERVER_DISABLED ((NTSTATUS)0xC0000080) - #define STATUS_SERVER_NOT_DISABLED ((NTSTATUS)0xC0000081) - #define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS)0xC0000082) - #define STATUS_GUIDS_EXHAUSTED ((NTSTATUS)0xC0000083) - #define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS)0xC0000084) - #define STATUS_AGENTS_EXHAUSTED ((NTSTATUS)0xC0000085) - #define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS)0xC0000086) - #define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS)0xC0000087) - #define STATUS_NOT_MAPPED_DATA ((NTSTATUS)0xC0000088) - #define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS)0xC0000089) - #define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS)0xC000008A) - #define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS)0xC000008B) - #define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS)0xC000008C) - #define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS)0xC000008D) - #define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS)0xC000008E) - #define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS)0xC000008F) - #define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS)0xC0000090) - #define STATUS_FLOAT_OVERFLOW ((NTSTATUS)0xC0000091) - #define STATUS_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000092) - #define STATUS_FLOAT_UNDERFLOW ((NTSTATUS)0xC0000093) - #define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS)0xC0000094) - #define STATUS_INTEGER_OVERFLOW ((NTSTATUS)0xC0000095) - #define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS)0xC0000096) - #define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS)0xC0000097) - #define STATUS_FILE_INVALID ((NTSTATUS)0xC0000098) - #define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS)0xC0000099) - #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A) - #define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS)0xC000009B) - #define STATUS_DEVICE_DATA_ERROR ((NTSTATUS)0xC000009C) - #define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS)0xC000009D) - #define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS)0xC000009E) - #define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS)0xC000009F) - #define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS)0xC00000A0) - #define STATUS_WORKING_SET_QUOTA ((NTSTATUS)0xC00000A1) - #define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS)0xC00000A2) - #define STATUS_DEVICE_NOT_READY ((NTSTATUS)0xC00000A3) - #define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS)0xC00000A4) - #define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS)0xC00000A5) - #define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS)0xC00000A6) - #define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS)0xC00000A7) - #define STATUS_BAD_TOKEN_TYPE ((NTSTATUS)0xC00000A8) - #define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS)0xC00000A9) - #define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS)0xC00000AA) - #define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS)0xC00000AB) - #define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS)0xC00000AC) - #define STATUS_INVALID_PIPE_STATE ((NTSTATUS)0xC00000AD) - #define STATUS_PIPE_BUSY ((NTSTATUS)0xC00000AE) - #define STATUS_ILLEGAL_FUNCTION ((NTSTATUS)0xC00000AF) - #define STATUS_PIPE_DISCONNECTED ((NTSTATUS)0xC00000B0) - #define STATUS_PIPE_CLOSING ((NTSTATUS)0xC00000B1) - #define STATUS_PIPE_CONNECTED ((NTSTATUS)0xC00000B2) - #define STATUS_PIPE_LISTENING ((NTSTATUS)0xC00000B3) - #define STATUS_INVALID_READ_MODE ((NTSTATUS)0xC00000B4) - #define STATUS_IO_TIMEOUT ((NTSTATUS)0xC00000B5) - #define STATUS_FILE_FORCED_CLOSED ((NTSTATUS)0xC00000B6) - #define STATUS_PROFILING_NOT_STARTED ((NTSTATUS)0xC00000B7) - #define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS)0xC00000B8) - #define STATUS_COULD_NOT_INTERPRET ((NTSTATUS)0xC00000B9) - #define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS)0xC00000BA) - #define STATUS_NOT_SUPPORTED ((NTSTATUS)0xC00000BB) - #define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS)0xC00000BC) - #define STATUS_DUPLICATE_NAME ((NTSTATUS)0xC00000BD) - #define STATUS_BAD_NETWORK_PATH ((NTSTATUS)0xC00000BE) - #define STATUS_NETWORK_BUSY ((NTSTATUS)0xC00000BF) - #define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS)0xC00000C0) - #define STATUS_TOO_MANY_COMMANDS ((NTSTATUS)0xC00000C1) - #define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS)0xC00000C2) - #define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS)0xC00000C3) - #define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS)0xC00000C4) - #define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS)0xC00000C5) - #define STATUS_PRINT_QUEUE_FULL ((NTSTATUS)0xC00000C6) - #define STATUS_NO_SPOOL_SPACE ((NTSTATUS)0xC00000C7) - #define STATUS_PRINT_CANCELLED ((NTSTATUS)0xC00000C8) - #define STATUS_NETWORK_NAME_DELETED ((NTSTATUS)0xC00000C9) - #define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS)0xC00000CA) - #define STATUS_BAD_DEVICE_TYPE ((NTSTATUS)0xC00000CB) - #define STATUS_BAD_NETWORK_NAME ((NTSTATUS)0xC00000CC) - #define STATUS_TOO_MANY_NAMES ((NTSTATUS)0xC00000CD) - #define STATUS_TOO_MANY_SESSIONS ((NTSTATUS)0xC00000CE) - #define STATUS_SHARING_PAUSED ((NTSTATUS)0xC00000CF) - #define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS)0xC00000D0) - #define STATUS_REDIRECTOR_PAUSED ((NTSTATUS)0xC00000D1) - #define STATUS_NET_WRITE_FAULT ((NTSTATUS)0xC00000D2) - #define STATUS_PROFILING_AT_LIMIT ((NTSTATUS)0xC00000D3) - #define STATUS_NOT_SAME_DEVICE ((NTSTATUS)0xC00000D4) - #define STATUS_FILE_RENAMED ((NTSTATUS)0xC00000D5) - #define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS)0xC00000D6) - #define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS)0xC00000D7) - #define STATUS_CANT_WAIT ((NTSTATUS)0xC00000D8) - #define STATUS_PIPE_EMPTY ((NTSTATUS)0xC00000D9) - #define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS)0xC00000DA) - #define STATUS_CANT_TERMINATE_SELF ((NTSTATUS)0xC00000DB) - #define STATUS_INVALID_SERVER_STATE ((NTSTATUS)0xC00000DC) - #define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS)0xC00000DD) - #define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS)0xC00000DE) - #define STATUS_NO_SUCH_DOMAIN ((NTSTATUS)0xC00000DF) - #define STATUS_DOMAIN_EXISTS ((NTSTATUS)0xC00000E0) - #define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00000E1) - #define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS)0xC00000E2) - #define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS)0xC00000E3) - #define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS)0xC00000E4) - #define STATUS_INTERNAL_ERROR ((NTSTATUS)0xC00000E5) - #define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS)0xC00000E6) - #define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS)0xC00000E7) - #define STATUS_INVALID_USER_BUFFER ((NTSTATUS)0xC00000E8) - #define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS)0xC00000E9) - #define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS)0xC00000EA) - #define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS)0xC00000EB) - #define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS)0xC00000EC) - #define STATUS_NOT_LOGON_PROCESS ((NTSTATUS)0xC00000ED) - #define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS)0xC00000EE) - #define STATUS_INVALID_PARAMETER_1 ((NTSTATUS)0xC00000EF) - #define STATUS_INVALID_PARAMETER_2 ((NTSTATUS)0xC00000F0) - #define STATUS_INVALID_PARAMETER_3 ((NTSTATUS)0xC00000F1) - #define STATUS_INVALID_PARAMETER_4 ((NTSTATUS)0xC00000F2) - #define STATUS_INVALID_PARAMETER_5 ((NTSTATUS)0xC00000F3) - #define STATUS_INVALID_PARAMETER_6 ((NTSTATUS)0xC00000F4) - #define STATUS_INVALID_PARAMETER_7 ((NTSTATUS)0xC00000F5) - #define STATUS_INVALID_PARAMETER_8 ((NTSTATUS)0xC00000F6) - #define STATUS_INVALID_PARAMETER_9 ((NTSTATUS)0xC00000F7) - #define STATUS_INVALID_PARAMETER_10 ((NTSTATUS)0xC00000F8) - #define STATUS_INVALID_PARAMETER_11 ((NTSTATUS)0xC00000F9) - #define STATUS_INVALID_PARAMETER_12 ((NTSTATUS)0xC00000FA) - #define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS)0xC00000FB) - #define STATUS_REDIRECTOR_STARTED ((NTSTATUS)0xC00000FC) - #define STATUS_STACK_OVERFLOW ((NTSTATUS)0xC00000FD) - #define STATUS_NO_SUCH_PACKAGE ((NTSTATUS)0xC00000FE) - #define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS)0xC00000FF) - #define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS)0xC0000100) - #define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS)0xC0000101) - #define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS)0xC0000102) - #define STATUS_NOT_A_DIRECTORY ((NTSTATUS)0xC0000103) - #define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS)0xC0000104) - #define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS)0xC0000105) - #define STATUS_NAME_TOO_LONG ((NTSTATUS)0xC0000106) - #define STATUS_FILES_OPEN ((NTSTATUS)0xC0000107) - #define STATUS_CONNECTION_IN_USE ((NTSTATUS)0xC0000108) - #define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS)0xC0000109) - #define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS)0xC000010A) - #define STATUS_INVALID_LOGON_TYPE ((NTSTATUS)0xC000010B) - #define STATUS_NO_GUID_TRANSLATION ((NTSTATUS)0xC000010C) - #define STATUS_CANNOT_IMPERSONATE ((NTSTATUS)0xC000010D) - #define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS)0xC000010E) - #define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS)0xC000010F) - #define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS)0xC0000110) - #define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS)0xC0000111) - #define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS)0xC0000112) - #define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS)0xC0000113) - #define STATUS_ABIOS_INVALID_LID ((NTSTATUS)0xC0000114) - #define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS)0xC0000115) - #define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS)0xC0000116) - #define STATUS_NO_LDT ((NTSTATUS)0xC0000117) - #define STATUS_INVALID_LDT_SIZE ((NTSTATUS)0xC0000118) - #define STATUS_INVALID_LDT_OFFSET ((NTSTATUS)0xC0000119) - #define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS)0xC000011A) - #define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS)0xC000011B) - #define STATUS_RXACT_INVALID_STATE ((NTSTATUS)0xC000011C) - #define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS)0xC000011D) - #define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS)0xC000011E) - #define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS)0xC000011F) - #define STATUS_CANCELLED ((NTSTATUS)0xC0000120) - #define STATUS_CANNOT_DELETE ((NTSTATUS)0xC0000121) - #define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS)0xC0000122) - #define STATUS_FILE_DELETED ((NTSTATUS)0xC0000123) - #define STATUS_SPECIAL_ACCOUNT ((NTSTATUS)0xC0000124) - #define STATUS_SPECIAL_GROUP ((NTSTATUS)0xC0000125) - #define STATUS_SPECIAL_USER ((NTSTATUS)0xC0000126) - #define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS)0xC0000127) - #define STATUS_FILE_CLOSED ((NTSTATUS)0xC0000128) - #define STATUS_TOO_MANY_THREADS ((NTSTATUS)0xC0000129) - #define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS)0xC000012A) - #define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS)0xC000012B) - #define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS)0xC000012C) - #define STATUS_COMMITMENT_LIMIT ((NTSTATUS)0xC000012D) - #define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS)0xC000012E) - #define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS)0xC000012F) - #define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS)0xC0000130) - #define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS)0xC0000131) - #define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS)0xC0000132) - #define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS)0xC0000133) - #define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS)0xC0000134) - #define STATUS_DLL_NOT_FOUND ((NTSTATUS)0xC0000135) - #define STATUS_OPEN_FAILED ((NTSTATUS)0xC0000136) - #define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS)0xC0000137) - #define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000138) - #define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000139) - #define STATUS_CONTROL_C_EXIT ((NTSTATUS)0xC000013A) - #define STATUS_LOCAL_DISCONNECT ((NTSTATUS)0xC000013B) - #define STATUS_REMOTE_DISCONNECT ((NTSTATUS)0xC000013C) - #define STATUS_REMOTE_RESOURCES ((NTSTATUS)0xC000013D) - #define STATUS_LINK_FAILED ((NTSTATUS)0xC000013E) - #define STATUS_LINK_TIMEOUT ((NTSTATUS)0xC000013F) - #define STATUS_INVALID_CONNECTION ((NTSTATUS)0xC0000140) - #define STATUS_INVALID_ADDRESS ((NTSTATUS)0xC0000141) - #define STATUS_DLL_INIT_FAILED ((NTSTATUS)0xC0000142) - #define STATUS_MISSING_SYSTEMFILE ((NTSTATUS)0xC0000143) - #define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS)0xC0000144) - #define STATUS_APP_INIT_FAILURE ((NTSTATUS)0xC0000145) - #define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS)0xC0000146) - #define STATUS_NO_PAGEFILE ((NTSTATUS)0xC0000147) - #define STATUS_INVALID_LEVEL ((NTSTATUS)0xC0000148) - #define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS)0xC0000149) - #define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS)0xC000014A) - #define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014B) - #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C) - #define STATUS_REGISTRY_IO_FAILED ((NTSTATUS)0xC000014D) - #define STATUS_NO_EVENT_PAIR ((NTSTATUS)0xC000014E) - #define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS)0xC000014F) - #define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS)0xC0000150) - #define STATUS_NO_SUCH_ALIAS ((NTSTATUS)0xC0000151) - #define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS)0xC0000152) - #define STATUS_MEMBER_IN_ALIAS ((NTSTATUS)0xC0000153) - #define STATUS_ALIAS_EXISTS ((NTSTATUS)0xC0000154) - #define STATUS_LOGON_NOT_GRANTED ((NTSTATUS)0xC0000155) - #define STATUS_TOO_MANY_SECRETS ((NTSTATUS)0xC0000156) - #define STATUS_SECRET_TOO_LONG ((NTSTATUS)0xC0000157) - #define STATUS_INTERNAL_DB_ERROR ((NTSTATUS)0xC0000158) - #define STATUS_FULLSCREEN_MODE ((NTSTATUS)0xC0000159) - #define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS)0xC000015A) - #define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS)0xC000015B) - #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C) - #define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000015D) - #define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS)0xC000015E) - #define STATUS_FT_MISSING_MEMBER ((NTSTATUS)0xC000015F) - #define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS)0xC0000160) - #define STATUS_ILLEGAL_CHARACTER ((NTSTATUS)0xC0000161) - #define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS)0xC0000162) - #define STATUS_UNDEFINED_CHARACTER ((NTSTATUS)0xC0000163) - #define STATUS_FLOPPY_VOLUME ((NTSTATUS)0xC0000164) - #define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS)0xC0000165) - #define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS)0xC0000166) - #define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS)0xC0000167) - #define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS)0xC0000168) - #define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS)0xC0000169) - #define STATUS_DISK_OPERATION_FAILED ((NTSTATUS)0xC000016A) - #define STATUS_DISK_RESET_FAILED ((NTSTATUS)0xC000016B) - #define STATUS_SHARED_IRQ_BUSY ((NTSTATUS)0xC000016C) - #define STATUS_FT_ORPHANING ((NTSTATUS)0xC000016D) - #define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS)0xC000016E) - - #define STATUS_PARTITION_FAILURE ((NTSTATUS)0xC0000172) - #define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS)0xC0000173) - #define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS)0xC0000174) - #define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS)0xC0000175) - #define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS)0xC0000176) - #define STATUS_EOM_OVERFLOW ((NTSTATUS)0xC0000177) - #define STATUS_NO_MEDIA ((NTSTATUS)0xC0000178) - #define STATUS_NO_SUCH_MEMBER ((NTSTATUS)0xC000017A) - #define STATUS_INVALID_MEMBER ((NTSTATUS)0xC000017B) - #define STATUS_KEY_DELETED ((NTSTATUS)0xC000017C) - #define STATUS_NO_LOG_SPACE ((NTSTATUS)0xC000017D) - #define STATUS_TOO_MANY_SIDS ((NTSTATUS)0xC000017E) - #define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000017F) - #define STATUS_KEY_HAS_CHILDREN ((NTSTATUS)0xC0000180) - #define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS)0xC0000181) - #define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS)0xC0000182) - #define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS)0xC0000183) - #define STATUS_INVALID_DEVICE_STATE ((NTSTATUS)0xC0000184) - #define STATUS_IO_DEVICE_ERROR ((NTSTATUS)0xC0000185) - #define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS)0xC0000186) - #define STATUS_BACKUP_CONTROLLER ((NTSTATUS)0xC0000187) - #define STATUS_LOG_FILE_FULL ((NTSTATUS)0xC0000188) - #define STATUS_TOO_LATE ((NTSTATUS)0xC0000189) - #define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS)0xC000018A) - #define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS)0xC000018B) - #define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS)0xC000018C) - #define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS)0xC000018D) - #define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS)0xC000018E) - #define STATUS_EVENTLOG_CANT_START ((NTSTATUS)0xC000018F) - #define STATUS_TRUST_FAILURE ((NTSTATUS)0xC0000190) - #define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS)0xC0000191) - #define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS)0xC0000192) - #define STATUS_ACCOUNT_EXPIRED ((NTSTATUS)0xC0000193) - #define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS)0xC0000194) - #define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS)0xC0000195) - #define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS)0xC0000196) - #define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS)0xC0000197) - #define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS)0xC0000198) - #define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS)0xC0000199) - #define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS)0xC000019A) - #define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS)0xC000019B) - #define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS)0xC000019C) - #define STATUS_NO_USER_SESSION_KEY ((NTSTATUS)0xC0000202) - #define STATUS_USER_SESSION_DELETED ((NTSTATUS)0xC0000203) - #define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS)0xC0000204) - #define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS)0xC0000205) - #define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS)0xC0000206) - #define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS)0xC0000207) - #define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS)0xC0000208) - #define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS)0xC0000209) - #define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS)0xC000020A) - #define STATUS_ADDRESS_CLOSED ((NTSTATUS)0xC000020B) - #define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS)0xC000020C) - #define STATUS_CONNECTION_RESET ((NTSTATUS)0xC000020D) - #define STATUS_TOO_MANY_NODES ((NTSTATUS)0xC000020E) - #define STATUS_TRANSACTION_ABORTED ((NTSTATUS)0xC000020F) - #define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS)0xC0000210) - #define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS)0xC0000211) - #define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS)0xC0000212) - #define STATUS_TRANSACTION_RESPONDED ((NTSTATUS)0xC0000213) - #define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS)0xC0000214) - #define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS)0xC0000215) - #define STATUS_NOT_SERVER_SESSION ((NTSTATUS)0xC0000216) - #define STATUS_NOT_CLIENT_SESSION ((NTSTATUS)0xC0000217) - #define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS)0xC0000218) - #define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS)0xC0000219) - #define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS)0xC000021A) - #define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS)0xC000021B) - #define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS)0xC000021C) - #define STATUS_VDM_HARD_ERROR ((NTSTATUS)0xC000021D) - #define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS)0xC000021E) - #define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS)0xC000021F) - #define STATUS_MAPPED_ALIGNMENT ((NTSTATUS)0xC0000220) - #define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS)0xC0000221) - #define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS)0xC0000222) - #define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS)0xC0000223) - #define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS)0xC0000224) - #define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225) - #define STATUS_NOT_TINY_STREAM ((NTSTATUS)0xC0000226) - #define STATUS_RECOVERY_FAILURE ((NTSTATUS)0xC0000227) - #define STATUS_STACK_OVERFLOW_READ ((NTSTATUS)0xC0000228) - #define STATUS_FAIL_CHECK ((NTSTATUS)0xC0000229) - #define STATUS_DUPLICATE_OBJECTID ((NTSTATUS)0xC000022A) - #define STATUS_OBJECTID_EXISTS ((NTSTATUS)0xC000022B) - #define STATUS_CONVERT_TO_LARGE ((NTSTATUS)0xC000022C) - #define STATUS_RETRY ((NTSTATUS)0xC000022D) - #define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS)0xC000022E) - #define STATUS_ALLOCATE_BUCKET ((NTSTATUS)0xC000022F) - #define STATUS_PROPSET_NOT_FOUND ((NTSTATUS)0xC0000230) - #define STATUS_MARSHALL_OVERFLOW ((NTSTATUS)0xC0000231) - #define STATUS_INVALID_VARIANT ((NTSTATUS)0xC0000232) - #define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS)0xC0000233) - #define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS)0xC0000234) - #define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS)0xC0000235) - #define STATUS_CONNECTION_REFUSED ((NTSTATUS)0xC0000236) - #define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS)0xC0000237) - #define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS)0xC0000238) - #define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS)0xC0000239) - #define STATUS_CONNECTION_INVALID ((NTSTATUS)0xC000023A) - #define STATUS_CONNECTION_ACTIVE ((NTSTATUS)0xC000023B) - #define STATUS_NETWORK_UNREACHABLE ((NTSTATUS)0xC000023C) - #define STATUS_HOST_UNREACHABLE ((NTSTATUS)0xC000023D) - #define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS)0xC000023E) - #define STATUS_PORT_UNREACHABLE ((NTSTATUS)0xC000023F) - #define STATUS_REQUEST_ABORTED ((NTSTATUS)0xC0000240) - #define STATUS_CONNECTION_ABORTED ((NTSTATUS)0xC0000241) - #define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS)0xC0000242) - #define STATUS_USER_MAPPED_FILE ((NTSTATUS)0xC0000243) - #define STATUS_AUDIT_FAILED ((NTSTATUS)0xC0000244) - #define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS)0xC0000245) - #define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS)0xC0000246) - #define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS)0xC0000247) - #define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS)0xC0000248) - #define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS)0xC0000249) - #define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS)0xC0000250) - #define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS)0xC0000251) - #define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS)0xC0000252) - #define STATUS_LPC_REPLY_LOST ((NTSTATUS)0xC0000253) - #define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS)0xC0000254) - #define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS)0xC0000255) - #define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS)0xC0000256) - #define STATUS_PATH_NOT_COVERED ((NTSTATUS)0xC0000257) - #define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS)0xC0000258) - #define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS)0xC0000259) - #define STATUS_PWD_TOO_SHORT ((NTSTATUS)0xC000025A) - #define STATUS_PWD_TOO_RECENT ((NTSTATUS)0xC000025B) - #define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS)0xC000025C) - #define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS)0xC000025E) - #define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS)0xC000025F) - #define STATUS_INVALID_HW_PROFILE ((NTSTATUS)0xC0000260) - #define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS)0xC0000261) - #define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000262) - #define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000263) - #define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS)0xC0000264) - #define STATUS_TOO_MANY_LINKS ((NTSTATUS)0xC0000265) - #define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS)0xC0000266) - #define STATUS_FILE_IS_OFFLINE ((NTSTATUS)0xC0000267) - #define STATUS_EVALUATION_EXPIRATION ((NTSTATUS)0xC0000268) - #define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS)0xC0000269) - #define STATUS_LICENSE_VIOLATION ((NTSTATUS)0xC000026A) - #define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS)0xC000026B) - #define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS)0xC000026C) - #define STATUS_DFS_UNAVAILABLE ((NTSTATUS)0xC000026D) - #define STATUS_VOLUME_DISMOUNTED ((NTSTATUS)0xC000026E) - #define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS)0xC000026F) - #define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000270) - #define STATUS_VALIDATE_CONTINUE ((NTSTATUS)0xC0000271) - #define STATUS_NO_MATCH ((NTSTATUS)0xC0000272) - #define STATUS_NO_MORE_MATCHES ((NTSTATUS)0xC0000273) - #define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS)0xC0000275) - #define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS)0xC0000276) - #define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS)0xC0000277) - #define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS)0xC0000278) - #define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS)0xC0000279) - #define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000280) - #define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS)0xC0000281) - #define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS)0xC0000282) - #define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS)0xC0000283) - #define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS)0xC0000284) - #define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS)0xC0000285) - #define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS)0xC0000286) - #define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS)0xC0000287) - #define STATUS_ENCRYPTION_FAILED ((NTSTATUS)0xC000028A) - #define STATUS_DECRYPTION_FAILED ((NTSTATUS)0xC000028B) - #define STATUS_RANGE_NOT_FOUND ((NTSTATUS)0xC000028C) - #define STATUS_NO_RECOVERY_POLICY ((NTSTATUS)0xC000028D) - #define STATUS_NO_EFS ((NTSTATUS)0xC000028E) - #define STATUS_WRONG_EFS ((NTSTATUS)0xC000028F) - #define STATUS_NO_USER_KEYS ((NTSTATUS)0xC0000290) - #define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS)0xC0000291) - #define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS)0xC0000292) - #define STATUS_FILE_ENCRYPTED ((NTSTATUS)0xC0000293) - #define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS)0xC0000295) - #define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS)0xC0000296) - #define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS)0xC0000297) - #define STATUS_WMI_TRY_AGAIN ((NTSTATUS)0xC0000298) - #define STATUS_SHARED_POLICY ((NTSTATUS)0xC0000299) - #define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS)0xC000029A) - #define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS)0xC000029B) - #define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS)0xC000029C) - #define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS)0xC000029D) - #define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS)0xC000029E) - #define STATUS_NO_TRACKING_SERVICE ((NTSTATUS)0xC000029F) - #define STATUS_SERVER_SID_MISMATCH ((NTSTATUS)0xC00002A0) - #define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS)0xC00002A1) - #define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS)0xC00002A2) - #define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS)0xC00002A3) - #define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS)0xC00002A4) - #define STATUS_DS_BUSY ((NTSTATUS)0xC00002A5) - #define STATUS_DS_UNAVAILABLE ((NTSTATUS)0xC00002A6) - #define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS)0xC00002A7) - #define STATUS_DS_NO_MORE_RIDS ((NTSTATUS)0xC00002A8) - #define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS)0xC00002A9) - #define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS)0xC00002AA) - #define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS)0xC00002AB) - #define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS)0xC00002AC) - #define STATUS_DS_CANT_ON_RDN ((NTSTATUS)0xC00002AD) - #define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS)0xC00002AE) - #define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS)0xC00002AF) - #define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS)0xC00002B0) - #define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS)0xC00002B1) - #define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS)0xC00002B2) - #define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS)0xC00002B3) - #define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS)0xC00002B4) - #define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS)0xC00002B5) - #define STATUS_DEVICE_REMOVED ((NTSTATUS)0xC00002B6) - #define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS)0xC00002B7) - #define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS)0xC00002B8) - #define STATUS_NOINTERFACE ((NTSTATUS)0xC00002B9) - #define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00002C1) - #define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS)0xC00002C2) - #define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS)0xC00002C3) - #define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS)0xC00002C4) - #define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS)0xC00002C5) - #define STATUS_WMI_READ_ONLY ((NTSTATUS)0xC00002C6) - #define STATUS_WMI_SET_FAILURE ((NTSTATUS)0xC00002C7) - #define STATUS_COMMITMENT_MINIMUM ((NTSTATUS)0xC00002C8) - #define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS)0xC00002C9) - #define STATUS_TRANSPORT_FULL ((NTSTATUS)0xC00002CA) - #define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002CB) - #define STATUS_ONLY_IF_CONNECTED ((NTSTATUS)0xC00002CC) - #define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS)0xC00002CD) - #define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS)0xC00002CE) - #define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS)0xC00002CF) - #define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS)0xC00002D0) - #define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS)0xC00002D1) - #define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS)0xC00002D2) - #define STATUS_POWER_STATE_INVALID ((NTSTATUS)0xC00002D3) - #define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS)0xC00002D4) - #define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D5) - #define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D6) - #define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D7) - #define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC00002D8) - #define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D9) - #define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS)0xC00002DA) - #define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS)0xC00002DB) - #define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS)0xC00002DC) - #define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS)0xC00002DD) - #define STATUS_INSUFFICIENT_POWER ((NTSTATUS)0xC00002DE) - #define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS)0xC00002DF) - #define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS)0xC00002E0) - #define STATUS_DS_CANT_START ((NTSTATUS)0xC00002E1) - #define STATUS_DS_INIT_FAILURE ((NTSTATUS)0xC00002E2) - #define STATUS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002E3) - #define STATUS_DS_GC_REQUIRED ((NTSTATUS)0xC00002E4) - #define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS)0xC00002E5) - #define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS)0xC00002E6) - #define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS)0xC00002E7) - #define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS)0xC00002E8) - #define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS)0xC00002E9) - #define STATUS_CANNOT_MAKE ((NTSTATUS)0xC00002EA) - #define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS)0xC00002EB) - #define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002EC) - #define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002ED) - #define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS)0xC00002EE) - #define STATUS_NO_TGT_REPLY ((NTSTATUS)0xC00002EF) - #define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS)0xC00002F0) - #define STATUS_NO_IP_ADDRESSES ((NTSTATUS)0xC00002F1) - #define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS)0xC00002F2) - #define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS)0xC00002F3) - #define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS)0xC00002F4) - #define STATUS_MUST_BE_KDC ((NTSTATUS)0xC00002F5) - #define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS)0xC00002F6) - #define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS)0xC00002F7) - #define STATUS_NO_PA_DATA ((NTSTATUS)0xC00002F8) - #define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS)0xC00002F9) - #define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS)0xC00002FA) - #define STATUS_KDC_INVALID_REQUEST ((NTSTATUS)0xC00002FB) - #define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS)0xC00002FC) - #define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS)0xC00002FD) - #define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FE) - #define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FF) - #define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS)0xC0000300) - #define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS)0xC0000301) - #define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS)0xC0000302) - #define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS)0xC0000303) - #define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS)0xC0000304) - #define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS)0xC0000305) - #define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS)0xC0000306) - #define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS)0xC0000307) - #define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS)0xC0000308) - #define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS)0xC0000309) - #define STATUS_CSS_REGION_MISMATCH ((NTSTATUS)0xC000030A) - #define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS)0xC000030B) - #define STATUS_PKINIT_FAILURE ((NTSTATUS)0xC0000320) - #define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS)0xC0000321) - #define STATUS_NO_KERB_KEY ((NTSTATUS)0xC0000322) - #define STATUS_HOST_DOWN ((NTSTATUS)0xC0000350) - #define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS)0xC0000351) - #define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS)0xC0000352) - #define STATUS_PORT_NOT_SET ((NTSTATUS)0xC0000353) - #define STATUS_DEBUGGER_INACTIVE ((NTSTATUS)0xC0000354) - #define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS)0xC0000355) - #define STATUS_AUDITING_DISABLED ((NTSTATUS)0xC0000356) - #define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS)0xC0000357) - #define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC0000358) - #define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS)0xC0000359) - #define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS)0xC000035A) - #define STATUS_BAD_BINDINGS ((NTSTATUS)0xC000035B) - #define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS)0xC000035C) - #define STATUS_APPHELP_BLOCK ((NTSTATUS)0xC000035D) - #define STATUS_ALL_SIDS_FILTERED ((NTSTATUS)0xC000035E) - #define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS)0xC000035F) - #define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS)0xC0000361) - #define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS)0xC0000362) - #define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS)0xC0000363) - #define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS)0xC0000364) - #define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS)0xC0000365) - #define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS)0xC0000366) - #define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS)0x00000367) - #define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000368) - #define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS)0xC0000369) - #define STATUS_MCA_OCCURED ((NTSTATUS)0xC000036A) - #define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS)0xC000036B) - #define STATUS_DRIVER_BLOCKED ((NTSTATUS)0xC000036C) - #define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS)0xC000036D) - #define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS)0xC000036E) - #define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS)0xC000036F) - #define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS)0xC0000380) - #define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS)0xC0000381) - #define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS)0xC0000382) - #define STATUS_SMARTCARD_NO_CARD ((NTSTATUS)0xC0000383) - #define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS)0xC0000384) - #define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS)0xC0000385) - #define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS)0xC0000386) - #define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS)0xC0000387) - #define STATUS_DOWNGRADE_DETECTED ((NTSTATUS)0xC0000388) - #define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS)0xC0000389) - #define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS)0xC000038A) - #define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS)0xC000038B) - #define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS)0xC000038C) - #define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS)0xC000038D) - #define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS)0xC000038E) - #define STATUS_SMARTCARD_SILENT_CONTEXT ((NTSTATUS)0xC000038F) - #define STATUS_PER_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS)0xC0000401) - #define STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS)0xC0000402) - #define STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED ((NTSTATUS)0xC0000403) - #define STATUS_DS_NAME_NOT_UNIQUE ((NTSTATUS)0xC0000404) - #define STATUS_DS_DUPLICATE_ID_FOUND ((NTSTATUS)0xC0000405) - #define STATUS_DS_GROUP_CONVERSION_ERROR ((NTSTATUS)0xC0000406) - #define STATUS_VOLSNAP_PREPARE_HIBERNATE ((NTSTATUS)0xC0000407) - #define STATUS_USER2USER_REQUIRED ((NTSTATUS)0xC0000408) - #define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS)0xC0000409) - #define STATUS_NO_S4U_PROT_SUPPORT ((NTSTATUS)0xC000040A) - #define STATUS_CROSSREALM_DELEGATION_FAILURE ((NTSTATUS)0xC000040B) - #define STATUS_REVOCATION_OFFLINE_KDC ((NTSTATUS)0xC000040C) - #define STATUS_ISSUING_CA_UNTRUSTED_KDC ((NTSTATUS)0xC000040D) - #define STATUS_KDC_CERT_EXPIRED ((NTSTATUS)0xC000040E) - #define STATUS_KDC_CERT_REVOKED ((NTSTATUS)0xC000040F) - #define STATUS_PARAMETER_QUOTA_EXCEEDED ((NTSTATUS)0xC0000410) - #define STATUS_HIBERNATION_FAILURE ((NTSTATUS)0xC0000411) - #define STATUS_DELAY_LOAD_FAILED ((NTSTATUS)0xC0000412) - #define STATUS_AUTHENTICATION_FIREWALL_FAILED ((NTSTATUS)0xC0000413) - #define STATUS_VDM_DISALLOWED ((NTSTATUS)0xC0000414) - #define STATUS_HUNG_DISPLAY_DRIVER_THREAD ((NTSTATUS)0xC0000415) - #define STATUS_ASSERTION_FAILURE ((NTSTATUS)0xC0000420L) - #define STATUS_CALLBACK_POP_STACK ((NTSTATUS)0xC0000423) - #define STATUS_WOW_ASSERTION ((NTSTATUS)0xC0009898) - - #define RPC_NT_INVALID_STRING_BINDING ((NTSTATUS)0xC0020001) - #define RPC_NT_WRONG_KIND_OF_BINDING ((NTSTATUS)0xC0020002) - #define RPC_NT_INVALID_BINDING ((NTSTATUS)0xC0020003) - #define RPC_NT_PROTSEQ_NOT_SUPPORTED ((NTSTATUS)0xC0020004) - #define RPC_NT_INVALID_RPC_PROTSEQ ((NTSTATUS)0xC0020005) - #define RPC_NT_INVALID_STRING_UUID ((NTSTATUS)0xC0020006) - #define RPC_NT_INVALID_ENDPOINT_FORMAT ((NTSTATUS)0xC0020007) - #define RPC_NT_INVALID_NET_ADDR ((NTSTATUS)0xC0020008) - #define RPC_NT_NO_ENDPOINT_FOUND ((NTSTATUS)0xC0020009) - #define RPC_NT_INVALID_TIMEOUT ((NTSTATUS)0xC002000A) - #define RPC_NT_OBJECT_NOT_FOUND ((NTSTATUS)0xC002000B) - #define RPC_NT_ALREADY_REGISTERED ((NTSTATUS)0xC002000C) - #define RPC_NT_TYPE_ALREADY_REGISTERED ((NTSTATUS)0xC002000D) - #define RPC_NT_ALREADY_LISTENING ((NTSTATUS)0xC002000E) - #define RPC_NT_NO_PROTSEQS_REGISTERED ((NTSTATUS)0xC002000F) - #define RPC_NT_NOT_LISTENING ((NTSTATUS)0xC0020010) - #define RPC_NT_UNKNOWN_MGR_TYPE ((NTSTATUS)0xC0020011) - #define RPC_NT_UNKNOWN_IF ((NTSTATUS)0xC0020012) - #define RPC_NT_NO_BINDINGS ((NTSTATUS)0xC0020013) - #define RPC_NT_NO_PROTSEQS ((NTSTATUS)0xC0020014) - #define RPC_NT_CANT_CREATE_ENDPOINT ((NTSTATUS)0xC0020015) - #define RPC_NT_OUT_OF_RESOURCES ((NTSTATUS)0xC0020016) - #define RPC_NT_SERVER_UNAVAILABLE ((NTSTATUS)0xC0020017) - #define RPC_NT_SERVER_TOO_BUSY ((NTSTATUS)0xC0020018) - #define RPC_NT_INVALID_NETWORK_OPTIONS ((NTSTATUS)0xC0020019) - #define RPC_NT_NO_CALL_ACTIVE ((NTSTATUS)0xC002001A) - #define RPC_NT_CALL_FAILED ((NTSTATUS)0xC002001B) - #define RPC_NT_CALL_FAILED_DNE ((NTSTATUS)0xC002001C) - #define RPC_NT_PROTOCOL_ERROR ((NTSTATUS)0xC002001D) - #define RPC_NT_UNSUPPORTED_TRANS_SYN ((NTSTATUS)0xC002001F) - #define RPC_NT_UNSUPPORTED_TYPE ((NTSTATUS)0xC0020021) - #define RPC_NT_INVALID_TAG ((NTSTATUS)0xC0020022) - #define RPC_NT_INVALID_BOUND ((NTSTATUS)0xC0020023) - #define RPC_NT_NO_ENTRY_NAME ((NTSTATUS)0xC0020024) - #define RPC_NT_INVALID_NAME_SYNTAX ((NTSTATUS)0xC0020025) - #define RPC_NT_UNSUPPORTED_NAME_SYNTAX ((NTSTATUS)0xC0020026) - #define RPC_NT_UUID_NO_ADDRESS ((NTSTATUS)0xC0020028) - #define RPC_NT_DUPLICATE_ENDPOINT ((NTSTATUS)0xC0020029) - #define RPC_NT_UNKNOWN_AUTHN_TYPE ((NTSTATUS)0xC002002A) - #define RPC_NT_MAX_CALLS_TOO_SMALL ((NTSTATUS)0xC002002B) - #define RPC_NT_STRING_TOO_LONG ((NTSTATUS)0xC002002C) - #define RPC_NT_PROTSEQ_NOT_FOUND ((NTSTATUS)0xC002002D) - #define RPC_NT_PROCNUM_OUT_OF_RANGE ((NTSTATUS)0xC002002E) - #define RPC_NT_BINDING_HAS_NO_AUTH ((NTSTATUS)0xC002002F) - #define RPC_NT_UNKNOWN_AUTHN_SERVICE ((NTSTATUS)0xC0020030) - #define RPC_NT_UNKNOWN_AUTHN_LEVEL ((NTSTATUS)0xC0020031) - #define RPC_NT_INVALID_AUTH_IDENTITY ((NTSTATUS)0xC0020032) - #define RPC_NT_UNKNOWN_AUTHZ_SERVICE ((NTSTATUS)0xC0020033) - #define EPT_NT_INVALID_ENTRY ((NTSTATUS)0xC0020034) - #define EPT_NT_CANT_PERFORM_OP ((NTSTATUS)0xC0020035) - #define EPT_NT_NOT_REGISTERED ((NTSTATUS)0xC0020036) - #define RPC_NT_NOTHING_TO_EXPORT ((NTSTATUS)0xC0020037) - #define RPC_NT_INCOMPLETE_NAME ((NTSTATUS)0xC0020038) - #define RPC_NT_INVALID_VERS_OPTION ((NTSTATUS)0xC0020039) - #define RPC_NT_NO_MORE_MEMBERS ((NTSTATUS)0xC002003A) - #define RPC_NT_NOT_ALL_OBJS_UNEXPORTED ((NTSTATUS)0xC002003B) - #define RPC_NT_INTERFACE_NOT_FOUND ((NTSTATUS)0xC002003C) - #define RPC_NT_ENTRY_ALREADY_EXISTS ((NTSTATUS)0xC002003D) - #define RPC_NT_ENTRY_NOT_FOUND ((NTSTATUS)0xC002003E) - #define RPC_NT_NAME_SERVICE_UNAVAILABLE ((NTSTATUS)0xC002003F) - #define RPC_NT_INVALID_NAF_ID ((NTSTATUS)0xC0020040) - #define RPC_NT_CANNOT_SUPPORT ((NTSTATUS)0xC0020041) - #define RPC_NT_NO_CONTEXT_AVAILABLE ((NTSTATUS)0xC0020042) - #define RPC_NT_INTERNAL_ERROR ((NTSTATUS)0xC0020043) - #define RPC_NT_ZERO_DIVIDE ((NTSTATUS)0xC0020044) - #define RPC_NT_ADDRESS_ERROR ((NTSTATUS)0xC0020045) - #define RPC_NT_FP_DIV_ZERO ((NTSTATUS)0xC0020046) - #define RPC_NT_FP_UNDERFLOW ((NTSTATUS)0xC0020047) - #define RPC_NT_FP_OVERFLOW ((NTSTATUS)0xC0020048) - #define RPC_NT_CALL_IN_PROGRESS ((NTSTATUS)0xC0020049) - #define RPC_NT_NO_MORE_BINDINGS ((NTSTATUS)0xC002004A) - #define RPC_NT_GROUP_MEMBER_NOT_FOUND ((NTSTATUS)0xC002004B) - #define EPT_NT_CANT_CREATE ((NTSTATUS)0xC002004C) - #define RPC_NT_INVALID_OBJECT ((NTSTATUS)0xC002004D) - #define RPC_NT_NO_INTERFACES ((NTSTATUS)0xC002004F) - #define RPC_NT_CALL_CANCELLED ((NTSTATUS)0xC0020050) - #define RPC_NT_BINDING_INCOMPLETE ((NTSTATUS)0xC0020051) - #define RPC_NT_COMM_FAILURE ((NTSTATUS)0xC0020052) - #define RPC_NT_UNSUPPORTED_AUTHN_LEVEL ((NTSTATUS)0xC0020053) - #define RPC_NT_NO_PRINC_NAME ((NTSTATUS)0xC0020054) - #define RPC_NT_NOT_RPC_ERROR ((NTSTATUS)0xC0020055) - #define RPC_NT_SEC_PKG_ERROR ((NTSTATUS)0xC0020057) - #define RPC_NT_NOT_CANCELLED ((NTSTATUS)0xC0020058) - #define RPC_NT_INVALID_ASYNC_HANDLE ((NTSTATUS)0xC0020062) - #define RPC_NT_INVALID_ASYNC_CALL ((NTSTATUS)0xC0020063) - - #define RPC_NT_NO_MORE_ENTRIES ((NTSTATUS)0xC0030001) - #define RPC_NT_SS_CHAR_TRANS_OPEN_FAIL ((NTSTATUS)0xC0030002) - #define RPC_NT_SS_CHAR_TRANS_SHORT_FILE ((NTSTATUS)0xC0030003) - #define RPC_NT_SS_IN_NULL_CONTEXT ((NTSTATUS)0xC0030004) - #define RPC_NT_SS_CONTEXT_MISMATCH ((NTSTATUS)0xC0030005) - #define RPC_NT_SS_CONTEXT_DAMAGED ((NTSTATUS)0xC0030006) - #define RPC_NT_SS_HANDLES_MISMATCH ((NTSTATUS)0xC0030007) - #define RPC_NT_SS_CANNOT_GET_CALL_HANDLE ((NTSTATUS)0xC0030008) - #define RPC_NT_NULL_REF_POINTER ((NTSTATUS)0xC0030009) - #define RPC_NT_ENUM_VALUE_OUT_OF_RANGE ((NTSTATUS)0xC003000A) - #define RPC_NT_BYTE_COUNT_TOO_SMALL ((NTSTATUS)0xC003000B) - #define RPC_NT_BAD_STUB_DATA ((NTSTATUS)0xC003000C) - #define RPC_NT_INVALID_ES_ACTION ((NTSTATUS)0xC0030059) - #define RPC_NT_WRONG_ES_VERSION ((NTSTATUS)0xC003005A) - #define RPC_NT_WRONG_STUB_VERSION ((NTSTATUS)0xC003005B) - #define RPC_NT_INVALID_PIPE_OBJECT ((NTSTATUS)0xC003005C) - #define RPC_NT_INVALID_PIPE_OPERATION ((NTSTATUS)0xC003005D) - #define RPC_NT_WRONG_PIPE_VERSION ((NTSTATUS)0xC003005E) - #define RPC_NT_PIPE_CLOSED ((NTSTATUS)0xC003005F) - #define RPC_NT_PIPE_DISCIPLINE_ERROR ((NTSTATUS)0xC0030060) - #define RPC_NT_PIPE_EMPTY ((NTSTATUS)0xC0030061) - - #define STATUS_PNP_BAD_MPS_TABLE ((NTSTATUS)0xC0040035) - #define STATUS_PNP_TRANSLATION_FAILED ((NTSTATUS)0xC0040036) - #define STATUS_PNP_IRQ_TRANSLATION_FAILED ((NTSTATUS)0xC0040037) - #define STATUS_PNP_INVALID_ID ((NTSTATUS)0xC0040038) - - #define STATUS_CTX_WINSTATION_NAME_INVALID ((NTSTATUS)0xC00A0001) - #define STATUS_CTX_INVALID_PD ((NTSTATUS)0xC00A0002) - #define STATUS_CTX_PD_NOT_FOUND ((NTSTATUS)0xC00A0003) - #define STATUS_CTX_CLOSE_PENDING ((NTSTATUS)0xC00A0006) - #define STATUS_CTX_NO_OUTBUF ((NTSTATUS)0xC00A0007) - #define STATUS_CTX_MODEM_INF_NOT_FOUND ((NTSTATUS)0xC00A0008) - #define STATUS_CTX_INVALID_MODEMNAME ((NTSTATUS)0xC00A0009) - #define STATUS_CTX_RESPONSE_ERROR ((NTSTATUS)0xC00A000A) - #define STATUS_CTX_MODEM_RESPONSE_TIMEOUT ((NTSTATUS)0xC00A000B) - #define STATUS_CTX_MODEM_RESPONSE_NO_CARRIER ((NTSTATUS)0xC00A000C) - #define STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE ((NTSTATUS)0xC00A000D) - #define STATUS_CTX_MODEM_RESPONSE_BUSY ((NTSTATUS)0xC00A000E) - #define STATUS_CTX_MODEM_RESPONSE_VOICE ((NTSTATUS)0xC00A000F) - #define STATUS_CTX_TD_ERROR ((NTSTATUS)0xC00A0010) - #define STATUS_CTX_LICENSE_CLIENT_INVALID ((NTSTATUS)0xC00A0012) - #define STATUS_CTX_LICENSE_NOT_AVAILABLE ((NTSTATUS)0xC00A0013) - #define STATUS_CTX_LICENSE_EXPIRED ((NTSTATUS)0xC00A0014) - #define STATUS_CTX_WINSTATION_NOT_FOUND ((NTSTATUS)0xC00A0015) - #define STATUS_CTX_WINSTATION_NAME_COLLISION ((NTSTATUS)0xC00A0016) - #define STATUS_CTX_WINSTATION_BUSY ((NTSTATUS)0xC00A0017) - #define STATUS_CTX_BAD_VIDEO_MODE ((NTSTATUS)0xC00A0018) - #define STATUS_CTX_GRAPHICS_INVALID ((NTSTATUS)0xC00A0022) - #define STATUS_CTX_NOT_CONSOLE ((NTSTATUS)0xC00A0024) - #define STATUS_CTX_CLIENT_QUERY_TIMEOUT ((NTSTATUS)0xC00A0026) - #define STATUS_CTX_CONSOLE_DISCONNECT ((NTSTATUS)0xC00A0027) - #define STATUS_CTX_CONSOLE_CONNECT ((NTSTATUS)0xC00A0028) - #define STATUS_CTX_SHADOW_DENIED ((NTSTATUS)0xC00A002A) - #define STATUS_CTX_WINSTATION_ACCESS_DENIED ((NTSTATUS)0xC00A002B) - #define STATUS_CTX_INVALID_WD ((NTSTATUS)0xC00A002E) - #define STATUS_CTX_WD_NOT_FOUND ((NTSTATUS)0xC00A002F) - #define STATUS_CTX_SHADOW_INVALID ((NTSTATUS)0xC00A0030) - #define STATUS_CTX_SHADOW_DISABLED ((NTSTATUS)0xC00A0031) - #define STATUS_RDP_PROTOCOL_ERROR ((NTSTATUS)0xC00A0032) - #define STATUS_CTX_CLIENT_LICENSE_NOT_SET ((NTSTATUS)0xC00A0033) - #define STATUS_CTX_CLIENT_LICENSE_IN_USE ((NTSTATUS)0xC00A0034) - #define STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE ((NTSTATUS)0xC00A0035) - #define STATUS_CTX_SHADOW_NOT_RUNNING ((NTSTATUS)0xC00A0036) - - #define STATUS_CLUSTER_INVALID_NODE ((NTSTATUS)0xC0130001) - #define STATUS_CLUSTER_NODE_EXISTS ((NTSTATUS)0xC0130002) - #define STATUS_CLUSTER_JOIN_IN_PROGRESS ((NTSTATUS)0xC0130003) - #define STATUS_CLUSTER_NODE_NOT_FOUND ((NTSTATUS)0xC0130004) - #define STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND ((NTSTATUS)0xC0130005) - #define STATUS_CLUSTER_NETWORK_EXISTS ((NTSTATUS)0xC0130006) - #define STATUS_CLUSTER_NETWORK_NOT_FOUND ((NTSTATUS)0xC0130007) - #define STATUS_CLUSTER_NETINTERFACE_EXISTS ((NTSTATUS)0xC0130008) - #define STATUS_CLUSTER_NETINTERFACE_NOT_FOUND ((NTSTATUS)0xC0130009) - #define STATUS_CLUSTER_INVALID_REQUEST ((NTSTATUS)0xC013000A) - #define STATUS_CLUSTER_INVALID_NETWORK_PROVIDER ((NTSTATUS)0xC013000B) - #define STATUS_CLUSTER_NODE_DOWN ((NTSTATUS)0xC013000C) - #define STATUS_CLUSTER_NODE_UNREACHABLE ((NTSTATUS)0xC013000D) - #define STATUS_CLUSTER_NODE_NOT_MEMBER ((NTSTATUS)0xC013000E) - #define STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS ((NTSTATUS)0xC013000F) - #define STATUS_CLUSTER_INVALID_NETWORK ((NTSTATUS)0xC0130010) - #define STATUS_CLUSTER_NO_NET_ADAPTERS ((NTSTATUS)0xC0130011) - #define STATUS_CLUSTER_NODE_UP ((NTSTATUS)0xC0130012) - #define STATUS_CLUSTER_NODE_PAUSED ((NTSTATUS)0xC0130013) - #define STATUS_CLUSTER_NODE_NOT_PAUSED ((NTSTATUS)0xC0130014) - #define STATUS_CLUSTER_NO_SECURITY_CONTEXT ((NTSTATUS)0xC0130015) - #define STATUS_CLUSTER_NETWORK_NOT_INTERNAL ((NTSTATUS)0xC0130016) - #define STATUS_CLUSTER_POISONED ((NTSTATUS)0xC0130017) - - #define STATUS_SXS_SECTION_NOT_FOUND ((NTSTATUS)0xC0150001) - #define STATUS_SXS_CANT_GEN_ACTCTX ((NTSTATUS)0xC0150002) - #define STATUS_SXS_INVALID_ACTCTXDATA_FORMAT ((NTSTATUS)0xC0150003) - #define STATUS_SXS_ASSEMBLY_NOT_FOUND ((NTSTATUS)0xC0150004) - #define STATUS_SXS_MANIFEST_FORMAT_ERROR ((NTSTATUS)0xC0150005) - #define STATUS_SXS_MANIFEST_PARSE_ERROR ((NTSTATUS)0xC0150006) - #define STATUS_SXS_ACTIVATION_CONTEXT_DISABLED ((NTSTATUS)0xC0150007) - #define STATUS_SXS_KEY_NOT_FOUND ((NTSTATUS)0xC0150008) - #define STATUS_SXS_VERSION_CONFLICT ((NTSTATUS)0xC0150009) - #define STATUS_SXS_WRONG_SECTION_TYPE ((NTSTATUS)0xC015000A) - #define STATUS_SXS_THREAD_QUERIES_DISABLED ((NTSTATUS)0xC015000B) - #define STATUS_SXS_ASSEMBLY_MISSING ((NTSTATUS)0xC015000C) - #define STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET ((NTSTATUS)0xC015000E) - #define STATUS_SXS_EARLY_DEACTIVATION ((NTSTATUS)0xC015000F) - #define STATUS_SXS_INVALID_DEACTIVATION ((NTSTATUS)0xC0150010) - #define STATUS_SXS_MULTIPLE_DEACTIVATION ((NTSTATUS)0xC0150011) - #define STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY ((NTSTATUS)0xC0150012) - #define STATUS_SXS_PROCESS_TERMINATION_REQUESTED ((NTSTATUS)0xC0150013) - #define STATUS_SXS_CORRUPT_ACTIVATION_STACK ((NTSTATUS)0xC0150014) - #define STATUS_SXS_CORRUPTION ((NTSTATUS)0xC0150015) - - #endif /* WIN32_NO_STATUS */ + #ifdef __cplusplus + } + #endif - #endif /* _NTSTATUS_ */ + #endif diff --combined include/psdk/urlmon.idl index d16a3b5d7ec,2ab3b2b021d..2ab3b2b021d --- a/include/psdk/urlmon.idl +++ b/include/psdk/urlmon.idl @@@ -24,6 -24,7 +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; @@@ -1716,6 -1717,105 +1717,105 @@@ interface IUriContainer : IUnknow 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 */ diff --combined include/psdk/wincodec.idl index 8e8dfe60475,1bcb2cd1bad..1bcb2cd1bad --- a/include/psdk/wincodec.idl +++ b/include/psdk/wincodec.idl @@@ -72,6 -72,14 +72,14 @@@ typedef enum WICBitmapEncoderCacheOptio 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 +177,7 @@@ cpp_quote("#define WINCODEC_ERR_UNSUPPO 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 +213,46 @@@ interface IWICBitmapSource : IUnknow [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 +632,19 @@@ interface IWICStream : IStrea [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);") [ diff --combined include/psdk/wincrypt.h index af79c64240d,3f7f4ed6e5b..3f7f4ed6e5b --- a/include/psdk/wincrypt.h +++ b/include/psdk/wincrypt.h @@@ -1339,14 -1339,18 +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 +2782,9 @@@ typedef struct _CTL_FIND_SUBJECT_PAR #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" diff --combined include/reactos/win32k/ntuser.h index 8e59d26b4cc,53a8f6a3311..53a8f6a3311 --- a/include/reactos/win32k/ntuser.h +++ b/include/reactos/win32k/ntuser.h @@@ -2977,7 -2977,7 +2977,7 @@@ BOO NTAPI NtUserTranslateMessage( LPMSG lpMsg, - HKL dwhkl ); + UINT flags ); BOOL NTAPI @@@ -3279,8 -3279,8 +3279,8 @@@ typedef struct tagROSMENUITEMINF 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 diff --combined include/reactos/wine/config.h index b677544aa1b,406b5fb895d..406b5fb895d --- a/include/reactos/wine/config.h +++ b/include/reactos/wine/config.h @@@ -979,17 -979,28 +979,28 @@@ #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 */ diff --combined include/reactos/wine/port.h index 3b1b1c06d3c,6b293173ec2..6b293173ec2 --- a/include/reactos/wine/port.h +++ b/include/reactos/wine/port.h @@@ -148,29 -148,6 +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__ diff --combined lib/sdk/crt/math/i386/pow_asm.s index 6b722fef068,0b79aa5883e..0b79aa5883e --- a/lib/sdk/crt/math/i386/pow_asm.s +++ b/lib/sdk/crt/math/i386/pow_asm.s @@@ -1,121 -1,368 +1,368 @@@ - /* - * 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 , 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 // + 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 // + 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 // + 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) + + diff --combined media/doc/README.WINE index a588c563353,828e413dbc1..828e413dbc1 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@@ -22,7 -22,7 +22,7 @@@ When porting a new DLL from Wine to Rea 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_39 + 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) @@@ -137,7 -137,7 +137,7 @@@ reactos/dll/win32/pstorec # Aut reactos/dll/win32/query # Autosync reactos/dll/win32/rasapi32 # Autosync reactos/dll/win32/resutils # Autosync - reactos/dll/win32/riched20 # Autosync ?? + reactos/dll/win32/riched20 # Autosync reactos/dll/win32/riched32 # Autosync reactos/dll/win32/rpcrt4 # Synced to Wine-0_9_55 reactos/dll/win32/rsabase # Autosync diff --combined media/inf/battery.inf index 33a8fb887a2,70583c10f03..70583c10f03 Binary files differ diff --combined media/inf/cpu.inf index 12416a0d2b6,bc2517dcaa0..bc2517dcaa0 Binary files differ diff --combined media/inf/inf.rbuild index 44ea108fd6e,34d024bee2b..34d024bee2b --- a/media/inf/inf.rbuild +++ b/media/inf/inf.rbuild @@@ -5,6 -5,7 +5,7 @@@ audio.inf battery.inf cdrom.inf + cpu.inf display.inf fdc.inf font.inf @@@ -23,6 -24,7 +24,7 @@@ ports.inf scsi.inf syssetup.inf + usb.inf usbport.inf usbstor.inf xboxdisp.inf diff --combined ntoskrnl/config/cmalloc.c index 37da97ea44b,97dfc1a6e26..97dfc1a6e26 --- a/ntoskrnl/config/cmalloc.c +++ b/ntoskrnl/config/cmalloc.c @@@ -70,14 -70,13 +70,13 @@@ CmpFreeKeyControlBlock(IN PCM_KEY_CONTR KeAcquireGuardedMutex(&CmpAllocBucketLock); /* Sanity check on lock ownership */ - //ASSERT((CmpIsKcbLockedExclusive(Kcb) == TRUE) || - // (CmpTestRegistryLockExclusive() == TRUE)); + CMP_ASSERT_HASH_ENTRY_LOCK(Kcb->ConvKey); /* Add us to the free list */ InsertTailList(&CmpFreeKCBListHead, &Kcb->FreeListEntry); /* Get the allocation page */ - AllocPage = (PCM_ALLOC_PAGE)((ULONG_PTR)Kcb & 0xFFFFF000); + AllocPage = CmpGetAllocPageFromKcb(Kcb); /* Sanity check */ ASSERT(AllocPage->FreeCount != CM_KCBS_PER_PAGE); @@@ -134,7 -133,7 +133,7 @@@ SearchKcbList FreeListEntry); /* Get the allocation page */ - AllocPage = (PCM_ALLOC_PAGE)((ULONG_PTR)CurrentKcb & 0xFFFFF000); + AllocPage = CmpGetAllocPageFromKcb(CurrentKcb); /* Decrease the free count */ ASSERT(AllocPage->FreeCount != 0); @@@ -168,7 -167,7 +167,7 @@@ /* Set it up */ CurrentKcb->PrivateAlloc = TRUE; CurrentKcb->DelayCloseEntry = NULL; - InsertHeadList(&CmpFreeKCBListHead, + InsertTailList(&CmpFreeKCBListHead, &CurrentKcb->FreeListEntry); } @@@ -178,9 -177,7 +177,7 @@@ } /* Allocate a KCB only */ - CurrentKcb = CmpAllocate(sizeof(CM_KEY_CONTROL_BLOCK), - TRUE, - TAG_CM); + CurrentKcb = CmpAllocate(sizeof(CM_KEY_CONTROL_BLOCK), TRUE, TAG_CM); if (CurrentKcb) { /* Set it up */ @@@ -219,7 -216,7 +216,7 @@@ SearchList Entry->ListEntry.Flink = Entry->ListEntry.Blink = NULL; /* Grab the alloc page */ - AllocPage = (PCM_ALLOC_PAGE)((ULONG_PTR)Entry & 0xFFFFF000); + AllocPage = CmpGetAllocPageFromDelayAlloc(Entry); /* Decrease free entries */ ASSERT(AllocPage->FreeCount != 0); @@@ -278,7 -275,7 +275,7 @@@ CmpFreeDelayItem(PVOID Entry InsertTailList(&CmpFreeDelayItemsListHead, &AllocEntry->ListEntry); /* Get the alloc page */ - AllocPage = (PCM_ALLOC_PAGE)((ULONG_PTR)Entry & 0xFFFFF000); + AllocPage = CmpGetAllocPageFromDelayAlloc(Entry); ASSERT(AllocPage->FreeCount != CM_DELAYS_PER_PAGE); /* Increase the number of free items */ diff --combined ntoskrnl/dbgk/dbgkutil.c index 0d5d5713c09,2937d35c4cb..2937d35c4cb --- a/ntoskrnl/dbgk/dbgkutil.c +++ b/ntoskrnl/dbgk/dbgkutil.c @@@ -243,10 -243,10 +243,10 @@@ DbgkCreateThread(IN PETHREAD Thread wcsncpy(Teb->StaticUnicodeBuffer, L"ntdll.dll", sizeof(Teb->StaticUnicodeBuffer) / sizeof(WCHAR)); - Teb->Tib.ArbitraryUserPointer = Teb->StaticUnicodeBuffer; + Teb->NtTib.ArbitraryUserPointer = Teb->StaticUnicodeBuffer; /* Return it in the debug event as well */ - LoadDll->NamePointer = &Teb->Tib.ArbitraryUserPointer; + LoadDll->NamePointer = &Teb->NtTib.ArbitraryUserPointer; } /* Get a handle */ diff --combined ntoskrnl/include/internal/cm_x.h index ed3f3bff629,581a336d636..581a336d636 --- a/ntoskrnl/include/internal/cm_x.h +++ b/ntoskrnl/include/internal/cm_x.h @@@ -254,3 -254,25 +254,25 @@@ CmpConvertKcbSharedToExclusive(IN PCM_K ExReleasePushLock(&GET_HASH_ENTRY(CmpNameCacheTable, \ (k)).Lock); \ } + + // + // Asserts that either the registry or the KCB is locked + // + #define CMP_ASSERT_HASH_ENTRY_LOCK(k) \ + { \ + ASSERT(((GET_HASH_ENTRY(CmpCacheTable, k).Owner == \ + KeGetCurrentThread())) || \ + (CmpTestRegistryLockExclusive() == TRUE)); \ + } + + // + // Gets the page attached to the KCB + // + #define CmpGetAllocPageFromKcb(k) \ + (PCM_ALLOC_PAGE)(((ULONG_PTR)(k)) & ~(PAGE_SIZE - 1)) + + // + // Gets the page attached to the delayed allocation + // + #define CmpGetAllocPageFromDelayAlloc(a) \ + (PCM_ALLOC_PAGE)(((ULONG_PTR)(a)) & ~(PAGE_SIZE - 1)) diff --combined ntoskrnl/io/pnpmgr/pnpmgr.c index e6346378566,9cd6347e957..9cd6347e957 --- a/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/ntoskrnl/io/pnpmgr/pnpmgr.c @@@ -1847,6 -1847,7 +1847,7 @@@ IopActionConfigureChildServices(PDEVICE PUNICODE_STRING Service; UNICODE_STRING ClassGUID; NTSTATUS Status; + DEVICE_CAPABILITIES DeviceCaps; DPRINT("IopActionConfigureChildServices(%p, %p)\n", DeviceNode, Context); @@@ -1920,9 -1921,22 +1921,22 @@@ if (Service->Buffer == NULL) { - IopDeviceNodeSetFlag(DeviceNode, DNF_DISABLED); + if (NT_SUCCESS(IopQueryDeviceCapabilities(DeviceNode, &DeviceCaps)) && + DeviceCaps.RawDeviceOK) + { + DPRINT1("%wZ is using parent bus driver (%wZ)\n", &DeviceNode->InstancePath, &ParentDeviceNode->ServiceName); + + DeviceNode->ServiceName.Length = 0; + DeviceNode->ServiceName.MaximumLength = ParentDeviceNode->ServiceName.MaximumLength; + DeviceNode->ServiceName.Buffer = ExAllocatePool(PagedPool, DeviceNode->ServiceName.MaximumLength); + if (!DeviceNode->ServiceName.Buffer) + return STATUS_SUCCESS; + + RtlCopyUnicodeString(&DeviceNode->ServiceName, &ParentDeviceNode->ServiceName); - if (ClassGUID.Length != 0) + IopDeviceNodeSetFlag(DeviceNode, DNF_LEGACY_DRIVER); + } + else if (ClassGUID.Length != 0) { /* Device has a ClassGUID value, but no Service value. * Suppose it is using the NULL driver, so state the @@@ -1930,6 -1944,10 +1944,10 @@@ DPRINT1("%wZ is using NULL driver\n", &DeviceNode->InstancePath); IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); } + else + { + IopDeviceNodeSetFlag(DeviceNode, DNF_DISABLED); + } return STATUS_SUCCESS; } diff --combined ntoskrnl/ke/i386/usercall.c index a07a0550e01,07ce4442df4..07ce4442df4 --- a/ntoskrnl/ke/i386/usercall.c +++ b/ntoskrnl/ke/i386/usercall.c @@@ -169,7 -169,7 +169,7 @@@ KeUserModeCallback(IN ULONG RoutineInde /* Save the exception list */ Teb = KeGetCurrentThread()->Teb; - ExceptionList = Teb->Tib.ExceptionList; + ExceptionList = Teb->NtTib.ExceptionList; /* Jump to user mode */ *UserEsp = NewStack; @@@ -177,7 -177,7 +177,7 @@@ if (CallbackStatus != STATUS_CALLBACK_POP_STACK) { /* Only restore the exception list if we didn't crash in ring 3 */ - Teb->Tib.ExceptionList = ExceptionList; + Teb->NtTib.ExceptionList = ExceptionList; CallbackStatus = STATUS_SUCCESS; } else diff --combined ntoskrnl/mm/ARM3/procsup.c index e12ad48fe59,24bd11a2586..24bd11a2586 --- a/ntoskrnl/mm/ARM3/procsup.c +++ b/ntoskrnl/mm/ARM3/procsup.c @@@ -517,9 -517,9 +517,9 @@@ MmCreatePeb(IN PEPROCESS Process // // Write subsystem data // - Peb->ImageSubSystem = NtHeaders->OptionalHeader.Subsystem; - Peb->ImageSubSystemMajorVersion = NtHeaders->OptionalHeader.MajorSubsystemVersion; - Peb->ImageSubSystemMinorVersion = NtHeaders->OptionalHeader.MinorSubsystemVersion; + Peb->ImageSubsystem = NtHeaders->OptionalHeader.Subsystem; + Peb->ImageSubsystemMajorVersion = NtHeaders->OptionalHeader.MajorSubsystemVersion; + Peb->ImageSubsystemMinorVersion = NtHeaders->OptionalHeader.MinorSubsystemVersion; // // Check for version data @@@ -635,13 -635,13 +635,13 @@@ MmCreateTeb(IN PEPROCESS Process // // Set TIB Data // - Teb->Tib.ExceptionList = EXCEPTION_CHAIN_END; - Teb->Tib.Self = (PNT_TIB)Teb; + Teb->NtTib.ExceptionList = EXCEPTION_CHAIN_END; + Teb->NtTib.Self = (PNT_TIB)Teb; // // Identify this as an OS/2 V3.0 ("Cruiser") TIB // - Teb->Tib.Version = 30 << 8; + Teb->NtTib.Version = 30 << 8; // // Set TEB Data @@@ -660,8 -660,8 +660,8 @@@ // // Use initial TEB values // - Teb->Tib.StackBase = InitialTeb->StackBase; - Teb->Tib.StackLimit = InitialTeb->StackLimit; + Teb->NtTib.StackBase = InitialTeb->StackBase; + Teb->NtTib.StackLimit = InitialTeb->StackLimit; Teb->DeallocationStack = InitialTeb->AllocatedStackBase; } else @@@ -669,8 -669,8 +669,8 @@@ // // Use grandparent TEB values // - Teb->Tib.StackBase = InitialTeb->PreviousStackBase; - Teb->Tib.StackLimit = InitialTeb->PreviousStackLimit; + Teb->NtTib.StackBase = InitialTeb->PreviousStackBase; + Teb->NtTib.StackLimit = InitialTeb->PreviousStackLimit; } // diff --combined ntoskrnl/po/events.c index 0cd97405a47,8417f2760cc..8417f2760cc --- a/ntoskrnl/po/events.c +++ b/ntoskrnl/po/events.c @@@ -157,6 -157,8 +157,8 @@@ PopAddRemoveSysCapsCallback(IN PVOID No BOOLEAN Arrival; ULONG Caps; NTSTATUS Status; + UNICODE_STRING DeviceName; + UNICODE_STRING DeviceNamePrefix = RTL_CONSTANT_STRING(L"\\??\\"); DPRINT("PopAddRemoveSysCapsCallback(%p %p)\n", NotificationStructure, Context); @@@ -177,10 -179,20 +179,20 @@@ { DPRINT("Arrival of %wZ\n", Notification->SymbolicLinkName); + DeviceName.Length = 0; + DeviceName.MaximumLength = Notification->SymbolicLinkName->MaximumLength + DeviceNamePrefix.MaximumLength; + DeviceName.Buffer = ExAllocatePool(PagedPool, DeviceName.MaximumLength); + if (!DeviceName.Buffer) return STATUS_INSUFFICIENT_RESOURCES; + + RtlCopyUnicodeString(&DeviceName, &DeviceNamePrefix); + RtlAppendUnicodeStringToString(&DeviceName, Notification->SymbolicLinkName); + + DPRINT("Opening handle to %wZ\n", &DeviceName); + /* Open the device */ InitializeObjectAttributes( &ObjectAttributes, - Notification->SymbolicLinkName, + &DeviceName, OBJ_KERNEL_HANDLE, NULL, NULL); diff --combined ntoskrnl/po/power.c index 96a211b5680,e8d37b855fd..e8d37b855fd --- a/ntoskrnl/po/power.c +++ b/ntoskrnl/po/power.c @@@ -47,10 -47,11 +47,11 @@@ PopRequestPowerIrpCompletion(IN PDEVICE RequestPowerItem->PowerState, RequestPowerItem->Context, &Irp->IoStatus); - - ExFreePool(&Irp->IoStatus); + ExFreePool(Context); + IoFreeIrp(Irp); + return STATUS_SUCCESS; } @@@ -137,7 -138,7 +138,7 @@@ PoInitSystem(IN ULONG BootPhase { /* Registry power button notification */ IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange, - 0, /* The registry has not been initialized yet */ + PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, (PVOID)&GUID_DEVICE_SYS_BUTTON, IopRootDeviceNode-> PhysicalDeviceObject->DriverObject, @@@ -358,7 -359,6 +359,6 @@@ PoRequestPowerIrp(IN PDEVICE_OBJECT Dev PDEVICE_OBJECT TopDeviceObject; PIO_STACK_LOCATION Stack; PIRP Irp; - PIO_STATUS_BLOCK IoStatusBlock; PREQUEST_POWER_ITEM RequestPowerItem; NTSTATUS Status; @@@ -370,27 -370,19 +370,19 @@@ 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; } @@@ -404,7 -396,10 +396,10 @@@ 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; diff --combined ntoskrnl/rtl/libsupp.c index ae87fc53d32,27f78952c72..27f78952c72 --- a/ntoskrnl/rtl/libsupp.c +++ b/ntoskrnl/rtl/libsupp.c @@@ -340,8 -340,8 +340,8 @@@ RtlWalkFrameChain(OUT PVOID *Callers } /* Get the stack limits */ - StackBegin = (ULONG_PTR)Teb->Tib.StackLimit; - StackEnd = (ULONG_PTR)Teb->Tib.StackBase; + StackBegin = (ULONG_PTR)Teb->NtTib.StackLimit; + StackEnd = (ULONG_PTR)Teb->NtTib.StackBase; #ifdef _M_IX86 Stack = TrapFrame->Ebp; #elif defined(_M_PPC) diff --combined ntoskrnl/se/semgr.c index 8ed056becb8,4d5739efcc8..4d5739efcc8 --- a/ntoskrnl/se/semgr.c +++ b/ntoskrnl/se/semgr.c @@@ -630,6 -630,37 +630,37 @@@ SepAccessCheck(IN PSECURITY_DESCRIPTOR } } + static PSID + SepGetSDOwner(IN PSECURITY_DESCRIPTOR _SecurityDescriptor) + { + PISECURITY_DESCRIPTOR SecurityDescriptor = _SecurityDescriptor; + PSID Owner; + + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + Owner = (PSID)((ULONG_PTR)SecurityDescriptor->Owner + + (ULONG_PTR)SecurityDescriptor); + else + Owner = (PSID)SecurityDescriptor->Owner; + + return Owner; + } + + static PSID + SepGetSDGroup(IN PSECURITY_DESCRIPTOR _SecurityDescriptor) + { + PISECURITY_DESCRIPTOR SecurityDescriptor = _SecurityDescriptor; + PSID Group; + + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + Group = (PSID)((ULONG_PTR)SecurityDescriptor->Group + + (ULONG_PTR)SecurityDescriptor); + else + Group = (PSID)SecurityDescriptor->Group; + + return Group; + } + + /* PUBLIC FUNCTIONS ***********************************************************/ /* @@@ -704,6 -735,27 +735,27 @@@ NtAccessCheck(IN PSECURITY_DESCRIPTOR S 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, @@@ -713,16 -765,33 +765,33 @@@ NULL); if (!NT_SUCCESS(Status)) { - DPRINT1("Failed to reference token (Status %lx)\n", Status); + DPRINT("Failed to reference token (Status %lx)\n", Status); return Status; } /* Check token type */ if (Token->TokenType != TokenImpersonation) { - DPRINT1("No impersonation token\n"); + DPRINT("No impersonation token\n"); + ObDereferenceObject(Token); + return STATUS_NO_IMPERSONATION_TOKEN; + } + + /* Check the impersonation level */ + if (Token->ImpersonationLevel < SecurityIdentification) + { + DPRINT("Impersonation level < SecurityIdentification\n"); ObDereferenceObject(Token); - return STATUS_ACCESS_DENIED; + return STATUS_BAD_IMPERSONATION_LEVEL; + } + + /* Check security descriptor for valid owner and group */ + if (SepGetSDOwner(SecurityDescriptor)== NULL || + SepGetSDGroup(SecurityDescriptor) == NULL) + { + DPRINT("Security Descriptor does not have a valid group or owner\n"); + ObDereferenceObject(Token); + return STATUS_INVALID_SECURITY_DESCR; } /* Set up the subject context, and lock it */ @@@ -745,8 -814,10 +814,10 @@@ AccessStatus, SecurityIdentification); - /* Unlock subject context and dereference the token */ + /* Unlock subject context */ SeUnlockSubjectContext(&SubjectSecurityContext); + + /* Dereference the token */ ObDereferenceObject(Token); /* Check succeeded */ diff --combined ntoskrnl/se/token.c index c27d7f8c40a,8f73312fde4..8f73312fde4 --- a/ntoskrnl/se/token.c +++ b/ntoskrnl/se/token.c @@@ -1347,6 -1347,14 +1347,14 @@@ NtQueryInformationToken(IN HANDLE Token PSECURITY_IMPERSONATION_LEVEL sil = (PSECURITY_IMPERSONATION_LEVEL)TokenInformation; DPRINT("NtQueryInformationToken(TokenImpersonationLevel)\n"); + + /* Fail if the token is not an impersonation token */ + if (Token->TokenType != TokenImpersonation) + { + Status = STATUS_INVALID_INFO_CLASS; + break; + } + RequiredLength = sizeof(SECURITY_IMPERSONATION_LEVEL); _SEH2_TRY @@@ -2187,7 -2195,7 +2195,7 @@@ NtOpenThreadTokenEx(IN HANDLE ThreadHan { 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; @@@ -2313,9 -2321,9 +2321,9 @@@ } if (NewToken) ObDereferenceObject(NewToken); - + if (CopyOnOpen && NewThread) ObDereferenceObject(NewThread); - + if(NT_SUCCESS(Status)) { _SEH2_TRY diff --combined subsystems/subsystems.rbuild index 49a9029d4da,8dc879444d4..8dc879444d4 --- a/subsystems/subsystems.rbuild +++ b/subsystems/subsystems.rbuild @@@ -1,9 -1,11 +1,11 @@@ - - - + + + + + diff --combined subsystems/win32/win32k/include/menu.h index a9ad71eb3a2,94d7106baa3..94d7106baa3 --- a/subsystems/win32/win32k/include/menu.h +++ b/subsystems/win32/win32k/include/menu.h @@@ -23,7 -23,7 +23,7 @@@ typedef struct _MENU_ITE UNICODE_STRING Text; HBITMAP hbmpItem; RECTL Rect; - UINT XTab; + UINT dxTab; } MENU_ITEM, *PMENU_ITEM; typedef struct _MENU_OBJECT diff --combined subsystems/win32/win32k/include/msgqueue.h index eadc3ab1ecf,5752481c9d4..5752481c9d4 --- a/subsystems/win32/win32k/include/msgqueue.h +++ b/subsystems/win32/win32k/include/msgqueue.h @@@ -187,7 -187,7 +187,7 @@@ co_IntSendMessageTimeout(HWND hWnd LRESULT FASTCALL IntDispatchMessage(MSG* Msg); BOOL FASTCALL - IntTranslateKbdMessage(LPMSG lpMsg, HKL dwhkl); + IntTranslateKbdMessage(LPMSG lpMsg, UINT flags); VOID FASTCALL co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); diff --combined subsystems/win32/win32k/ntuser/keyboard.c index 443919cbb99,0c935a478e0..0c935a478e0 --- a/subsystems/win32/win32k/ntuser/keyboard.c +++ b/subsystems/win32/win32k/ntuser/keyboard.c @@@ -419,7 -419,7 +419,7 @@@ CLEANUP BOOL FASTCALL IntTranslateKbdMessage(LPMSG lpMsg, - HKL dwhkl) + UINT flags) { PTHREADINFO pti; static INT dead_char = 0; diff --combined subsystems/win32/win32k/ntuser/menu.c index f030481a636,9bdbe026cf8..9bdbe026cf8 --- a/subsystems/win32/win32k/ntuser/menu.c +++ b/subsystems/win32/win32k/ntuser/menu.c @@@ -690,8 -690,8 +690,8 @@@ IntGetMenuItemInfo(PMENU_OBJECT Menu, / 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 +842,8 @@@ IntSetMenuItemInfo(PMENU_OBJECT MenuObj 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 +1002,8 @@@ IntBuildMenuItemList(PMENU_OBJECT MenuO 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)) diff --combined subsystems/win32/win32k/ntuser/message.c index e7265c06220,1b244b0e038..1b244b0e038 --- a/subsystems/win32/win32k/ntuser/message.c +++ b/subsystems/win32/win32k/ntuser/message.c @@@ -2285,7 -2285,7 +2285,7 @@@ NtUserDispatchMessage(PMSG UnsafeMsgInf BOOL APIENTRY NtUserTranslateMessage(LPMSG lpMsg, - HKL dwhkl) + UINT flags) { NTSTATUS Status; MSG SafeMsg; @@@ -2301,7 -2301,7 +2301,7 @@@ RETURN( FALSE); } - RETURN( IntTranslateKbdMessage(&SafeMsg, dwhkl)); + RETURN( IntTranslateKbdMessage(&SafeMsg, flags)); CLEANUP: DPRINT("Leave NtUserTranslateMessage: ret=%i\n",_ret_); diff --combined subsystems/win32/win32k/ntuser/windc.c index 608ba2f75d1,00000000000..b870b499a4f mode 100644,000000..100644 --- a/subsystems/win32/win32k/ntuser/windc.c +++ b/subsystems/win32/win32k/ntuser/windc.c @@@ -1,1075 -1,0 +1,1080 @@@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: subsystems/win32/win32k/ntuser/windc.c + * PURPOSE: Window DC management + * COPYRIGHT: Copyright 2007 ReactOS + * + */ + +/* INCLUDES ******************************************************************/ + +#include + +#define NDEBUG +#include + +int FASTCALL CLIPPING_UpdateGCRegion(DC* Dc); + +/* GLOBALS *******************************************************************/ + +/* NOTE - I think we should store this per window station (including gdi objects) */ +/* Answer: No, use the DCE pMonitor to compare with! */ + +static LIST_ENTRY LEDce; +static INT DCECount = 0; // Count of DCE in system. + +#define DCX_CACHECOMPAREMASK (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | \ + DCX_NORESETATTRS | DCX_LOCKWINDOWUPDATE | \ + DCX_LAYEREDWIN | DCX_CACHE | DCX_WINDOW | \ + DCX_PARENTCLIP) + +/* FUNCTIONS *****************************************************************/ + +// +// This should be moved to dc.c or dcutil.c. +// +HDC FASTCALL +DceCreateDisplayDC(VOID) +{ + HDC hDC; + UNICODE_STRING DriverName; + RtlInitUnicodeString(&DriverName, L"DISPLAY"); + hDC = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE); + + co_IntGraphicsCheck(TRUE); + +// +// If NULL, first time through! Build the default window dc! +// + if (hDC && !defaultDCstate) // Ultra HAX! Dedicated to GvG! + { // This is a cheesy way to do this. + PDC dc = DC_LockDc ( hDC ); + defaultDCstate = ExAllocatePoolWithTag(PagedPool, sizeof(DC), TAG_DC); + RtlZeroMemory(defaultDCstate, sizeof(DC)); + defaultDCstate->pdcattr = &defaultDCstate->dcattr; + DC_vCopyState(dc, defaultDCstate, TRUE); + DC_UnlockDc( dc ); + InitializeListHead(&LEDce); + } + return hDC; +} + +static +HRGN FASTCALL +DceGetVisRgn(PWINDOW_OBJECT Window, ULONG Flags, HWND hWndChild, ULONG CFlags) +{ + HRGN VisRgn; + + VisRgn = VIS_ComputeVisibleRegion( Window, + 0 == (Flags & DCX_WINDOW), + 0 != (Flags & DCX_CLIPCHILDREN), + 0 != (Flags & DCX_CLIPSIBLINGS)); + + if (VisRgn == NULL) + VisRgn = IntSysCreateRectRgn(0, 0, 0, 0); + + return VisRgn; +} + +PDCE FASTCALL +DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type) +{ + PDCE pDce; + PWND Wnd = NULL; + + if (Window) Wnd = Window->Wnd; + + pDce = ExAllocatePoolWithTag(PagedPool, sizeof(DCE), TAG_PDCE); + if(!pDce) + return NULL; + + pDce->hDC = DceCreateDisplayDC(); + if (!pDce->hDC) + { + ExFreePoolWithTag(pDce, TAG_PDCE); + return NULL; + } + DCECount++; + DPRINT("Alloc DCE's! %d\n",DCECount); + pDce->hwndCurrent = (Window ? Window->hSelf : NULL); + pDce->pwndOrg = Wnd; + pDce->pwndClip = Wnd; + pDce->hrgnClip = NULL; + pDce->hrgnClipPublic = NULL; + pDce->hrgnSavedVis = NULL; + pDce->ppiOwner = NULL; + + InsertTailList(&LEDce, &pDce->List); + + DCU_SetDcUndeletable(pDce->hDC); + + if (Type == DCE_WINDOW_DC || Type == DCE_CLASS_DC) //Window DCE have ownership. + { + pDce->ptiOwner = GetW32ThreadInfo(); + } + else + { + DPRINT("FREE DCATTR!!!! NOT DCE_WINDOW_DC!!!!! hDC-> %x\n", pDce->hDC); + IntGdiSetDCOwnerEx( pDce->hDC, GDI_OBJ_HMGR_NONE, FALSE); + pDce->ptiOwner = NULL; + } + + if (Type == DCE_CACHE_DC) + { + pDce->DCXFlags = DCX_CACHE | DCX_DCEEMPTY; + } + else + { + pDce->DCXFlags = DCX_DCEBUSY; + if (Wnd) + { + if (Type == DCE_WINDOW_DC) + { + if (Wnd->style & WS_CLIPCHILDREN) pDce->DCXFlags |= DCX_CLIPCHILDREN; + if (Wnd->style & WS_CLIPSIBLINGS) pDce->DCXFlags |= DCX_CLIPSIBLINGS; + } + } + } + return(pDce); +} + +static VOID APIENTRY +DceSetDrawable( PWINDOW_OBJECT Window OPTIONAL, + HDC hDC, + ULONG Flags, + BOOL SetClipOrigin) +{ + PWND Wnd; + DC *dc = DC_LockDc(hDC); + if(!dc) + return; + + if (Window == NULL) + { + dc->ptlDCOrig.x = 0; + dc->ptlDCOrig.y = 0; + } + else + { + Wnd = Window->Wnd; + if (Flags & DCX_WINDOW) + { + dc->ptlDCOrig.x = Wnd->rcWindow.left; + dc->ptlDCOrig.y = Wnd->rcWindow.top; + } + else + { + dc->ptlDCOrig.x = Wnd->rcClient.left; + dc->ptlDCOrig.y = Wnd->rcClient.top; + } + } + DC_UnlockDc(dc); +} + + +static VOID FASTCALL +DceDeleteClipRgn(DCE* Dce) +{ + Dce->DCXFlags &= ~(DCX_EXCLUDERGN | DCX_INTERSECTRGN); + + if (Dce->DCXFlags & DCX_KEEPCLIPRGN ) + { + Dce->DCXFlags &= ~DCX_KEEPCLIPRGN; + } + else if (Dce->hrgnClip != NULL) + { + GDIOBJ_FreeObjByHandle(Dce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT); + } + + Dce->hrgnClip = NULL; + + /* make it dirty so that the vis rgn gets recomputed next time */ + Dce->DCXFlags |= DCX_DCEDIRTY; +} + +static INT FASTCALL +DceReleaseDC(DCE* dce, BOOL EndPaint) +{ + if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_INDESTROY | DCX_DCEEMPTY | DCX_DCEBUSY))) + { + return 0; + } + + /* restore previous visible region */ + if ((dce->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) && + ((dce->DCXFlags & DCX_CACHE) || EndPaint)) + { + DceDeleteClipRgn(dce); + } + + if (dce->DCXFlags & DCX_CACHE) + { + if (!(dce->DCXFlags & DCX_NORESETATTRS)) + { + /* make the DC clean so that SetDCState doesn't try to update the vis rgn */ + IntGdiSetHookFlags(dce->hDC, DCHF_VALIDATEVISRGN); + + // Clean the DC + if (!IntGdiCleanDC(dce->hDC)) return 0; + + if (dce->DCXFlags & DCX_DCEDIRTY) + { + /* don't keep around invalidated entries + * because SetDCState() disables hVisRgn updates + * by removing dirty bit. */ + dce->hwndCurrent = 0; + dce->DCXFlags &= DCX_CACHE; + dce->DCXFlags |= DCX_DCEEMPTY; + } + } + dce->DCXFlags &= ~DCX_DCEBUSY; + DPRINT("Exit!!!!! DCX_CACHE!!!!!! hDC-> %x \n", dce->hDC); + if (!IntGdiSetDCOwnerEx( dce->hDC, GDI_OBJ_HMGR_NONE, FALSE)) + return 0; + dce->ptiOwner = NULL; // Reset ownership. + dce->ppiOwner = NULL; + +#if 0 // Need to research and fix before this is a "growing" issue. + if (++DCECache > 32) + { + pLE = LEDce.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + do + { + if (!(pDCE->DCXFlags & DCX_DCEBUSY)) + { /* Free the unused cache DCEs. */ + pDCE = DceFreeDCE(pDCE, TRUE); + if (!pDCE) break; + continue; + } + } + while (pLE != &LEDce ); + } +#endif + } + return 1; // Released! +} + +static VOID FASTCALL +DceUpdateVisRgn(DCE *Dce, PWINDOW_OBJECT Window, ULONG Flags) +{ + HANDLE hRgnVisible = NULL; + ULONG DcxFlags; + PWINDOW_OBJECT DesktopWindow; + + if (Flags & DCX_PARENTCLIP) + { + PWINDOW_OBJECT Parent; + PWND ParentWnd; + + Parent = Window->spwndParent; + if(!Parent) + { + hRgnVisible = NULL; + goto noparent; + } + + ParentWnd = Parent->Wnd; + + if (ParentWnd->style & WS_CLIPSIBLINGS) + { + DcxFlags = DCX_CLIPSIBLINGS | + (Flags & ~(DCX_CLIPCHILDREN | DCX_WINDOW)); + } + else + { + DcxFlags = Flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_WINDOW); + } + hRgnVisible = DceGetVisRgn(Parent, DcxFlags, Window->hSelf, Flags); + } + else if (Window == NULL) + { + DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); + if (NULL != DesktopWindow) + { + hRgnVisible = IntSysCreateRectRgnIndirect(&DesktopWindow->Wnd->rcWindow); + } + else + { + hRgnVisible = NULL; + } + } + else + { + hRgnVisible = DceGetVisRgn(Window, Flags, 0, 0); + } + +noparent: + if (Flags & DCX_INTERSECTRGN) + { + if(Dce->hrgnClip != NULL) + { + NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_AND); + } + else + { + if(hRgnVisible != NULL) + { + REGION_FreeRgnByHandle(hRgnVisible); + } + hRgnVisible = IntSysCreateRectRgn(0, 0, 0, 0); + } + } + else if (Flags & DCX_EXCLUDERGN && Dce->hrgnClip != NULL) + { + NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_DIFF); + } + + Dce->DCXFlags &= ~DCX_DCEDIRTY; + GdiSelectVisRgn(Dce->hDC, hRgnVisible); + + if (Window != NULL) + { + IntEngWindowChanged(Window, WOC_RGN_CLIENT); + } + + if (hRgnVisible != NULL) + { + REGION_FreeRgnByHandle(hRgnVisible); + } +} + +HDC FASTCALL +UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) +{ + PWINDOW_OBJECT Parent; + ULONG DcxFlags; + DCE* Dce = NULL; + BOOL UpdateClipOrigin = FALSE; + PWND Wnd = NULL; + HDC hDC = NULL; + PPROCESSINFO ppi; + PLIST_ENTRY pLE; + + if (NULL == Window) + { + Flags &= ~DCX_USESTYLE; + Flags |= DCX_CACHE; + } + else + Wnd = Window->Wnd; + + if (Flags & (DCX_WINDOW | DCX_PARENTCLIP)) Flags |= DCX_CACHE; + + // When GetDC is called with hWnd nz, DCX_CACHE & _WINDOW are clear w _USESTYLE set. + if (Flags & DCX_USESTYLE) + { + Flags &= ~(DCX_CLIPCHILDREN | DCX_CLIPSIBLINGS | DCX_PARENTCLIP); + if (!(Flags & DCX_WINDOW)) // not window rectangle + { + if (Wnd->pcls->style & CS_PARENTDC) + { + Flags |= DCX_PARENTCLIP; + } + + if (!(Flags & DCX_CACHE) && // Not on the cheap wine list. + !(Wnd->pcls->style & CS_OWNDC) ) + { + if (!(Wnd->pcls->style & CS_CLASSDC)) + // The window is not POWNED or has any CLASS, so we are looking for cheap wine. + Flags |= DCX_CACHE; + else + { + if (Wnd->pcls->pdce) hDC = ((PDCE)Wnd->pcls->pdce)->hDC; + DPRINT("We have CLASS!!\n"); + } + } +/* else // For Testing! + { + DPRINT1("We have POWNER!!\n"); + if (Window->Dce) DPRINT1("We have POWNER with DCE!!\n"); + } +*/ + if (Wnd->style & WS_CLIPSIBLINGS) + { + Flags |= DCX_CLIPSIBLINGS; + } + + if (Wnd->style & WS_CLIPCHILDREN && + !(Wnd->style & WS_MINIMIZE)) + { + Flags |= DCX_CLIPCHILDREN; + } + /* If minized with icon in the set, we are forced to be cheap! */ + if (Wnd->style & WS_MINIMIZE && + Wnd->pcls->hIcon) + { + Flags |= DCX_CACHE; + } + } + else + { + if (Wnd->style & WS_CLIPSIBLINGS) Flags |= DCX_CLIPSIBLINGS; + Flags |= DCX_CACHE; + } + } + + if (Flags & DCX_WINDOW) Flags &= ~DCX_CLIPCHILDREN; + + if (Flags & DCX_NOCLIPCHILDREN) + { + Flags |= DCX_CACHE; + Flags &= ~(DCX_PARENTCLIP | DCX_CLIPCHILDREN); + } + + Parent = (Window ? Window->spwndParent : NULL); + + if (NULL == Window || !(Wnd->style & WS_CHILD) || NULL == Parent) + { + Flags &= ~DCX_PARENTCLIP; + Flags |= DCX_CLIPSIBLINGS; + } + + /* it seems parent clip is ignored when clipping siblings or children */ + if (Flags & (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN)) Flags &= ~DCX_PARENTCLIP; + + if (Flags & DCX_PARENTCLIP) + { + if ((Wnd->style & WS_VISIBLE) && + (Parent->Wnd->style & WS_VISIBLE)) + { + Flags &= ~DCX_CLIPCHILDREN; + if (Parent->Wnd->style & WS_CLIPSIBLINGS) + { + Flags |= DCX_CLIPSIBLINGS; + } + } + } + + // Window nz, check to see if we still own this or it is just cheap wine tonight. + if (!(Flags & DCX_CACHE)) + { + if ( Wnd->head.pti != GetW32ThreadInfo()) + Flags |= DCX_CACHE; // Ah~ Not Powned! Forced to be cheap~ + } + + DcxFlags = Flags & DCX_CACHECOMPAREMASK; + + if (Flags & DCX_CACHE) + { // Scan the cheap wine list for our match. + DCE* DceEmpty = NULL; + DCE* DceUnused = NULL; + KeEnterCriticalRegion(); + pLE = LEDce.Flink; + Dce = CONTAINING_RECORD(pLE, DCE, List); + do + { +// The reason for this you may ask? +// Well, it seems ReactOS calls GetDC with out first creating a desktop DC window! +// Need to test for null here. Not sure if this is a bug or a feature. +// First time use hax, need to use DceAllocDCE during window display init. + if (!Dce) break; +// +// The way I understand this, you can have more than one DC per window. +// Only one Owned if one was requested and saved and one Cached. +// + if ((Dce->DCXFlags & (DCX_CACHE | DCX_DCEBUSY)) == DCX_CACHE) + { + DceUnused = Dce; + if (Dce->DCXFlags & DCX_DCEEMPTY) + { + DceEmpty = Dce; + } + else if (Dce->hwndCurrent == (Window ? Window->hSelf : NULL) && + ((Dce->DCXFlags & DCX_CACHECOMPAREMASK) == DcxFlags)) + { + UpdateClipOrigin = TRUE; + break; + } + } + pLE = Dce->List.Flink; + Dce = CONTAINING_RECORD(pLE, DCE, List); + } + while (pLE != &LEDce); + KeLeaveCriticalRegion(); + + Dce = (DceEmpty == NULL) ? DceUnused : DceEmpty; + + if (Dce == NULL) + { + Dce = DceAllocDCE(NULL, DCE_CACHE_DC); + } + if (!Dce) return NULL; + + Dce->hwndCurrent = (Window ? Window->hSelf : NULL); + } + else // If we are here, we are POWNED or having CLASS. + { + KeEnterCriticalRegion(); + pLE = LEDce.Flink; + Dce = CONTAINING_RECORD(pLE, DCE, List); + do + { // Check for Window handle than HDC match for CLASS. + if ((Dce->hwndCurrent == Window->hSelf) || + (Dce->hDC == hDC)) + break; + pLE = Dce->List.Flink; + Dce = CONTAINING_RECORD(pLE, DCE, List); + } + while (pLE != &LEDce); + KeLeaveCriticalRegion(); + + if ( (Flags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) && + (Dce->DCXFlags & (DCX_INTERSECTRGN|DCX_EXCLUDERGN)) ) + { + DceDeleteClipRgn(Dce); + } + } +// First time use hax, need to use DceAllocDCE during window display init. + if (NULL == Dce) + { + return(NULL); + } + + if (!GDIOBJ_ValidateHandle(Dce->hDC, GDI_OBJECT_TYPE_DC)) + { + DPRINT1("FIXME: Got DCE with invalid hDC! 0x%x\n", Dce->hDC); + Dce->hDC = DceCreateDisplayDC(); + /* FIXME: Handle error */ + } + + Dce->DCXFlags = Flags | DCX_DCEBUSY; + + /* + Bump it up! This prevents the random errors in wine dce tests and with + proper bits set in DCX_CACHECOMPAREMASK. + Reference: + http://www.reactos.org/archives/public/ros-dev/2008-July/010498.html + http://www.reactos.org/archives/public/ros-dev/2008-July/010499.html + */ + if (pLE != &LEDce) + { + RemoveEntryList(&Dce->List); + InsertHeadList(&LEDce, &Dce->List); + } + + /* Introduced in rev 6691 and modified later. */ + if ( (Flags & DCX_INTERSECTUPDATE) && !ClipRegion ) + { + Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN; + Dce->DCXFlags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN; + ClipRegion = Window->hrgnUpdate; + } + + if (ClipRegion == (HRGN) 1) + { + if (!(Flags & DCX_WINDOW)) + { + Dce->hrgnClip = IntSysCreateRectRgnIndirect(&Window->Wnd->rcClient); + } + else + { + Dce->hrgnClip = IntSysCreateRectRgnIndirect(&Window->Wnd->rcWindow); + } + Dce->DCXFlags &= ~DCX_KEEPCLIPRGN; + } + 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; + } + + DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin); + + DceUpdateVisRgn(Dce, Window, Flags); + + if (Dce->DCXFlags & DCX_CACHE) + { + DPRINT("ENTER!!!!!! DCX_CACHE!!!!!! hDC-> %x\n", Dce->hDC); + // Need to set ownership so Sync dcattr will work. + IntGdiSetDCOwnerEx( Dce->hDC, GDI_OBJ_HMGR_POWNED, FALSE); + Dce->ptiOwner = GetW32ThreadInfo(); // Set the temp owning + } + + if ( Wnd && + Wnd->ExStyle & WS_EX_LAYOUTRTL && + !(Flags & DCX_KEEPLAYOUT) ) + { + NtGdiSetLayout(Dce->hDC, -1, LAYOUT_RTL); + } + + if (Dce->DCXFlags & DCX_PROCESSOWNED) + { + ppi = PsGetCurrentProcessWin32Process(); + ppi->W32PF_flags |= W32PF_OWNDCCLEANUP; + Dce->ptiOwner = NULL; + Dce->ppiOwner = ppi; + } + + return(Dce->hDC); +} + +/*********************************************************************** + * DceFreeDCE + */ +PDCE FASTCALL +DceFreeDCE(PDCE pdce, BOOLEAN Force) +{ + DCE *ret; + PLIST_ENTRY pLE; + BOOL Hit = FALSE; + + if (NULL == pdce) return NULL; + + 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); + // Note: Windows sets W32PF_OWNDCCLEANUP and moves on. + if (!IsObjectDead((HGDIOBJ) pdce->hDC)) + { + DC_SetOwnership( pdce->hDC, PsGetCurrentProcess()); + } + else + { + DPRINT1("Attempted to change ownership of an DCEhDC 0x%x currently being destroyed!!!\n",pdce->hDC); + Hit = TRUE; + } + } ++ else ++ { ++ if (!GreGetObjectOwner(pdce->hDC, GDIObjType_DC_TYPE)) ++ DC_SetOwnership( pdce->hDC, PsGetCurrentProcess()); ++ } + + if (!Hit) IntGdiDeleteDC(pdce->hDC, TRUE); + + if (pdce->hrgnClip && !(pdce->DCXFlags & DCX_KEEPCLIPRGN)) + { + GDIOBJ_FreeObjByHandle(pdce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT); + pdce->hrgnClip = NULL; + } + + RemoveEntryList(&pdce->List); + + if (IsListEmpty(&pdce->List)) + { + DPRINT1("List is Empty! DCE! -> %x\n" , pdce); + return NULL; + } + + ExFreePoolWithTag(pdce, TAG_PDCE); + + DCECount--; + DPRINT("Freed DCE's! %d \n", DCECount); + + return ret; +} + +/*********************************************************************** + * DceFreeWindowDCE + * + * Remove owned DCE and reset unreleased cache DCEs. + */ +void FASTCALL +DceFreeWindowDCE(PWINDOW_OBJECT Window) +{ + PDCE pDCE; + PLIST_ENTRY pLE; + + if (DCECount <= 0) + { + DPRINT1("FreeWindowDCE No Entry! %d\n",DCECount); + return; + } + + pLE = LEDce.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + do + { + 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) ) + { + if (!(pDCE->DCXFlags & DCX_CACHE)) /* owned or Class DCE*/ + { + if (Window->Wnd->pcls->style & CS_CLASSDC) /* Test Class first */ + { + if (pDCE->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) /* Class DCE*/ + DceDeleteClipRgn(pDCE); + // Update and reset Vis Rgn and clear the dirty bit. + // Should release VisRgn than reset it to default. + DceUpdateVisRgn(pDCE, Window, pDCE->DCXFlags); + pDCE->DCXFlags = DCX_DCEEMPTY|DCX_CACHE; + pDCE->hwndCurrent = 0; + + DPRINT("POWNED DCE going Cheap!! DCX_CACHE!! hDC-> %x \n", pDCE->hDC); + if (!IntGdiSetDCOwnerEx( pDCE->hDC, GDI_OBJ_HMGR_NONE, FALSE)) + { + 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*/ + { + pDCE = DceFreeDCE(pDCE, FALSE); + if (!pDCE) break; + continue; + } + else + { + DPRINT1("Not POWNED or CLASSDC hwndCurrent -> %x \n", pDCE->hwndCurrent); + ASSERT(FALSE); + } + } + else + { + if (pDCE->DCXFlags & DCX_DCEBUSY) /* shared cache DCE */ + { + /* FIXME: AFAICS we are doing the right thing here so + * this should be a DPRINT. But this is best left as an ERR + * because the 'application error' is likely to come from + * another part of Wine (i.e. it's our fault after all). + * We should change this to DPRINT when ReactOS is more stable + * (for 1.0?). + */ + DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->hSelf); + DceReleaseDC(pDCE, FALSE); + } + pDCE->DCXFlags |= DCX_DCEEMPTY; + pDCE->hwndCurrent = 0; + } + } + pLE = pDCE->List.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + } + while (pLE != &LEDce); +} + +void FASTCALL +DceFreeClassDCE(HDC hDC) +{ + PDCE pDCE; + PLIST_ENTRY pLE; + pLE = LEDce.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + + do + { + if(!pDCE) break; + if (pDCE->hDC == hDC) + { + pDCE = DceFreeDCE(pDCE, TRUE); // Might have gone cheap! + if (!pDCE) break; + continue; + } + pLE = pDCE->List.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + } + while (pLE != &LEDce); +} + +void FASTCALL +DceFreeThreadDCE(PTHREADINFO pti) +{ + PDCE pDCE; + PLIST_ENTRY pLE; + pLE = LEDce.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + + do + { + if(!pDCE) break; + if (pDCE->ptiOwner == pti) + { + if (pDCE->DCXFlags & DCX_CACHE) + { + pDCE = DceFreeDCE(pDCE, TRUE); + if (!pDCE) break; + continue; + } + } + pLE = pDCE->List.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + } + while (pLE != &LEDce); +} + +VOID FASTCALL +DceEmptyCache(VOID) +{ + PDCE pDCE; + PLIST_ENTRY pLE; + pLE = LEDce.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + + do + { + if(!pDCE) break; + pDCE = DceFreeDCE(pDCE, TRUE); + if(!pDCE) break; + } + while (pLE != &LEDce); +} + +VOID FASTCALL +DceResetActiveDCEs(PWINDOW_OBJECT Window) +{ + DCE *pDCE; + PDC dc; + PWINDOW_OBJECT CurrentWindow; + INT DeltaX; + INT DeltaY; + PLIST_ENTRY pLE; + + if (NULL == Window) + { + return; + } + pLE = LEDce.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + if(!pDCE) return; // Another null test! + do + { + if(!pDCE) break; + if(pLE == &LEDce) break; + if (0 == (pDCE->DCXFlags & (DCX_DCEEMPTY|DCX_INDESTROY))) + { + if (Window->hSelf == pDCE->hwndCurrent) + { + CurrentWindow = Window; + } + else + { + CurrentWindow = UserGetWindowObject(pDCE->hwndCurrent); + if (NULL == CurrentWindow) + { + pLE = pDCE->List.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + continue; + } + } + + if (!GDIOBJ_ValidateHandle(pDCE->hDC, GDI_OBJECT_TYPE_DC) || + (dc = DC_LockDc(pDCE->hDC)) == NULL) + { + pLE = pDCE->List.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + continue; + } + if (Window == CurrentWindow || IntIsChildWindow(Window, CurrentWindow)) + { + if (pDCE->DCXFlags & DCX_WINDOW) + { + DeltaX = CurrentWindow->Wnd->rcWindow.left - dc->ptlDCOrig.x; + DeltaY = CurrentWindow->Wnd->rcWindow.top - dc->ptlDCOrig.y; + dc->ptlDCOrig.x = CurrentWindow->Wnd->rcWindow.left; + dc->ptlDCOrig.y = CurrentWindow->Wnd->rcWindow.top; + } + else + { + DeltaX = CurrentWindow->Wnd->rcClient.left - dc->ptlDCOrig.x; + DeltaY = CurrentWindow->Wnd->rcClient.top - dc->ptlDCOrig.y; + dc->ptlDCOrig.x = CurrentWindow->Wnd->rcClient.left; + dc->ptlDCOrig.y = CurrentWindow->Wnd->rcClient.top; + } + if (NULL != dc->rosdc.hClipRgn) + { + NtGdiOffsetRgn(dc->rosdc.hClipRgn, DeltaX, DeltaY); + CLIPPING_UpdateGCRegion(dc); + } + if (NULL != pDCE->hrgnClip) + { + NtGdiOffsetRgn(pDCE->hrgnClip, DeltaX, DeltaY); + } + } + DC_UnlockDc(dc); + + DceUpdateVisRgn(pDCE, CurrentWindow, pDCE->DCXFlags); + + if (Window->hSelf != pDCE->hwndCurrent) + { +// IntEngWindowChanged(CurrentWindow, WOC_RGN_CLIENT); +// UserDerefObject(CurrentWindow); + } + } + pLE = pDCE->List.Flink; + pDCE = CONTAINING_RECORD(pLE, DCE, List); + } + while (pLE != &LEDce); +} + +HWND FASTCALL +IntWindowFromDC(HDC hDc) +{ + DCE *Dce; + PLIST_ENTRY pLE; + HWND Ret = NULL; + + pLE = LEDce.Flink; + Dce = CONTAINING_RECORD(pLE, DCE, List); + do + { + if (Dce->hDC == hDc) + { + if (Dce->DCXFlags & DCX_INDESTROY) + Ret = NULL; + else + Ret = Dce->hwndCurrent; + break; + } + pLE = Dce->List.Flink; + Dce = CONTAINING_RECORD(pLE, DCE, List); + } + while (pLE != &LEDce); + return Ret; +} + +INT FASTCALL +UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint) +{ + PDCE dce; + PLIST_ENTRY pLE; + INT nRet = 0; + BOOL Hit = FALSE; + + DPRINT("%p %p\n", Window, hDc); + pLE = LEDce.Flink; + dce = CONTAINING_RECORD(pLE, DCE, List); + do + { + if(!dce) break; + if (dce->hDC == hDc) + { + Hit = TRUE; + break; + } + pLE = dce->List.Flink; + dce = CONTAINING_RECORD(pLE, DCE, List); + } + while (pLE != &LEDce ); + + if ( Hit && (dce->DCXFlags & DCX_DCEBUSY)) + { + nRet = DceReleaseDC(dce, EndPaint); + } + + return nRet; +} + +HDC FASTCALL +UserGetWindowDC(PWINDOW_OBJECT Wnd) +{ + return UserGetDCEx(Wnd, 0, DCX_USESTYLE | DCX_WINDOW); +} + +HWND FASTCALL +UserGethWnd( HDC hdc, PWNDOBJ *pwndo) +{ + PWNDGDI pWndgdi; + PWINDOW_OBJECT Wnd; + HWND hWnd; + + hWnd = IntWindowFromDC(hdc); + + if (hWnd && !(Wnd = UserGetWindowObject(hWnd))) + { + pWndgdi = (WNDGDI *)IntGetProp(Wnd, AtomWndObj); + + if ( pWndgdi && pWndgdi->Hwnd == hWnd ) + { + if (pwndo) *pwndo = (PWNDOBJ)pWndgdi; + } + } + return hWnd; +} + +HDC APIENTRY +NtUserGetDCEx(HWND hWnd OPTIONAL, HANDLE ClipRegion, ULONG Flags) +{ + PWINDOW_OBJECT Wnd=NULL; + DECLARE_RETURN(HDC); + + DPRINT("Enter NtUserGetDCEx\n"); + UserEnterExclusive(); + + if (hWnd && !(Wnd = UserGetWindowObject(hWnd))) + { + RETURN(NULL); + } + RETURN( UserGetDCEx(Wnd, ClipRegion, Flags)); + +CLEANUP: + DPRINT("Leave NtUserGetDCEx, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} + +/* + * NtUserGetWindowDC + * + * The NtUserGetWindowDC function retrieves the device context (DC) for the + * entire window, including title bar, menus, and scroll bars. A window device + * context permits painting anywhere in a window, because the origin of the + * device context is the upper-left corner of the window instead of the client + * area. + * + * Status + * @implemented + */ +HDC APIENTRY +NtUserGetWindowDC(HWND hWnd) +{ + return NtUserGetDCEx(hWnd, 0, DCX_USESTYLE | DCX_WINDOW); +} + +HDC APIENTRY +NtUserGetDC(HWND hWnd) +{ + DPRINT("NtUGetDC -> %x:%x\n", hWnd, !hWnd ? DCX_CACHE | DCX_WINDOW : DCX_USESTYLE ); + + return NtUserGetDCEx(hWnd, NULL, NULL == hWnd ? DCX_CACHE | DCX_WINDOW : DCX_USESTYLE); +} + +/*! + * Select logical palette into device context. + * \param hDC handle to the device context + * \param hpal handle to the palette + * \param ForceBackground If this value is FALSE the logical palette will be copied to the device palette only when the applicatioon + * is in the foreground. If this value is TRUE then map the colors in the logical palette to the device + * palette colors in the best way. + * \return old palette + * + * \todo implement ForceBackground == TRUE +*/ +HPALETTE +APIENTRY +NtUserSelectPalette(HDC hDC, + HPALETTE hpal, + BOOL ForceBackground) +{ + HPALETTE oldPal; + UserEnterExclusive(); + // Implement window checks + oldPal = GdiSelectPalette( hDC, hpal, ForceBackground); + UserLeave(); + return oldPal; +} + + +/* EOF */ diff --combined subsystems/win32/win32k/objects/gdibatch.c index 6bb56851c55,00000000000..c2b5434a6ae mode 100644,000000..100644 --- a/subsystems/win32/win32k/objects/gdibatch.c +++ b/subsystems/win32/win32k/objects/gdibatch.c @@@ -1,186 -1,0 +1,209 @@@ + +#include + +#define NDEBUG +#include + + +// +// +// Gdi Batch Flush support functions. +// + +// +// DoDeviceSync +// +// based on IntEngEnter from eng/engmisc.c +// +VOID +FASTCALL +DoDeviceSync( SURFOBJ *Surface, PRECTL Rect, FLONG fl) +{ + PPDEVOBJ Device = (PDEVOBJ*)Surface->hdev; +// No punting and "Handle to a surface, provided that the surface is device-managed. +// Otherwise, dhsurf is zero". + if (!(Device->flFlags & PDEV_DRIVER_PUNTED_CALL) && (Surface->dhsurf)) + { + if (Device->DriverFunctions.SynchronizeSurface) + { + Device->DriverFunctions.SynchronizeSurface(Surface, Rect, fl); + } + else + { + if (Device->DriverFunctions.Synchronize) + { + Device->DriverFunctions.Synchronize(Surface->dhpdev, Rect); + } + } + } +} + +VOID +FASTCALL +SynchonizeDriver(FLONG Flags) +{ + SURFOBJ *SurfObj; + PPDEVOBJ Device; + + if (Flags & GCAPS2_SYNCFLUSH) + Flags = DSS_FLUSH_EVENT; + if (Flags & GCAPS2_SYNCTIMER) + Flags = DSS_TIMER_EVENT; + + Device = IntEnumHDev(); +// UNIMPLEMENTED; +//ASSERT(FALSE); + SurfObj = 0;// EngLockSurface( Device->pSurface ); + if(!SurfObj) return; + DoDeviceSync( SurfObj, NULL, Flags); + EngUnlockSurface(SurfObj); + return; +} + +// +// Process the batch. +// +ULONG +FASTCALL +GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) +{ ++ BOOL Hit = FALSE; ++ ULONG Cmd = 0, Size = 0; + PDC_ATTR pdcattr = NULL; + + if (dc) + { - pdcattr = dc->pdcattr; ++ pdcattr = dc->pdcattr; + } - // The thread is approaching the end of sunset. - switch(pHdr->Cmd) ++ ++ _SEH2_TRY ++ { ++ Cmd = pHdr->Cmd; ++ Size = pHdr->Size; // Return the full size of the structure. ++ } ++ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) ++ { ++ Hit = TRUE; ++ } ++ _SEH2_END; ++ ++ if (Hit) ++ { ++ DPRINT1("WARNING! GdiBatch Fault!\n"); ++ return 0; ++ } ++ ++ // FYI! The thread is approaching the end of sunset. ++ switch(Cmd) + { + case GdiBCPatBlt: // Highest pri first! + break; + case GdiBCPolyPatBlt: + break; + case GdiBCTextOut: + break; + case GdiBCExtTextOut: + break; + case GdiBCSetBrushOrg: + { + PGDIBSSETBRHORG pgSBO; + if(!dc) break; + pgSBO = (PGDIBSSETBRHORG) pHdr; + pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin; + break; + } + case GdiBCExtSelClipRgn: + break; + case GdiBCSelObj: + { + PGDIBSOBJECT pgO; + if(!dc) break; + pgO = (PGDIBSOBJECT) pHdr; + TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL); + pdcattr->ulDirty_ &= ~(DIRTY_CHARSET); + } + case GdiBCDelRgn: + DPRINT("Delete Region Object!\n"); + case GdiBCDelObj: + { + PGDIBSOBJECT pgO = (PGDIBSOBJECT) pHdr; + GreDeleteObject( pgO->hgdiobj ); + break; + } + default: + break; + } + - return pHdr->Size; // Return the full size of the structure. ++ return Size; +} + +/* + * NtGdiFlush + * + * Flushes the calling thread's current batch. + */ +VOID +APIENTRY +NtGdiFlush(VOID) +{ + SynchonizeDriver(GCAPS2_SYNCFLUSH); +} + +/* + * NtGdiFlushUserBatch + * + * Callback for thread batch flush routine. + * + * Think small & fast! + */ +NTSTATUS +APIENTRY +NtGdiFlushUserBatch(VOID) +{ + PTEB pTeb = NtCurrentTeb(); + ULONG GdiBatchCount = pTeb->GdiBatchCount; + + if( (GdiBatchCount > 0) && (GdiBatchCount <= (GDIBATCHBUFSIZE/4))) + { + HDC hDC = (HDC) pTeb->GdiTebBatch.HDC; + + /* If hDC is zero and the buffer fills up with delete objects we need + to run anyway. + */ + if (hDC || GdiBatchCount) + { + PCHAR pHdr = (PCHAR)&pTeb->GdiTebBatch.Buffer[0]; + PDC pDC = NULL; + + if (hDC && !IsObjectDead(hDC)) + { + pDC = DC_LockDc(hDC); + } + + // No need to init anything, just go! + for (; GdiBatchCount > 0; GdiBatchCount--) + { ++ ULONG Size; + // Process Gdi Batch! - pHdr += GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr); ++ Size = GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr); ++ if (!Size) break; ++ pHdr += Size; + } + + if (pDC) + { + DC_UnlockDc(pDC); + } + + // Exit and clear out for the next round. + pTeb->GdiTebBatch.Offset = 0; + pTeb->GdiBatchCount = 0; + pTeb->GdiTebBatch.HDC = 0; + } + } + + // FIXME: on xp the function returns &pTeb->RealClientId, maybe VOID? + return STATUS_SUCCESS; +} + +