merge trunk rev : 25663 and 25664 to 0.3.1 branch - update freetype, take care of...
authorMagnus Olsen <magnus@greatlord.com>
Wed, 31 Jan 2007 17:07:19 +0000 (17:07 +0000)
committerMagnus Olsen <magnus@greatlord.com>
Wed, 31 Jan 2007 17:07:19 +0000 (17:07 +0000)
svn path=/branches/ros-branch-0_3_1/; revision=25666

606 files changed:
reactos/Makefile
reactos/base/applications/cacls/cacls.c
reactos/base/applications/cmdutils/find/find.c
reactos/base/applications/games/solitaire/solitaire.cpp
reactos/base/applications/ibrowser/mainframe.cpp
reactos/base/applications/ibrowser/utility/utility.h
reactos/base/applications/ibrowser/utility/xmlstorage.h
reactos/base/applications/ibrowser/webchild.cpp
reactos/base/applications/imagesoft/tooldock.c
reactos/base/applications/network/ftp/ftp.c
reactos/base/applications/network/roshttpd/common/socket.cpp
reactos/base/applications/network/roshttpd/httpd.cpp
reactos/base/applications/network/roshttpd/include/httpd.h
reactos/base/applications/network/roshttpd/include/socket.h
reactos/base/applications/network/telnet/src/tconsole.cpp
reactos/base/applications/regedit/clb/clb.def
reactos/base/applications/taskmgr/proclist.c
reactos/base/applications/testsets/smss/movefile/movefile.cpp
reactos/base/applications/utils/binpatch/patch.c
reactos/base/setup/usetup/bootsup.c
reactos/base/setup/usetup/partlist.c
reactos/base/setup/welcome/welcome.c
reactos/base/shell/explorer/dialogs/searchprogram.cpp
reactos/base/shell/explorer/explorer-fr.rc
reactos/base/shell/explorer/explorer.cpp
reactos/base/shell/explorer/services/shellservices.h
reactos/base/shell/explorer/services/startup.c
reactos/base/shell/explorer/shell/mainframe.cpp
reactos/base/shell/explorer/shell/ntobjfs.cpp
reactos/base/shell/explorer/shell/webchild.cpp
reactos/base/shell/explorer/taskbar/desktopbar.cpp
reactos/base/shell/explorer/utility/utility.h
reactos/base/shell/explorer/utility/xmlstorage.cpp
reactos/base/shell/explorer/utility/xmlstorage.h
reactos/base/system/autochk/autochk.c
reactos/base/system/expand/resource.h
reactos/base/system/rundll32/lang/nl-NL.rc [deleted file]
reactos/base/system/rundll32/rsrc.rc
reactos/base/system/winlogon/screensaver.c
reactos/baseaddress.rbuild
reactos/boot/bootdata/hivesys.inf
reactos/boot/bootdata/packages/reactos.dff
reactos/boot/bootdata/txtsetup.sif
reactos/boot/freeldr/freeldr/bootmgr.c
reactos/boot/freeldr/freeldr/custom.c
reactos/boot/freeldr/freeldr/drivemap.c
reactos/boot/freeldr/freeldr/include/drivemap.h
reactos/boot/freeldr/freeldr/include/linux.h
reactos/boot/freeldr/freeldr/include/miscboot.h
reactos/boot/freeldr/freeldr/include/options.h
reactos/boot/freeldr/freeldr/linuxboot.c
reactos/boot/freeldr/freeldr/miscboot.c
reactos/boot/freeldr/freeldr/reactos/reactos.c
reactos/config.rbuild [new file with mode: 0644]
reactos/config.template.rbuild
reactos/depmap.xsl [deleted file]
reactos/dll/3rdparty/freetype/builds/win32/visualc/freetype.dsp
reactos/dll/3rdparty/freetype/builds/win32/visualc/freetype.sln
reactos/dll/3rdparty/freetype/builds/win32/visualc/freetype.vcproj
reactos/dll/cpl/access/It.rc [deleted file]
reactos/dll/cpl/access/access.rc
reactos/dll/cpl/desk/Fr.rc
reactos/dll/cpl/desk/It.rc
reactos/dll/cpl/desk/Ja.rc
reactos/dll/cpl/desk/Ru.rc
reactos/dll/cpl/desk/Uk.rc
reactos/dll/cpl/desk/appearance.c
reactos/dll/cpl/desk/cz.rc
reactos/dll/cpl/desk/de.rc
reactos/dll/cpl/desk/en.rc
reactos/dll/cpl/desk/es.rc
reactos/dll/cpl/desk/gr.rc
reactos/dll/cpl/desk/hu.rc
reactos/dll/cpl/desk/nl.rc
reactos/dll/cpl/desk/pl.rc
reactos/dll/cpl/desk/preview.c
reactos/dll/cpl/desk/preview.h
reactos/dll/cpl/desk/resource.h
reactos/dll/cpl/desk/sv.rc
reactos/dll/cpl/intl_new/En.rc
reactos/dll/cpl/intl_new/Fr.rc [deleted file]
reactos/dll/cpl/intl_new/currency.c [deleted file]
reactos/dll/cpl/intl_new/date.c [deleted file]
reactos/dll/cpl/intl_new/extra.c
reactos/dll/cpl/intl_new/intl.c
reactos/dll/cpl/intl_new/intl.h
reactos/dll/cpl/intl_new/intl.rbuild
reactos/dll/cpl/intl_new/intl.rc
reactos/dll/cpl/intl_new/langs.c [deleted file]
reactos/dll/cpl/intl_new/locale.c
reactos/dll/cpl/intl_new/nums.c [deleted file]
reactos/dll/cpl/intl_new/resource.h
reactos/dll/cpl/intl_new/setupreg.c [deleted file]
reactos/dll/cpl/intl_new/time.c [deleted file]
reactos/dll/cpl/sysdm/Ja.rc
reactos/dll/cpl/sysdm/computer.c [new file with mode: 0644]
reactos/dll/cpl/sysdm/custclicklink.c [new file with mode: 0644]
reactos/dll/cpl/sysdm/cz.rc
reactos/dll/cpl/sysdm/de.rc
reactos/dll/cpl/sysdm/dk.rc
reactos/dll/cpl/sysdm/en.rc
reactos/dll/cpl/sysdm/es.rc
reactos/dll/cpl/sysdm/fr.rc
reactos/dll/cpl/sysdm/general.c
reactos/dll/cpl/sysdm/hu.rc
reactos/dll/cpl/sysdm/manifest.xml [deleted file]
reactos/dll/cpl/sysdm/nl.rc
reactos/dll/cpl/sysdm/precomp.h
reactos/dll/cpl/sysdm/resource.h
reactos/dll/cpl/sysdm/ru.rc
reactos/dll/cpl/sysdm/startrec.c
reactos/dll/cpl/sysdm/sv.rc
reactos/dll/cpl/sysdm/sysdm.c
reactos/dll/cpl/sysdm/sysdm.rbuild
reactos/dll/cpl/sysdm/sysdm.rc
reactos/dll/cpl/sysdm/uk.rc
reactos/dll/cpl/sysdm/userprofile.c
reactos/dll/cpl/sysdm/virtmem.c
reactos/dll/keyboard/kbdit/kbdit.c [deleted file]
reactos/dll/keyboard/kbdit/kbdit.def [deleted file]
reactos/dll/keyboard/kbdit/kbdit.rbuild [deleted file]
reactos/dll/keyboard/kbdit/kbdit.rc [deleted file]
reactos/dll/keyboard/keyboard.rbuild
reactos/dll/lib.mak [new file with mode: 0644]
reactos/dll/ntdll/ldr/utils.c
reactos/dll/win32/acledit/acledit.def
reactos/dll/win32/aclui/checklist.c
reactos/dll/win32/aclui/misc.c
reactos/dll/win32/aclui/precomp.h
reactos/dll/win32/advapi32/sec/sid.c
reactos/dll/win32/advapi32/service/sctrl.c
reactos/dll/win32/beepmidi/beepmidi.c [deleted file]
reactos/dll/win32/beepmidi/beepmidi.def [deleted file]
reactos/dll/win32/beepmidi/beepmidi.rbuild [deleted file]
reactos/dll/win32/beepmidi/readme.txt [deleted file]
reactos/dll/win32/comdlg32/cdlg.h
reactos/dll/win32/comdlg32/cdlg32.c
reactos/dll/win32/comdlg32/colordlg.c
reactos/dll/win32/comdlg32/comdlg32.rbuild
reactos/dll/win32/comdlg32/comdlg32_ros.diff [deleted file]
reactos/dll/win32/comdlg32/filedlg.c
reactos/dll/win32/comdlg32/filedlg31.c
reactos/dll/win32/comdlg32/filedlgbrowser.c
reactos/dll/win32/comdlg32/filetitle.c
reactos/dll/win32/comdlg32/finddlg32.c
reactos/dll/win32/comdlg32/fontdlg.c
reactos/dll/win32/comdlg32/precomp.h [deleted file]
reactos/dll/win32/comdlg32/printdlg.c
reactos/dll/win32/dbghelp/msc.c
reactos/dll/win32/dbghelp/stack.c
reactos/dll/win32/iphlpapi/iphlpapi_private.h
reactos/dll/win32/kernel32/file/cnotify.c
reactos/dll/win32/kernel32/file/create.c
reactos/dll/win32/kernel32/file/dir.c
reactos/dll/win32/kernel32/file/dosdev.c
reactos/dll/win32/kernel32/file/file.c
reactos/dll/win32/kernel32/file/find.c
reactos/dll/win32/kernel32/file/lock.c
reactos/dll/win32/kernel32/file/npipe.c
reactos/dll/win32/kernel32/file/volume.c
reactos/dll/win32/kernel32/include/debug.h
reactos/dll/win32/kernel32/include/kernel32.h
reactos/dll/win32/kernel32/k32.h
reactos/dll/win32/kernel32/kernel32.rbuild
reactos/dll/win32/kernel32/mem/global.c
reactos/dll/win32/kernel32/mem/heap.c
reactos/dll/win32/kernel32/misc/actctx.c
reactos/dll/win32/kernel32/misc/comm.c
reactos/dll/win32/kernel32/misc/computername.c
reactos/dll/win32/kernel32/misc/console.c
reactos/dll/win32/kernel32/misc/dllmain.c
reactos/dll/win32/kernel32/misc/env.c
reactos/dll/win32/kernel32/misc/errormsg.c
reactos/dll/win32/kernel32/misc/lang.c
reactos/dll/win32/kernel32/misc/lcformat.c
reactos/dll/win32/kernel32/misc/ldr.c
reactos/dll/win32/kernel32/misc/lzexpand_main.c
reactos/dll/win32/kernel32/misc/nls.c
reactos/dll/win32/kernel32/misc/profile.c
reactos/dll/win32/kernel32/misc/recovery.c
reactos/dll/win32/kernel32/misc/stubs.c
reactos/dll/win32/kernel32/nls/ukr.nls
reactos/dll/win32/kernel32/process/create.c [moved from reactos/dll/win32/kernel32/process/procsup.c with 99% similarity]
reactos/dll/win32/kernel32/process/proc.c
reactos/dll/win32/kernel32/string/lstring.c
reactos/dll/win32/kernel32/synch/condvar.c
reactos/dll/win32/kernel32/synch/event.c
reactos/dll/win32/kernel32/synch/mutex.c
reactos/dll/win32/kernel32/synch/sem.c
reactos/dll/win32/kernel32/synch/timer.c
reactos/dll/win32/kernel32/synch/wait.c
reactos/dll/win32/kernel32/thread/thread.c
reactos/dll/win32/msgina/gui.c
reactos/dll/win32/msgina/stubs.c
reactos/dll/win32/msgina/tui.c
reactos/dll/win32/netid/lang/de-DE.rc [deleted file]
reactos/dll/win32/netid/lang/en-US.rc [deleted file]
reactos/dll/win32/netid/netid.c [deleted file]
reactos/dll/win32/netid/netid.rbuild [deleted file]
reactos/dll/win32/netid/netid.rc [deleted file]
reactos/dll/win32/netid/netid.spec [deleted file]
reactos/dll/win32/netid/res/netid.ico [deleted file]
reactos/dll/win32/netid/resource.h [deleted file]
reactos/dll/win32/newdev/newdev.c
reactos/dll/win32/opengl32/opengl32.h
reactos/dll/win32/riched20/editor.c
reactos/dll/win32/setupapi/parser.c
reactos/dll/win32/shell32/shellord.c
reactos/dll/win32/syssetup/syssetup.rc
reactos/dll/win32/syssetup/syssetup_It.rc [deleted file]
reactos/dll/win32/user32/misc/desktop.c
reactos/dll/win32/user32/windows/accel.c
reactos/dll/win32/user32/windows/bitmap.c
reactos/dll/win32/user32/windows/draw.c
reactos/dll/win32/user32/windows/input.c
reactos/dll/win32/version/info.c
reactos/dll/win32/win32.rbuild
reactos/drivers/base/bootvid/vid_vgatext.c
reactos/drivers/base/green/createclose.c
reactos/drivers/base/green/green.h
reactos/drivers/network/dd/ne2000/include/ne2000.h
reactos/drivers/network/tcpip/tcpip/proto.c
reactos/drivers/test/kmtest/ntos_ob.c
reactos/hal/halx86/generic/halinit.c
reactos/hal/halx86/mp/halinit.c
reactos/include/ddk/ndis.h
reactos/include/ddk/ntddft.h [deleted file]
reactos/include/ddk/ntifs.h
reactos/include/ddk/winddk.h
reactos/include/ndk/asm.h
reactos/include/ndk/cctypes.h
reactos/include/ndk/exfuncs.h
reactos/include/ndk/extypes.h
reactos/include/ndk/iotypes.h
reactos/include/ndk/kdtypes.h
reactos/include/ndk/kefuncs.h
reactos/include/ndk/ketypes.h
reactos/include/ndk/ntndk.h
reactos/include/ndk/obfuncs.h
reactos/include/ndk/obtypes.h
reactos/include/ndk/rtlfuncs.h
reactos/include/psdk/intrin.h
reactos/include/psdk/shlobj.h
reactos/include/psdk/winbase.h
reactos/include/psdk/windef.h
reactos/include/psdk/windns.h
reactos/include/psdk/winnt.h
reactos/include/psdk/winuser.h
reactos/include/reactos/version.h
reactos/include/reactos/wine/commdlg.h
reactos/include/reactos/wine/debug.h
reactos/include/reactos/wine/dlgs.h
reactos/include/reactos/wine/objbase.h
reactos/include/reactos/wine/shellapi.h
reactos/include/reactos/wine/shlguid.h
reactos/include/reactos/wine/shlobj.h
reactos/include/reactos/wine/shlwapi.h
reactos/include/reactos/wine/windef.h
reactos/include/reactos/wine/wingdi.h
reactos/include/reactos/wine/winuser.h
reactos/lib/3rdparty/expat/Changes [new file with mode: 0644]
reactos/lib/3rdparty/expat/MANIFEST [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/README.txt [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/all_projects.bpg [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/elements.bpf [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/elements.bpr [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/elements.mak [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expat.bpf [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expat.bpr [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expat.mak [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expat_static.bpf [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expat_static.bpr [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expat_static.mak [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expatw.bpf [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expatw.bpr [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expatw.mak [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expatw_static.bpf [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expatw_static.bpr [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/expatw_static.mak [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/libexpat_mtd.def [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/libexpatw_mtd.def [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/makefile.mak [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/outline.bpf [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/outline.bpr [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/outline.mak [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/setup.bat [new file with mode: 0755]
reactos/lib/3rdparty/expat/bcb5/xmlwf.bpf [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/xmlwf.bpr [new file with mode: 0644]
reactos/lib/3rdparty/expat/bcb5/xmlwf.mak [new file with mode: 0644]
reactos/lib/3rdparty/expat/buildconf.sh [new file with mode: 0644]
reactos/lib/3rdparty/expat/configure.in [new file with mode: 0644]
reactos/lib/3rdparty/expat/conftools/PrintPath [new file with mode: 0644]
reactos/lib/3rdparty/expat/conftools/ac_c_bigendian_cross.m4 [new file with mode: 0644]
reactos/lib/3rdparty/expat/conftools/config.guess [new file with mode: 0644]
reactos/lib/3rdparty/expat/conftools/config.sub [new file with mode: 0644]
reactos/lib/3rdparty/expat/conftools/expat.m4 [new file with mode: 0644]
reactos/lib/3rdparty/expat/conftools/get-version.sh [new file with mode: 0644]
reactos/lib/3rdparty/expat/conftools/install-sh [new file with mode: 0644]
reactos/lib/3rdparty/expat/conftools/mkinstalldirs [new file with mode: 0644]
reactos/lib/3rdparty/expat/doc/expat.png [new file with mode: 0644]
reactos/lib/3rdparty/expat/doc/reference.html [new file with mode: 0644]
reactos/lib/3rdparty/expat/doc/style.css [new file with mode: 0644]
reactos/lib/3rdparty/expat/doc/valid-xhtml10.png [new file with mode: 0644]
reactos/lib/3rdparty/expat/doc/xmlwf.1 [new file with mode: 0644]
reactos/lib/3rdparty/expat/doc/xmlwf.sgml [new file with mode: 0644]
reactos/lib/3rdparty/expat/examples/elements.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/examples/elements.dsp [new file with mode: 0644]
reactos/lib/3rdparty/expat/examples/elements.vcproj [new file with mode: 0644]
reactos/lib/3rdparty/expat/examples/outline.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/examples/outline.dsp [new file with mode: 0644]
reactos/lib/3rdparty/expat/examples/outline.vcproj [new file with mode: 0644]
reactos/lib/3rdparty/expat/examples/poem.rbuild [new file with mode: 0644]
reactos/lib/3rdparty/expat/expat.rbuild
reactos/lib/3rdparty/expat/gennmtab/gennmtab.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/gennmtab/gennmtab.dsp [new file with mode: 0644]
reactos/lib/3rdparty/expat/make-release.sh [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/README.txt [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/benchmark/README.txt [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/benchmark/benchmark.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/benchmark/benchmark.dsp [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/benchmark/benchmark.dsw [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/chardata.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/chardata.h [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/minicheck.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/minicheck.h [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/runtests.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/runtestspp.cpp [new file with mode: 0644]
reactos/lib/3rdparty/expat/tests/xmltest.sh [new file with mode: 0644]
reactos/lib/3rdparty/expat/vms/README.vms [new file with mode: 0644]
reactos/lib/3rdparty/expat/vms/descrip.mms [new file with mode: 0644]
reactos/lib/3rdparty/expat/vms/expat_config.h [new file with mode: 0644]
reactos/lib/3rdparty/expat/win32/MANIFEST.txt [new file with mode: 0644]
reactos/lib/3rdparty/expat/win32/README.txt [new file with mode: 0644]
reactos/lib/3rdparty/expat/win32/expat.iss [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/codepage.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/codepage.h [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/ct.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/filemap.h [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/readfilemap.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/unixfilemap.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/win32filemap.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmlfile.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmlfile.h [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmlmime.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmlmime.h [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmltchar.h [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmlurl.h [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmlwf.c [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmlwf.dsp [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmlwf.vcproj [new file with mode: 0644]
reactos/lib/3rdparty/expat/xmlwf/xmlwin32url.cxx [new file with mode: 0644]
reactos/lib/crt/locale/locale.c
reactos/lib/intrlck/i386/compareexchange.c
reactos/lib/intrlck/i386/decrement.c
reactos/lib/intrlck/i386/exchange.c
reactos/lib/intrlck/i386/exchangeadd.c
reactos/lib/intrlck/i386/increment.c
reactos/lib/mingw/mingw.rbuild
reactos/lib/rtl/austin/udict.h
reactos/lib/rtl/debug.c
reactos/lib/rtl/heap.c
reactos/lib/rtl/i386/debug_asm.S
reactos/lib/rtl/i386/thread.c [deleted file]
reactos/lib/rtl/nls.c
reactos/lib/rtl/rtl.rbuild
reactos/lib/rtl/rtlp.h
reactos/lib/rtl/sid.c
reactos/lib/rtl/thread.c
reactos/lib/string/sscanf.c
reactos/lib/string/wtoi.c
reactos/media/fonts/DejaVuSans-Bold.ttf
reactos/media/fonts/DejaVuSans-BoldOblique.ttf
reactos/media/fonts/DejaVuSans-ExtraLight.ttf
reactos/media/fonts/DejaVuSans-Oblique.ttf
reactos/media/fonts/DejaVuSans.ttf
reactos/media/fonts/DejaVuSansCondensed-Bold.ttf
reactos/media/fonts/DejaVuSansCondensed-BoldOblique.ttf
reactos/media/fonts/DejaVuSansCondensed-Oblique.ttf
reactos/media/fonts/DejaVuSansCondensed.ttf
reactos/media/fonts/DejaVuSansMono-Bold.ttf
reactos/media/fonts/DejaVuSansMono-BoldOblique.ttf
reactos/media/fonts/DejaVuSansMono-Oblique.ttf
reactos/media/fonts/DejaVuSansMono.ttf
reactos/media/fonts/DejaVuSerif-Bold.ttf
reactos/media/fonts/DejaVuSerif-BoldOblique.ttf
reactos/media/fonts/DejaVuSerif-Oblique.ttf
reactos/media/fonts/DejaVuSerif.ttf
reactos/media/fonts/DejaVuSerifCondensed-Bold.ttf
reactos/media/fonts/DejaVuSerifCondensed-BoldOblique.ttf
reactos/media/fonts/DejaVuSerifCondensed-Oblique.ttf
reactos/media/fonts/DejaVuSerifCondensed.ttf
reactos/media/fonts/doc/DejaVu_AUTHORS.txt
reactos/media/fonts/doc/DejaVu_NEWS.txt
reactos/media/fonts/doc/DejaVu_README.txt
reactos/media/fonts/doc/DejaVu_langcover.txt
reactos/media/fonts/doc/DejaVu_status.txt
reactos/media/fonts/doc/DejaVu_unicover.txt
reactos/ntoskrnl/KrnlFun.c
reactos/ntoskrnl/cc/cacheman.c
reactos/ntoskrnl/cc/copy.c
reactos/ntoskrnl/cc/mdl.c
reactos/ntoskrnl/cm/ntfunc.c
reactos/ntoskrnl/cm/registry.c
reactos/ntoskrnl/cm/regobj.c
reactos/ntoskrnl/ex/callback.c
reactos/ntoskrnl/ex/handle.c
reactos/ntoskrnl/ex/init.c
reactos/ntoskrnl/ex/lookas.c
reactos/ntoskrnl/ex/pushlock.c
reactos/ntoskrnl/ex/resource.c
reactos/ntoskrnl/ex/sysinfo.c
reactos/ntoskrnl/ex/time.c
reactos/ntoskrnl/ex/timer.c
reactos/ntoskrnl/ex/work.c
reactos/ntoskrnl/fs/context.c [new file with mode: 0644]
reactos/ntoskrnl/fs/fastio.c [new file with mode: 0644]
reactos/ntoskrnl/fs/filelock.c [new file with mode: 0644]
reactos/ntoskrnl/fs/mcb.c [moved from reactos/ntoskrnl/fsrtl/largemcb.c with 62% similarity]
reactos/ntoskrnl/fs/name.c [new file with mode: 0644]
reactos/ntoskrnl/fs/notify.c [new file with mode: 0644]
reactos/ntoskrnl/fs/oplock.c [moved from reactos/ntoskrnl/fsrtl/oplock.c with 75% similarity]
reactos/ntoskrnl/fs/pool.c [new file with mode: 0644]
reactos/ntoskrnl/fs/tunnel.c [moved from reactos/ntoskrnl/fsrtl/tunnel.c with 57% similarity]
reactos/ntoskrnl/fs/unc.c [moved from reactos/ntoskrnl/fsrtl/unc.c with 66% similarity]
reactos/ntoskrnl/fs/util.c [new file with mode: 0644]
reactos/ntoskrnl/fsrtl/dbcsname.c [deleted file]
reactos/ntoskrnl/fsrtl/fastio.c [deleted file]
reactos/ntoskrnl/fsrtl/faulttol.c [deleted file]
reactos/ntoskrnl/fsrtl/filelock.c [deleted file]
reactos/ntoskrnl/fsrtl/filter.c [deleted file]
reactos/ntoskrnl/fsrtl/filtrctx.c [deleted file]
reactos/ntoskrnl/fsrtl/fsfilter.c [deleted file]
reactos/ntoskrnl/fsrtl/fsrtlpc.c [deleted file]
reactos/ntoskrnl/fsrtl/name.c [deleted file]
reactos/ntoskrnl/fsrtl/notify.c [deleted file]
reactos/ntoskrnl/fsrtl/pnp.c [deleted file]
reactos/ntoskrnl/fsrtl/stackovf.c [deleted file]
reactos/ntoskrnl/inbv/inbv.c
reactos/ntoskrnl/include/internal/cc.h
reactos/ntoskrnl/include/internal/ex.h
reactos/ntoskrnl/include/internal/fsrtl.h
reactos/ntoskrnl/include/internal/i386/ke.h
reactos/ntoskrnl/include/internal/inbv.h
reactos/ntoskrnl/include/internal/io.h
reactos/ntoskrnl/include/internal/kd.h
reactos/ntoskrnl/include/internal/ke.h
reactos/ntoskrnl/include/internal/ke_x.h
reactos/ntoskrnl/include/internal/lpc.h
reactos/ntoskrnl/include/internal/mm.h
reactos/ntoskrnl/include/internal/ntoskrnl.h
reactos/ntoskrnl/include/internal/ob.h
reactos/ntoskrnl/include/internal/ob_x.h
reactos/ntoskrnl/include/internal/po.h
reactos/ntoskrnl/include/internal/ps.h
reactos/ntoskrnl/include/internal/ps_x.h
reactos/ntoskrnl/include/ntoskrnl.h
reactos/ntoskrnl/io/iomgr/controller.c
reactos/ntoskrnl/io/iomgr/deviface.c
reactos/ntoskrnl/io/iomgr/driver.c
reactos/ntoskrnl/io/iomgr/file.c
reactos/ntoskrnl/io/pnpmgr/pnpmgr.c
reactos/ntoskrnl/kd/kdmain.c
reactos/ntoskrnl/ke/apc.c
reactos/ntoskrnl/ke/balmgr.c [deleted file]
reactos/ntoskrnl/ke/clock.c
reactos/ntoskrnl/ke/dpc.c
reactos/ntoskrnl/ke/event.c
reactos/ntoskrnl/ke/gate.c
reactos/ntoskrnl/ke/gmutex.c
reactos/ntoskrnl/ke/i386/clock.S
reactos/ntoskrnl/ke/i386/cpu.c
reactos/ntoskrnl/ke/i386/ctxswitch.S
reactos/ntoskrnl/ke/i386/kiinit.c
reactos/ntoskrnl/ke/i386/patpge.c
reactos/ntoskrnl/ke/i386/thread.c
reactos/ntoskrnl/ke/i386/trap.s
reactos/ntoskrnl/ke/krnlinit.c
reactos/ntoskrnl/ke/process.c
reactos/ntoskrnl/ke/queue.c
reactos/ntoskrnl/ke/thrdobj.c
reactos/ntoskrnl/ke/thrdschd.c
reactos/ntoskrnl/ke/timer.c
reactos/ntoskrnl/ke/wait.c
reactos/ntoskrnl/lpc/close.c
reactos/ntoskrnl/lpc/complete.c
reactos/ntoskrnl/lpc/connect.c
reactos/ntoskrnl/lpc/create.c
reactos/ntoskrnl/lpc/listen.c
reactos/ntoskrnl/lpc/ntlpc/close.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/ntlpc/complete.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/ntlpc/connect.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/ntlpc/create.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/ntlpc/listen.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/ntlpc/lpc.h [new file with mode: 0644]
reactos/ntoskrnl/lpc/ntlpc/lpc_x.h [moved from reactos/ntoskrnl/include/internal/lpc_x.h with 76% similarity]
reactos/ntoskrnl/lpc/ntlpc/port.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/ntlpc/reply.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/ntlpc/send.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/port.c
reactos/ntoskrnl/lpc/query.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/queue.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/receive.c [new file with mode: 0644]
reactos/ntoskrnl/lpc/reply.c
reactos/ntoskrnl/lpc/send.c
reactos/ntoskrnl/mm/mminit.c
reactos/ntoskrnl/mm/mpw.c
reactos/ntoskrnl/mm/pagefile.c
reactos/ntoskrnl/mm/pageop.c
reactos/ntoskrnl/mm/rmap.c
reactos/ntoskrnl/mm/section.c
reactos/ntoskrnl/ntoskrnl.def
reactos/ntoskrnl/ntoskrnl.mc
reactos/ntoskrnl/ntoskrnl.rbuild
reactos/ntoskrnl/ob/obdir.c
reactos/ntoskrnl/ob/obhandle.c
reactos/ntoskrnl/ob/obinit.c
reactos/ntoskrnl/ob/oblife.c
reactos/ntoskrnl/ob/obname.c
reactos/ntoskrnl/ob/obref.c
reactos/ntoskrnl/ob/obsecure.c
reactos/ntoskrnl/ob/obwait.c
reactos/ntoskrnl/ob/symlink.c
reactos/ntoskrnl/po/power.c
reactos/ntoskrnl/ps/kill.c
reactos/ntoskrnl/ps/notify.c
reactos/ntoskrnl/ps/process.c
reactos/ntoskrnl/ps/psmgr.c
reactos/ntoskrnl/ps/query.c
reactos/ntoskrnl/ps/security.c
reactos/ntoskrnl/ps/thread.c
reactos/ntoskrnl/rtl/libsupp.c
reactos/ntoskrnl/se/semgr.c
reactos/ntoskrnl/se/token.c
reactos/ntoskrnl/tests/fsrtl.c [deleted file]
reactos/ntoskrnl/vdm/vdmexec.c
reactos/regtests/winetests/kernel32/thread.c
reactos/regtests/winetests/user32/edit.c
reactos/subsystems/win32/csrss/api/wapi.c
reactos/subsystems/win32/csrss/csrss.c
reactos/subsystems/win32/csrss/init.c
reactos/subsystems/win32/csrss/win32csr/guiconsole.c
reactos/subsystems/win32/win32k/include/object.h
reactos/subsystems/win32/win32k/ntuser/cursoricon.c
reactos/subsystems/win32/win32k/ntuser/desktop.c
reactos/subsystems/win32/win32k/ntuser/misc.c
reactos/subsystems/win32/win32k/objects/arc.c [deleted file]
reactos/subsystems/win32/win32k/objects/print.c
reactos/tools/pefixup.c
reactos/tools/rbuild/backend/dependencymap/dependencymap.cpp
reactos/tools/rbuild/backend/devcpp/devcpp.cpp
reactos/tools/rbuild/backend/mingw/mingw.cpp
reactos/tools/rbuild/backend/mingw/modulehandler.cpp
reactos/tools/rbuild/backend/msvc/msvcmaker.cpp
reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp
reactos/tools/rbuild/bootstrap.cpp
reactos/tools/rbuild/global.cpp
reactos/tools/rbuild/module.cpp
reactos/tools/rbuild/project.cpp
reactos/tools/rbuild/rbuild.cpp
reactos/tools/rbuild/syssetupgenerator.cpp
reactos/tools/rbuild/testsupportcode.cpp
reactos/tools/rgenstat/web/rapistatus.xsl
reactos/tools/sysreg/file_reader.cpp
reactos/tools/sysreg/namedpipe_reader.cpp
reactos/tools/sysreg/namedpipe_reader.h
reactos/tools/sysreg/rosboot_test.cpp
reactos/tools/sysreg/rosboot_test.h
reactos/tools/sysreg/sysreg.mak
reactos/tools/tools.mak
reactos/tools/wrc/newstruc.c
rosapps/devutils/cputointel/AnyalsingProcess.c [deleted file]
rosapps/devutils/cputointel/ConvertToIA32Process.c [deleted file]
rosapps/devutils/cputointel/ConvertToPPCProcess.c [deleted file]
rosapps/devutils/cputointel/ConvertingProcess.c [deleted file]
rosapps/devutils/cputointel/CpuToIntel.c
rosapps/devutils/cputointel/From/ARM/ARM.h [deleted file]
rosapps/devutils/cputointel/From/ARM/ARMBrain.c [deleted file]
rosapps/devutils/cputointel/From/ARM/ARMBrain.h [deleted file]
rosapps/devutils/cputointel/From/IA32/IA32Brain.c [deleted file]
rosapps/devutils/cputointel/From/IA32/IA32opcode.c [deleted file]
rosapps/devutils/cputointel/From/PPC/PPC.h [deleted file]
rosapps/devutils/cputointel/From/PPC/PPCBrain.c [deleted file]
rosapps/devutils/cputointel/From/PPC/PPCBrain.h [deleted file]
rosapps/devutils/cputointel/From/PPC/PPCopcode.c [deleted file]
rosapps/devutils/cputointel/ImageLoader.c [deleted file]
rosapps/devutils/cputointel/OpCodePPC.txt [deleted file]
rosapps/devutils/cputointel/PPC/PPC.h [moved from rosapps/devutils/cputointel/From/IA32/IA32.h with 78% similarity]
rosapps/devutils/cputointel/PPC/PPCBrain.c [new file with mode: 0644]
rosapps/devutils/cputointel/PPC/PPCBrain.h [moved from rosapps/devutils/cputointel/From/IA32/IA32Brain.h with 74% similarity]
rosapps/devutils/cputointel/PPC/PPCopcode.c [moved from rosapps/devutils/cputointel/From/ARM/ARMopcode.c with 67% similarity]
rosapps/devutils/cputointel/ReadMe.txt [deleted file]
rosapps/devutils/cputointel/any_op.h [deleted file]
rosapps/devutils/cputointel/cputointel.rbuild
rosapps/devutils/cputointel/dummycpu/Dummy.h [moved from rosapps/devutils/cputointel/From/dummycpu/Dummy.h with 96% similarity]
rosapps/devutils/cputointel/dummycpu/DummyBrain.c [moved from rosapps/devutils/cputointel/From/dummycpu/DummyBrain.c with 52% similarity]
rosapps/devutils/cputointel/dummycpu/DummyBrain.h [moved from rosapps/devutils/cputointel/From/dummycpu/DummyBrain.h with 94% similarity]
rosapps/devutils/cputointel/dummycpu/Dummyopcode.c [moved from rosapps/devutils/cputointel/From/dummycpu/Dummyopcode.c with 98% similarity]
rosapps/devutils/cputointel/m68k/M68kBrain.c [moved from rosapps/devutils/cputointel/From/m68k/M68kBrain.c with 89% similarity]
rosapps/devutils/cputointel/m68k/M68kBrain.h [moved from rosapps/devutils/cputointel/From/m68k/M68kBrain.h with 98% similarity]
rosapps/devutils/cputointel/m68k/M68kopcode.c [moved from rosapps/devutils/cputointel/From/m68k/M68kopcode.c with 100% similarity]
rosapps/devutils/cputointel/m68k/m68k.h [moved from rosapps/devutils/cputointel/From/m68k/m68k.h with 99% similarity]
rosapps/devutils/cputointel/misc.c
rosapps/devutils/cputointel/misc.h
rosapps/directory.rbuild
rosapps/tests/Imagelistviewer/imagelistviewer.rbuild
rosapps/tests/directory.rbuild

index d04d828..294ae80 100644 (file)
@@ -274,48 +274,45 @@ endif
        cp = $(Q)cp
        NUL = /dev/null
 else # mingw32-windows
-       ifeq ($(OSTYPE),msys)
-               HOST=mingw32-linux
-               export EXEPREFIX = ./
-               export EXEPOSTFIX = .exe
-               export SEP = /
-               mkdir = -$(Q)mkdir -p
-               rm = $(Q)rm -f
-               cp = $(Q)cp
-               NUL = /dev/null
-       else
-               export EXEPREFIX =
-               export EXEPOSTFIX = .exe
-               ROS_EMPTY =
-               export SEP = \$(ROS_EMPTY)
-               mkdir = -$(Q)mkdir
-               rm = $(Q)del /f /q
-               cp = $(Q)copy /y
-               NUL = NUL
-       endif
-       ifeq ($(ROS_PREFIX),)
-               gcc = $(Q)gcc
-               gpp = $(Q)g++
-               ld = $(Q)ld
-               nm = $(Q)nm
-               objdump = $(Q)objdump
-               ar = $(Q)ar
-               objcopy = $(Q)objcopy
-               dlltool = $(Q)dlltool
-               strip = $(Q)strip
-               windres = $(Q)windres
-       else
-               gcc = $(ROS_PREFIX)-gcc
-               gpp = $(Q)$(ROS_PREFIX)-g++
-               ld = $(Q)$(ROS_PREFIX)-ld
-               nm = $(Q)$(ROS_PREFIX)-nm
-               objdump = $(Q)$(ROS_PREFIX)-objdump
-               ar = $(Q)$(ROS_PREFIX)-ar
-               objcopy = $(Q)$(ROS_PREFIX)-objcopy
-               dlltool = $(Q)$(ROS_PREFIX)-dlltool
-               strip = $(Q)$(ROS_PREFIX)-strip
-               windres = $(Q)$(ROS_PREFIX)-windres
-       endif
+  ifeq ($(OSTYPE),msys)
+       HOST=mingw32-linux
+       export EXEPREFIX = ./
+       export EXEPOSTFIX = .exe
+       export SEP = /
+       mkdir = -$(Q)mkdir -p
+       gcc = $(Q)gcc
+       gpp = $(Q)g++
+       ld = $(Q)ld
+       nm = $(Q)nm
+       objdump = $(Q)objdump
+       ar = $(Q)ar
+       objcopy = $(Q)objcopy
+       dlltool = $(Q)dlltool
+       strip = $(Q)strip
+       windres = $(Q)windres
+       rm = $(Q)rm -f
+       cp = $(Q)cp
+       NUL = /dev/null
+  else
+       export EXEPREFIX =
+       export EXEPOSTFIX = .exe
+       ROS_EMPTY =
+       export SEP = \$(ROS_EMPTY)
+       mkdir = -$(Q)mkdir
+       gcc = $(Q)gcc
+       gpp = $(Q)g++
+       ld = $(Q)ld
+       nm = $(Q)nm
+       objdump = $(Q)objdump
+       ar = $(Q)ar
+       objcopy = $(Q)objcopy
+       dlltool = $(Q)dlltool
+       strip = $(Q)strip
+       windres = $(Q)windres
+       rm = $(Q)del /f /q
+       cp = $(Q)copy /y
+       NUL = NUL
+  endif
 endif
 
 ifneq ($(ROS_INTERMEDIATE),)
index 7a30308..c779be7 100644 (file)
@@ -30,7 +30,7 @@
 #include <string.h>
 #include <ctype.h>
 
-#include <io.h>
+#include <dir.h>
 #include <dos.h>
 
 
index 4fc86c0..cda7203 100644 (file)
@@ -21,7 +21,7 @@ CardWindow SolWnd;
 
 LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
 
-void MakePath(TCHAR *szDest, UINT nDestLen, const TCHAR *szExt)
+void MakePath(TCHAR *szDest, UINT nDestLen, TCHAR *szExt)
 {
     TCHAR *ptr;
     
index eab4c86..f777dc7 100644 (file)
@@ -149,16 +149,14 @@ MainFrameBase::MainFrameBase(HWND hwnd)
        rbBand.cyMaxChild = 0;
        rbBand.cyIntegral = btn_hgt;
 
-       TCHAR ToolBarText[] = _T("Toolbar");
-       rbBand.lpText = ToolBarText;
+       rbBand.lpText = TEXT("Toolbar");
        rbBand.hwndChild = _htoolbar;
        rbBand.cxMinChild = 0;
        rbBand.cyMinChild = btn_hgt + 4;
        rbBand.cx = 182;
        SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
 
-       TCHAR AddressText[] = _T("Address");
-       rbBand.lpText = AddressText;
+       rbBand.lpText = TEXT("Address");
        rbBand.hwndChild = _haddressedit;
        rbBand.cxMinChild = 0;
        rbBand.cyMinChild = btn_hgt - 2;
index 15b2096..56f7fae 100644 (file)
  // Martin Fuchs, 23.07.2003
  //
 
- // STL headers for strings and streams
-#include <string>
-#include <iostream>
-using namespace std;
 
  // standard windows headers
 #define WIN32_LEAN_AND_MEAN
@@ -159,6 +155,11 @@ BOOL exists_path(LPCTSTR path);
 #pragma warning(disable: 4786) // disable warnings about too long debug information symbols
 #endif
 
+ // STL headers for strings and streams
+#include <string>
+#include <iostream>
+using namespace std;
+
  // containers
 #include <map>
 #include <set>
index 3697269..0eadea6 100644 (file)
@@ -707,7 +707,7 @@ struct XMLNode : public XS_String
                        return super::find(x);
                }
 
-               XS_String get(const char* x, LPCXSSTR def=XS_EMPTY_STR) const
+               XS_String get(const char* x, LPXSSTR def=XS_EMPTY_STR) const
                {
                        const_iterator found = find(x);
 
@@ -720,7 +720,7 @@ struct XMLNode : public XS_String
 #else
        struct AttributeMap : public std::map<XS_String, XS_String>
        {
-               XS_String get(const char* x, LPCXSSTR def=XS_EMPTY_STR) const
+               XS_String get(const char* x, LPXSSTR def=XS_EMPTY_STR) const
                {
                        const_iterator found = find(x);
 
@@ -840,7 +840,7 @@ struct XMLNode : public XS_String
        }
 
         /// read only access to an attribute
-       template<typename T> XS_String get(const T& attr_name, LPCXSSTR def=XS_EMPTY_STR) const
+       template<typename T> XS_String get(const T& attr_name, LPXSSTR def=XS_EMPTY_STR) const
        {
                AttributeMap::const_iterator found = _attributes.find(attr_name);
 
index 4c7b8f6..76bb895 100644 (file)
@@ -133,7 +133,7 @@ void BrowserNavigator::goto_url(LPCTSTR url)
        else {
                _new_url = url;
 
-               _browser->Navigate(BStr(L"about:blank"), NULL, NULL, NULL, NULL);
+               _browser->Navigate(L"about:blank", NULL, NULL, NULL, NULL);
        }
 }
 
index 84c513b..3afffe5 100644 (file)
@@ -460,7 +460,8 @@ TbdCreateToolbarWnd(PTOOLBAR_DOCKS TbDocks,
 
                 if (Drag)
                 {
-                    SetCursor(LoadCursor(NULL, IDC_ARROW));
+                    SetCursor(LoadCursor(NULL,
+                                         MAKEINTRESOURCE(IDC_ARROW)));
                     SendMessage(hToolbar,
                                 WM_NCLBUTTONDOWN,
                                 HTCAPTION,
@@ -935,7 +936,8 @@ RebarSubclassProc(HWND hWnd,
                                                         &pt,
                                                         1);
 
-                                        SetCursor(LoadCursor(NULL, IDC_SIZEALL));
+                                        SetCursor(LoadCursor(NULL,
+                                                             MAKEINTRESOURCE(IDC_SIZEALL)));
 
                                         SendMessage(TbDocks->hRebar[DragTo],
                                                     WM_LBUTTONDOWN,
index cc21736..6a03a70 100644 (file)
@@ -176,15 +176,15 @@ char *hookup(char *host, int port)
                code = -1;
                goto bad;
        }
-       cin = cout = s;
+        cin = cout = s;
        if (verbose) {
                printf("Connected to %s.\n", hostname);
                (void) fflush(stdout);
        }
        if (getreply(0) > 2) {  /* read startup message from server */
-               closesocket(cin);
-               code = -1;
-               goto bad;
+           closesocket(cin);
+           code = -1;
+           goto bad;
        }
 #ifdef SO_OOBINLINE
        {
@@ -222,26 +222,26 @@ int login(const char *host)
                acct = pacct;
        }
        while (user == NULL) {
-               const char *myname = "none"; // This needs to become the usename env
-
-               if (myname)
-                       printf("Name (%s:%s): ", host, myname);
-               else
-                       printf("Name (%s): ", host);
-               (void) fflush(stdout);
-               (void) fgets(tmp, sizeof(tmp) - 1, stdin);
-               tmp[strlen(tmp) - 1] = '\0';
-               if (*tmp == '\0')
-                       user = myname;
-               else
-                       user = tmp;
+           const char *myname = "none"; // This needs to become the usename env
+
+           if (myname)
+              printf("Name (%s:%s): ", host, myname);
+           else
+              printf("Name (%s): ", host);
+          (void) fflush(stdout);
+           (void) fgets(tmp, sizeof(tmp) - 1, stdin);
+           tmp[strlen(tmp) - 1] = '\0';
+           if (*tmp == '\0')
+              user = myname;
+           else
+              user = tmp;
        }
        n = command("USER %s", user);
        if (n == CONTINUE) {
                if (pass == NULL)
                        pass = getpass("Password:");
                n = command("PASS %s", pass);
-               fflush(stdin);
+                fflush(stdin);
        }
        if (n == CONTINUE) {
                aflag++;
@@ -284,7 +284,7 @@ int command(const char *fmt, ...)
 {
        va_list ap;
        int r;
-       void (*oldintr)(int);
+       void (*oldintr)(int), cmdabort(int);
 
        abrtflag = 0;
        if (debug) {
@@ -301,16 +301,16 @@ int command(const char *fmt, ...)
                return (0);
        }
        oldintr = signal(SIGINT,cmdabort);
-       {
-               char buffer[1024];
+        {
+           char buffer[1024];
 
-               va_start(ap, fmt);
-               vsprintf(buffer, fmt, ap);
-               va_end(ap);
+           va_start(ap, fmt);
+           vsprintf(buffer, fmt, ap);
+           va_end(ap);
 //DLJ: to work through  firewalls - send the command as a single message
-               strcat(buffer,"\r\n");
-               fprintfSocket(cout, buffer);
-       }
+                  strcat(buffer,"\r\n");
+           fprintfSocket(cout, buffer);
+        }
 //DLJ: the following two lines are replaced by the strcat above - seems to
 // make it work through firewalls.
 //     fprintfSocket(cout, "\r\n");
@@ -335,7 +335,7 @@ getreply(expecteof)
        register int dig;
        register char *cp;
        int originalcode = 0, continuation = 0;
-       void (*oldintr)(int);
+       void (*oldintr)(int), cmdabort(int);
        int pflag = 0;
        char *pt = pasv;
 
@@ -460,7 +460,7 @@ void abortsend()
 void sendrequest(const char *cmd, const char *local, const char *remote, int printnames)
 {
        FILE *fin;
-       int dout = 0;
+        int dout = 0;
        int (*closefunc)(), _pclose(), fclose();
        sig_t (*oldintr)(), (*oldintp)();
        char buf[BUFSIZ], *bufp;
@@ -624,39 +624,39 @@ null();// oldintp = signal(SIGPIPE, SIG_IGN);
 
        case TYPE_A:
                {
-               char buf[1024];
+        char buf[1024];
                static int bufsize = 1024;
                int ipos=0;
 
                while ((c = getc(fin)) != EOF) {
-                       if (c == '\n') {
-                               while (hash && (bytes >= hashbytes)) {
-                                       (void) putchar('#');
-                                       (void) fflush(stdout);
-                                       hashbytes += HASHBYTES;
-                               }
+                   if (c == '\n') {
+                      while (hash && (bytes >= hashbytes)) {
+                         (void) putchar('#');
+                         (void) fflush(stdout);
+                         hashbytes += HASHBYTES;
+                      }
 // Szurgot: The following code is unncessary on Win32.
-//                             (void) fputcSocket(dout, '\r');
-//                             bytes++;
-                       }
-
-                       if (ipos >= bufsize) {
-                               fputSocket(dout,buf,ipos);
-                               if(!hash) (void) putchar('.');
-                               ipos=0;
-                       }
-                       buf[ipos]=c; ++ipos;
-                       bytes++;
+//                      (void) fputcSocket(dout, '\r');
+//                         bytes++;
+                   }
+
+                                  if (ipos >= bufsize) {
+                                               fputSocket(dout,buf,ipos);
+                                               if(!hash) (void) putchar('.');
+                                               ipos=0;
+                                  }
+                                  buf[ipos]=c; ++ipos;
+                                  bytes++;
                }
                if (ipos) {
                        fputSocket(dout,buf,ipos);
                        ipos=0;
                }
                if (hash) {
-                       if (bytes < hashbytes)
-                       (void) putchar('#');
-                       (void) putchar('\n');
-                       (void) fflush(stdout);
+                   if (bytes < hashbytes)
+                      (void) putchar('#');
+                   (void) putchar('\n');
+                   (void) fflush(stdout);
                }
                else {
                        (void) putchar('.');
@@ -664,13 +664,13 @@ null();// oldintp = signal(SIGPIPE, SIG_IGN);
                        (void) fflush(stdout);
                }
                if (ferror(fin))
-                       perror(local);
+                   perror(local);
 //             if (ferror(dout)) {
 //                     if (errno != EPIPE)
 //                             perror("netout");
 //                     bytes = -1;
 //             }
-               break;
+                break;
                }
        }
        (void) gettimeofday(&stop, (struct timezone *)0);
@@ -734,13 +734,13 @@ void recvrequest(const char *cmd, const char *local, const char *remote, const c
                 int printnames)
 {
        FILE *fout = stdout;
-       int din = 0;
+        int din = 0;
        int (*closefunc)(), _pclose(), fclose();
        void (*oldintr)(int), (*oldintp)(int);
        int oldverbose = 0, oldtype = 0, is_retr, tcrflag, nfnd, bare_lfs = 0;
        char msg;
 //     static char *buf; // Szurgot: Shouldn't this go SOMEWHERE?
-       char buf[1024];
+        char buf[1024];
        static int bufsize = 1024;
        long bytes = 0, hashbytes = HASHBYTES;
 //     struct
@@ -783,45 +783,45 @@ null();// oldintr = signal(SIGINT, abortrecv);
        if (strcmp(local, "-") && *local != '|') {
 #ifndef _WIN32
 // This whole thing is a problem... access Won't work on non-existent files
-               if (access(local, 2) < 0) {
-                       char *dir = rindex(local, '/');
-
-                       if (errno != ENOENT && errno != EACCES) {
-                               perror(local);
-                               (void) signal(SIGINT, oldintr);
-                               code = -1;
-                               return;
-                       }
-                       if (dir != NULL)
-                               *dir = 0;
-                       d = access(dir ? local : ".", 2);
-                       if (dir != NULL)
-                               *dir = '/';
-                       if (d < 0) {
-                               perror(local);
-                               (void) signal(SIGINT, oldintr);
-                               code = -1;
-                               return;
-                       }
-                       if (!runique && errno == EACCES &&
-                           chmod(local, 0600) < 0) {
-                               perror(local);
-                               (void) signal(SIGINT, oldintr);
-                               code = -1;
-                               return;
-                       }
-                       if (runique && errno == EACCES &&
-                           (local = gunique(local)) == NULL) {
-                               (void) signal(SIGINT, oldintr);
-                               code = -1;
-                               return;
-                       }
-               }
-               else if (runique && (local = gunique(local)) == NULL) {
-                       (void) signal(SIGINT, oldintr);
-                       code = -1;
-                       return;
-               }
+           if (access(local, 2) < 0) {
+              char *dir = rindex(local, '/');
+
+              if (errno != ENOENT && errno != EACCES) {
+                 perror(local);
+                 (void) signal(SIGINT, oldintr);
+                 code = -1;
+                 return;
+              }
+              if (dir != NULL)
+                 *dir = 0;
+              d = access(dir ? local : ".", 2);
+              if (dir != NULL)
+                 *dir = '/';
+              if (d < 0) {
+                 perror(local);
+                 (void) signal(SIGINT, oldintr);
+                 code = -1;
+                 return;
+              }
+              if (!runique && errno == EACCES &&
+                  chmod(local, 0600) < 0) {
+                 perror(local);
+                 (void) signal(SIGINT, oldintr);
+                 code = -1;
+                 return;
+              }
+              if (runique && errno == EACCES &&
+                  (local = gunique(local)) == NULL) {
+                 (void) signal(SIGINT, oldintr);
+                 code = -1;
+                 return;
+              }
+           }
+           else if (runique && (local = gunique(local)) == NULL) {
+              (void) signal(SIGINT, oldintr);
+              code = -1;
+              return;
+           }
 #endif
        }
        if (initconn()) {
@@ -926,15 +926,15 @@ null();//         oldintp = signal(SIGPIPE, SIG_IGN);
 //                     if ((d = write(fileno(fout), buf, c)) != c)
 //                             break;
                while ((c = recv(din, buf, bufsize, 0)) > 0) {
-                       write(fileno(fout), buf, c);
-                       bytes += c;
-                       if (hash) {
-                               while (bytes >= hashbytes) {
-                                       (void) putchar('#');
-                                       hashbytes += HASHBYTES;
-                               }
-                               (void) fflush(stdout);
-                       }
+                   write(fileno(fout), buf, c);
+                   bytes += c;
+                   if (hash) {
+                      while (bytes >= hashbytes) {
+                         (void) putchar('#');
+                         hashbytes += HASHBYTES;
+                      }
+                      (void) fflush(stdout);
+                   }
                }
                if (hash && bytes > 0) {
                        if (bytes < HASHBYTES)
@@ -981,23 +981,23 @@ done:
                        if (c == '\n')
                                bare_lfs++;
                        while (c == '\r') {
-                               while (hash && (bytes >= hashbytes)) {
-                                       (void) putchar('#');
-                                       (void) fflush(stdout);
-                                       hashbytes += HASHBYTES;
-                               }
-                               bytes++;
-                               if ((c = fgetcSocket(din)) != '\n' || tcrflag) {
-                                       if (ferror(fout))
-                                       goto break2;
-                                       (void) putc('\r', fout);
-                                       if (c == '\0') {
-                                               bytes++;
-                                               goto contin2;
-                                       }
-                                       if (c == EOF)
-                                               goto contin2;
-                               }
+                           while (hash && (bytes >= hashbytes)) {
+                              (void) putchar('#');
+                              (void) fflush(stdout);
+                              hashbytes += HASHBYTES;
+                           }
+                           bytes++;
+                           if ((c = fgetcSocket(din)) != '\n' || tcrflag) {
+                              if (ferror(fout))
+                                 goto break2;
+                              (void) putc('\r', fout);
+                              if (c == '\0') {
+                                 bytes++;
+                                 goto contin2;
+                              }
+                              if (c == EOF)
+                                 goto contin2;
+                           }
                        }
                        (void) putc(c, fout);
                        bytes++;
@@ -1089,7 +1089,7 @@ null();//         (void) signal(SIGINT,oldintr);
        fprintfSocket(cout,"%c%c",IAC,IP);
        msg = (char)IAC;
 /* send IAC in urgent mode instead of DM because UNIX places oob mark */
-/* after urgent byte rather than before as now is protocol */
+/* after urgent byte rather than before as now is protocol            */
        if (send(cout,&msg,1,MSG_OOB) != 1) {
                perror("abort");
        }
@@ -1154,51 +1154,51 @@ initconn()
 
 
        if (passivemode) {
-               data = socket(AF_INET, SOCK_STREAM, 0);
-               if (data < 0) {
-                       perror("ftp: socket");
-                       return(1);
-               }
-               if ((options & SO_DEBUG) &&
-                   setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on,
-                   sizeof (on)) < 0)
-                       perror("ftp: setsockopt (ignored)");
-               if (command("PASV") != COMPLETE) {
-                       printf("Passive mode refused.\n");
-                       goto bad;
-               }
-
-               /*
-                * What we've got at this point is a string of comma
-                * separated one-byte unsigned integer values.
-                * The first four are the an IP address. The fifth is
-                * the MSB of the port number, the sixth is the LSB.
-                * From that we'll prepare a sockaddr_in.
-                */
-
-               if (sscanf(pasv,"%d,%d,%d,%d,%d,%d",
-                   &a0, &a1, &a2, &a3, &p0, &p1) != 6) {
-                       printf("Passive mode address scan failure. Shouldn't happen!\n");
-                       goto bad;
-               }
-
-               bzero(&data_addr, sizeof(data_addr));
-               data_addr.sin_family = AF_INET;
-               a = (char *)&data_addr.sin_addr.s_addr;
-               a[0] = a0 & 0xff;
-               a[1] = a1 & 0xff;
-               a[2] = a2 & 0xff;
-               a[3] = a3 & 0xff;
-               p = (char *)&data_addr.sin_port;
-               p[0] = p0 & 0xff;
-               p[1] = p1 & 0xff;
-
-               if (connect(data, (struct sockaddr *)&data_addr,
-                   sizeof(data_addr)) < 0) {
-                       perror("ftp: connect");
-                       goto bad;
-               }
-               return(0);
+      data = socket(AF_INET, SOCK_STREAM, 0);
+      if (data < 0) {
+        perror("ftp: socket");
+        return(1);
+      }
+      if ((options & SO_DEBUG) &&
+          setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on,
+                     sizeof (on)) < 0)
+        perror("ftp: setsockopt (ignored)");
+      if (command("PASV") != COMPLETE) {
+        printf("Passive mode refused.\n");
+        goto bad;
+      }
+
+      /*
+       * What we've got at this point is a string of comma
+       * separated one-byte unsigned integer values.
+       * The first four are the an IP address. The fifth is
+       * the MSB of the port number, the sixth is the LSB.
+       * From that we'll prepare a sockaddr_in.
+       */
+
+      if (sscanf(pasv,"%d,%d,%d,%d,%d,%d",
+                 &a0, &a1, &a2, &a3, &p0, &p1) != 6) {
+        printf("Passive mode address scan failure. Shouldn't happen!\n");
+        goto bad;
+      }
+
+      bzero(&data_addr, sizeof(data_addr));
+      data_addr.sin_family = AF_INET;
+      a = (char *)&data_addr.sin_addr.s_addr;
+      a[0] = a0 & 0xff;
+      a[1] = a1 & 0xff;
+      a[2] = a2 & 0xff;
+      a[3] = a3 & 0xff;
+      p = (char *)&data_addr.sin_port;
+      p[0] = p0 & 0xff;
+      p[1] = p1 & 0xff;
+
+      if (connect(data, (struct sockaddr *)&data_addr,
+                  sizeof(data_addr)) < 0) {
+        perror("ftp: connect");
+        goto bad;
+      }
+      return(0);
        }
 
 
@@ -1262,26 +1262,26 @@ bad:
 
 int dataconn(const char *mode)
 {
-       struct sockaddr_in from;
-       int s, fromlen = sizeof (from);
-
-       if (passivemode)
-               return (data);
-
-       s = accept(data, (struct sockaddr *) &from, &fromlen);
-       if (s < 0) {
-               perror("ftp: accept");
-               (void) closesocket(data), data = -1;
-               return (int) (NULL);
-       }
+   struct sockaddr_in from;
+   int s, fromlen = sizeof (from);
+
+   if (passivemode)
+     return (data);
+
+   s = accept(data, (struct sockaddr *) &from, &fromlen);
+   if (s < 0) {
+      perror("ftp: accept");
+      (void) closesocket(data), data = -1;
+      return (int) (NULL);
+   }
        if(closesocket(data)) {
                int iret=WSAGetLastError ();
                fprintf(stdout,"Error closing socket(%d)\n",iret);
                (void) fflush(stdout);
        }
 
-       data = s;
-       return (data);
+   data = s;
+   return (data);
 }
 
 void ptransfer(direction, bytes, t0, t1)
@@ -1356,7 +1356,7 @@ void pswitch(int flag)
        struct comvars *ip, *op;
 
        abrtflag = 0;
-       oldintr = signal(SIGINT, psabort);
+    oldintr = signal(SIGINT, psabort);
        if (flag) {
                if (proxy)
                        return;
@@ -1415,7 +1415,7 @@ void pswitch(int flag)
        (void) strncpy(ip->mo, mapout, MAXPATHLEN - 1);
        (ip->mo)[strlen(ip->mo)] = '\0';
        (void) strcpy(mapout, op->mo);
-//     (void) signal(SIGINT, oldintr);
+//        (void) signal(SIGINT, oldintr);
        if (abrtflag) {
                abrtflag = 0;
                (*oldintr)(1);
@@ -1816,5 +1816,5 @@ gunique(local)
 
 int null(void)
 {
-       return 0;
+   return 0;
 }
index b42e365..def90bb 100644 (file)
@@ -102,36 +102,36 @@ VOID CSocket::Close()
 // Constructor with serversocket as parameter
 CServerClientSocket::CServerClientSocket(LPCServerSocket lpServerSocket)
 {
-    ServerSocket = lpServerSocket;
+       ServerSocket = lpServerSocket;
 }
 
 // Transmit data to socket
-INT CServerClientSocket::Transmit( LPCSTR lpsBuffer, UINT nLength)
+INT CServerClientSocket::Transmit( LPSTR lpsBuffer, UINT nLength)
 {
     return send(Socket, lpsBuffer, nLength, 0);
 }
 
 // Send a string to socket
-INT CServerClientSocket::SendText( LPCSTR lpsText)
+INT CServerClientSocket::SendText( LPSTR lpsText)
 {
     static CHAR crlf[3] = {0x0D, 0x0A, 0x00};
-    INT nCount;
+       INT nCount;
 
     nCount = Transmit(lpsText, strlen(lpsText));
-    nCount += Transmit(crlf, strlen(crlf));
-    return nCount;
+       nCount += Transmit(crlf, strlen(crlf));
+       return nCount;
 }
 
 // Receive data from socket
 INT CServerClientSocket::Receive(LPSTR lpsBuffer, UINT nLength)
 {
-    return recv(Socket, lpsBuffer, nLength, 0);
+       return recv(Socket, lpsBuffer, nLength, 0);
 }
 
 // Process winsock messages if any
 VOID CServerClientSocket::MessageLoop()
 {
-    UINT nStatus;
+       UINT nStatus;
     WSANETWORKEVENTS NetworkEvents;
 
     nStatus = WSAWaitForMultipleEvents(1, &Event, FALSE, 0, FALSE);
index 1801a6c..2aa43bd 100644 (file)
@@ -41,7 +41,7 @@ CHttpClient::CHttpClient(CServerSocket *serversocket)
 VOID CHttpClient::SplitUri(LPSTR lpsUri, LPSTR lpsHost, LPSTR lpsResource, LPSTR lpsParams)
 {
     LPSTR lpsPos;
-    LPSTR lpsStr;
+       LPSTR lpsStr;
     UINT i;
 
        strcpy(lpsHost, "");
@@ -118,7 +118,7 @@ VOID CHttpClient::SplitResource(LPSTR lpsResource, LPSTR lpsPath, LPSTR lpsFilen
 VOID CHttpClient::ProcessRequest()
 {
     CHAR sStr[255];
-    CHAR sHost[255];
+       CHAR sHost[255];
     CHAR sResource[255];
     CHAR sParams[255];
 
@@ -145,7 +145,7 @@ VOID CHttpClient::ProcessRequest()
                                }
                        }
                        strcpy(sStr, pConfiguration->GetHttpBase());
-                       strcat(sStr, sResource);
+               strcat(sStr, sResource);
                        SendFile(sStr);
                        break;
                }
@@ -212,7 +212,7 @@ VOID CHttpClient::SendFile(LPSTR lpsFilename)
                return;
        }
 
-    SendText("HTTP/1.1 200 OK");
+       SendText("HTTP/1.1 200 OK");
     SendText("Server: ROSHTTPD");
     SendText("MIME-version: 1.0");
     SendText("Content-Type: text/plain");
@@ -260,7 +260,7 @@ VOID CHttpClient::SendFile(LPSTR lpsFilename)
 }
 
 // Report something to client
-VOID CHttpClient::Report(LPCSTR lpsCode, LPSTR lpsStr)
+VOID CHttpClient::Report(LPSTR lpsCode, LPSTR lpsStr)
 {
     CHAR sTmp[128];
     CHAR sTmp2[16];
index ff85940..1996517 100644 (file)
@@ -37,7 +37,7 @@ public:
        void SplitResource(const LPSTR lpsResource, LPSTR lpsPath, LPSTR lpsFilename, LPSTR lpsExtension);
     void ProcessRequest();
     void SendFile(const LPSTR lpsFilename);
-    void Report(LPCSTR lpsCode, const LPSTR lpsStr);
+    void Report(const LPSTR lpsCode, const LPSTR lpsStr);
 private:
        BOOL bStop;
        LPSTR lpsBuffer;
index db15fe9..da6a40e 100644 (file)
@@ -82,9 +82,9 @@ public:
     virtual VOID SetPort( UINT nPort) {};
        virtual VOID Open();
        virtual VOID Close();
-       virtual INT Transmit( LPCSTR lpsBuffer,  UINT nLength) { return 0; };
+       virtual INT Transmit( LPSTR lpsBuffer,  UINT nLength) { return 0; };
        virtual INT Receive(LPSTR lpsBuffer,  UINT nLength) { return 0; };
-       virtual INT SendText( LPCSTR lpsStr) { return 0; };
+       virtual INT SendText( LPSTR lpsStr) { return 0; };
 protected:
        SOCKET Socket;
        SOCKADDR_IN SockAddrIn;
@@ -100,9 +100,9 @@ public:
        CServerClientSocket() {};
        CServerClientSocket(LPCServerSocket lpServerSocket);
        CServerSocket *GetServerSocket();
-       virtual INT Transmit( LPCSTR lpsBuffer,  UINT nLength);
+       virtual INT Transmit( LPSTR lpsBuffer,  UINT nLength);
        virtual INT Receive(LPSTR lpsBuffer,  UINT nLength);
-       virtual INT SendText( LPCSTR lpsText);
+       virtual INT SendText( LPSTR lpsText);
        virtual VOID MessageLoop();
        virtual VOID OnRead() {};
        //virtual VOID OnWrite() {};
index ab11fca..24fabdb 100644 (file)
@@ -417,7 +417,7 @@ unsigned long TConsole::WriteStringFast(const char* pszString, unsigned long cbS
                if(ini.get_vt100_mode() && cbString + (unsigned)CON_CUR_X == (unsigned)CON_COLS) {
 
                        cbString--;
-                       if((long)cbString >= 0) WriteConsole(hConsole, pszString, cbString, &Result, 0);
+                       if(cbString >= 0) WriteConsole(hConsole, pszString, cbString, &Result, 0);
 
                        COORD dwBufferCoord;
                        dwBufferCoord.X = 0;
index 805736e..9762bd1 100644 (file)
@@ -1,10 +1,10 @@
 LIBRARY clb.dll
 
 EXPORTS
-ClbAddData @1
-ClbSetColumnWidths @2
-ClbStyleW @3
-ClbWndProc @4
-CustomControlInfoW @5
+ClbAddData@12 @1
+ClbSetColumnWidths@12 @2
+ClbStyleW@8 @3
+ClbWndProc@16 @4
+CustomControlInfoW@4 @5
 
 ; EOF
index f55f619..eb37a6b 100644 (file)
@@ -72,13 +72,10 @@ ProcessListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
          * subtract it from our clip rect because we don't
          * use icons in this list control.
          */
-       rcClip.left = LVIR_BOUNDS;
-       SendMessage(hWnd, LVM_GETITEMRECT, 0, (LPARAM)&rcClip);
-       rcClip.left = LVIR_BOUNDS;
-       SendMessage(hWnd, LVM_GETITEMRECT, ListView_GetItemCount(hWnd) - 1, (LPARAM)&rcItem);
-       rcClip.bottom = rcItem.bottom;
-       rcClip.left = LVIR_ICON;
-       SendMessage(hWnd, LVM_GETITEMRECT, 0, (LPARAM)&rcItem);
+        (void)ListView_GetItemRect(hWnd, 0, &rcClip, LVIR_BOUNDS);
+        (void)ListView_GetItemRect(hWnd, ListView_GetItemCount(hWnd) - 1, &rcItem, LVIR_BOUNDS);
+        rcClip.bottom = rcItem.bottom;
+        (void)ListView_GetItemRect(hWnd, 0, &rcItem, LVIR_ICON);
         rcClip.left = rcItem.right;
 
         /*
index 447c389..0e4b8c1 100644 (file)
@@ -85,11 +85,11 @@ int Generate()
        HANDLE hFile = NULL;
        BOOL fReturnValue;
 
-       const char szxReplacedFile[] = "c:\\testFileIsReplaced";
-       const char szxMovedFileWithRepl[] = "c:\\testFileShouldBeMovedW";
-       const char szxMovedFile[] = "c:\\testFileShouldBeMoved";
-       const char szxNewMovedFile[] = "c:\\testFileIsMoved";
-       const char szxDeletedFile[] = "c:\\testFileShouldBeDeleted";
+       char *szxReplacedFile = "c:\\testFileIsReplaced";
+       char *szxMovedFileWithRepl = "c:\\testFileShouldBeMovedW";
+       char *szxMovedFile = "c:\\testFileShouldBeMoved";
+       char *szxNewMovedFile = "c:\\testFileIsMoved";
+       char *szxDeletedFile = "c:\\testFileShouldBeDeleted";
 
        memset(sBuf, 0xaa, sizeof(sBuf));
 
index 1e4e18e..abb7841 100644 (file)
@@ -1,4 +1,3 @@
-#include <windows.h>
 #include <conio.h>
 #include <io.h>
 #include <stdio.h>
@@ -503,7 +502,7 @@ applyPatch_file_open_error:
          if (c == 'y')
          {
             char buffer[MAX_PATH];
-            _snprintf(buffer, MAX_PATH, "%s.bak", fileName);
+            snprintf(buffer, MAX_PATH, "%s.bak", fileName);
             buffer[MAX_PATH-1] = '\0';
             makeBackup = 1;
             if (access(buffer, 0) >= 0) /* file exists */
index 1768478..2d962a4 100644 (file)
@@ -305,12 +305,12 @@ CreateFreeLoaderIniForDos(PWCHAR IniPath,
                    L"SystemPath",
                    ArcPath);
 
-  /* Options=/DEBUGPORT=SCREEN /NOGUIBOOT /SOS*/
+  /* Options=/DEBUGPORT=SCREEN /NOGUIBOOT */
   IniCacheInsertKey(IniSection,
                    NULL,
                    INSERT_LAST,
                    L"Options",
-                   L"/DEBUGPORT=SCREEN /NOGUIBOOT /SOS");
+                   L"/DEBUGPORT=SCREEN /NOGUIBOOT");
 
   /* Create "DOS" section */
   IniSection = IniCacheAppendSection(IniCache,
@@ -416,12 +416,12 @@ CreateFreeLoaderIniForReactos(PWCHAR IniPath,
                    L"SystemPath",
                    ArcPath);
 
-  /* Options=/DEBUGPORT=COM1 /NOGUIBOOT /SOS*/
+  /* Options=/DEBUGPORT=SCREEN /NOGUIBOOT */
   IniCacheInsertKey(IniSection,
                    NULL,
                    INSERT_LAST,
                    L"Options",
-                   L"/DEBUGPORT=COM1 /NOGUIBOOT /SOS");
+                   L"/DEBUGPORT=COM1 /NOGUIBOOT");
 
   /* Save the ini file */
   IniCacheSave(IniCache, IniPath);
index 3445ade..5184e0d 100644 (file)
@@ -636,14 +636,14 @@ EnumerateBiosDiskEntries(PPARTLIST PartList)
 
                       InsertTailList(&PartList->BiosDiskListHead, &BiosDiskEntry->ListEntry);
 
-                      DPRINT("DiskNumber:        %lu\n", BiosDiskEntry->DiskNumber);
-                      DPRINT("Signature:         %08lx\n", BiosDiskEntry->Signature);
-                      DPRINT("Checksum:          %08lx\n", BiosDiskEntry->Checksum);
-                      DPRINT("BytesPerSector:    %lu\n", BiosDiskEntry->DiskGeometry.BytesPerSector);
-                      DPRINT("NumberOfCylinders: %lu\n", BiosDiskEntry->DiskGeometry.NumberOfCylinders);
-                      DPRINT("NumberOfHeads:     %lu\n", BiosDiskEntry->DiskGeometry.NumberOfHeads);
+                      DPRINT("DiskNumber:        %d\n", BiosDiskEntry->DiskNumber);
+                      DPRINT("Signature:         %08x\n", BiosDiskEntry->Signature);
+                      DPRINT("Checksum:          %08x\n", BiosDiskEntry->Checksum);
+                      DPRINT("BytesPerSector:    %d\n", BiosDiskEntry->DiskGeometry.BytesPerSector);
+                      DPRINT("NumberOfCylinders: %d\n", BiosDiskEntry->DiskGeometry.NumberOfCylinders);
+                      DPRINT("NumberOfHeads:     %d\n", BiosDiskEntry->DiskGeometry.NumberOfHeads);
                       DPRINT("DriveSelect:       %02x\n", BiosDiskEntry->Int13DiskData.DriveSelect);
-                      DPRINT("MaxCylinders:      %lu\n", BiosDiskEntry->Int13DiskData.MaxCylinders);
+                      DPRINT("MaxCylinders:      %d\n", BiosDiskEntry->Int13DiskData.MaxCylinders);
                       DPRINT("SectorsPerTrack:   %d\n", BiosDiskEntry->Int13DiskData.SectorsPerTrack);
                       DPRINT("MaxHeads:          %d\n", BiosDiskEntry->Int13DiskData.MaxHeads);
                       DPRINT("NumberDrives:      %d\n", BiosDiskEntry->Int13DiskData.NumberDrives);
index e8d130b..a64d648 100755 (executable)
@@ -129,7 +129,7 @@ WinMain(HINSTANCE hInst,
   wndclass.cbWndExtra = 0;
   wndclass.hInstance = hInstance;
   wndclass.hIcon = hMainIcon;
-  wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
+  wndclass.hCursor = LoadCursor (NULL, MAKEINTRESOURCE(IDC_ARROW));
   wndclass.hbrBackground = 0;
   wndclass.lpszMenuName = NULL;
   wndclass.lpszClassName = szFrameClass;
index 8fa1d60..55c8c03 100644 (file)
@@ -107,18 +107,15 @@ FindProgramDlg::FindProgramDlg(HWND hwnd)
 
        LV_COLUMN column = {LVCF_FMT|LVCF_WIDTH|LVCF_TEXT, LVCFMT_LEFT, 250};
 
-       TCHAR lvColName[] = _T("Name");
-       column.pszText = lvColName;
+       column.pszText = _T("Name");
        ListView_InsertColumn(_list_ctrl, 0, &column);
 
        column.cx = 300;
-       TCHAR lvColPath[] = _T("Path");
-       column.pszText = lvColPath;
+       column.pszText = _T("Path");
        ListView_InsertColumn(_list_ctrl, 1, &column);
 
        column.cx = 400;
-       TCHAR lvColMenuPath[] = _T("Menu Path");
-       column.pszText = lvColMenuPath;
+       column.pszText = _T("Menu Path");
        ListView_InsertColumn(_list_ctrl, 2, &column);
 
        ListView_SetExtendedListViewStyleEx(_list_ctrl, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
index a85f146..6fc4319 100644 (file)
@@ -366,7 +366,7 @@ BEGIN
     IDS_MINIMIZE_ALL        "mimimiser toutes les fenêtres"
     IDS_DESKTOP_NUM         "Bureau %d"
     IDS_VOLUME              "Volume"
-    IDS_ITEMS_CUR           "objets actuels"
+    IDS_ITEMS_CUR           "abjets actuels"
     IDS_ITEMS_CONFIGURED    "configuration"
     IDS_ITEMS_VISIBLE       "visible"
     IDS_ITEMS_HIDDEN        "caché"
index a37104c..2750513 100644 (file)
@@ -1186,7 +1186,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL
 
        /**TODO launching autostart programs can be moved into a background thread. */
        if (autostart) {
-               const char* argv[] = {"", "s"}; // call startup routine in SESSION_START mode
+               char* argv[] = {"", "s"};       // call startup routine in SESSION_START mode
                startup(2, argv);
        }
 
index bfe5c60..ecda281 100644 (file)
@@ -27,7 +27,7 @@
 
 
  // launch start programs
-extern "C" int startup(int argc, const char *argv[]);
+extern "C" int startup(int argc, char *argv[]);
 
  // load Shell Service Objects (volume control, printer/network icons, ...)
 struct SSOThread : public Thread
index 207b4a0..ec0e422 100644 (file)
@@ -416,7 +416,7 @@ static const struct op_mask
     SETUP                      = {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE};
 #define DEFAULT SESSION_START
 
-int startup(int argc, const char *argv[])
+int startup(int argc, char *argv[])
 {
     struct op_mask ops; /* Which of the ops do we want to perform? */
     /* First, set the current directory to SystemRoot */
index c6037f2..439b28b 100644 (file)
@@ -865,8 +865,7 @@ MDIMainFrame::MDIMainFrame(HWND hwnd)
 #endif
        rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE;
 
-       TCHAR ExtrasBand[] = _T("Extras");
-       rbBand.lpText = ExtrasBand;
+       rbBand.lpText = TEXT("Extras");
        rbBand.hwndChild = _hextrabar;
        rbBand.cxMinChild = 0;
        rbBand.cyMinChild = btn_hgt;
@@ -875,8 +874,7 @@ MDIMainFrame::MDIMainFrame(HWND hwnd)
 
 #ifndef _NO_WIN_FS
        rbBand.fStyle |= RBBS_BREAK;
-       TCHAR DrivesBand[] = _T("Drives");
-       rbBand.lpText = DrivesBand;
+       rbBand.lpText = TEXT("Drives");
        rbBand.hwndChild = _hdrivebar;
        rbBand.cxMinChild = 0;
        rbBand.cyMinChild = btn_hgt;
index 4cb3d33..e22d9ec 100644 (file)
@@ -230,14 +230,12 @@ void NtObjDirectory::read_directory(int scan_flags)
                        if (info->name.string_ptr) {
                                info->name.string_ptr[info->name.string_len / sizeof(WCHAR)] = 0;
                        } else {
-                               TCHAR empty_string_ptr[] = _T("");
-                               info->name.string_ptr = empty_string_ptr;
+                               info->name.string_ptr = TEXT("");
                        }
                        if (info->type.string_ptr) {
                                info->type.string_ptr[info->type.string_len / sizeof(WCHAR)] = 0;
                        } else {
-                               TCHAR empty_string_ptr[] = _T("");
-                               info->type.string_ptr = empty_string_ptr;
+                               info->type.string_ptr = TEXT("");
                        }
                        lstrcpynW(p, info->name.string_ptr, COUNTOF(buffer));
 #else
index 1580e3e..a4e4033 100644 (file)
@@ -133,7 +133,7 @@ void BrowserNavigator::goto_url(LPCTSTR url)
        else {
                _new_url = url;
 
-               _browser->Navigate(BStr(L"about:blank"), NULL, NULL, NULL, NULL);
+               _browser->Navigate(L"about:blank", NULL, NULL, NULL, NULL);
        }
 }
 
index 1fa6e34..d51c08c 100644 (file)
@@ -148,15 +148,13 @@ LRESULT DesktopBar::Init(LPCREATESTRUCT pcs)
        rbBand.cxMinChild = rbBand.cyIntegral * 3;
        rbBand.fStyle = RBBS_VARIABLEHEIGHT|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE;
 
-       TCHAR QuickLaunchBand[] = _T("Quicklaunch");
-       rbBand.lpText = QuickLaunchBand;
+       rbBand.lpText = TEXT("Quicklaunch");
        rbBand.hwndChild = _hwndQuickLaunch;
        rbBand.cx = 250;
        rbBand.wID = IDW_QUICKLAUNCHBAR;
        SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
 
-       TCHAR TaskbarBand[] = _T("Taskbar");
-       rbBand.lpText = TaskbarBand;
+       rbBand.lpText = TEXT("Taskbar");
        rbBand.hwndChild = _hwndTaskBar;
        rbBand.cx = 200;        //pcs->cx-_taskbar_pos-quicklaunch_width-(notifyarea_width+1);
        rbBand.wID = IDW_TASKTOOLBAR;
index 4442387..e3de958 100644 (file)
  // Martin Fuchs, 23.07.2003
  //
 
-#ifdef __cplusplus
-
-#ifdef _MSC_VER
-#pragma warning(disable: 4786) // disable warnings about too long debug information symbols
-#endif
-
- // STL headers for strings and streams
-#include <string>
-#include <iostream>
-using namespace std;
-
-#endif /* __cplusplus */
-
 
  // standard windows headers
 #define WIN32_LEAN_AND_MEAN
@@ -203,6 +190,15 @@ BOOL exists_path(LPCTSTR path);
 
 #ifdef __cplusplus
 
+#ifdef _MSC_VER
+#pragma warning(disable: 4786) // disable warnings about too long debug information symbols
+#endif
+
+ // STL headers for strings and streams
+#include <string>
+#include <iostream>
+using namespace std;
+
  // containers
 #include <map>
 #include <set>
index 29c79cd..e947451 100644 (file)
@@ -279,12 +279,12 @@ XMLNode* XMLNode::create_relative(const char* path)
 
 
  /// encode XML string literals
-std::string EncodeXMLString(const XS_String& str, bool cdata)
+std::string EncodeXMLString(const XS_String& str)
 {
        LPCXSSTR s = str.c_str();
        size_t l = XS_len(s);
 
-       if (!cdata && l<=BUFFER_LEN) {
+       if (l <= BUFFER_LEN) {
                LPXSSTR buffer = (LPXSSTR)alloca(6*sizeof(XS_CHAR)*XS_len(s));  // worst case "&quot;" / "&apos;"
                LPXSSTR o = buffer;
 
@@ -410,10 +410,10 @@ XS_String DecodeXMLString(const XS_String& str)
                                p += 5;
                        } else
                                *o++ = *p;
-               } else if (*p=='<' && !XS_nicmp(p+1,XS_TEXT("![CDATA["),8)) {
-                       LPCXSSTR e = XS_strstr(p+9, XS_TEXT("]]>"));
+               } else if (*p=='<' && !XS_nicmp(p+1,XS_TEXT("!CDATA["),7)) {
+                       p += 9;
+                       LPCXSSTR e = XS_strstr(p, XS_TEXT("]]>"));
                        if (e) {
-                               p += 9;
                                size_t l = e - p;
                                memcpy(o, p, l);
                                o += l;
index a488bbf..0d224c9 100644 (file)
@@ -409,7 +409,7 @@ inline std::string get_utf8(const XS_String& s)
 
 #endif // XS_STRING_UTF8
 
-extern std::string EncodeXMLString(const XS_String& str, bool cdata=false);
+extern std::string EncodeXMLString(const XS_String& str);
 extern XS_String DecodeXMLString(const XS_String& str);
 
 
@@ -714,7 +714,7 @@ struct XMLNode : public XS_String
                        return super::find(x);
                }
 
-               XS_String get(const char* x, LPCXSSTR def=XS_EMPTY_STR) const
+               XS_String get(const char* x, LPXSSTR def=XS_EMPTY_STR) const
                {
                        const_iterator found = find(x);
 
@@ -728,7 +728,7 @@ struct XMLNode : public XS_String
         /// map of XML node attributes
        struct AttributeMap : public std::map<XS_String, XS_String>
        {
-               XS_String get(const char* x, LPCXSSTR def=XS_EMPTY_STR) const
+               XS_String get(const char* x, LPXSSTR def=XS_EMPTY_STR) const
                {
                        const_iterator found = find(x);
 
@@ -848,7 +848,7 @@ struct XMLNode : public XS_String
        }
 
         /// read only access to an attribute
-       template<typename T> XS_String get(const T& attr_name, LPCXSSTR def=XS_EMPTY_STR) const
+       template<typename T> XS_String get(const T& attr_name, LPXSSTR def=XS_EMPTY_STR) const
        {
                AttributeMap::const_iterator found = _attributes.find(attr_name);
 
@@ -940,9 +940,9 @@ struct XMLNode : public XS_String
                return DecodeXMLString(ret.c_str());
        }
 
-       void set_content(const XS_String& s, bool cdata=false)
+       void set_content(const XS_String& s)
        {
-               _content.assign(EncodeXMLString(s.c_str(), cdata));
+               _content.assign(EncodeXMLString(s.c_str()));
        }
 
 #ifdef XMLNODE_LOCATION
@@ -2391,10 +2391,10 @@ struct XMLWriter
                return _stack.top()._attributes[attr_name];
        }
 
-       void set_content(const XS_String& s, bool cdata=false)
+       void set_content(const XS_String& s)
        {
                if (!_stack.empty())
-                       _stack.top()._content = EncodeXMLString(s.c_str(), cdata);
+                       _stack.top()._content = EncodeXMLString(s.c_str());
        }
 
         // public for access in StackEntry
index 8b153d0..f276278 100644 (file)
@@ -306,7 +306,7 @@ CheckVolume(
     }
 
     /* Call provider */
-    //PrintString("  Verifying volume %S\n", DrivePath);
+    PrintString("  Verifying volume %S\n", DrivePath);
     RtlInitUnicodeString(&DrivePathU, DrivePath);
     Status = ChkdskFunc(&DrivePathU,
                         TRUE, // FixErrors
@@ -360,11 +360,11 @@ _main(int argc,
         if ((DeviceMap.Query.DriveMap & (1 << i))
          && (DeviceMap.Query.DriveType[i] == DOSDEVICE_DRIVE_FIXED))
         {
-            swprintf(DrivePath, L"%c:\\", L'A'+i);
+            swprintf(DrivePath, L"%c:\\", 'A'+i);
             CheckVolume(DrivePath);
         }
     }
-    //PrintString("  Done\n\n");
+    PrintString("  Done\n\n");
     return 0;
 }
 
index 20560c1..4cab403 100644 (file)
@@ -1,10 +1,8 @@
-#ifndef RESOURCE_H__
-#define RESOURCE_H__
+
 
 #define RC_STRING_MAX_SIZE                 4096
 #define IDS_Copy                            100
 #define IDS_FAILS                           101
 
-#endif
 
 /* EOF */
diff --git a/reactos/base/system/rundll32/lang/nl-NL.rc b/reactos/base/system/rundll32/lang/nl-NL.rc
deleted file mode 100644 (file)
index 020abeb..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "resource.h"
-/*
- * Moved all hardcoded strings to En.rc.
- * By Magnus Olsen  2005 magnus@itkonsult-olsen.com
- * Translation done by Vertaald door Eric Janssen
- */
-
-LANGUAGE LANG_DUTCH, SUBLANG_DUTCH
-STRINGTABLE DISCARDABLE
-{
-IDS_DllNotLoaded,   "LoadLibrary kon '%s' niet laden"
-IDS_MissingEntry, "Entry point:%s\n niet gevonden In %s"
-}
index 60d14a2..2f3844b 100644 (file)
@@ -11,5 +11,4 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 #include "lang/ru-RU.rc"
 #include "lang/el-GR.rc"
 #include "lang/nb-NO.rc"
-#include "lang/nl-NL.rc"
 #include "lang/uk-UA.rc"
index eeaf598..513d8b2 100644 (file)
@@ -275,9 +275,9 @@ StartScreenSaver(
        if (bufferSize == 0)
                goto cleanup;
        
-       szApplicationName[bufferSize] = 0; /* Terminate the string */
+    szApplicationName[bufferSize] = 0; /* Terminate the string */
 
-       if (wcslen(szApplicationName) == 0)
+    if (wcslen(szApplicationName) == 0)
                goto cleanup;
 
        wsprintfW(szCommandLine, L"%s /s", szApplicationName);
index a615bde..8cb1ba9 100644 (file)
@@ -12,7 +12,6 @@
   <property name="BASEADDRESS_SLAYER" value="0x5c7e0000" />
   <property name="BASEADDRESS_DPLAYX" value="0x5e080000" />
   <property name="BASEADDRESS_DINPUT" value="0x5f580000" />
-  <property name="BASEADDRESS_NETID" value="0x5f660000" />
   <property name="BASEADDRESS_MAPI32" value="0x62250000" />
   <property name="BASEADDRESS_HDWWIZ" value="0x64d40000" />
   <property name="BASEADDRESS_TIMEDATE" value="0x64da0000" />
index 35132ae..62e33df 100644 (file)
@@ -53,8 +53,6 @@ HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00010409","Layout File",0
 HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00010409","Layout Text",0x00000000,"US-Dvorak"
 HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000040c","Layout File",0x00000000,"kbdfr.dll"
 HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000040c","Layout Text",0x00000000,"FR"
-HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000410","Layout File",0x00000000,"kbdit.dll"
-HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000410","Layout Text",0x00000000,"IT"
 HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000419","Layout File",0x00000000,"kbdru.dll"
 HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000419","Layout Text",0x00000000,"Russian"
 HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000041d","Layout File",0x00000000,"kbdse.dll"
index 64b92d0..9b9c367 100644 (file)
@@ -136,7 +136,6 @@ dll\keyboard\kbdfr\kbdfr.dll                        1
 dll\keyboard\kbdgr\kbdgr.dll                        1
 dll\keyboard\kbdhe\kbdhe.dll                        1
 dll\keyboard\kbdhu\kbdhu.dll                        1
-dll\keyboard\kbdit\kbdit.dll                        1
 dll\keyboard\kbdja\kbdja.dll                        1
 dll\keyboard\kbdpo\kbdpo.dll                        1
 dll\keyboard\kbdru\kbdru.dll                        1
@@ -194,7 +193,6 @@ dll\win32\msvideo\msvfw32.dll                       1
 dll\win32\mswsock\mswsock.dll                       1
 dll\win32\netapi32\netapi32.dll                     1
 dll\win32\netcfgx\netcfgx.dll                       1
-dll\win32\netid\netid.dll                           1
 dll\win32\newdev\newdev.dll                         1
 dll\win32\ntmarta\ntmarta.dll                       1
 dll\win32\objsel\objsel.dll                         1
index 44c6f4c..96d5d00 100644 (file)
@@ -104,7 +104,6 @@ Default = "XT-, AT- or extended keyboard (83-105 keys)"
 00000408 = "Greek"
 00010408 = "Greek 220"
 0000040E = "Hungarian" 
-00000410 = "Italian"
 00000411 = "Japanese"
 00000816 = "Portuguese (Portugal)"
 00000419 = "Russian"
@@ -122,7 +121,6 @@ Default = "XT-, AT- or extended keyboard (83-105 keys)"
 0000040A = kbdes.dll
 0000040C = kbdfr.dll
 0000040E = kbdhu.dll
-00000410 = kbdit.dll
 00000419 = kbdru.dll
 0000041D = kbdse.dll
 0000041E = kbdth.dll
index ac0dd3f..43b1ef6 100644 (file)
@@ -119,14 +119,11 @@ NoGui:
                }
 
                // Install the drive mapper according to this sections drive mappings
-#ifdef __i386__
                DriveMapMapDrivesInSection(OperatingSystemSectionNames[SelectedOperatingSystem]);
-#endif
                if (_stricmp(SettingValue, "ReactOS") == 0)
                {
                        LoadAndBootReactOS(OperatingSystemSectionNames[SelectedOperatingSystem]);
                }
-#ifdef __i386__
                else if (_stricmp(SettingValue, "WindowsNT40") == 0)
                {
                        LoadAndBootWindows(OperatingSystemSectionNames[SelectedOperatingSystem], _WIN32_WINNT_NT4);
@@ -159,7 +156,6 @@ NoGui:
                {
                        LoadAndBootDrive(OperatingSystemSectionNames[SelectedOperatingSystem]);
                }
-#endif
        }
 
 
index e4d9de5..38b61dd 100644 (file)
@@ -33,15 +33,7 @@ const CHAR   CustomBootPrompt[] = "Press ENTER to boot your custom boot setup.";
 
 VOID OptionMenuCustomBoot(VOID)
 {
-       PCSTR   CustomBootMenuList[] = {
-#ifdef __i386__
-               "Disk",
-               "Partition",
-               "Boot Sector File",
-               "ReactOS",
-               "Linux"
-#endif /* __i386__ */
-               };
+       PCSTR   CustomBootMenuList[] = { "Disk", "Partition", "Boot Sector File", "ReactOS", "Linux" };
        ULONG           CustomBootMenuCount = sizeof(CustomBootMenuList) / sizeof(CustomBootMenuList[0]);
        ULONG           SelectedMenuItem;
 
@@ -53,7 +45,6 @@ VOID OptionMenuCustomBoot(VOID)
 
        switch (SelectedMenuItem)
        {
-#ifdef __i386__
        case 0: // Disk
                OptionMenuCustomBootDisk();
                break;
@@ -69,11 +60,9 @@ VOID OptionMenuCustomBoot(VOID)
        case 4: // Linux
                OptionMenuCustomBootLinux();
                break;
-#endif /* __i386__ */
        }
 }
 
-#ifdef __i386__
 VOID OptionMenuCustomBootDisk(VOID)
 {
        CHAR    SectionName[100];
@@ -408,4 +397,3 @@ VOID OptionMenuCustomBootLinux(VOID)
 
        LoadAndBootLinux(SectionName, "Custom Linux Setup");
 }
-#endif /* __i386__ */
index 7e82f13..31ecab7 100644 (file)
@@ -22,7 +22,6 @@
 #define NDEBUG
 #include <debug.h>
 
-#ifdef __i386__
 BOOLEAN        DriveMapInstalled = FALSE;      // Tells us if we have already installed our drive map int 13h handler code
 ULONG          OldInt13HandlerAddress = 0;     // Address of BIOS int 13h handler
 ULONG          DriveMapHandlerAddress = 0;     // Linear address of our drive map handler
@@ -223,4 +222,3 @@ VOID DriveMapRemoveInt13Handler(VOID)
                DriveMapInstalled = FALSE;
        }
 }
-#endif /* __i386__ */
index 29a3d2c..1d25f1f 100644 (file)
@@ -20,7 +20,7 @@
 #ifndef __DRIVEMAP_H
 #define __DRIVEMAP_H
 
-#ifdef __i386__
+
 typedef struct
 {
        UCHAR           DriveMapCount;          // Count of drives currently mapped
@@ -39,6 +39,5 @@ extern PVOID                  DriveMapInt13HandlerStart;
 extern PVOID                   DriveMapInt13HandlerEnd;
 extern ULONG                           DriveMapOldInt13HandlerAddress;
 extern DRIVE_MAP_LIST  DriveMapInt13HandlerMapList;
-#endif /* __i386__ */
 
 #endif // #defined __DRIVEMAP_H
index 14d3bf0..90c6a8a 100644 (file)
@@ -22,7 +22,7 @@
 #ifndef __LINUX_H
 #define __LINUX_H
 
-#ifdef __i386__
+
 #define LINUX_LOADER_TYPE_LILO                 0x01
 #define LINUX_LOADER_TYPE_LOADLIN              0x11
 #define LINUX_LOADER_TYPE_BOOTSECT             0x21
@@ -135,6 +135,5 @@ BOOLEAN     LinuxReadSetupSector(PFILE LinuxKernelFile);
 BOOLEAN        LinuxReadKernel(PFILE LinuxKernelFile);
 BOOLEAN        LinuxCheckKernelVersion(VOID);
 BOOLEAN        LinuxReadInitrd(PFILE LinuxInitrdFile);
-#endif /* __i386__ */
 
 #endif // defined __LINUX_H
index c0aea83..e274c9a 100644 (file)
 #ifndef __BOOT_H
 #define __BOOT_H
 
-#ifdef __i386__
 VOID   LoadAndBootBootSector(PCSTR OperatingSystemName);
 VOID   LoadAndBootPartition(PCSTR OperatingSystemName);
 VOID   LoadAndBootDrive(PCSTR OperatingSystemName);
-#endif /* __i386__ */
 
 #endif // defined __BOOT_H
index 72cfa53..82ac615 100644 (file)
@@ -25,12 +25,10 @@ VOID        DoOptionsMenu(VOID);
 VOID   OptionMenuReboot(VOID);
 
 VOID   OptionMenuCustomBoot(VOID);
-#ifdef __i386__
 VOID   OptionMenuCustomBootDisk(VOID);
 VOID   OptionMenuCustomBootPartition(VOID);
 VOID   OptionMenuCustomBootBootSectorFile(VOID);
 VOID   OptionMenuCustomBootReactOS(VOID);
 VOID   OptionMenuCustomBootLinux(VOID);
-#endif /* __i386__ */
 
 #endif // #defined __OPTIONS_H
index 5c086ef..27589bd 100644 (file)
@@ -23,7 +23,6 @@
 #define NDEBUG
 #include <debug.h>
 
-#ifdef __i386__
 #define        LINUX_READ_CHUNK_SIZE   0x20000                 // Read 128k at a time
 
 
@@ -492,4 +491,3 @@ BOOLEAN LinuxReadInitrd(PFILE LinuxInitrdFile)
 
        return TRUE;
 }
-#endif /* __i386__ */
index a96bbd5..bbbf34f 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <freeldr.h>
 
-#ifdef __i386__
 VOID LoadAndBootBootSector(PCSTR OperatingSystemName)
 {
        PFILE   FilePointer;
@@ -214,4 +213,3 @@ VOID LoadAndBootDrive(PCSTR OperatingSystemName)
        //DisableA20();
        ChainLoadBiosBootSectorCode();
 }
-#endif /* __i386__ */
index eafd96d..5c60d63 100644 (file)
@@ -926,13 +926,13 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
         * Load boot drivers
         */
        FrLdrLoadBootDrivers(szBootPath, 40);
-       //UiUnInitialize("Booting ReactOS...");
+       UiUnInitialize("Booting ReactOS...");
 
        /*
         * Now boot the kernel
         */
        DiskStopFloppyMotor();
-    //MachVideoPrepareForReactOS();
+    MachVideoPrepareForReactOS();
     FrLdrStartup(0x2badb002);
 }
 
diff --git a/reactos/config.rbuild b/reactos/config.rbuild
new file mode 100644 (file)
index 0000000..be3d6df
--- /dev/null
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>\r
+<rbuild xmlns:xi="http://www.w3.org/2001/XInclude">\r
+\r
+<!--\r
+  This file is a template used as a starting point for compile-time\r
+  configuration of ReactOS. Make a copy of this file and name it config.rbuild.\r
+  Then change the options in config.rbuild. If you don't have a config.rbuild file,\r
+  then the defaults in this file, config.template.rbuild, will be used instead.\r
+\r
+  Boolean options can obtain the values 0 (disabled) or 1 (enabled). String\r
+  options can obtain any value specified in the comment before it.\r
+-->\r
+\r
+\r
+<!--\r
+  Architecture to build for. Specify one of:\r
+    i386\r
+-->\r
+<property name="ARCH" value="i386" />\r
+\r
+<!--\r
+  Sub-architecture to build for. Specify one of:\r
+    xbox\r
+-->\r
+<property name="SARCH" value="" />\r
+\r
+\r
+<!--\r
+  Which CPU ReactOS should be optimized for. Specify one of:\r
+    i486, i586, pentium, pentium2, pentium3, pentium4, athlon-xp, athlon-mp,\r
+    k6-2\r
+\r
+  See GCC manual for more CPU names and which CPUs GCC can optimize for.\r
+-->\r
+<property name="OARCH" value="pentium2" />\r
+\r
+\r
+<!--\r
+  Whether to compile for an uniprocessor or multiprocessor machine.\r
+-->\r
+<property name="MP" value="0" />\r
+\r
+\r
+<!--\r
+  Whether to compile in the integrated kernel debugger.\r
+-->\r
+<property name="KDBG" value="1" />\r
+\r
+\r
+<!--\r
+  Whether to compile for debugging. No compiler optimizations will be\r
+  performed.\r
+-->\r
+<property name="DBG" value="1" />\r
+\r
+\r
+<!--\r
+  Whether to compile for debugging with GDB. If you don't use GDB, don't\r
+  enable this.\r
+-->\r
+<property name="GDB" value="0" />\r
+\r
+\r
+<!--\r
+  Whether to compile apps/libs with features covered software patents or not.\r
+  If you live in a country where software patents are valid/apply, don't\r
+  enable this (except they/you purchased a license from the patent owner).\r
+  This settings is disabled (0) by default.\r
+-->\r
+<property name="NSWPAT" value="0" />\r
+\r
+<!--\r
+  Whether to compile with NT-compatible LPC Semantics. At the moment, this will\r
+  cause all LPC-related functionality to fail and should only be used if you're\r
+  working on the \ntlpc directory. Leave this disabled unless you really know\r
+  what you're doing.\r
+-->\r
+<property name="NTLPC" value="0" />\r
+\r
+</rbuild>\r
index 252e523..92c8107 100644 (file)
@@ -75,6 +75,6 @@
   working on the \ntlpc directory. Leave this disabled unless you really know
   what you're doing.
 -->
-<property name="NTLPC" value="1" />
+<property name="NTLPC" value="0" />
 
 </rbuild>
diff --git a/reactos/depmap.xsl b/reactos/depmap.xsl
deleted file mode 100644 (file)
index 7184e45..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:template match="/">
-<html>
-<head>
-<title>ReactOS Dependency Map</title>
-</head>
-<body>
-<h1>ReactOS Dependency Map</h1>
-<table border="1">
-  <tr bgcolor="#9acd32">
-    <th align="left">Module Name</th>
-    <th align="left">Module Location</th>
-    <th align="left">Other Module Usage</th>
-    <th align="left">Module Re-Usage</th>
-  </tr>
-  <xsl:for-each select="components/component">
-    <tr>
-      <td><xsl:value-of select="name"/></td>
-      <td><xsl:value-of select="base"/></td>
-      <td><xsl:value-of select="lib_count"/></td>
-      <td><xsl:value-of select="ref_count"/></td>
-    </tr>
-    </xsl:for-each>
-    </table>
-  </body>
-  </html>
-</xsl:template>
-
-</xsl:stylesheet>
index f2cac93..536c623 100644 (file)
-# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=freetype - Win32 Debug Singlethreaded
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "freetype.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "freetype.mak" CFG="freetype - Win32 Debug Singlethreaded"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "freetype - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "freetype - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE "freetype - Win32 Debug Multithreaded" (based on "Win32 (x86) Static Library")
-!MESSAGE "freetype - Win32 Release Multithreaded" (based on "Win32 (x86) Static Library")
-!MESSAGE "freetype - Win32 Release Singlethreaded" (based on "Win32 (x86) Static Library")
-!MESSAGE "freetype - Win32 Debug Singlethreaded" (based on "Win32 (x86) Static Library")
-!MESSAGE 
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF  "$(CFG)" == "freetype - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\..\objs\release"
-# PROP Intermediate_Dir "..\..\..\objs\release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /MD /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c
-# SUBTRACT CPP /nologo /Z<none> /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype230.lib"
-
-!ELSEIF  "$(CFG)" == "freetype - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\..\objs\debug"
-# PROP Intermediate_Dir "..\..\..\objs\debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /MDd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c
-# SUBTRACT CPP /nologo /X /YX
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype230_D.lib"
-
-!ELSEIF  "$(CFG)" == "freetype - Win32 Debug Multithreaded"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "freetype___Win32_Debug_Multithreaded"
-# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Multithreaded"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\..\objs\debug_mt"
-# PROP Intermediate_Dir "..\..\..\objs\debug_mt"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /Za /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /GZ /c
-# SUBTRACT BASE CPP /X
-# ADD CPP /MTd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c
-# SUBTRACT CPP /nologo /X /YX
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo /out:"lib\freetype230_D.lib"
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype230MT_D.lib"
-
-!ELSEIF  "$(CFG)" == "freetype - Win32 Release Multithreaded"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "freetype___Win32_Release_Multithreaded"
-# PROP BASE Intermediate_Dir "freetype___Win32_Release_Multithreaded"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\..\objs\release_mt"
-# PROP Intermediate_Dir "..\..\..\objs\release_mt"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /Za /W3 /GX /O2 /I "..\freetype\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c
-# ADD CPP /MT /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c
-# SUBTRACT CPP /nologo /Z<none> /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo /out:"lib\freetype230.lib"
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype230MT.lib"
-
-!ELSEIF  "$(CFG)" == "freetype - Win32 Release Singlethreaded"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "freetype___Win32_Release_Singlethreaded"
-# PROP BASE Intermediate_Dir "freetype___Win32_Release_Singlethreaded"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\..\objs\release_st"
-# PROP Intermediate_Dir "..\..\..\objs\release_st"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c
-# SUBTRACT BASE CPP /YX
-# ADD CPP /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c
-# SUBTRACT CPP /nologo /Z<none> /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype230.lib"
-# ADD LIB32 /out:"..\..\..\objs\freetype230ST.lib"
-# SUBTRACT LIB32 /nologo
-
-!ELSEIF  "$(CFG)" == "freetype - Win32 Debug Singlethreaded"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "freetype___Win32_Debug_Singlethreaded"
-# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Singlethreaded"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\..\objs\debug_st"
-# PROP Intermediate_Dir "..\..\..\objs\debug_st"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c
-# SUBTRACT BASE CPP /X /YX
-# ADD CPP /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c
-# SUBTRACT CPP /nologo /X /YX
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype230_D.lib"
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype230ST_D.lib"
-
-!ENDIF 
-
-# Begin Target
-
-# Name "freetype - Win32 Release"
-# Name "freetype - Win32 Debug"
-# Name "freetype - Win32 Debug Multithreaded"
-# Name "freetype - Win32 Release Multithreaded"
-# Name "freetype - Win32 Release Singlethreaded"
-# Name "freetype - Win32 Debug Singlethreaded"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\..\..\src\autofit\autofit.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\bdf\bdf.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\cff\cff.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftbase.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftbbox.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftbdf.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftbitmap.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftgasp.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\cache\ftcache.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\ftdebug.c
-# ADD CPP /Ze
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftglyph.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftgxval.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\gzip\ftgzip.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftinit.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\lzw\ftlzw.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftmm.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftotval.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftpfr.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftstroke.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftsynth.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftsystem.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\fttype1.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftwinfnt.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\base\ftxf86.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\pcf\pcf.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\pfr\pfr.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\psaux\psaux.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\pshinter\pshinter.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\psnames\psmodule.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\raster\raster.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\sfnt\sfnt.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\smooth\smooth.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\truetype\truetype.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\type1\type1.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\cid\type1cid.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\type42\type42.c
-# SUBTRACT CPP /Fr
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\src\winfonts\winfnt.c
-# SUBTRACT CPP /Fr
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\..\..\include\ft2build.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\include\freetype\config\ftconfig.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\include\freetype\config\ftheader.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\include\freetype\config\ftmodule.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\include\freetype\config\ftoption.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\include\freetype\config\ftstdlib.h
-# End Source File
-# End Group
-# End Target
-# End Project
+# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=freetype - Win32 Debug Singlethreaded\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "freetype.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "freetype.mak" CFG="freetype - Win32 Debug Singlethreaded"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "freetype - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Debug Multithreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Release Multithreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Release Singlethreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Debug Singlethreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "freetype - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\..\..\objs\release"\r
+# PROP Intermediate_Dir "..\..\..\objs\release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD CPP /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c\r
+# SUBTRACT CPP /nologo /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2110.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\..\..\objs\debug"\r
+# PROP Intermediate_Dir "..\..\..\objs\debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD CPP /MDd /Za /W4 /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c\r
+# SUBTRACT CPP /nologo /X /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2110_D.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Debug Multithreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "freetype___Win32_Debug_Multithreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Multithreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\..\..\objs\debug_mt"\r
+# PROP Intermediate_Dir "..\..\..\objs\debug_mt"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /Za /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /GZ /c\r
+# SUBTRACT BASE CPP /X\r
+# ADD CPP /MTd /Za /W4 /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c\r
+# SUBTRACT CPP /nologo /X /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype200b8_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2110MT_D.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Release Multithreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "freetype___Win32_Release_Multithreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Release_Multithreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\..\..\objs\release_mt"\r
+# PROP Intermediate_Dir "..\..\..\objs\release_mt"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /Za /W3 /GX /O2 /I "..\freetype\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c\r
+# ADD CPP /MT /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c\r
+# SUBTRACT CPP /nologo /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype200b8.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2110MT.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Release Singlethreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "freetype___Win32_Release_Singlethreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Release_Singlethreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\..\..\objs\release_st"\r
+# PROP Intermediate_Dir "..\..\..\objs\release_st"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c\r
+# SUBTRACT BASE CPP /YX\r
+# ADD CPP /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c\r
+# SUBTRACT CPP /nologo /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype206.lib"\r
+# ADD LIB32 /out:"..\..\..\objs\freetype2110ST.lib"\r
+# SUBTRACT LIB32 /nologo\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Debug Singlethreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "freetype___Win32_Debug_Singlethreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Singlethreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\..\..\objs\debug_st"\r
+# PROP Intermediate_Dir "..\..\..\objs\debug_st"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c\r
+# SUBTRACT BASE CPP /X /YX\r
+# ADD CPP /Za /W4 /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c\r
+# SUBTRACT CPP /nologo /X /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype206_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2110ST_D.lib"\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "freetype - Win32 Release"\r
+# Name "freetype - Win32 Debug"\r
+# Name "freetype - Win32 Debug Multithreaded"\r
+# Name "freetype - Win32 Release Multithreaded"\r
+# Name "freetype - Win32 Release Singlethreaded"\r
+# Name "freetype - Win32 Debug Singlethreaded"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\autohint\autohint.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\bdf\bdf.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\cff\cff.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftbase.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\cache\ftcache.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\ftdebug.c\r
+# ADD CPP /Ze\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftglyph.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\gzip\ftgzip.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\lzw\ftlzw.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftinit.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftmm.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftsystem.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\pcf\pcf.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\pfr\pfr.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\psaux\psaux.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\pshinter\pshinter.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\psnames\psmodule.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\raster\raster.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\sfnt\sfnt.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\smooth\smooth.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\truetype\truetype.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\type1\type1.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\cid\type1cid.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\type42\type42.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\winfonts\winfnt.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\ft2build.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftconfig.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftheader.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftmodule.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftoption.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftstdlib.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
index 470d4fa..3b11936 100644 (file)
@@ -1,31 +1,33 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               Debug Multithreaded|Win32 = Debug Multithreaded|Win32
-               Debug Singlethreaded|Win32 = Debug Singlethreaded|Win32
-               Debug|Win32 = Debug|Win32
-               Release Multithreaded|Win32 = Release Multithreaded|Win32
-               Release Singlethreaded|Win32 = Release Singlethreaded|Win32
-               Release|Win32 = Release|Win32
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32
-               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfiguration) = preSolution\r
+               Debug = Debug\r
+               Debug Multithreaded = Debug Multithreaded\r
+               Debug Singlethreaded = Debug Singlethreaded\r
+               Release = Release\r
+               Release Multithreaded = Release Multithreaded\r
+               Release Singlethreaded = Release Singlethreaded\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfiguration) = postSolution\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug.ActiveCfg = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug.Build.0 = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded.ActiveCfg = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded.Build.0 = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded.ActiveCfg = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded.Build.0 = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release.ActiveCfg = Release|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release.Build.0 = Release|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded.ActiveCfg = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded.Build.0 = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded.ActiveCfg = Release Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded.Build.0 = Release Singlethreaded|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityAddIns) = postSolution\r
+       EndGlobalSection\r
+EndGlobal\r
index 9e87284..e1a5d57 100644 (file)
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-       ProjectType="Visual C++"
-       Version="8.00"
-       Name="freetype"
-       ProjectGUID="{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"
-       >
-       <Platforms>
-               <Platform
-                       Name="Win32"
-               />
-       </Platforms>
-       <ToolFiles>
-       </ToolFiles>
-       <Configurations>
-               <Configuration
-                       Name="Release|Win32"
-                       OutputDirectory=".\..\..\..\objs\release"
-                       IntermediateDirectory=".\..\..\..\objs\release"
-                       ConfigurationType="4"
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-                       UseOfMFC="0"
-                       ATLMinimizesCRunTimeLibraryUsage="false"
-                       CharacterSet="2"
-                       >
-                       <Tool
-                               Name="VCPreBuildEventTool"
-                       />
-                       <Tool
-                               Name="VCCustomBuildTool"
-                       />
-                       <Tool
-                               Name="VCXMLDataGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCMIDLTool"
-                       />
-                       <Tool
-                               Name="VCCLCompilerTool"
-                               Optimization="2"
-                               InlineFunctionExpansion="1"
-                               AdditionalIncludeDirectories="..\..\..\include"
-                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"
-                               StringPooling="true"
-                               RuntimeLibrary="2"
-                               EnableFunctionLevelLinking="true"
-                               DisableLanguageExtensions="true"
-                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"
-                               AssemblerListingLocation=".\..\..\..\objs\release/"
-                               ObjectFile=".\..\..\..\objs\release/"
-                               ProgramDataBaseFileName=".\..\..\..\objs\release/"
-                               WarningLevel="4"
-                               DebugInformationFormat="0"
-                               CompileAs="0"
-                       />
-                       <Tool
-                               Name="VCManagedResourceCompilerTool"
-                       />
-                       <Tool
-                               Name="VCResourceCompilerTool"
-                               PreprocessorDefinitions="NDEBUG"
-                               Culture="1033"
-                       />
-                       <Tool
-                               Name="VCPreLinkEventTool"
-                       />
-                       <Tool
-                               Name="VCLibrarianTool"
-                               OutputFile="..\..\..\objs\freetype230.lib"
-                               SuppressStartupBanner="true"
-                       />
-                       <Tool
-                               Name="VCALinkTool"
-                       />
-                       <Tool
-                               Name="VCXDCMakeTool"
-                       />
-                       <Tool
-                               Name="VCBscMakeTool"
-                       />
-                       <Tool
-                               Name="VCFxCopTool"
-                       />
-                       <Tool
-                               Name="VCPostBuildEventTool"
-                       />
-               </Configuration>
-               <Configuration
-                       Name="Release Multithreaded|Win32"
-                       OutputDirectory=".\..\..\..\objs\release_mt"
-                       IntermediateDirectory=".\..\..\..\objs\release_mt"
-                       ConfigurationType="4"
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-                       UseOfMFC="0"
-                       ATLMinimizesCRunTimeLibraryUsage="false"
-                       CharacterSet="2"
-                       >
-                       <Tool
-                               Name="VCPreBuildEventTool"
-                       />
-                       <Tool
-                               Name="VCCustomBuildTool"
-                       />
-                       <Tool
-                               Name="VCXMLDataGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCMIDLTool"
-                       />
-                       <Tool
-                               Name="VCCLCompilerTool"
-                               Optimization="2"
-                               InlineFunctionExpansion="1"
-                               AdditionalIncludeDirectories="..\..\..\include"
-                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"
-                               StringPooling="true"
-                               RuntimeLibrary="0"
-                               EnableFunctionLevelLinking="true"
-                               DisableLanguageExtensions="true"
-                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"
-                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"
-                               ObjectFile=".\..\..\..\objs\release_mt/"
-                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"
-                               WarningLevel="4"
-                               DebugInformationFormat="0"
-                               CompileAs="0"
-                       />
-                       <Tool
-                               Name="VCManagedResourceCompilerTool"
-                       />
-                       <Tool
-                               Name="VCResourceCompilerTool"
-                               PreprocessorDefinitions="NDEBUG"
-                               Culture="1033"
-                       />
-                       <Tool
-                               Name="VCPreLinkEventTool"
-                       />
-                       <Tool
-                               Name="VCLibrarianTool"
-                               OutputFile="..\..\..\objs\freetype230MT.lib"
-                               SuppressStartupBanner="true"
-                       />
-                       <Tool
-                               Name="VCALinkTool"
-                       />
-                       <Tool
-                               Name="VCXDCMakeTool"
-                       />
-                       <Tool
-                               Name="VCBscMakeTool"
-                       />
-                       <Tool
-                               Name="VCFxCopTool"
-                       />
-                       <Tool
-                               Name="VCPostBuildEventTool"
-                       />
-               </Configuration>
-               <Configuration
-                       Name="Release Singlethreaded|Win32"
-                       OutputDirectory=".\..\..\..\objs\release_st"
-                       IntermediateDirectory=".\..\..\..\objs\release_st"
-                       ConfigurationType="4"
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-                       UseOfMFC="0"
-                       ATLMinimizesCRunTimeLibraryUsage="false"
-                       CharacterSet="2"
-                       >
-                       <Tool
-                               Name="VCPreBuildEventTool"
-                       />
-                       <Tool
-                               Name="VCCustomBuildTool"
-                       />
-                       <Tool
-                               Name="VCXMLDataGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCMIDLTool"
-                       />
-                       <Tool
-                               Name="VCCLCompilerTool"
-                               Optimization="2"
-                               InlineFunctionExpansion="1"
-                               AdditionalIncludeDirectories="..\..\..\include"
-                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"
-                               StringPooling="true"
-                               RuntimeLibrary="0"
-                               EnableFunctionLevelLinking="true"
-                               DisableLanguageExtensions="true"
-                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"
-                               AssemblerListingLocation=".\..\..\..\objs\release_st/"
-                               ObjectFile=".\..\..\..\objs\release_st/"
-                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"
-                               WarningLevel="4"
-                               DebugInformationFormat="0"
-                               CompileAs="0"
-                       />
-                       <Tool
-                               Name="VCManagedResourceCompilerTool"
-                       />
-                       <Tool
-                               Name="VCResourceCompilerTool"
-                               PreprocessorDefinitions="NDEBUG"
-                               Culture="1033"
-                       />
-                       <Tool
-                               Name="VCPreLinkEventTool"
-                       />
-                       <Tool
-                               Name="VCLibrarianTool"
-                               OutputFile="..\..\..\objs\freetype230ST.lib"
-                       />
-                       <Tool
-                               Name="VCALinkTool"
-                       />
-                       <Tool
-                               Name="VCXDCMakeTool"
-                       />
-                       <Tool
-                               Name="VCBscMakeTool"
-                       />
-                       <Tool
-                               Name="VCFxCopTool"
-                       />
-                       <Tool
-                               Name="VCPostBuildEventTool"
-                       />
-               </Configuration>
-               <Configuration
-                       Name="Debug|Win32"
-                       OutputDirectory=".\..\..\..\objs\debug"
-                       IntermediateDirectory=".\..\..\..\objs\debug"
-                       ConfigurationType="4"
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-                       UseOfMFC="0"
-                       ATLMinimizesCRunTimeLibraryUsage="false"
-                       CharacterSet="2"
-                       >
-                       <Tool
-                               Name="VCPreBuildEventTool"
-                       />
-                       <Tool
-                               Name="VCCustomBuildTool"
-                       />
-                       <Tool
-                               Name="VCXMLDataGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCMIDLTool"
-                       />
-                       <Tool
-                               Name="VCCLCompilerTool"
-                               Optimization="0"
-                               AdditionalIncludeDirectories="..\..\..\include"
-                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"
-                               BasicRuntimeChecks="3"
-                               RuntimeLibrary="3"
-                               DisableLanguageExtensions="true"
-                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"
-                               AssemblerListingLocation=".\..\..\..\objs\debug/"
-                               ObjectFile=".\..\..\..\objs\debug/"
-                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"
-                               WarningLevel="4"
-                               DebugInformationFormat="3"
-                               CompileAs="0"
-                       />
-                       <Tool
-                               Name="VCManagedResourceCompilerTool"
-                       />
-                       <Tool
-                               Name="VCResourceCompilerTool"
-                               PreprocessorDefinitions="_DEBUG"
-                               Culture="1033"
-                       />
-                       <Tool
-                               Name="VCPreLinkEventTool"
-                       />
-                       <Tool
-                               Name="VCLibrarianTool"
-                               OutputFile="..\..\..\objs\freetype230_D.lib"
-                               SuppressStartupBanner="true"
-                       />
-                       <Tool
-                               Name="VCALinkTool"
-                       />
-                       <Tool
-                               Name="VCXDCMakeTool"
-                       />
-                       <Tool
-                               Name="VCBscMakeTool"
-                       />
-                       <Tool
-                               Name="VCFxCopTool"
-                       />
-                       <Tool
-                               Name="VCPostBuildEventTool"
-                       />
-               </Configuration>
-               <Configuration
-                       Name="Debug Singlethreaded|Win32"
-                       OutputDirectory=".\..\..\..\objs\debug_st"
-                       IntermediateDirectory=".\..\..\..\objs\debug_st"
-                       ConfigurationType="4"
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-                       UseOfMFC="0"
-                       ATLMinimizesCRunTimeLibraryUsage="false"
-                       CharacterSet="2"
-                       >
-                       <Tool
-                               Name="VCPreBuildEventTool"
-                       />
-                       <Tool
-                               Name="VCCustomBuildTool"
-                       />
-                       <Tool
-                               Name="VCXMLDataGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCMIDLTool"
-                       />
-                       <Tool
-                               Name="VCCLCompilerTool"
-                               Optimization="0"
-                               AdditionalIncludeDirectories="..\..\..\include"
-                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"
-                               BasicRuntimeChecks="3"
-                               RuntimeLibrary="1"
-                               DisableLanguageExtensions="true"
-                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"
-                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"
-                               ObjectFile=".\..\..\..\objs\debug_st/"
-                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"
-                               WarningLevel="4"
-                               DebugInformationFormat="3"
-                               CompileAs="0"
-                       />
-                       <Tool
-                               Name="VCManagedResourceCompilerTool"
-                       />
-                       <Tool
-                               Name="VCResourceCompilerTool"
-                               PreprocessorDefinitions="_DEBUG"
-                               Culture="1033"
-                       />
-                       <Tool
-                               Name="VCPreLinkEventTool"
-                       />
-                       <Tool
-                               Name="VCLibrarianTool"
-                               OutputFile="..\..\..\objs\freetype230ST_D.lib"
-                               SuppressStartupBanner="true"
-                       />
-                       <Tool
-                               Name="VCALinkTool"
-                       />
-                       <Tool
-                               Name="VCXDCMakeTool"
-                       />
-                       <Tool
-                               Name="VCBscMakeTool"
-                       />
-                       <Tool
-                               Name="VCFxCopTool"
-                       />
-                       <Tool
-                               Name="VCPostBuildEventTool"
-                       />
-               </Configuration>
-               <Configuration
-                       Name="Debug Multithreaded|Win32"
-                       OutputDirectory=".\..\..\..\objs\debug_mt"
-                       IntermediateDirectory=".\..\..\..\objs\debug_mt"
-                       ConfigurationType="4"
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-                       UseOfMFC="0"
-                       ATLMinimizesCRunTimeLibraryUsage="false"
-                       CharacterSet="2"
-                       >
-                       <Tool
-                               Name="VCPreBuildEventTool"
-                       />
-                       <Tool
-                               Name="VCCustomBuildTool"
-                       />
-                       <Tool
-                               Name="VCXMLDataGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCWebServiceProxyGeneratorTool"
-                       />
-                       <Tool
-                               Name="VCMIDLTool"
-                       />
-                       <Tool
-                               Name="VCCLCompilerTool"
-                               Optimization="0"
-                               AdditionalIncludeDirectories="..\..\..\include"
-                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"
-                               GeneratePreprocessedFile="0"
-                               BasicRuntimeChecks="3"
-                               RuntimeLibrary="1"
-                               DisableLanguageExtensions="true"
-                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"
-                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"
-                               ObjectFile=".\..\..\..\objs\debug_mt/"
-                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"
-                               WarningLevel="4"
-                               DebugInformationFormat="3"
-                               CompileAs="0"
-                       />
-                       <Tool
-                               Name="VCManagedResourceCompilerTool"
-                       />
-                       <Tool
-                               Name="VCResourceCompilerTool"
-                               PreprocessorDefinitions="_DEBUG"
-                               Culture="1033"
-                       />
-                       <Tool
-                               Name="VCPreLinkEventTool"
-                       />
-                       <Tool
-                               Name="VCLibrarianTool"
-                               OutputFile="..\..\..\objs\freetype230MT_D.lib"
-                               SuppressStartupBanner="true"
-                       />
-                       <Tool
-                               Name="VCALinkTool"
-                       />
-                       <Tool
-                               Name="VCXDCMakeTool"
-                       />
-                       <Tool
-                               Name="VCBscMakeTool"
-                       />
-                       <Tool
-                               Name="VCFxCopTool"
-                       />
-                       <Tool
-                               Name="VCPostBuildEventTool"
-                       />
-               </Configuration>
-       </Configurations>
-       <References>
-       </References>
-       <Files>
-               <Filter
-                       Name="Source Files"
-                       Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-                       >
-                       <File
-                               RelativePath="..\..\..\src\autofit\autofit.c"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\bdf\bdf.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\cff\cff.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\base\ftbase.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\base\ftbitmap.c"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\base\ftgasp.c"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\cache\ftcache.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\ftdebug.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               DisableLanguageExtensions="false"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               DisableLanguageExtensions="false"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               DisableLanguageExtensions="false"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                               DisableLanguageExtensions="false"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                               DisableLanguageExtensions="false"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                               DisableLanguageExtensions="false"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\base\ftglyph.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\gzip\ftgzip.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\base\ftinit.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\lzw\ftlzw.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\base\ftstroke.c"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\base\ftsystem.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <File
-                               RelativePath="..\..\..\src\smooth\smooth.c"
-                               >
-                               <FileConfiguration
-                                       Name="Release|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Release Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="2"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Singlethreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                               <FileConfiguration
-                                       Name="Debug Multithreaded|Win32"
-                                       >
-                                       <Tool
-                                               Name="VCCLCompilerTool"
-                                               Optimization="0"
-                                               AdditionalIncludeDirectories=""
-                                               PreprocessorDefinitions=""
-                                               BasicRuntimeChecks="3"
-                                       />
-                               </FileConfiguration>
-                       </File>
-                       <Filter
-                               Name="FT_MODULES"
-                               >
-                               <File
-                                       RelativePath="..\..\..\src\base\ftbbox.c"
-                                       >
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\base\ftmm.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\base\ftpfr.c"
-                                       >
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\base\ftsynth.c"
-                                       >
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\base\fttype1.c"
-                                       >
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\base\ftwinfnt.c"
-                                       >
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\pcf\pcf.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\pfr\pfr.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\psaux\psaux.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\pshinter\pshinter.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\psnames\psmodule.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\raster\raster.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\sfnt\sfnt.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\truetype\truetype.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\type1\type1.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\cid\type1cid.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\type42\type42.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                               <File
-                                       RelativePath="..\..\..\src\winfonts\winfnt.c"
-                                       >
-                                       <FileConfiguration
-                                               Name="Release|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Release Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="2"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Singlethreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                                       <FileConfiguration
-                                               Name="Debug Multithreaded|Win32"
-                                               >
-                                               <Tool
-                                                       Name="VCCLCompilerTool"
-                                                       Optimization="0"
-                                                       AdditionalIncludeDirectories=""
-                                                       PreprocessorDefinitions=""
-                                                       BasicRuntimeChecks="3"
-                                               />
-                                       </FileConfiguration>
-                               </File>
-                       </Filter>
-               </Filter>
-               <Filter
-                       Name="Header Files"
-                       Filter="h;hpp;hxx;hm;inl"
-                       >
-                       <File
-                               RelativePath="..\..\..\include\ft2build.h"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\..\include\freetype\config\ftconfig.h"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\..\include\freetype\config\ftheader.h"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\..\include\freetype\config\ftmodule.h"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\..\include\freetype\config\ftoption.h"
-                               >
-                       </File>
-                       <File
-                               RelativePath="..\..\..\include\freetype\config\ftstdlib.h"
-                               >
-                       </File>
-               </Filter>
-       </Files>
-       <Globals>
-       </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="7.10"\r
+       Name="freetype"\r
+       ProjectGUID="{D0087BEB-3E7B-4004-BD4A-E4D071CF8D92}"\r
+       SccProjectName=""\r
+       SccLocalPath="">\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"/>\r
+       </Platforms>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release"\r
+                       IntermediateDirectory=".\..\..\..\objs\release"\r
+                       ConfigurationType="4"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               ImproveFloatingPointConsistency="TRUE"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB"\r
+                               StringPooling="TRUE"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="TRUE"\r
+                               DisableLanguageExtensions="TRUE"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype2110.lib"\r
+                               SuppressStartupBanner="TRUE"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\release_mt"\r
+                       ConfigurationType="4"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               ImproveFloatingPointConsistency="TRUE"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB"\r
+                               StringPooling="TRUE"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="TRUE"\r
+                               DisableLanguageExtensions="TRUE"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype2110MT.lib"\r
+                               SuppressStartupBanner="TRUE"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release_st"\r
+                       IntermediateDirectory=".\..\..\..\objs\release_st"\r
+                       ConfigurationType="4"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               ImproveFloatingPointConsistency="TRUE"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB"\r
+                               StringPooling="TRUE"\r
+                               RuntimeLibrary="4"\r
+                               EnableFunctionLevelLinking="TRUE"\r
+                               DisableLanguageExtensions="TRUE"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype2110ST.lib"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug"\r
+                       ConfigurationType="4"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               ImproveFloatingPointConsistency="TRUE"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="TRUE"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype2110_D.lib"\r
+                               SuppressStartupBanner="TRUE"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug_st"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug_st"\r
+                       ConfigurationType="4"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               ImproveFloatingPointConsistency="TRUE"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="5"\r
+                               DisableLanguageExtensions="TRUE"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype2110ST_D.lib"\r
+                               SuppressStartupBanner="TRUE"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug_mt"\r
+                       ConfigurationType="4"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               ImproveFloatingPointConsistency="TRUE"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE"\r
+                               GeneratePreprocessedFile="0"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="TRUE"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype2110MT_D.lib"\r
+                               SuppressStartupBanner="TRUE"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">\r
+                       <File\r
+                               RelativePath="..\..\..\src\autofit\autofit.c">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\bdf\bdf.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cff\cff.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbase.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbitmap.c">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cache\ftcache.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\ftdebug.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="FALSE"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="FALSE"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="FALSE"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="FALSE"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="FALSE"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="FALSE"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftglyph.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\gzip\ftgzip.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftinit.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\lzw\ftlzw.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftstroke.c">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftsystem.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\smooth\smooth.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <Filter\r
+                               Name="FT_MODULES"\r
+                               Filter="">\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftmm.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pcf\pcf.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pfr\pfr.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psaux\psaux.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pshinter\pshinter.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psnames\psmodule.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\raster\raster.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\sfnt\sfnt.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\truetype\truetype.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type1\type1.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\cid\type1cid.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type42\type42.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\winfonts\winfnt.c">\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32">\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"/>\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl">\r
+                       <File\r
+                               RelativePath="..\..\..\include\ft2build.h">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftconfig.h">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftheader.h">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftmodule.h">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftoption.h">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftstdlib.h">\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/reactos/dll/cpl/access/It.rc b/reactos/dll/cpl/access/It.rc
deleted file mode 100644 (file)
index d96fcf3..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
-
-IDI_CPLACCESS ICON "resources/applet.ico"
-
-
-IDD_PROPPAGEKEYBOARD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Tastiera"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
-  GROUPBOX "Tasti bloccabili",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
-  LTEXT "Usa i tasti bloccabili se vuoi usare i tasti Shift, Ctrl o Alt premendo un tasto alla volta.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
-  CHECKBOX "&Usa Tasti bloccabili",IDC_STICKY_BOX,PROPSHEETPADDING(4),LABELLINE(5)+2,PROPSHEETPADDING(15),14
-  PUSHBUTTON "&Impostazioni",IDC_STICKY_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14
-  GROUPBOX "Filtro",-1,PROPSHEETPADDING(1),LABELLINE(8)+5,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(7)+2
-  LTEXT "Usa il filtro se vuoi che siano ignorate le pressioni troppo brevi o doppie dei tastio per rallentare la ripetizione automatica.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(10)-3,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
-  CHECKBOX "Usa &Filtro",IDC_FILTER_BOX,PROPSHEETPADDING(4),LABELLINE(13)+2,PROPSHEETPADDING(15),14
-  PUSHBUTTON "I&mpostazioni",IDC_FILTER_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(13)+2,PROPSHEETPADDING(15),14
-  GROUPBOX "Bistabili",-1,PROPSHEETPADDING(1),LABELLINE(16)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
-  LTEXT "Se vuoi un segnale acustico quando viene premuto Blocco Maiuscole, Num o Scr.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(18)-3,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(2)
-  CHECKBOX "Use &Bistabili",IDC_TOGGLE_BOX,PROPSHEETPADDING(4),LABELLINE(20)+2,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(2)
-  PUSHBUTTON "Im&postazioni",IDC_TOGGLE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(20)+2,PROPSHEETPADDING(15),14
-//  CHECKBOX "Sho&w extra keyboard help in programs",IDC_KEYBOARD_EXTRA
-END
-
-
-IDD_PROPPAGESOUND DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Suoni"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
-  GROUPBOX "Visuale",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
-  LTEXT "Usa questa opzione se vuoi una segnalazione visiva in corrispondenza delle segnalazioni acustiche.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
-  CHECKBOX "Use &Visuale",IDC_SENTRY_BOX,PROPSHEETPADDING(4),LABELLINE(5)+2,PROPSHEETPADDING(15),14
-  PUSHBUTTON "&Impostazioni",IDC_SENTRY_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14
-
-  GROUPBOX "Titoli",-1,PROPSHEETPADDING(1),LABELLINE(8)+5,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(7)+2
-  LTEXT "Usa Titoli per informare i programmi che devono mostrare del testo corrispondente a suoni e parlato.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(10)-3,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
-  CHECKBOX "Usa &Titoli",IDC_SSHOW_BOX,PROPSHEETPADDING(4),LABELLINE(12)+2,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
-END
-
-
-IDD_PROPPAGEDISPLAY DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Video"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN  
-  GROUPBOX "Alto contrasto",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
-  LTEXT "Usa questa opzione se devono essere usati colori e font che migliorano la leggibilità.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
-  CHECKBOX "&Usa Alto contrasto",IDC_CONTRAST_BOX,PROPSHEETPADDING(4),LABELLINE(5)+2,PROPSHEETPADDING(15),14
-  PUSHBUTTON "&Impostazioni",IDC_CONTRAST_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14
-END
-
-
-
-IDD_PROPPAGEMOUSE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Mouse"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
-  GROUPBOX "Mouse sui tasti",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
-  LTEXT "Usa questa opzione se vuoi usare il tastierino numerico al posto del mouse.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
-  CHECKBOX "Use &Mouse sui tasti",IDC_MOUSE_BOX,PROPSHEETPADDING(4),LABELLINE(5)+2,PROPSHEETPADDING(15),14
-  PUSHBUTTON "&Impostazioni",IDC_MOUSE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14
-END
-
-
-IDD_PROPPAGEGENERAL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "General"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
-  GROUPBOX "Reset Automatico",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5)
-  CHECKBOX "&Disattiva le funzioni di accessibilità se fermo per:",IDC_RESET_BOX,PROPSHEETPADDING(2),LABELLINE(2)-2,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(2)
-
-  //POPUP IDC_RESET_POPUP, GRAYED
-  //{
-  //  MENUITEM "5 Minutes", IDC_RESET_5
-  //  MENUITEM "10 Minutes", IDC_RESET_10
-  //  MENUITEM "15 Minutes", IDC_RESET_15
-  //  MENUITEM "20 Minutes", IDC_RESET_20
-  //  MENUITEM "25 Minutes", IDC_RESET_25
-  //  MENUITEM "30 Minutes", IDC_RESET_30
-  //}
-
-  GROUPBOX "Notifiche",-1,PROPSHEETPADDING(1),LABELLINE(7)-2,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5)
-  CHECKBOX "Avvisa con un messaggio quando si attiva una funzione",IDC_NOTIFICATION_MESSAGE,PROPSHEETPADDING(2),LABELLINE(8)-2,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(2)
-  CHECKBOX "Fai una segnalazione acustica quando una funzione viene attivata o ddisattivata",IDC_NOTIFICATION_SOUND,PROPSHEETPADDING(2),LABELLINE(10)-2,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(1)
-
-  GROUPBOX "Dispositivi seriali",-1,PROPSHEETPADDING(1),LABELLINE(13)-4,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5)
-  LTEXT "I dispositivi seriali permettono una modalità alternativa per gestire le funzioni di mouse e tastiera.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(14)-4,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(2)
-  CHECKBOX "Supporta i Dispositivi &Seriali",IDC_SERIAL_BOX,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(16)-4,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(1)
-  
-  PUSHBUTTON "&Impostazioni",IDC_SERIAL_BUTTON,180,LABELLINE(16)-4,50,LABELLINE(1)  
-
-  GROUPBOX "Opzioni di amministrazione",-1,PROPSHEETPADDING(1),LABELLINE(19)-4,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5)
-
-  CHECKBOX "Applica tutte le impostazioni al desktop di &login ",IDC_ADMIN_LOGON_BOX,PROPSHEETPADDING(2),LABELLINE(20)-4,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(2)
-  CHECKBOX "Applica tutte le impostazioni a quelle predefinite per i nuovi utenti",IDC_ADMIN_USERS_BOX,PROPSHEETPADDING(2),LABELLINE(22)-4,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(1)
-END
-
-
-STRINGTABLE 
-BEGIN
-  IDS_CPLSYSTEMNAME "Accessibility"
-  IDS_CPLSYSTEMDESCRIPTION "Customizes accessibility features for your computer."
-END
-
index 91b4665..4de2a05 100644 (file)
@@ -17,4 +17,3 @@
 #include "Fr.rc"
 #include "Es.rc"
 #include "Cz.rc"
-#include "It.rc"
index 42ab064..528e456 100644 (file)
@@ -62,11 +62,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index 4c36465..d1c3134 100644 (file)
@@ -55,11 +55,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index c7329ee..23e7aba 100644 (file)
@@ -59,11 +59,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 228
index b4735f2..4ba9a73 100644 (file)
@@ -58,11 +58,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX 0, 0, 246, 188
index d1899a9..55549e3 100644 (file)
@@ -63,11 +63,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index a51e047..18a4a63 100644 (file)
  * PURPOSE:         Appearance property page
  * 
  * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
- *                  Eric Kohl
  */
 
 #include "desk.h"
-#include "preview.h"
-
-typedef struct _GLOBAL_DATA
-{
-    INT nItem;
-} GLOBAL_DATA, *PGLOBAL_DATA;
 
 
 static VOID
-OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
+OnInitDialog(HWND hwndDlg)
 {
     TCHAR szBuffer[256];
-    UINT i, idx;
+    UINT i;
 
-    /* Set the item names */
     for (i = IDS_ITEM_FIRST; i < IDS_ITEM_LAST; i++)
     {
         LoadString(hApplet, i, szBuffer, 256);
-        idx = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_UI_ITEM, CB_ADDSTRING, 0, (LPARAM)szBuffer);
-        if (idx != CB_ERR)
-        {
-            SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_UI_ITEM, CB_SETITEMDATA, (WPARAM)idx, (LPARAM)i - IDS_ITEM_FIRST);
-        }
-    }
-
-    pGlobalData->nItem = IDX_DESKTOP;
-    SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_UI_ITEM, CB_SETCURSEL, pGlobalData->nItem, 0);
-}
-
-
-static VOID
-OnItemChange(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
-{
-    INT nSelection, nIdx;
-
-    nIdx = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_UI_ITEM, CB_GETCURSEL, 0, 0);
-    if (nIdx == CB_ERR)
-        return;
-
-    nSelection = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_UI_ITEM, CB_GETITEMDATA, (WPARAM)nIdx, 0);
-    if (nSelection == CB_ERR)
-        return;
-
-    pGlobalData->nItem = nSelection;
-
-    switch (nSelection)
-    {
-        case IDX_SCROLLBAR:
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE), TRUE);
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE_UPDOWN), TRUE);
-            SendDlgItemMessage(hwndDlg, IDC_APPEAR_SIZE_UPDOWN, UDM_SETPOS, 0,
-                               (LPARAM)MAKELONG((short)SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_GETCXSCROLLBAR, 0, 0), 0));
-            break;
-
-        case IDX_MENU:
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE), TRUE);
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE_UPDOWN), TRUE);
-            SendDlgItemMessage(hwndDlg, IDC_APPEAR_SIZE_UPDOWN, UDM_SETPOS, 0,
-                               (LPARAM)MAKELONG((short)SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_GETCYMENU, 0, 0), 0));
-            break;
-
-        case IDX_INACTIVE_BORDER:
-        case IDX_ACTIVE_BORDER:
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE), TRUE);
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE_UPDOWN), TRUE);
-            SendDlgItemMessage(hwndDlg, IDC_APPEAR_SIZE_UPDOWN, UDM_SETPOS, 0,
-                               (LPARAM)MAKELONG((short)SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_GETCYSIZEFRAME, 0, 0), 0));
-            break;
-
-        case IDX_INACTIVE_CAPTION:
-        case IDX_ACTIVE_CAPTION:
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE), TRUE);
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE_UPDOWN), TRUE);
-            SendDlgItemMessage(hwndDlg, IDC_APPEAR_SIZE_UPDOWN, UDM_SETPOS, 0,
-                               (LPARAM)MAKELONG((short)SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_GETCYCAPTION, 0, 0), 0));
-            break;
-
-        case IDX_CAPTION_BUTTON:
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE), TRUE);
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE_UPDOWN), TRUE);
-            SendDlgItemMessage(hwndDlg, IDC_APPEAR_SIZE_UPDOWN, UDM_SETPOS, 0,
-                               (LPARAM)MAKELONG((short)SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_GETCYCAPTION, 0, 0), 0));
-            break;
-
-        default:
-            SetDlgItemText(hwndDlg, IDC_APPEAR_SIZE, _T(""));
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE), FALSE);
-            EnableWindow(GetDlgItem(hwndDlg, IDC_APPEAR_SIZE_UPDOWN), FALSE);
-
-            break;
+        SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_UI_ITEM, CB_ADDSTRING, 0, (LPARAM)szBuffer);
     }
 
+    SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_UI_ITEM, CB_SETCURSEL, 2, 0);
 }
 
 
@@ -111,76 +33,24 @@ AppearancePageProc(HWND hwndDlg,
                    WPARAM wParam,
                    LPARAM lParam)
 {
-    PGLOBAL_DATA pGlobalData;
-
-    pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
+    UNREFERENCED_PARAMETER(lParam);
+    UNREFERENCED_PARAMETER(wParam);
+    UNREFERENCED_PARAMETER(hwndDlg);
 
     switch (uMsg)
     {
         case WM_INITDIALOG:
-            pGlobalData = (PGLOBAL_DATA)HeapAlloc(GetProcessHeap(),
-                                                  HEAP_ZERO_MEMORY,
-                                                  sizeof(GLOBAL_DATA));
-            if (!pGlobalData)
-                return -1;
-
-            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
-            OnInitDialog(hwndDlg, pGlobalData);
-            OnItemChange(hwndDlg, pGlobalData);
+            OnInitDialog(hwndDlg);
             break;
 
         case WM_COMMAND:
-            switch (LOWORD(wParam))
-            {
-                case IDC_APPEARANCE_UI_ITEM:
-                    if (HIWORD(wParam) == CBN_SELCHANGE)
-                    {
-                        OnItemChange(hwndDlg, pGlobalData);
-                    }
-                    break;
-
-                case IDC_APPEAR_SIZE:
-                    if (pGlobalData && HIWORD(wParam) == EN_CHANGE)
-                    {
-                        int i = (int)LOWORD(SendDlgItemMessage(hwndDlg, IDC_APPEAR_SIZE_UPDOWN, UDM_GETPOS,0,0L));
-
-                        switch (pGlobalData->nItem)
-                        {
-                            case IDX_INACTIVE_CAPTION:
-                            case IDX_ACTIVE_CAPTION:
-                            case IDX_CAPTION_BUTTON:
-                                SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCYCAPTION, 0, i);
-                                break;
-
-                            case IDX_MENU:
-                                SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCYMENU, 0, i);
-                                break;
-
-                            case IDX_SCROLLBAR:
-                                SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCXSCROLLBAR, 0, i);
-                                break;
-
-                            case IDX_INACTIVE_BORDER:
-                            case IDX_ACTIVE_BORDER:
-                                SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCYSIZEFRAME, 0, i);
-                                break;
-                        }
-                    }
-                    break;
-            }
-            break;
-
-        case WM_DESTROY:
-            HeapFree(GetProcessHeap(), 0, pGlobalData);
             break;
 
         case WM_USER:
             SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_UI_ITEM, CB_SETCURSEL, lParam, 0);
-            OnItemChange(hwndDlg, pGlobalData);
             break;
     }
 
     return FALSE;
 }
 
-
index 8a0796c..5acbe8c 100644 (file)
@@ -59,11 +59,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index da1c20c..f2ae1ed 100644 (file)
@@ -56,12 +56,7 @@ BEGIN
     CONTROL         "", IDC_APPEARANCE_PREVIEW, "PreviewWndClass",
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
-    COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
+    COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 228
index 75e1493..4b1c0cc 100644 (file)
@@ -55,11 +55,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index 2a6abe0..9961962 100644 (file)
@@ -66,11 +66,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index c4d863c..b9db771 100644 (file)
@@ -59,11 +59,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index bbc9607..476b50d 100644 (file)
@@ -51,11 +51,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index 9c2f3f2..cd5cdb6 100644 (file)
@@ -59,11 +59,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index b2018cf..c77aba7 100644 (file)
@@ -60,11 +60,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index fdbe4af..f7a72b9 100644 (file)
-/*
- * PROJECT:     ReactOS Desktop Control Panel
- * LICENSE:     GPL - See COPYING in the top level directory
- * FILE:        lib/cpl/desk/preview.c
- * PURPOSE:     Draws the preview control
- * COPYRIGHT:   Copyright 2006, 2007 Eric Kohl
- */
-
-#include "desk.h"
-#include "preview.h"
-
-static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass");
-
-typedef struct _PREVIEW_DATA
-{
-    HWND hwndParent;
-
-    DWORD clrDesktop;
-    HBRUSH hbrDesktop;
-
-    DWORD clrWindow;
-    HBRUSH hbrWindow;
-
-    DWORD clrScrollbar;
-    HBRUSH hbrScrollbar;
-
-    DWORD clrActiveCaptionText;
-    DWORD clrInactiveCaptionText;
-    DWORD clrWindowText;
-    DWORD clrButtonText;
-
-    INT cxEdge;
-    INT cyEdge;
-
-    INT cySizeFrame;
-
-    INT cyCaption;
-    INT cyMenu;
-    INT cxScrollbar;
-
-    RECT rcDesktop;
-    RECT rcInactiveFrame;
-    RECT rcInactiveCaption;
-    RECT rcInactiveCaptionButtons;
-
-    RECT rcActiveFrame;
-    RECT rcActiveCaption;
-    RECT rcActiveCaptionButtons;
-    RECT rcActiveMenuBar;
-    RECT rcSelectedMenuItem;
-    RECT rcActiveClient;
-    RECT rcActiveScroll;
-
-    RECT rcDialogFrame;
-    RECT rcDialogCaption;
-    RECT rcDialogCaptionButtons;
-    RECT rcDialogClient;
-
-    RECT rcDialogButton;
-
-    LPTSTR lpInAct;
-    LPTSTR lpAct;
-    LPTSTR lpWinTxt;
-    LPTSTR lpMessBox;
-    LPTSTR lpMessText;
-    LPTSTR lpButText;
-
-    LOGFONT lfCaptionFont;
-    LOGFONT lfMenuFont;
-    LOGFONT lfMessageFont;
-
-    HFONT hCaptionFont;
-    HFONT hMenuFont;
-    HFONT hMessageFont;
-
-    HMENU hMenu;
-
-} PREVIEW_DATA, *PPREVIEW_DATA;
-
-
-
-static VOID
-DrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax, int x)
-{
-    RECT rc3;
-    RECT rc4;
-    RECT rc5;
-
-    rc3.left = lpRect->right - 2 - x;
-    rc3.top = lpRect->top + 2;
-    rc3.right = lpRect->right - 2;
-    rc3.bottom = lpRect->bottom - 2;
-
-    DrawFrameControl(hdc, &rc3, DFC_CAPTION, DFCS_CAPTIONCLOSE);
-
-    if (bMinMax)
-    {
-        rc4.left = rc3.left - x - 2;
-        rc4.top = rc3.top;
-        rc4.right = rc3.right - x - 2;
-        rc4.bottom = rc3.bottom;
-
-        DrawFrameControl(hdc, &rc4, DFC_CAPTION, DFCS_CAPTIONMAX);
-
-        rc5.left = rc4.left - x;
-        rc5.top = rc4.top;
-        rc5.right = rc4.right - x;
-        rc5.bottom = rc4.bottom;
-
-        DrawFrameControl(hdc, &rc5, DFC_CAPTION, DFCS_CAPTIONMIN);
-    }
-}
-
-
-static VOID
-DrawScrollbar(HDC hdc, LPRECT rc, HBRUSH hbrScrollbar)
-{
-    RECT rcTop;
-    RECT rcBottom;
-    RECT rcMiddle;
-    int width;
-
-    width = rc->right - rc->left;
-
-    rcTop.left = rc->left;
-    rcTop.right = rc->right;
-    rcTop.top = rc->top;
-    rcTop.bottom = rc->top + width;
-
-    rcMiddle.left = rc->left;
-    rcMiddle.right = rc->right;
-    rcMiddle.top = rc->top + width;
-    rcMiddle.bottom = rc->bottom - width;
-
-    rcBottom.left = rc->left;
-    rcBottom.right = rc->right;
-    rcBottom.top = rc->bottom - width;
-    rcBottom.bottom = rc->bottom;
-
-    DrawFrameControl(hdc, &rcTop, DFC_SCROLL, DFCS_SCROLLUP);
-    DrawFrameControl(hdc, &rcBottom, DFC_SCROLL, DFCS_SCROLLDOWN);
-
-    FillRect(hdc, &rcMiddle, hbrScrollbar);
-}
-
-
-static VOID
-OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
-{
-    NONCLIENTMETRICS NonClientMetrics;
-
-    pPreviewData->clrScrollbar = GetSysColor(COLOR_SCROLLBAR);
-    pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrScrollbar);
-
-    pPreviewData->clrDesktop = GetSysColor(COLOR_DESKTOP);
-    pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrDesktop);
-    pPreviewData->clrWindow = GetSysColor(COLOR_WINDOW);
-    pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrWindow);
-
-    pPreviewData->clrActiveCaptionText = GetSysColor(COLOR_CAPTIONTEXT);
-    pPreviewData->clrInactiveCaptionText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
-    pPreviewData->clrWindowText = GetSysColor(COLOR_WINDOWTEXT);
-    pPreviewData->clrButtonText = GetSysColor(COLOR_BTNTEXT);
-
-    pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE);
-    pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE);
-
-    pPreviewData->cySizeFrame = GetSystemMetrics(SM_CYSIZEFRAME);
-
-    pPreviewData->cyCaption = GetSystemMetrics(SM_CYCAPTION);
-    pPreviewData->cyMenu = GetSystemMetrics(SM_CYMENU);
-    pPreviewData->cxScrollbar = GetSystemMetrics(SM_CXVSCROLL);
-
-    /* load font info */
-    NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
-    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
-
-    pPreviewData->lfCaptionFont = NonClientMetrics.lfCaptionFont;
-    pPreviewData->hCaptionFont = CreateFontIndirect(&pPreviewData->lfCaptionFont);
-
-    pPreviewData->lfMenuFont = NonClientMetrics.lfMenuFont;
-    pPreviewData->hMenuFont = CreateFontIndirect(&pPreviewData->lfMenuFont);
-
-    pPreviewData->lfMessageFont = NonClientMetrics.lfMessageFont;
-    pPreviewData->hMessageFont = CreateFontIndirect(&pPreviewData->lfMessageFont);
-
-    /* Load and modify the menu */
-    pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU));
-    EnableMenuItem(pPreviewData->hMenu, ID_MENU_DISABLED,
-                   MF_BYCOMMAND | MF_DISABLED);
-    HiliteMenuItem(hwnd, pPreviewData->hMenu,
-                   ID_MENU_SELECTED, MF_BYCOMMAND | MF_HILITE);
-
-//    GetMenuItemRect(hwnd, pPreviewData->hMenu,
-//                    ID_MENU_SELECTED, &pPreviewData->rcSelectedMenuItem);
-
-
-    AllocAndLoadString(&pPreviewData->lpInAct, hApplet, IDS_INACTWIN);
-    AllocAndLoadString(&pPreviewData->lpAct, hApplet, IDS_ACTWIN);
-    AllocAndLoadString(&pPreviewData->lpWinTxt, hApplet, IDS_WINTEXT);
-    AllocAndLoadString(&pPreviewData->lpMessBox, hApplet, IDS_MESSBOX);
-    AllocAndLoadString(&pPreviewData->lpMessText, hApplet, IDS_MESSTEXT);
-    AllocAndLoadString(&pPreviewData->lpButText, hApplet, IDS_BUTTEXT);
-}
-
-
-static VOID
-CalculateItemSize(PPREVIEW_DATA pPreviewData)
-{
-    int width, height;
-
-    /* Calculate the inactive window rectangle */
-    pPreviewData->rcInactiveFrame.left = pPreviewData->rcDesktop.left + 8;
-    pPreviewData->rcInactiveFrame.top = pPreviewData->rcDesktop.top + 8;
-    pPreviewData->rcInactiveFrame.right = pPreviewData->rcDesktop.right - 25;
-    pPreviewData->rcInactiveFrame.bottom = pPreviewData->rcDesktop.bottom - 30;
-
-    /* Calculate the inactive caption rectangle */
-    pPreviewData->rcInactiveCaption.left = pPreviewData->rcInactiveFrame.left + pPreviewData->cxEdge + 1/*3*/ + 1;
-    pPreviewData->rcInactiveCaption.top = pPreviewData->rcInactiveFrame.top + pPreviewData->cyEdge + 1/*3*/ + 1;
-    pPreviewData->rcInactiveCaption.right = pPreviewData->rcInactiveFrame.right - pPreviewData->cxEdge - 1/*3*/ - 1;
-    pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveFrame.top + pPreviewData->cyCaption + 1 + 2;
-
-    /* Calculate the inactive caption buttons rectangle */
-    pPreviewData->rcInactiveCaptionButtons.left = pPreviewData->rcInactiveCaption.right - 2 - 2 - 3 * 16;
-    pPreviewData->rcInactiveCaptionButtons.top = pPreviewData->rcInactiveCaption.top + 2;
-    pPreviewData->rcInactiveCaptionButtons.right = pPreviewData->rcInactiveCaption.right - 2;
-    pPreviewData->rcInactiveCaptionButtons.bottom = pPreviewData->rcInactiveCaption.bottom - 2;
-
-    /* Calculate the active window rectangle */
-    pPreviewData->rcActiveFrame.left = pPreviewData->rcInactiveFrame.left + 3 + 1;
-    pPreviewData->rcActiveFrame.top = pPreviewData->rcInactiveCaption.bottom + 1;
-    pPreviewData->rcActiveFrame.right = pPreviewData->rcDesktop.right - 10;
-    pPreviewData->rcActiveFrame.bottom = pPreviewData->rcDesktop.bottom - 25;
-
-    /* Calculate the active caption rectangle */
-    pPreviewData->rcActiveCaption.left = pPreviewData->rcActiveFrame.left + 3 + 1;
-    pPreviewData->rcActiveCaption.top = pPreviewData->rcActiveFrame.top + 3 + 1;
-    pPreviewData->rcActiveCaption.right = pPreviewData->rcActiveFrame.right - 3 - 1;
-    pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveFrame.top + pPreviewData->cyCaption + 1 + 2;
-
-    /* Calculate the active caption buttons rectangle */
-    pPreviewData->rcActiveCaptionButtons.left = pPreviewData->rcActiveCaption.right - 2 - 2 - 3 * 16;
-    pPreviewData->rcActiveCaptionButtons.top = pPreviewData->rcActiveCaption.top + 2;
-    pPreviewData->rcActiveCaptionButtons.right = pPreviewData->rcActiveCaption.right - 2;
-    pPreviewData->rcActiveCaptionButtons.bottom = pPreviewData->rcActiveCaption.bottom - 2;
-
-    /* Calculate the active menu bar rectangle */
-    pPreviewData->rcActiveMenuBar.left = pPreviewData->rcActiveFrame.left + 3 + 1;
-    pPreviewData->rcActiveMenuBar.top = pPreviewData->rcActiveCaption.bottom + 1;
-    pPreviewData->rcActiveMenuBar.right = pPreviewData->rcActiveFrame.right - 3 - 1;
-    pPreviewData->rcActiveMenuBar.bottom = pPreviewData->rcActiveMenuBar.top + pPreviewData->cyMenu + 1;
-
-    /* Calculate the active client rectangle */
-    pPreviewData->rcActiveClient.left = pPreviewData->rcActiveFrame.left + 3 + 1;
-    pPreviewData->rcActiveClient.top = pPreviewData->rcActiveMenuBar.bottom; // + 1;
-    pPreviewData->rcActiveClient.right = pPreviewData->rcActiveFrame.right - 3 - 1;
-    pPreviewData->rcActiveClient.bottom = pPreviewData->rcActiveFrame.bottom - 3 - 1;
-
-    /* Calculate the active scroll rectangle */
-    pPreviewData->rcActiveScroll.left = pPreviewData->rcActiveClient.right - 2 - pPreviewData->cxScrollbar;
-    pPreviewData->rcActiveScroll.top = pPreviewData->rcActiveClient.top + 2;
-    pPreviewData->rcActiveScroll.right = pPreviewData->rcActiveClient.right - 2;
-    pPreviewData->rcActiveScroll.bottom = pPreviewData->rcActiveClient.bottom - 2;
-
-
-    /* Dialog window */
-    pPreviewData->rcDialogFrame.left = pPreviewData->rcActiveClient.left + 4;
-    pPreviewData->rcDialogFrame.top = (pPreviewData->rcDesktop.bottom * 60) / 100;
-    pPreviewData->rcDialogFrame.right = (pPreviewData->rcDesktop.right * 65) / 100;
-    pPreviewData->rcDialogFrame.bottom = pPreviewData->rcDesktop.bottom - 5;
-
-    /* Calculate the dialog caption rectangle */
-    pPreviewData->rcDialogCaption.left = pPreviewData->rcDialogFrame.left + 3;
-    pPreviewData->rcDialogCaption.top = pPreviewData->rcDialogFrame.top + 3;
-    pPreviewData->rcDialogCaption.right = pPreviewData->rcDialogFrame.right - 3;
-    pPreviewData->rcDialogCaption.bottom = pPreviewData->rcDialogFrame.top + pPreviewData->cyCaption + 1 + 1;
-
-    /* Calculate the inactive caption buttons rectangle */
-    pPreviewData->rcDialogCaptionButtons.left = pPreviewData->rcDialogCaption.right - 2 - 16;
-    pPreviewData->rcDialogCaptionButtons.top = pPreviewData->rcDialogCaption.top + 2;
-    pPreviewData->rcDialogCaptionButtons.right = pPreviewData->rcDialogCaption.right - 2;
-    pPreviewData->rcDialogCaptionButtons.bottom = pPreviewData->rcDialogCaption.bottom - 2;
-
-    /* Calculate the dialog client rectangle */
-    pPreviewData->rcDialogClient.left = pPreviewData->rcDialogFrame.left + 3;
-    pPreviewData->rcDialogClient.top = pPreviewData->rcDialogCaption.bottom + 1;
-    pPreviewData->rcDialogClient.right = pPreviewData->rcDialogFrame.right - 3;
-    pPreviewData->rcDialogClient.bottom = pPreviewData->rcDialogFrame.bottom - 3;
-
-    /* Calculate the dialog button rectangle */
-    width = 80;
-    height = 28;
-
-    pPreviewData->rcDialogButton.left =
-        (pPreviewData->rcDialogClient.right + pPreviewData->rcDialogClient.left - width) / 2;
-    pPreviewData->rcDialogButton.right = pPreviewData->rcDialogButton.left + width;
-    pPreviewData->rcDialogButton.bottom = pPreviewData->rcDialogClient.bottom - 2;
-    pPreviewData->rcDialogButton.top = pPreviewData->rcDialogButton.bottom - height;
-}
-
-
-static VOID
-OnSize(INT cx, INT cy, PPREVIEW_DATA pPreviewData)
-{
-    /* Get Desktop rectangle */
-    pPreviewData->rcDesktop.left = 0;
-    pPreviewData->rcDesktop.top = 0;
-    pPreviewData->rcDesktop.right = cx;
-    pPreviewData->rcDesktop.bottom = cy;
-
-    CalculateItemSize(pPreviewData);
-}
-
-
-static VOID
-OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
-{
-    PAINTSTRUCT ps;
-    HFONT hOldFont;
-    HDC hdc;
-    RECT rc;
-
-    hdc = BeginPaint(hwnd, &ps);
-
-    /* Desktop */
-    FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop);
-
-    /* Inactive Window */
-    DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
-    SetTextColor(hdc, pPreviewData->clrInactiveCaptionText);
-    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption,  pPreviewData->hCaptionFont,
-                    NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);
-    DrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2);
-
-    /* Active Window */
-    DrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
-    SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
-    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
-                    NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
-    DrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2);
-
-    /* FIXME: Draw the menu bar */
-    DrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
-                    pPreviewData->hMenu /*HMENU hMenu*/,
-                    pPreviewData->hMessageFont /*HFONT hFont*/);
-
-    /* Draw the client area */
-    CopyRect(&rc, &pPreviewData->rcActiveClient);
-    DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
-    FillRect(hdc, &rc, pPreviewData->hbrWindow);
-
-    /* Draw the client text */
-    CopyRect(&rc, &pPreviewData->rcActiveClient);
-    rc.left += 4;
-    rc.top += 2;
-    SetTextColor(hdc, pPreviewData->clrWindowText);
-    hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
-    DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);
-    SelectObject(hdc, hOldFont);
-
-    /* Draw the scroll bar */
-    DrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar);
-
-    /* Dialog Window */
-    DrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
-    SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
-    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
-                    NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
-    DrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2);
-
-    /* Draw the dialog text */
-    CopyRect(&rc, &pPreviewData->rcDialogClient);
-    rc.left += 4;
-    rc.top += 2;
-    SetTextColor(hdc, RGB(0,0,0));
-    hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
-    DrawText(hdc, pPreviewData->lpMessText, lstrlen(pPreviewData->lpMessText), &rc, DT_LEFT);
-    SelectObject(hdc, hOldFont);
-
-    /* Draw Button */
-    DrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH);
-    CopyRect(&rc, &pPreviewData->rcDialogButton);
-    SetTextColor(hdc, pPreviewData->clrButtonText);
-    hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
-    DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
-    SelectObject(hdc, hOldFont);
-
-    EndPaint(hwnd, &ps);
-}
-
-
-static VOID
-OnLButtonDown(HWND hwnd, int xPos, int yPos, PPREVIEW_DATA pPreviewData)
-{
-    UINT type = IDX_DESKTOP;
-    POINT pt;
-
-    pt.x = xPos;
-    pt.y = yPos;
-
-    if (PtInRect(&pPreviewData->rcInactiveFrame, pt))
-        type = IDX_INACTIVE_BORDER;
-
-    if (PtInRect(&pPreviewData->rcInactiveCaption, pt))
-        type = IDX_INACTIVE_CAPTION;
-
-    if (PtInRect(&pPreviewData->rcInactiveCaptionButtons, pt))
-        type = IDX_CAPTION_BUTTON;
-
-    if (PtInRect(&pPreviewData->rcActiveFrame, pt))
-        type = IDX_ACTIVE_BORDER;
-
-    if (PtInRect(&pPreviewData->rcActiveCaption, pt))
-        type = IDX_ACTIVE_CAPTION;
-
-    if (PtInRect(&pPreviewData->rcActiveCaptionButtons, pt))
-        type = IDX_CAPTION_BUTTON;
-
-    if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
-        type = IDX_MENU;
-
-//    if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
-//        type = IDX_SELECTION;
-
-    if (PtInRect(&pPreviewData->rcActiveClient, pt))
-        type = IDX_WINDOW;
-
-    if (PtInRect(&pPreviewData->rcActiveScroll, pt))
-        type = IDX_SCROLLBAR;
-
-    if (PtInRect(&pPreviewData->rcDialogFrame, pt))
-        type = IDX_DIALOG;
-
-    if (PtInRect(&pPreviewData->rcDialogCaption, pt))
-        type = IDX_ACTIVE_CAPTION;
-
-    if (PtInRect(&pPreviewData->rcDialogCaptionButtons, pt))
-        type = IDX_CAPTION_BUTTON;
-
-    if (PtInRect(&pPreviewData->rcDialogButton, pt))
-        type = IDX_3D_OBJECTS;
-
-    SendMessage(GetParent(hwnd), WM_USER, 0, type);
-}
-
-
-static VOID
-OnDestroy(PPREVIEW_DATA pPreviewData)
-{
-    DeleteObject(pPreviewData->hbrScrollbar);
-    DeleteObject(pPreviewData->hbrDesktop);
-    DeleteObject(pPreviewData->hbrWindow);
-
-    DeleteObject(pPreviewData->hCaptionFont);
-    DeleteObject(pPreviewData->hMenuFont);
-    DeleteObject(pPreviewData->hMessageFont);
-
-    DestroyMenu(pPreviewData->hMenu);
-
-    LocalFree((HLOCAL)pPreviewData->lpInAct);
-    LocalFree((HLOCAL)pPreviewData->lpAct);
-    LocalFree((HLOCAL)pPreviewData->lpWinTxt);
-    LocalFree((HLOCAL)pPreviewData->lpMessBox);
-    LocalFree((HLOCAL)pPreviewData->lpMessText);
-    LocalFree((HLOCAL)pPreviewData->lpButText);
-}
-
-
-static LRESULT CALLBACK
-PreviewWndProc(HWND hwnd,
-               UINT uMsg,
-               WPARAM wParam,
-               LPARAM lParam)
-{
-    PPREVIEW_DATA pPreviewData;
-
-    pPreviewData = (PPREVIEW_DATA)GetWindowLongPtr(hwnd, GWLP_USERDATA);
-
-    switch (uMsg)
-    {
-        case WM_CREATE:
-            pPreviewData = (PPREVIEW_DATA)HeapAlloc(GetProcessHeap(),
-                                                    HEAP_ZERO_MEMORY,
-                                                    sizeof(PREVIEW_DATA));
-            if (!pPreviewData)
-                return -1;
-
-            SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pPreviewData);
-            OnCreate(hwnd, pPreviewData);
-            break;
-
-        case WM_SIZE:
-            OnSize(LOWORD(lParam), HIWORD(lParam), pPreviewData);
-            break;
-
-        case WM_PAINT:
-            OnPaint(hwnd, pPreviewData);
-            break;
-
-        case WM_LBUTTONDOWN:
-            OnLButtonDown(hwnd, LOWORD(lParam), HIWORD(lParam), pPreviewData);
-            break;
-
-        case WM_DESTROY:
-            OnDestroy(pPreviewData);
-            HeapFree(GetProcessHeap(), 0, pPreviewData);
-            break;
-
-        case PVM_GETCYCAPTION:
-            return pPreviewData->cyCaption;
-
-        case PVM_SETCYCAPTION:
-            if ((INT)lParam > 0)
-            {
-                pPreviewData->cyCaption = (INT)lParam;
-                CalculateItemSize(pPreviewData);
-                InvalidateRect(hwnd, NULL, FALSE);
-            }
-            break;
-
-        case PVM_GETCYMENU:
-            return pPreviewData->cyMenu;
-
-        case PVM_SETCYMENU:
-            if ((INT)lParam > 0)
-            {
-                pPreviewData->cyMenu = (INT)lParam;
-                CalculateItemSize(pPreviewData);
-                InvalidateRect(hwnd, NULL, FALSE);
-            }
-            break;
-
-        case PVM_GETCXSCROLLBAR:
-            return pPreviewData->cxScrollbar;
-
-        case PVM_SETCXSCROLLBAR:
-            if ((INT)lParam > 0)
-            {
-                pPreviewData->cxScrollbar = (INT)lParam;
-                CalculateItemSize(pPreviewData);
-                InvalidateRect(hwnd, NULL, FALSE);
-            }
-            break;
-
-        case PVM_GETCYSIZEFRAME:
-            return pPreviewData->cySizeFrame;
-
-        case PVM_SETCYSIZEFRAME:
-            if ((INT)lParam > 0)
-            {
-                pPreviewData->cySizeFrame = (INT)lParam;
-                CalculateItemSize(pPreviewData);
-                InvalidateRect(hwnd, NULL, FALSE);
-            }
-            break;
-
-        default:
-            DefWindowProc(hwnd,
-                          uMsg,
-                          wParam,
-                          lParam);
-    }
-
-    return TRUE;
-}
-
-
-BOOL
-RegisterPreviewControl(IN HINSTANCE hInstance)
-{
-    WNDCLASSEX wc = {0};
-
-    wc.cbSize = sizeof(WNDCLASSEX);
-    wc.lpfnWndProc = PreviewWndProc;
-    wc.hInstance = hInstance;
-    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
-    wc.hbrBackground = (HBRUSH)NULL; //(COLOR_BTNFACE + 1);
-    wc.lpszClassName = szPreviewWndClass;
-
-    return RegisterClassEx(&wc) != (ATOM)0;
-}
-
-
-VOID
-UnregisterPreviewControl(IN HINSTANCE hInstance)
-{
-    UnregisterClass(szPreviewWndClass,
-                    hInstance);
-}
+/*\r
+ * PROJECT:     ReactOS Timedate Control Panel\r
+ * LICENSE:     GPL - See COPYING in the top level directory\r
+ * FILE:        lib/cpl/desk/preview.c\r
+ * PURPOSE:     Draws the preview control\r
+ * COPYRIGHT:   Copyright 2006, 2007 Eric Kohl\r
+ */\r
+\r
+#include "desk.h"\r
+#include "preview.h"\r
+\r
+static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass");\r
+\r
+typedef struct _PREVIEW_DATA\r
+{\r
+    HWND hwndParent;\r
+\r
+    DWORD clrDesktop;\r
+    HBRUSH hbrDesktop;\r
+\r
+    DWORD clrWindow;\r
+    HBRUSH hbrWindow;\r
+\r
+    DWORD clrScrollbar;\r
+    HBRUSH hbrScrollbar;\r
+\r
+    DWORD clrActiveCaptionText;\r
+    DWORD clrInactiveCaptionText;\r
+    DWORD clrWindowText;\r
+    DWORD clrButtonText;\r
+\r
+    INT cxEdge;\r
+    INT cyEdge;\r
+\r
+    INT cyCaption;\r
+\r
+    RECT rcDesktop;\r
+    RECT rcInactiveFrame;\r
+    RECT rcInactiveCaption;\r
+    RECT rcInactiveCaptionButtons;\r
+\r
+    RECT rcActiveFrame;\r
+    RECT rcActiveCaption;\r
+    RECT rcActiveCaptionButtons;\r
+    RECT rcActiveMenuBar;\r
+    RECT rcSelectedMenuItem;\r
+    RECT rcActiveClient;\r
+    RECT rcActiveScroll;\r
+\r
+    RECT rcDialogFrame;\r
+    RECT rcDialogCaption;\r
+    RECT rcDialogCaptionButtons;\r
+    RECT rcDialogClient;\r
+\r
+    RECT rcDialogButton;\r
+\r
+    LPTSTR lpInAct;\r
+    LPTSTR lpAct;\r
+    LPTSTR lpWinTxt;\r
+    LPTSTR lpMessBox;\r
+    LPTSTR lpMessText;\r
+    LPTSTR lpButText;\r
+\r
+    LOGFONT lfCaptionFont;\r
+    LOGFONT lfMenuFont;\r
+    LOGFONT lfMessageFont;\r
+\r
+    HFONT hCaptionFont;\r
+    HFONT hMenuFont;\r
+    HFONT hMessageFont;\r
+\r
+    HMENU hMenu;\r
+\r
+} PREVIEW_DATA, *PPREVIEW_DATA;\r
+\r
+\r
+\r
+static VOID\r
+DrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax)\r
+{\r
+    RECT rc3;\r
+    RECT rc4;\r
+    RECT rc5;\r
+\r
+    rc3.left = lpRect->right - 2 - 16;\r
+    rc3.top = lpRect->top + 2;\r
+    rc3.right = lpRect->right - 2;\r
+    rc3.bottom = lpRect->bottom - 2;\r
+\r
+    DrawFrameControl(hdc, &rc3, DFC_CAPTION, DFCS_CAPTIONCLOSE);\r
+\r
+    if (bMinMax)\r
+    {\r
+        rc4.left = rc3.left - 16 - 2;\r
+        rc4.top = rc3.top;\r
+        rc4.right = rc3.right - 16 - 2;\r
+        rc4.bottom = rc3.bottom;\r
+\r
+        DrawFrameControl(hdc, &rc4, DFC_CAPTION, DFCS_CAPTIONMAX);\r
+\r
+        rc5.left = rc4.left - 16;\r
+        rc5.top = rc4.top;\r
+        rc5.right = rc4.right - 16;\r
+        rc5.bottom = rc4.bottom;\r
+\r
+        DrawFrameControl(hdc, &rc5, DFC_CAPTION, DFCS_CAPTIONMIN);\r
+    }\r
+}\r
+\r
+static VOID\r
+DrawScrollbar(HDC hdc, LPRECT rc, HBRUSH hbrScrollbar)\r
+{\r
+    RECT rcTop;\r
+    RECT rcBottom;\r
+    RECT rcMiddle;\r
+    int width;\r
+\r
+    width = rc->right - rc->left;\r
+\r
+    rcTop.left = rc->left;\r
+    rcTop.right = rc->right;\r
+    rcTop.top = rc->top;\r
+    rcTop.bottom = rc->top + width;\r
+\r
+    rcMiddle.left = rc->left;\r
+    rcMiddle.right = rc->right;\r
+    rcMiddle.top = rc->top + width;\r
+    rcMiddle.bottom = rc->bottom - width;\r
+\r
+    rcBottom.left = rc->left;\r
+    rcBottom.right = rc->right;\r
+    rcBottom.top = rc->bottom - width;\r
+    rcBottom.bottom = rc->bottom;\r
+\r
+    DrawFrameControl(hdc, &rcTop, DFC_SCROLL, DFCS_SCROLLUP);\r
+    DrawFrameControl(hdc, &rcBottom, DFC_SCROLL, DFCS_SCROLLDOWN);\r
+\r
+    FillRect(hdc, &rcMiddle, hbrScrollbar);\r
+}\r
+\r
+\r
+static VOID\r
+OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)\r
+{\r
+    NONCLIENTMETRICS NonClientMetrics;\r
+\r
+    pPreviewData->clrScrollbar = GetSysColor(COLOR_SCROLLBAR);\r
+    pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrScrollbar);\r
+\r
+    pPreviewData->clrDesktop = GetSysColor(COLOR_DESKTOP);\r
+    pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrDesktop);\r
+    pPreviewData->clrWindow = GetSysColor(COLOR_WINDOW);\r
+    pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrWindow);\r
+\r
+    pPreviewData->clrActiveCaptionText = GetSysColor(COLOR_CAPTIONTEXT);\r
+    pPreviewData->clrInactiveCaptionText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);\r
+    pPreviewData->clrWindowText = GetSysColor(COLOR_WINDOWTEXT);\r
+    pPreviewData->clrButtonText = GetSysColor(COLOR_BTNTEXT);\r
+\r
+    pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE);\r
+    pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE);\r
+\r
+    pPreviewData->cyCaption = 20; //GetSystemMetrics(SM_CYCAPTION);\r
+\r
+    /* load font info */\r
+    NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);\r
+    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);\r
+\r
+    pPreviewData->lfCaptionFont = NonClientMetrics.lfCaptionFont;\r
+    pPreviewData->hCaptionFont = CreateFontIndirect(&pPreviewData->lfCaptionFont);\r
+\r
+    pPreviewData->lfMenuFont = NonClientMetrics.lfMenuFont;\r
+    pPreviewData->hMenuFont = CreateFontIndirect(&pPreviewData->lfMenuFont);\r
+\r
+    pPreviewData->lfMessageFont = NonClientMetrics.lfMessageFont;\r
+    pPreviewData->hMessageFont = CreateFontIndirect(&pPreviewData->lfMessageFont);\r
+\r
+    /* Load and modify the menu */\r
+    pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU));\r
+    EnableMenuItem(pPreviewData->hMenu, ID_MENU_DISABLED,\r
+                   MF_BYCOMMAND | MF_DISABLED);\r
+    HiliteMenuItem(hwnd, pPreviewData->hMenu,\r
+                   ID_MENU_SELECTED, MF_BYCOMMAND | MF_HILITE);\r
+\r
+//    GetMenuItemRect(hwnd, pPreviewData->hMenu,\r
+//                    ID_MENU_SELECTED, &pPreviewData->rcSelectedMenuItem);\r
+\r
+\r
+    AllocAndLoadString(&pPreviewData->lpInAct, hApplet, IDS_INACTWIN);\r
+    AllocAndLoadString(&pPreviewData->lpAct, hApplet, IDS_ACTWIN);\r
+    AllocAndLoadString(&pPreviewData->lpWinTxt, hApplet, IDS_WINTEXT);\r
+    AllocAndLoadString(&pPreviewData->lpMessBox, hApplet, IDS_MESSBOX);\r
+    AllocAndLoadString(&pPreviewData->lpMessText, hApplet, IDS_MESSTEXT);\r
+    AllocAndLoadString(&pPreviewData->lpButText, hApplet, IDS_BUTTEXT);\r
+}\r
+\r
+\r
+static VOID\r
+OnSize(INT cx, INT cy, PPREVIEW_DATA pPreviewData)\r
+{\r
+    int width, height;\r
+\r
+    /* Get Desktop rectangle */\r
+    pPreviewData->rcDesktop.left = 0;\r
+    pPreviewData->rcDesktop.top = 0;\r
+    pPreviewData->rcDesktop.right = cx;\r
+    pPreviewData->rcDesktop.bottom = cy;\r
+\r
+    /* Calculate the inactive window rectangle */\r
+    pPreviewData->rcInactiveFrame.left = pPreviewData->rcDesktop.left + 8;\r
+    pPreviewData->rcInactiveFrame.top = pPreviewData->rcDesktop.top + 8;\r
+    pPreviewData->rcInactiveFrame.right = pPreviewData->rcDesktop.right - 25;\r
+    pPreviewData->rcInactiveFrame.bottom = pPreviewData->rcDesktop.bottom - 30;\r
+\r
+    /* Calculate the inactive caption rectangle */\r
+    pPreviewData->rcInactiveCaption.left = pPreviewData->rcInactiveFrame.left + pPreviewData->cxEdge + 1/*3*/ + 1;\r
+    pPreviewData->rcInactiveCaption.top = pPreviewData->rcInactiveFrame.top + pPreviewData->cyEdge + 1/*3*/ + 1;\r
+    pPreviewData->rcInactiveCaption.right = pPreviewData->rcInactiveFrame.right - pPreviewData->cxEdge - 1/*3*/ - 1;\r
+    pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveFrame.top + pPreviewData->cyCaption /*20*/ + 2;\r
+\r
+    /* Calculate the inactive caption buttons rectangle */\r
+    pPreviewData->rcInactiveCaptionButtons.left = pPreviewData->rcInactiveCaption.right - 2 - 2 - 3 * 16;\r
+    pPreviewData->rcInactiveCaptionButtons.top = pPreviewData->rcInactiveCaption.top + 2;\r
+    pPreviewData->rcInactiveCaptionButtons.right = pPreviewData->rcInactiveCaption.right - 2;\r
+    pPreviewData->rcInactiveCaptionButtons.bottom = pPreviewData->rcInactiveCaption.bottom - 2;\r
+\r
+    /* Calculate the active window rectangle */\r
+    pPreviewData->rcActiveFrame.left = pPreviewData->rcInactiveFrame.left + 3 + 1;\r
+    pPreviewData->rcActiveFrame.top = pPreviewData->rcInactiveCaption.bottom + 1;\r
+    pPreviewData->rcActiveFrame.right = pPreviewData->rcDesktop.right - 10;\r
+    pPreviewData->rcActiveFrame.bottom = pPreviewData->rcDesktop.bottom - 25;\r
+\r
+    /* Calculate the active caption rectangle */\r
+    pPreviewData->rcActiveCaption.left = pPreviewData->rcActiveFrame.left + 3 + 1;\r
+    pPreviewData->rcActiveCaption.top = pPreviewData->rcActiveFrame.top + 3 + 1;\r
+    pPreviewData->rcActiveCaption.right = pPreviewData->rcActiveFrame.right - 3 - 1;\r
+    pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveFrame.top + pPreviewData->cyCaption/*20*/ + 2;\r
+\r
+    /* Calculate the active caption buttons rectangle */\r
+    pPreviewData->rcActiveCaptionButtons.left = pPreviewData->rcActiveCaption.right - 2 - 2 - 3 * 16;\r
+    pPreviewData->rcActiveCaptionButtons.top = pPreviewData->rcActiveCaption.top + 2;\r
+    pPreviewData->rcActiveCaptionButtons.right = pPreviewData->rcActiveCaption.right - 2;\r
+    pPreviewData->rcActiveCaptionButtons.bottom = pPreviewData->rcActiveCaption.bottom - 2;\r
+\r
+    /* Calculate the active menu bar rectangle */\r
+    pPreviewData->rcActiveMenuBar.left = pPreviewData->rcActiveFrame.left + 3 + 1;\r
+    pPreviewData->rcActiveMenuBar.top = pPreviewData->rcActiveCaption.bottom + 1;\r
+    pPreviewData->rcActiveMenuBar.right = pPreviewData->rcActiveFrame.right - 3 - 1;\r
+    pPreviewData->rcActiveMenuBar.bottom = pPreviewData->rcActiveMenuBar.top + 20;\r
+\r
+    /* Calculate the active client rectangle */\r
+    pPreviewData->rcActiveClient.left = pPreviewData->rcActiveFrame.left + 3 + 1;\r
+    pPreviewData->rcActiveClient.top = pPreviewData->rcActiveMenuBar.bottom; // + 1;\r
+    pPreviewData->rcActiveClient.right = pPreviewData->rcActiveFrame.right - 3 - 1;\r
+    pPreviewData->rcActiveClient.bottom = pPreviewData->rcActiveFrame.bottom - 3 - 1;\r
+\r
+    /* Calculate the active scroll rectangle */\r
+    pPreviewData->rcActiveScroll.left = pPreviewData->rcActiveClient.right - 2 - 16;\r
+    pPreviewData->rcActiveScroll.top = pPreviewData->rcActiveClient.top + 2;\r
+    pPreviewData->rcActiveScroll.right = pPreviewData->rcActiveClient.right - 2;\r
+    pPreviewData->rcActiveScroll.bottom = pPreviewData->rcActiveClient.bottom - 2;\r
+\r
+\r
+    /* Dialog window */\r
+    pPreviewData->rcDialogFrame.left = pPreviewData->rcActiveClient.left + 4;\r
+    pPreviewData->rcDialogFrame.top = (pPreviewData->rcDesktop.bottom * 60) / 100;\r
+    pPreviewData->rcDialogFrame.right = (pPreviewData->rcDesktop.right * 65) / 100;\r
+    pPreviewData->rcDialogFrame.bottom = pPreviewData->rcDesktop.bottom - 5;\r
+\r
+    /* Calculate the dialog caption rectangle */\r
+    pPreviewData->rcDialogCaption.left = pPreviewData->rcDialogFrame.left + 3;\r
+    pPreviewData->rcDialogCaption.top = pPreviewData->rcDialogFrame.top + 3;\r
+    pPreviewData->rcDialogCaption.right = pPreviewData->rcDialogFrame.right - 3;\r
+    pPreviewData->rcDialogCaption.bottom = pPreviewData->rcDialogFrame.top + 20 + 1;\r
+\r
+    /* Calculate the inactive caption buttons rectangle */\r
+    pPreviewData->rcDialogCaptionButtons.left = pPreviewData->rcDialogCaption.right - 2 - 16;\r
+    pPreviewData->rcDialogCaptionButtons.top = pPreviewData->rcDialogCaption.top + 2;\r
+    pPreviewData->rcDialogCaptionButtons.right = pPreviewData->rcDialogCaption.right - 2;\r
+    pPreviewData->rcDialogCaptionButtons.bottom = pPreviewData->rcDialogCaption.bottom - 2;\r
+\r
+    /* Calculate the dialog client rectangle */\r
+    pPreviewData->rcDialogClient.left = pPreviewData->rcDialogFrame.left + 3;\r
+    pPreviewData->rcDialogClient.top = pPreviewData->rcDialogCaption.bottom + 1;\r
+    pPreviewData->rcDialogClient.right = pPreviewData->rcDialogFrame.right - 3;\r
+    pPreviewData->rcDialogClient.bottom = pPreviewData->rcDialogFrame.bottom - 3;\r
+\r
+    /* Calculate the dialog button rectangle */\r
+    width = 80;\r
+    height = 28;\r
+\r
+    pPreviewData->rcDialogButton.left =\r
+        (pPreviewData->rcDialogClient.right + pPreviewData->rcDialogClient.left - width) / 2;\r
+    pPreviewData->rcDialogButton.right = pPreviewData->rcDialogButton.left + width;\r
+    pPreviewData->rcDialogButton.bottom = pPreviewData->rcDialogClient.bottom - 2;\r
+    pPreviewData->rcDialogButton.top = pPreviewData->rcDialogButton.bottom - height;\r
+}\r
+\r
+\r
+static VOID\r
+OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)\r
+{\r
+    PAINTSTRUCT ps;\r
+    HFONT hOldFont;\r
+    HDC hdc;\r
+    RECT rc;\r
+\r
+    hdc = BeginPaint(hwnd, &ps);\r
+\r
+    /* Desktop */\r
+    FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop);\r
+\r
+    /* Inactive Window */\r
+    DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);\r
+    SetTextColor(hdc, pPreviewData->clrInactiveCaptionText);\r
+    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption,  pPreviewData->hCaptionFont,\r
+                    NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);\r
+    DrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE);\r
+\r
+    /* Active Window */\r
+    DrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);\r
+    SetTextColor(hdc, pPreviewData->clrActiveCaptionText);\r
+    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,\r
+                    NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);\r
+    DrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE);\r
+\r
+    /* FIXME: Draw the menu bar */\r
+    DrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,\r
+                    pPreviewData->hMenu /*HMENU hMenu*/,\r
+                    pPreviewData->hMessageFont /*HFONT hFont*/);\r
+\r
+    /* Draw the client area */\r
+    CopyRect(&rc, &pPreviewData->rcActiveClient);\r
+    DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);\r
+    FillRect(hdc, &rc, pPreviewData->hbrWindow);\r
+\r
+    /* Draw the client text */\r
+    CopyRect(&rc, &pPreviewData->rcActiveClient);\r
+    rc.left += 4;\r
+    rc.top += 2;\r
+    SetTextColor(hdc, pPreviewData->clrWindowText);\r
+    hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);\r
+    DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);\r
+    SelectObject(hdc, hOldFont);\r
+\r
+    /* Draw the scroll bar */\r
+    DrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar);\r
+\r
+    /* Dialog Window */\r
+    DrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);\r
+    SetTextColor(hdc, pPreviewData->clrActiveCaptionText);\r
+    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,\r
+                    NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);\r
+    DrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE);\r
+\r
+    /* Draw the dialog text */\r
+    CopyRect(&rc, &pPreviewData->rcDialogClient);\r
+    rc.left += 4;\r
+    rc.top += 2;\r
+    SetTextColor(hdc, RGB(0,0,0));\r
+    hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);\r
+    DrawText(hdc, pPreviewData->lpMessText, lstrlen(pPreviewData->lpMessText), &rc, DT_LEFT);\r
+    SelectObject(hdc, hOldFont);\r
+\r
+    /* Draw Button */\r
+    DrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH);\r
+    CopyRect(&rc, &pPreviewData->rcDialogButton);\r
+    SetTextColor(hdc, pPreviewData->clrButtonText);\r
+    hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);\r
+    DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);\r
+    SelectObject(hdc, hOldFont);\r
+\r
+    EndPaint(hwnd, &ps);\r
+}\r
+\r
+\r
+static VOID\r
+OnLButtonDown(HWND hwnd, int xPos, int yPos, PPREVIEW_DATA pPreviewData)\r
+{\r
+    UINT type = IDX_DESKTOP;\r
+    POINT pt;\r
+\r
+    pt.x = xPos;\r
+    pt.y = yPos;\r
+\r
+    if (PtInRect(&pPreviewData->rcInactiveFrame, pt))\r
+        type = IDX_INACTIVE_BORDER;\r
+\r
+    if (PtInRect(&pPreviewData->rcInactiveCaption, pt))\r
+        type = IDX_INACTIVE_CAPTION;\r
+\r
+    if (PtInRect(&pPreviewData->rcInactiveCaptionButtons, pt))\r
+        type = IDX_CAPTION_BUTTON;\r
+\r
+    if (PtInRect(&pPreviewData->rcActiveFrame, pt))\r
+        type = IDX_ACTIVE_BORDER;\r
+\r
+    if (PtInRect(&pPreviewData->rcActiveCaption, pt))\r
+        type = IDX_ACTIVE_CAPTION;\r
+\r
+    if (PtInRect(&pPreviewData->rcActiveCaptionButtons, pt))\r
+        type = IDX_CAPTION_BUTTON;\r
+\r
+    if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))\r
+        type = IDX_MENU;\r
+\r
+//    if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))\r
+//        type = IDX_SELECTION;\r
+\r
+    if (PtInRect(&pPreviewData->rcActiveClient, pt))\r
+        type = IDX_WINDOW;\r
+\r
+    if (PtInRect(&pPreviewData->rcActiveScroll, pt))\r
+        type = IDX_SCROLLBAR;\r
+\r
+    if (PtInRect(&pPreviewData->rcDialogFrame, pt))\r
+        type = IDX_DIALOG;\r
+\r
+    if (PtInRect(&pPreviewData->rcDialogCaption, pt))\r
+        type = IDX_ACTIVE_CAPTION;\r
+\r
+    if (PtInRect(&pPreviewData->rcDialogCaptionButtons, pt))\r
+        type = IDX_CAPTION_BUTTON;\r
+\r
+    if (PtInRect(&pPreviewData->rcDialogButton, pt))\r
+        type = IDX_3D_OBJECTS;\r
+\r
+    SendMessage(GetParent(hwnd), WM_USER, 0, type);\r
+}\r
+\r
+\r
+static VOID\r
+OnDestroy(PPREVIEW_DATA pPreviewData)\r
+{\r
+    DeleteObject(pPreviewData->hbrScrollbar);\r
+    DeleteObject(pPreviewData->hbrDesktop);\r
+    DeleteObject(pPreviewData->hbrWindow);\r
+\r
+    DeleteObject(pPreviewData->hCaptionFont);\r
+    DeleteObject(pPreviewData->hMenuFont);\r
+    DeleteObject(pPreviewData->hMessageFont);\r
+\r
+    DestroyMenu(pPreviewData->hMenu);\r
+\r
+    LocalFree((HLOCAL)pPreviewData->lpInAct);\r
+    LocalFree((HLOCAL)pPreviewData->lpAct);\r
+    LocalFree((HLOCAL)pPreviewData->lpWinTxt);\r
+    LocalFree((HLOCAL)pPreviewData->lpMessBox);\r
+    LocalFree((HLOCAL)pPreviewData->lpMessText);\r
+    LocalFree((HLOCAL)pPreviewData->lpButText);\r
+}\r
+\r
+\r
+static LRESULT CALLBACK\r
+PreviewWndProc(HWND hwnd,\r
+               UINT uMsg,\r
+               WPARAM wParam,\r
+               LPARAM lParam)\r
+{\r
+    PPREVIEW_DATA pPreviewData;\r
+\r
+    pPreviewData = (PPREVIEW_DATA)GetWindowLongPtr(hwnd, GWLP_USERDATA);\r
+\r
+    switch (uMsg)\r
+    {\r
+        case WM_CREATE:\r
+            pPreviewData = (PPREVIEW_DATA)HeapAlloc(GetProcessHeap(),\r
+                                                    HEAP_ZERO_MEMORY,\r
+                                                    sizeof(PREVIEW_DATA));\r
+            if (!pPreviewData)\r
+                return -1;\r
+\r
+            SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pPreviewData);\r
+            OnCreate(hwnd, pPreviewData);\r
+            break;\r
+\r
+        case WM_SIZE:\r
+            OnSize(LOWORD(lParam), HIWORD(lParam), pPreviewData);\r
+            break;\r
+\r
+        case WM_PAINT:\r
+            OnPaint(hwnd, pPreviewData);\r
+            break;\r
+\r
+        case WM_LBUTTONDOWN:\r
+            OnLButtonDown(hwnd, LOWORD(lParam), HIWORD(lParam), pPreviewData);\r
+            break;\r
+\r
+        case WM_DESTROY:\r
+            OnDestroy(pPreviewData);\r
+            HeapFree(GetProcessHeap(), 0, pPreviewData);\r
+            break;\r
+\r
+        default:\r
+            DefWindowProc(hwnd,\r
+                          uMsg,\r
+                          wParam,\r
+                          lParam);\r
+    }\r
+\r
+    return TRUE;\r
+}\r
+\r
+\r
+BOOL\r
+RegisterPreviewControl(IN HINSTANCE hInstance)\r
+{\r
+    WNDCLASSEX wc = {0};\r
+\r
+    wc.cbSize = sizeof(WNDCLASSEX);\r
+    wc.lpfnWndProc = PreviewWndProc;\r
+    wc.hInstance = hInstance;\r
+    wc.hCursor = LoadCursor(NULL, IDC_ARROW);\r
+    wc.hbrBackground = (HBRUSH)NULL; //(COLOR_BTNFACE + 1);\r
+    wc.lpszClassName = szPreviewWndClass;\r
+\r
+    return RegisterClassEx(&wc) != (ATOM)0;\r
+}\r
+\r
+\r
+VOID\r
+UnregisterPreviewControl(IN HINSTANCE hInstance)\r
+{\r
+    UnregisterClass(szPreviewWndClass,\r
+                    hInstance);\r
+}\r
index c5e409c..8b5852c 100644 (file)
@@ -1,40 +1,21 @@
-/*
- * PROJECT:     ReactOS Desktop Control Panel
- * LICENSE:     GPL - See COPYING in the top level directory
- * FILE:        lib/cpl/desk/preview.h
- * PURPOSE:     Definitions used by the preview control
- * COPYRIGHT:   Copyright 2006, 2007 Eric Kohl
- */
-
-#define IDX_3D_OBJECTS        0
-#define IDX_SCROLLBAR         1
-#define IDX_DESKTOP           2
-#define IDX_DIALOG            3
-#define IDX_WINDOW            4
-#define IDX_APPSPACE          5
-#define IDX_SELECTION         6
-#define IDX_MENU              7
-
-#define IDX_QUICKINFO         9
-#define IDX_INACTIVE_BORDER  10
-#define IDX_ACTIVE_BORDER    11
-
-#define IDX_INACTIVE_CAPTION 15
-#define IDX_ACTIVE_CAPTION   16
-#define IDX_CAPTION_BUTTON   17
-
-
-#define PVM_GETCYCAPTION     (WM_USER+1)
-#define PVM_SETCYCAPTION     (WM_USER+2)
-
-#define PVM_GETCYMENU        (WM_USER+3)
-#define PVM_SETCYMENU        (WM_USER+4)
-
-#define PVM_GETCXSCROLLBAR   (WM_USER+5)
-#define PVM_SETCXSCROLLBAR   (WM_USER+6)
-
-#define PVM_GETCYSIZEFRAME   (WM_USER+7)
-#define PVM_SETCYSIZEFRAME   (WM_USER+8)
-
-BOOL RegisterPreviewControl(IN HINSTANCE hInstance);
-VOID UnregisterPreviewControl(IN HINSTANCE hInstance);
+\r
+#define IDX_3D_OBJECTS        0\r
+#define IDX_SCROLLBAR         1\r
+#define IDX_DESKTOP           2\r
+#define IDX_DIALOG            3\r
+#define IDX_WINDOW            4\r
+#define IDX_APPSPACE          5\r
+#define IDX_SELECTION         6\r
+#define IDX_MENU              7\r
+\r
+#define IDX_QUICKINFO         9\r
+#define IDX_INACTIVE_BORDER  10\r
+#define IDX_ACTIVE_BORDER    11\r
+\r
+#define IDX_INACTIVE_CAPTION 15\r
+#define IDX_ACTIVE_CAPTION   16\r
+#define IDX_CAPTION_BUTTON   17\r
+\r
+\r
+BOOL RegisterPreviewControl(IN HINSTANCE hInstance);\r
+VOID UnregisterPreviewControl(IN HINSTANCE hInstance);\r
index 940b390..f83d9cb 100644 (file)
 
 
 /* Appearance Page */
-#define IDC_APPEARANCE_PREVIEW       1500
-#define IDC_APPEARANCE_UI_ITEM       1501
-
-#define IDC_APPEAR_SIZE          1502
-#define IDC_APPEAR_SIZE_UPDOWN   1503
-
-#define IDC_APPEAR_FONT_NAME     1510
-
+#define IDC_APPEARANCE_PREVIEW   1500
+#define IDC_APPEARANCE_UI_ITEM   1501
 
 #define IDS_INACTWIN    1510
 #define IDS_ACTWIN      1511
 
 #endif /* __CPL_DESK_RESOURCE_H__ */
 
-
index a2999c9..a2b443c 100644 (file)
@@ -62,11 +62,6 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Item:", IDC_STATIC, 7, 159, 26, 9
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Size:", IDC_STATIC, 142, 159, 16, 9
-    EDITTEXT        IDC_APPEAR_SIZE, 142, 169, 38, 13, ES_RIGHT | WS_GROUP
-    CONTROL         "", IDC_APPEAR_SIZE_UPDOWN, UPDOWN_CLASS, WS_BORDER | WS_GROUP |
-                    UDS_AUTOBUDDY | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_SETBUDDYINT,
-                    172, 169, 10, 13
 END
 
 IDD_SETTINGS DIALOGEX DISCARDABLE  0, 0, 246, 188
index c9c7c0a..bbde0bb 100644 (file)
@@ -39,139 +39,6 @@ BEGIN
     LTEXT "This option...", -1, 14, 18, 223, 33
     LTEXT "Select language...", -1, 14, 55, 223, 18
     GROUPBOX "Transformation tables codepages", -1, 5, 101, 242, 88
-    /* TODO: add other components*/
-END
-
-IDD_LANGSOPTSPAGE DIALOGEX 0, 0, 252, 236
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Languages"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Text input languages and services", IDC_GROUPBOX, 5, 3, 242, 52
-    LTEXT "To view or change language or text input methods press ""Detail...""", -1, 12, 13, 230, 18
-    PUSHBUTTON "De&tail...", IDC_DETAIL_BUTTON, 186, 34, 54, 14
-    GROUPBOX "Additional language support", IDC_GROUPBOX, 5, 60, 242, 82
-    /* TODO: add other components*/
-END
-
-IDD_NUMSOPTSSETUP DIALOGEX 0, 0, 252, 236
-STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Numbers"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Samples", IDC_GROUPBOX, 5, 7, 242, 48
-    LTEXT "Positive:", -1, 11, 20, 28, 10
-    EDITTEXT IDC_NUM_EDIT, 42, 18, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Negative:", -1, 128, 20, 31, 10
-    EDITTEXT IDC_NEGNUM_EDIT, 162, 18, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Positive:", -1, 11, 38, 28, 10
-    EDITTEXT IDC_NUM1_EDIT, 42, 36, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Negative:", -1, 128, 38, 31, 10
-    EDITTEXT IDC_NEGNUM1_EDIT, 162, 36, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Whole and fractional part separator:", -1, 18, 61, 126, 9
-    COMBOBOX IDC_NUMDECIMALSEP_COMBO, 147, 59, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Number of fractional symbols:", -1, 18, 77, 126, 9
-    COMBOBOX IDC_NUMFRACSYBMS_COMBO, 147, 75, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Field separator:", -1, 18, 93, 126, 9
-    COMBOBOX IDC_NUMFIELDSEP_COMBO, 147, 91, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Number of digits in field:", -1, 18, 109, 126, 9
-    COMBOBOX IDC_NUMDIGFIELD_COMBO, 147, 107, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Negative number sign:", -1, 18, 125, 126, 9
-    COMBOBOX IDC_NUMNEGSIGN_COMBO, 147, 123, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Negative numbers format:", -1, 18, 141, 126, 9
-    COMBOBOX IDC_NUMNEGFMT_COMBO, 147, 139, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Leading zeroes:", -1, 18, 157, 126, 9
-    COMBOBOX IDC_NUMLEADZERO_COMBO, 147, 155, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Elements list separator:", -1, 18, 173, 126, 9
-    COMBOBOX IDC_NUMELEMLISTSEP_COMBO, 147, 171, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "System of units:", -1, 18, 189, 126, 9
-    COMBOBOX IDC_NUMUNITSSYS_COMBO, 147, 187, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Region corresponding digits:", -1, 18, 205, 126, 9
-    COMBOBOX IDC_NUMREGDIG_COMBO, 147, 203, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Digit replacement:", -1, 18, 221, 126, 9
-    COMBOBOX IDC_NUMDIGREPL_COMBO, 147, 219, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-END
-
-IDD_CURRENCYOPTSSETUP DIALOGEX 0, 0, 252, 236
-STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Currency"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Samples", IDC_GROUPBOX, 5, 7, 242, 40
-    LTEXT "Positive:", -1, 10, 25, 30, 10
-    EDITTEXT IDC_CURRENCY_EDIT, 42, 23, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Negative:", -1, 128, 25, 31, 10
-    EDITTEXT IDC_NEGCURRENCY_EDIT, 162, 23, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Monetary unit:", -1, 20, 61, 126, 9
-    COMBOBOX IDC_CURRENCYUNIT_COMBO, 148, 59, 90, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
-    LTEXT "Positive sum of money format:", -1, 20, 78, 126, 9
-    COMBOBOX IDC_POSCURRENCYSUM_COMBO, 148, 76, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Negative sum of money format:", -1, 20, 95, 126, 9
-    COMBOBOX IDC_NEGCURRENCYSUM_COMBO, 148, 93, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Whole and fractional part separator:", -1, 20, 121, 126, 9
-    COMBOBOX IDC_WHOLEFRACTSEP_COMBO, 148, 119, 90, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
-    LTEXT "Number of fractional symbols:", -1, 20, 137, 126, 9
-    COMBOBOX IDC_FRACSYMBSNUM_COMBO, 148, 136, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
-    LTEXT "Field separator:", -1, 20, 166, 126, 9
-    COMBOBOX IDC_FIELDSEP_COMBO, 148, 164, 90, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
-    LTEXT "Number of digits in field:", -1, 20, 183, 126, 9
-    COMBOBOX IDC_DIGINFIELDNUM_COMBO, 148, 181, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-END
-
-IDD_TIMEOPTSSETUP DIALOGEX 0, 0, 252, 236
-STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Time"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Samples", IDC_GROUPBOX, 5, 7, 242, 33
-    LTEXT "Sample:", -1, 13, 21, 52, 10
-    EDITTEXT IDC_TIME_EDIT, 68, 19, 84, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    EDITTEXT IDC_UNKNOWN_EDIT, 156, 19, 84, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Time format:", -1, 10, 52, 147, 10
-    COMBOBOX IDC_TIMEFMT_COMBO, 161, 50, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    LTEXT "Time components separator:", -1, 10, 69, 147, 10
-    COMBOBOX IDC_TIMESEP_COMBO, 161, 67, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    LTEXT "Time about midday notation (AM):", -1, 10, 86, 147, 10
-    COMBOBOX IDC_TIMEAM_COMBO, 161, 84, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    LTEXT "Time afternoon notation (PM):", -1, 10, 104, 147, 10
-    COMBOBOX IDC_TIMEPM_COMBO, 161, 102, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    GROUPBOX "", IDC_GROUPBOX, 7, 132, 238, 80
-    LTEXT "The designation of the time format\nh = hour     m = minute     s = second    t = \80\8c or \90\8c\n\nh = 12-hour day format\nH = 24-hour day format\n\nhh, mm, ss = with zeroes in beginning\nh, m, s = without zeroes", -1, 13, 141, 226, 65
-END
-
-IDD_DATEOPTSSETUP DIALOGEX 0, 0, 252, 236
-STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Date"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Calendar", IDC_GROUPBOX, 5, 7, 242, 74
-    LTEXT "If year typed as two digits, then show it as year between:", -1, 13, 18, 225, 8
-    EDITTEXT IDC_FIRSTYEAR_EDIT, 13, 30, 36, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "and", -1, 55, 32, 17, 8
-    EDITTEXT IDC_SECONDYEAR_EDIT, 77, 30, 36, 12, ES_LEFT | ES_NUMBER | WS_GROUP
-    CONTROL "",IDC_SCR_MAX_YEAR, "msctls_updown32", UDS_NOTHOUSANDS | UDS_WRAP | UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_CHILD | WS_VISIBLE, 113, 30, 10, 12
-    LTEXT "Calendar type:", -1, 13, 48, 56, 10
-    COMBOBOX IDC_CALTYPE_COMBO, 77, 46, 161, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | 
-             WS_VSCROLL | WS_TABSTOP | CBS_SORT | WS_DISABLED
-    LTEXT "Chronology by Hijra:", -1, 13, 59, 60, 16
-    COMBOBOX IDC_HIJCHRON_COMBO, 77, 64, 161, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | 
-             WS_VSCROLL | WS_TABSTOP | CBS_SORT | WS_DISABLED
-    GROUPBOX "Short date format", IDC_GROUPBOX, 7, 83, 238, 81
-    LTEXT "Sample:", -1, 13, 95, 63, 10
-    EDITTEXT IDC_SHRTDATESAMPLE_EDIT, 77, 93, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Sample - right to left read:", -1, 13, 109, 60, 16
-    EDITTEXT IDC_SHRTDATERTOL_EDIT, 77, 111, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED
-    LTEXT "Short format:", -1, 13, 131, 60, 10
-    COMBOBOX IDC_SHRTDATEFMT_COMBO, 77, 129, 161, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    LTEXT "Date components separator:", -1, 13, 148, 113, 10
-    COMBOBOX IDC_SHRTDATESEP_COMBO, 187, 146, 51, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    GROUPBOX "Long date format", IDC_GROUPBOX, 7, 167, 238, 64
-    LTEXT "Sample:", -1, 13, 179, 61, 10
-    EDITTEXT IDC_LONGDATESAMPLE_EDIT, 77, 177, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Sample - right to left read:", -1, 13, 193, 61, 16
-    EDITTEXT IDC_LONGDATERTOL_EDIT, 77, 195, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED
-    LTEXT "Long format:", -1, 13, 215, 60, 10
-    COMBOBOX IDC_LONGDATEFMT_COMBO, 77, 213, 161, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
 END
 
 STRINGTABLE
diff --git a/reactos/dll/cpl/intl_new/Fr.rc b/reactos/dll/cpl/intl_new/Fr.rc
deleted file mode 100644 (file)
index 0d81f61..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
-
-IDD_REGOPTSPAGE DIALOGEX 0, 0, 252, 236
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Options régionales"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Options régionales et standards", IDC_GROUPBOX, 5, 3, 242, 165
-    LTEXT "Cette option influence la façon d'affichage par les programmes des nombres, des devises, des dates et de l'heure.", IDC_STATIC, 14, 15, 230, 16
-    LTEXT "&Choisir un élément de la liste ou presser le bouton ""Pa&ramétrer"" pour modifier séparément les formats:", IDC_STATIC, 14, 36, 230, 16
-    COMBOBOX IDC_SETREG_COMBO, 14, 54, 168, 120, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | 
-             WS_VSCROLL | WS_TABSTOP | CBS_SORT
-    PUSHBUTTON "Pa&ramétrer...", IDC_SETUP_BUTTON, 187, 54, 52, 13
-    LTEXT "Exemples", IDC_STATIC, 14, 73, 70, 10
-    LTEXT "Nombre:", IDC_STATIC, 16, 86, 48, 10
-    LTEXT "Monétaire:", IDC_STATIC, 16, 101, 48, 10
-    LTEXT "Heure:", IDC_STATIC, 16, 116, 48, 10
-    LTEXT "Date courte:", IDC_STATIC, 16, 131, 48, 10
-    LTEXT "Date longue:", IDC_STATIC, 16, 146, 48, 10
-    EDITTEXT IDC_NUMSAMPLE_EDIT, 69, 86, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    EDITTEXT IDC_MONEYSAMPLE_EDIT, 69, 101, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    EDITTEXT IDC_TIMESAMPLE_EDIT, 69, 116, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    EDITTEXT IDC_SHORTTIMESAMPLE_EDIT, 69, 131, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    EDITTEXT IDC_FULLTIMESAMPLE_EDIT, 69, 146, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    GROUPBOX "Position géographique", IDC_GROUPBOX, 5, 172, 242, 56
-    LTEXT "Sélectionner votre position géographique pour les services tels que les infos locales ou la météo" , IDC_STATIC, 14, 184, 225, 24
-    COMBOBOX IDC_LOCATION_COMBO, 14, 211, 225, 40, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | 
-             WS_VSCROLL | WS_TABSTOP | CBS_SORT
-END
-
-IDD_EXTRAOPTSPAGE DIALOGEX 0, 0, 252, 236
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Extra"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Program language that not unicode supported", IDC_GROUPBOX, 5, 5, 242, 90
-    COMBOBOX IDC_LANGUAGE_COMBO, 14, 75, 225, 60, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | 
-             WS_VSCROLL | WS_TABSTOP | CBS_SORT
-    LTEXT "This option...", IDC_STATIC, 14, 18, 223, 33
-    LTEXT "Sélectionner la langue...", IDC_STATIC, 14, 55, 223, 18
-    GROUPBOX "Transformation tables codepages", IDC_GROUPBOX, 5, 101, 242, 88
-    /* TODO: add other components*/
-END
-
-IDD_LANGSOPTSPAGE DIALOGEX 0, 0, 252, 236
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Langues"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Langue de saisie du texte et services", IDC_GROUPBOX, 5, 3, 242, 52
-    LTEXT "Pour voir ou modifier les langues et les méthodes de saisie de texte, cliquer sur ""Détail...""", -1, 12, 13, 230, 18
-    PUSHBUTTON "Dé&tail...", IDC_DETAIL_BUTTON, 186, 34, 54, 14
-    GROUPBOX "Support de langages additionnels", IDC_GROUPBOX, 5, 60, 242, 82
-    /* TODO: add other components*/
-END
-
-IDD_NUMSOPTSSETUP DIALOGEX 0, 0, 252, 236
-STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Nombres"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Exemples", IDC_GROUPBOX, 5, 7, 242, 48
-    LTEXT "Positif:", -1, 11, 20, 28, 10
-    EDITTEXT IDC_NUM_EDIT, 42, 18, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Négatif:", -1, 128, 20, 31, 10
-    EDITTEXT IDC_NEGNUM_EDIT, 162, 18, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Positif:", -1, 11, 38, 28, 10
-    EDITTEXT IDC_NUM1_EDIT, 42, 36, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Négatif:", -1, 128, 38, 31, 10
-    EDITTEXT IDC_NEGNUM1_EDIT, 162, 36, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Séparateur décimal:", -1, 18, 61, 126, 9
-    COMBOBOX IDC_NUMDECIMALSEP_COMBO, 147, 59, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Nombre de chiffres décimaux:", -1, 18, 77, 126, 9
-    COMBOBOX IDC_NUMFRACSYBMS_COMBO, 147, 75, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Séparateur de champ:", -1, 18, 93, 126, 9
-    COMBOBOX IDC_NUMFIELDSEP_COMBO, 147, 91, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Nombre de chiffres dans le champ:", -1, 18, 109, 126, 9
-    COMBOBOX IDC_NUMDIGFIELD_COMBO, 147, 107, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Signe de nombre négatif:", -1, 18, 125, 126, 9
-    COMBOBOX IDC_NUMNEGSIGN_COMBO, 147, 123, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Format des nombres négatifs:", -1, 18, 141, 126, 9
-    COMBOBOX IDC_NUMNEGFMT_COMBO, 147, 139, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Zéros d'en-tête:", -1, 18, 157, 126, 9
-    COMBOBOX IDC_NUMLEADZERO_COMBO, 147, 155, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Séparateur d'éléments de liste :", -1, 18, 173, 126, 9
-    COMBOBOX IDC_NUMELEMLISTSEP_COMBO, 147, 171, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Unité de mesure:", -1, 18, 189, 126, 9
-    COMBOBOX IDC_NUMUNITSSYS_COMBO, 147, 187, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Region corresponding digits:", -1, 18, 205, 126, 9
-    COMBOBOX IDC_NUMREGDIG_COMBO, 147, 203, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Digit replacement:", -1, 18, 221, 126, 9
-    COMBOBOX IDC_NUMDIGREPL_COMBO, 147, 219, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-END
-
-IDD_CURRENCYOPTSSETUP DIALOGEX 0, 0, 252, 236
-STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Monnaie"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Exemples", IDC_GROUPBOX, 5, 7, 242, 40
-    LTEXT "Positif:", -1, 10, 25, 30, 10
-    EDITTEXT IDC_CURRENCY_EDIT, 42, 23, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Négatif:", -1, 128, 25, 31, 10
-    EDITTEXT IDC_NEGCURRENCY_EDIT, 162, 23, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Symbole monétaire:", -1, 20, 61, 126, 9
-    COMBOBOX IDC_CURRENCYUNIT_COMBO, 148, 59, 90, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
-    LTEXT "Monnaie au format négatif:", -1, 20, 78, 126, 9
-    COMBOBOX IDC_POSCURRENCYSUM_COMBO, 148, 76, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Monnaie au format positif:", -1, 20, 95, 126, 9
-    COMBOBOX IDC_NEGCURRENCYSUM_COMBO, 148, 93, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-    LTEXT "Séparateur décimal:", -1, 20, 121, 126, 9
-    COMBOBOX IDC_WHOLEFRACTSEP_COMBO, 148, 119, 90, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
-    LTEXT "Nombre de chiffres décimaux:", -1, 20, 137, 126, 9
-    COMBOBOX IDC_FRACSYMBSNUM_COMBO, 148, 136, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
-    LTEXT "Séparateur de champ:", -1, 20, 166, 126, 9
-    COMBOBOX IDC_FIELDSEP_COMBO, 148, 164, 90, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
-    LTEXT "Nombre de chiffres dans le champ:", -1, 20, 183, 126, 9
-    COMBOBOX IDC_DIGINFIELDNUM_COMBO, 148, 181, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
-END
-
-IDD_TIMEOPTSSETUP DIALOGEX 0, 0, 252, 236
-STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Heure"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Exemples", IDC_GROUPBOX, 5, 7, 242, 33
-    LTEXT "Exemple:", -1, 13, 21, 52, 10
-    EDITTEXT IDC_TIME_EDIT, 68, 19, 84, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    EDITTEXT IDC_UNKNOWN_EDIT, 156, 19, 84, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Format de l'heure:", -1, 10, 52, 147, 10
-    COMBOBOX IDC_TIMEFMT_COMBO, 161, 50, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    LTEXT "Séparateur horaire:", -1, 10, 69, 147, 10
-    COMBOBOX IDC_TIMESEP_COMBO, 161, 67, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    LTEXT "Heure avant midi (AM):", -1, 10, 86, 147, 10
-    COMBOBOX IDC_TIMEAM_COMBO, 161, 84, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    LTEXT "Heure après midi (PM):", -1, 10, 104, 147, 10
-    COMBOBOX IDC_TIMEPM_COMBO, 161, 102, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    GROUPBOX "", IDC_GROUPBOX, 7, 132, 238, 80
-    LTEXT "Description du format de l'heure\nh = heure    m = minute     s = seconde   t = matin ou après-midi\n\nh = heure au format 12 heures\nH = heure au format 24 heures\n\nhh, mm, ss = avec des zéros\nh, m, s = sans zéros", -1, 13, 141, 226, 65
-END
-
-IDD_DATEOPTSSETUP DIALOGEX 0, 0, 252, 236
-STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Date"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    GROUPBOX "Calendrier", IDC_GROUPBOX, 5, 7, 242, 74
-    LTEXT "Si l'année est saisie sur 2 chiffres, l'afficher en tant qu'année entre:", -1, 13, 18, 225, 8
-    EDITTEXT IDC_FIRSTYEAR_EDIT, 13, 30, 36, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "et", -1, 55, 32, 17, 8
-    EDITTEXT IDC_SECONDYEAR_EDIT, 77, 30, 36, 12, ES_LEFT | ES_NUMBER | WS_GROUP
-    CONTROL "",IDC_SCR_MAX_YEAR, "msctls_updown32", UDS_NOTHOUSANDS | UDS_WRAP | UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_CHILD | WS_VISIBLE, 113, 30, 10, 12
-    LTEXT "Calendrier:", -1, 13, 48, 56, 10
-    COMBOBOX IDC_CALTYPE_COMBO, 77, 46, 161, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | 
-             WS_VSCROLL | WS_TABSTOP | CBS_SORT | WS_DISABLED
-    LTEXT "Chronology by Hijra:", -1, 13, 59, 60, 16
-    COMBOBOX IDC_HIJCHRON_COMBO, 77, 64, 161, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | 
-             WS_VSCROLL | WS_TABSTOP | CBS_SORT | WS_DISABLED
-    GROUPBOX "Format court", IDC_GROUPBOX, 7, 83, 238, 81
-    LTEXT "Exemple:", -1, 13, 95, 63, 10
-    EDITTEXT IDC_SHRTDATESAMPLE_EDIT, 77, 93, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Exemple - lecture de droite à gauche:", -1, 13, 109, 60, 16
-    EDITTEXT IDC_SHRTDATERTOL_EDIT, 77, 111, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED
-    LTEXT "Format court:", -1, 13, 131, 60, 10
-    COMBOBOX IDC_SHRTDATEFMT_COMBO, 77, 129, 161, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    LTEXT "Séparateur de date:", -1, 13, 148, 113, 10
-    COMBOBOX IDC_SHRTDATESEP_COMBO, 187, 146, 51, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-    GROUPBOX "Format long:", IDC_GROUPBOX, 7, 167, 238, 64
-    LTEXT "Exemple:", -1, 13, 179, 61, 10
-    EDITTEXT IDC_LONGDATESAMPLE_EDIT, 77, 177, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
-    LTEXT "Exemple - lecture de gauche à droite:", -1, 13, 193, 61, 16
-    EDITTEXT IDC_LONGDATERTOL_EDIT, 77, 195, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED
-    LTEXT "Format long:", -1, 13, 215, 60, 10
-    COMBOBOX IDC_LONGDATEFMT_COMBO, 77, 213, 161, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
-END
-
-STRINGTABLE
-BEGIN
-    IDS_CPLNAME "Langage et options régionales"
-    IDS_CPLDESCRIPTION "Sélectionner le langage, les formats de nombres, les devises, l'heure et la date."
-END
diff --git a/reactos/dll/cpl/intl_new/currency.c b/reactos/dll/cpl/intl_new/currency.c
deleted file mode 100644 (file)
index 670b05c..0000000
+++ /dev/null
@@ -1,727 +0,0 @@
-/*\r
- * PROJECT:         ReactOS International Control Panel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            dll/cpl/intl/monetary.c\r
- * PURPOSE:         ReactOS International Control Panel\r
- * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)\r
-*/\r
-\r
-/* INCLUDES *****************************************************************/\r
-\r
-#include <windows.h>\r
-#include <commctrl.h>\r
-#include <cpl.h>\r
-\r
-#include "intl.h"\r
-#include "resource.h"\r
-\r
-/* GLOBALS ******************************************************************/\r
-\r
-#define SAMPLE_NUMBER               L"123456789"\r
-#define SAMPLE_NEG_NUMBER           L"-123456789"\r
-#define MAX_CURRENCY_UNIT_SAMPLES   2\r
-#define MAX_POS_CURRENCY_SAMPLES    4\r
-#define MAX_NEG_CURRENCY_SAMPLES    16\r
-#define MAX_CURRENCY_SEP_SAMPLES    2\r
-#define MAX_CURRENCY_FRAC_SAMPLES   10\r
-#define MAX_FIELD_SEP_SAMPLES       1\r
-#define MAX_FIELD_DIG_SAMPLES       3\r
-#define EOLN_SIZE                   sizeof(WCHAR)\r
-\r
-/* FUNCTIONS ****************************************************************/\r
-\r
-/* Init number of digidts in field control box */\r
-VOID\r
-InitCurrencyDigNumCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"0;0",\r
-        L"3;0",\r
-        L"3;2;0"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszFieldDigNum[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR* pwszFieldDigNumSmpl;\r
-\r
-    /* Get current field digits num */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SMONGROUPING,\r
-                   wszFieldDigNum,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_DIGINFIELDNUM_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of field digits num */\r
-    for(nCBIndex=0;nCBIndex<MAX_FIELD_DIG_SAMPLES;nCBIndex++)\r
-    {\r
-\r
-        pwszFieldDigNumSmpl=InsSpacesFmt(SAMPLE_NUMBER,wszFieldDigNumSamples[nCBIndex]);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_DIGINFIELDNUM_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)pwszFieldDigNumSmpl);\r
-        free(pwszFieldDigNumSmpl);\r
-    }\r
-\r
-    pwszFieldDigNumSmpl=InsSpacesFmt(SAMPLE_NUMBER,wszFieldDigNum);\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_DIGINFIELDNUM_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)pwszFieldDigNumSmpl);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_DIGINFIELDNUM_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_FIELD_DIG_SAMPLES+1,\r
-                     (LPARAM)pwszFieldDigNumSmpl);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_DIGINFIELDNUM_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)pwszFieldDigNumSmpl);\r
-    }\r
-\r
-    free(pwszFieldDigNumSmpl);\r
-}\r
-\r
-\r
-/* Init currency field separator control box */\r
-VOID\r
-InitCurrencyFieldSepCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszFieldSepSamples[MAX_FIELD_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L" "\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszFieldSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current field separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SMONTHOUSANDSEP,\r
-                   wszFieldSep,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_FIELDSEP_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of field separators */\r
-    for(nCBIndex=0;nCBIndex<MAX_FIELD_SEP_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_FIELDSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszFieldSepSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_FIELDSEP_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszFieldSep);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_FIELDSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_FIELD_SEP_SAMPLES+1,\r
-                     (LPARAM)wszFieldSep);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_FIELDSEP_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszFieldSep);\r
-    }\r
-}\r
-\r
-/* Init number of fractional symbols control box */\r
-VOID\r
-InitCurrencyFracNumCB(HWND hwndDlg)\r
-{\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszCurrencyFracNum[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszFracCount[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current number of fractional symbols */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_ICURRDIGITS,\r
-                   wszCurrencyFracNum,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_FRACSYMBSNUM_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of fractional symbols */\r
-    for(nCBIndex=0;nCBIndex<MAX_CURRENCY_FRAC_SAMPLES;nCBIndex++)\r
-    {\r
-        /* convert to wide char */\r
-        _itow(nCBIndex,wszFracCount,DECIMAL_RADIX);\r
-\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_FRACSYMBSNUM_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszFracCount);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_FRACSYMBSNUM_COMBO),\r
-                           CB_SETCURSEL,\r
-                           (WPARAM)_wtoi(wszCurrencyFracNum),\r
-                           (LPARAM)0);\r
-}\r
-\r
-\r
-/* Init positive currency sum format control box */\r
-VOID\r
-InitPosCurrencySumCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszPosCurrencySumSamples[MAX_POS_CURRENCY_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"$1,1",\r
-        L"1,1$",\r
-        L"$ 1,1",\r
-        L"1,1 $"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    WCHAR wszCurrPosFmt[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszCurrencyUnit[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszNewSample[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszCurrencySep[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR* pwszResultStr;\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-\r
-    /* Get current currency sum format */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_ICURRENCY,\r
-                   wszCurrPosFmt,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_POSCURRENCYSUM_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Get current currency separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SMONDECIMALSEP,\r
-                   wszCurrencySep,\r
-                   dwValueSize);\r
-\r
-    /* Get current currency unit */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SCURRENCY,\r
-                   wszCurrencyUnit,\r
-                   dwValueSize);\r
-\r
-    /* Create standart list of currency sum formats */\r
-    for(nCBIndex=0;nCBIndex<MAX_POS_CURRENCY_SAMPLES;nCBIndex++)\r
-    {\r
-        pwszResultStr = ReplaceSubStr(wszPosCurrencySumSamples[nCBIndex],\r
-                                      wszCurrencyUnit,\r
-                                      L"$");\r
-        wcscpy(wszNewSample,pwszResultStr);\r
-        free(pwszResultStr);\r
-        pwszResultStr = ReplaceSubStr(wszNewSample,\r
-                                      wszCurrencySep,\r
-                                      L",");\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_POSCURRENCYSUM_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)pwszResultStr);\r
-        free(pwszResultStr);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_POSCURRENCYSUM_COMBO),\r
-                           CB_SETCURSEL,\r
-                           (WPARAM)_wtoi(wszCurrPosFmt),\r
-                           (LPARAM)0);\r
-}\r
-\r
-/* Init negative currency sum format control box */\r
-VOID\r
-InitNegCurrencySumCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszNegCurrencySumSamples[MAX_NEG_CURRENCY_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"(?1,1)",\r
-        L"-?1,1",\r
-        L"?-1,1",\r
-        L"?1,1-",\r
-        L"(1,1?)",\r
-        L"-1,1?",\r
-        L"1,1-?",\r
-        L"1,1?-",\r
-        L"-1,1 ?",\r
-        L"-? 1,1",\r
-        L"1,1 ?-",\r
-        L"? 1,1-",\r
-        L"? -1,1",\r
-        L"1,1- ?",\r
-        L"(? 1,1)",\r
-        L"(1,1 ?)" /* 16 */\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    WCHAR wszCurrNegFmt[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszCurrencyUnit[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszCurrencySep[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszNewSample[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR* pwszResultStr;\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-\r
-    /* Get current currency sum format */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_INEGCURR,\r
-                   wszCurrNegFmt,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NEGCURRENCYSUM_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Get current currency unit */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SCURRENCY,\r
-                   wszCurrencyUnit,\r
-                   dwValueSize);\r
-\r
-    /* Get current currency separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SMONDECIMALSEP,\r
-                   wszCurrencySep,\r
-                   dwValueSize);\r
-\r
-    /* Create standart list of currency sum formats */\r
-    for(nCBIndex=0;nCBIndex<MAX_NEG_CURRENCY_SAMPLES;nCBIndex++)\r
-    {\r
-        pwszResultStr = ReplaceSubStr(wszNegCurrencySumSamples[nCBIndex],\r
-                                      wszCurrencyUnit,\r
-                                      L"?");\r
-        wcscpy(wszNewSample,pwszResultStr);\r
-        free(pwszResultStr);\r
-        pwszResultStr = ReplaceSubStr(wszNewSample,\r
-                                      wszCurrencySep,\r
-                                      L",");\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NEGCURRENCYSUM_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)pwszResultStr);\r
-        free(pwszResultStr);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NEGCURRENCYSUM_COMBO),\r
-                           CB_SETCURSEL,\r
-                           (WPARAM)_wtoi(wszCurrNegFmt),\r
-                           (LPARAM)0);\r
-}\r
-\r
-/* Init currency separator control box */\r
-VOID\r
-InitCurrencySepCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszCurrencySepSamples[MAX_CURRENCY_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L",",\r
-        L"."\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszCurrencySep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current currency separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SMONDECIMALSEP,\r
-                   wszCurrencySep,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of currency separators */\r
-    for(nCBIndex=0;nCBIndex<MAX_CURRENCY_SEP_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszCurrencySepSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszCurrencySep);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_CURRENCY_SEP_SAMPLES+1,\r
-                     (LPARAM)wszCurrencySep);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszCurrencySep);\r
-    }\r
-}\r
-\r
-/* Init currency unit control box */\r
-VOID\r
-InitCurrencyUnitCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszCurrencyUnitSamples[MAX_CURRENCY_UNIT_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"$"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszCurrencyUnit[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current currency unit */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SCURRENCY,\r
-                   wszCurrencyUnit,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of currency units */\r
-    for(nCBIndex=0;nCBIndex<MAX_CURRENCY_UNIT_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszCurrencyUnitSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszCurrencyUnit);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_CURRENCY_UNIT_SAMPLES+1,\r
-                     (LPARAM)wszCurrencyUnit);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszCurrencyUnit);\r
-    }\r
-}\r
-\r
-/* Set number of digidts in field  */\r
-BOOL\r
-SetCurrencyDigNum(HWND hwndDlg)\r
-{\r
-    WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"0;0",\r
-        L"3;0",\r
-        L"3;2;0"\r
-    };\r
-\r
-    int nCurrSel;\r
-\r
-    /* Get setted number of digidts in field */\r
-    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_DIGINFIELDNUM_COMBO),\r
-                          CB_GETCURSEL,\r
-                          (WPARAM)0,\r
-                          (LPARAM)0);\r
-\r
-    /* Save number of digidts in field */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONGROUPING, wszFieldDigNumSamples[nCurrSel]);\r
-\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set currency field separator */\r
-BOOL\r
-SetCurrencyFieldSep(HWND hwndDlg)\r
-{\r
-    WCHAR wszCurrencyFieldSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get setted currency field separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_FIELDSEP_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszCurrencyFieldSep);\r
-\r
-    /* Save currency field separator */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHOUSANDSEP, wszCurrencyFieldSep);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set number of fractional symbols */\r
-BOOL\r
-SetCurrencyFracSymNum(HWND hwndDlg)\r
-{\r
-    WCHAR wszCurrencyFracSymNum[MAX_SAMPLES_STR_SIZE];\r
-    INT nCurrSel;\r
-\r
-    /* Get setted number of fractional symbols */\r
-    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_FRACSYMBSNUM_COMBO),\r
-                          CB_GETCURSEL,\r
-                          (WPARAM)0,\r
-                          (LPARAM)0);\r
-\r
-    /* convert to wide char */\r
-    _itow(nCurrSel,wszCurrencyFracSymNum,DECIMAL_RADIX);\r
-\r
-    /* Save number of fractional symbols */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ICURRDIGITS, wszCurrencyFracSymNum);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set currency separator */\r
-BOOL\r
-SetCurrencySep(HWND hwndDlg)\r
-{\r
-    WCHAR wszCurrencySep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get setted currency decimal separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszCurrencySep);\r
-\r
-    /* TODO: Add check for correctly input */\r
-\r
-    /* Save currency separator */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONDECIMALSEP, wszCurrencySep);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set negative currency sum format */\r
-BOOL\r
-SetNegCurrencySumFmt(HWND hwndDlg)\r
-{\r
-    WCHAR wszNegCurrencySumFmt[MAX_SAMPLES_STR_SIZE];\r
-    INT nCurrSel;\r
-\r
-    /* Get setted currency unit */\r
-    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NEGCURRENCYSUM_COMBO),\r
-                          CB_GETCURSEL,\r
-                          (WPARAM)0,\r
-                          (LPARAM)0);\r
-\r
-    /* convert to wide char */\r
-    _itow(nCurrSel,wszNegCurrencySumFmt,DECIMAL_RADIX);\r
-\r
-    /* Save currency sum format */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_INEGCURR, wszNegCurrencySumFmt);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set positive currency sum format */\r
-BOOL\r
-SetPosCurrencySumFmt(HWND hwndDlg)\r
-{\r
-    WCHAR wszPosCurrencySumFmt[MAX_SAMPLES_STR_SIZE];\r
-    INT nCurrSel;\r
-\r
-    /* Get setted currency unit */\r
-    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_POSCURRENCYSUM_COMBO),\r
-                          CB_GETCURSEL,\r
-                          (WPARAM)0,\r
-                          (LPARAM)0);\r
-\r
-    /* convert to wide char */\r
-    _itow(nCurrSel,wszPosCurrencySumFmt,DECIMAL_RADIX);\r
-\r
-    /* Save currency sum format */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ICURRENCY, wszPosCurrencySumFmt);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set currency unit */\r
-BOOL\r
-SetCurrencyUnit(HWND hwndDlg)\r
-{\r
-    WCHAR wszCurrencyUnit[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get setted currency unit */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszCurrencyUnit);\r
-\r
-    /* Save currency unit */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SCURRENCY, wszCurrencyUnit);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Update all currency locale samples */\r
-static\r
-VOID\r
-UpdateCurrencyLocaleSamples(HWND hwndDlg,\r
-                        LCID lcidLocale)\r
-{\r
-    WCHAR OutBuffer[MAX_FMT_SIZE];\r
-\r
-    /* Get currency format sample */\r
-    GetCurrencyFormatW(lcidLocale,\r
-                       LOCALE_USE_CP_ACP,\r
-                       SAMPLE_NUMBER,\r
-                       NULL,\r
-                       OutBuffer,\r
-                       MAX_FMT_SIZE);\r
-\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCY_EDIT),\r
-                 WM_SETTEXT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)OutBuffer);\r
-\r
-    /* Get negative currency format sample */\r
-    GetCurrencyFormatW(lcidLocale,\r
-                       LOCALE_USE_CP_ACP,\r
-                       SAMPLE_NEG_NUMBER,\r
-                       NULL,\r
-                       OutBuffer,\r
-                       MAX_FMT_SIZE);\r
-\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NEGCURRENCY_EDIT),\r
-                 WM_SETTEXT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)OutBuffer);\r
-}\r
-\r
-/* Currency options setup page dialog callback */\r
-INT_PTR\r
-CALLBACK\r
-CurrencyOptsSetProc(HWND hwndDlg,\r
-                UINT uMsg,\r
-                WPARAM wParam,\r
-                LPARAM lParam)\r
-{\r
-    UNREFERENCED_PARAMETER(lParam);\r
-    UNREFERENCED_PARAMETER(wParam);\r
-    UNREFERENCED_PARAMETER(hwndDlg);\r
-    switch(uMsg)\r
-    {\r
-        case WM_INITDIALOG:\r
-        {\r
-            InitCurrencyUnitCB(hwndDlg);\r
-            InitCurrencySepCB(hwndDlg);\r
-            InitCurrencyFieldSepCB(hwndDlg);\r
-            InitCurrencyFracNumCB(hwndDlg);\r
-            InitPosCurrencySumCB(hwndDlg);\r
-            InitNegCurrencySumCB(hwndDlg);\r
-            InitCurrencyDigNumCB(hwndDlg);\r
-\r
-            UpdateCurrencyLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
-        }\r
-        break;\r
-\r
-        case WM_COMMAND:\r
-        {\r
-            switch (LOWORD(wParam))\r
-            {\r
-                case IDC_CURRENCYUNIT_COMBO:\r
-                case IDC_POSCURRENCYSUM_COMBO:\r
-                case IDC_NEGCURRENCYSUM_COMBO:\r
-                case IDC_WHOLEFRACTSEP_COMBO:\r
-                case IDC_FRACSYMBSNUM_COMBO:\r
-                case IDC_FIELDSEP_COMBO:\r
-                case IDC_DIGINFIELDNUM_COMBO:\r
-                {\r
-                    if (HIWORD(wParam) == CBN_SELCHANGE ||\r
-                        HIWORD(wParam) == CBN_EDITCHANGE)\r
-                    {\r
-                        /* Set "Apply" button enabled */\r
-                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
-                    }\r
-                }\r
-                break;\r
-            }\r
-        }\r
-        break;\r
-\r
-        case WM_NOTIFY:\r
-        {\r
-            LPNMHDR lpnm = (LPNMHDR)lParam;\r
-            /* If push apply button */\r
-            if (lpnm->code == (UINT)PSN_APPLY)\r
-            {\r
-                if(!SetCurrencyUnit(hwndDlg)) break;\r
-                if(!SetPosCurrencySumFmt(hwndDlg)) break;\r
-                if(!SetNegCurrencySumFmt(hwndDlg)) break;\r
-                if(!SetCurrencySep(hwndDlg)) break;\r
-                if(!SetCurrencyFracSymNum(hwndDlg)) break;\r
-                if(!SetCurrencyFieldSep(hwndDlg)) break;\r
-                if(!SetCurrencyDigNum(hwndDlg)) break;\r
-\r
-                /* Update sum format samples */\r
-                InitPosCurrencySumCB(hwndDlg);\r
-                InitNegCurrencySumCB(hwndDlg);\r
-\r
-                /* FIXME: */\r
-                Sleep(15);\r
-                UpdateCurrencyLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
-            }\r
-        }\r
-        break;\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-/* EOF */\r
diff --git a/reactos/dll/cpl/intl_new/date.c b/reactos/dll/cpl/intl_new/date.c
deleted file mode 100644 (file)
index 66ad93a..0000000
+++ /dev/null
@@ -1,609 +0,0 @@
-/*\r
- * PROJECT:         ReactOS International Control Panel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            dll/cpl/intl/date.c\r
- * PURPOSE:         ReactOS International Control Panel\r
- * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)\r
-*/\r
-\r
-/* INCLUDES *****************************************************************/\r
-\r
-#define WINVER 0x0500\r
-\r
-#include <windows.h>\r
-#include <commctrl.h>\r
-#include <cpl.h>\r
-\r
-#include "intl.h"\r
-#include "resource.h"\r
-\r
-/* GLOBALS ******************************************************************/\r
-\r
-const INT YEAR_STR_MAX_SIZE=4;\r
-const INT EOLN_SIZE=sizeof(WCHAR); /* size of EOLN char */\r
-#define MAX_SHORT_FMT_SAMPLES    5\r
-#define MAX_LONG_FMT_SAMPLES     2\r
-#define MAX_SHRT_DATE_SEPARATORS 3\r
-#define STD_DATE_SEP             L"."\r
-#define YEAR_DIFF                (99)\r
-#define MAX_YEAR                 (9999)\r
-\r
-/* FUNCTIONS ****************************************************************/\r
-\r
-/* if char is 'y' or 'M' or 'd' return TRUE, else FALSE */\r
-BOOL\r
-isDateCompAl(WCHAR walpha)\r
-{\r
-    \r
-    if((walpha == L'y') || (walpha == L'M') || (walpha == L'd') || (walpha == L' ')) return TRUE;\r
-    else return FALSE;\r
-}\r
-\r
-/* Find first date separator in string */\r
-WCHAR*\r
-FindDateSep(const WCHAR *wszSourceStr)\r
-{\r
-    int nDateCompCount=0;\r
-    int nDateSepCount=0;\r
-\r
-       WCHAR* wszFindedSep;\r
-       wszFindedSep=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE*sizeof(WCHAR));\r
-\r
-    wcscpy(wszFindedSep,STD_DATE_SEP);\r
-\r
-    while(nDateCompCount<wcslen(wszSourceStr))\r
-    {\r
-        if(!isDateCompAl(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))\r
-        {\r
-            while(!isDateCompAl(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))\r
-            {\r
-                wszFindedSep[nDateSepCount++]=wszSourceStr[nDateCompCount];\r
-                nDateCompCount++;\r
-            }\r
-            wszFindedSep[nDateSepCount]='\0';\r
-            return wszFindedSep;\r
-        }\r
-        nDateCompCount++;\r
-    }\r
-\r
-    return wszFindedSep;\r
-}\r
-\r
-/* Replace given template in source string with string to replace and return recieved string */\r
-\r
-\r
-/* Setted up short date separator to registry */\r
-BOOL\r
-SetShortDateSep(HWND hwndDlg)\r
-{\r
-    WCHAR wszShortDateSep[MAX_SAMPLES_STR_SIZE];\r
-    int nSepStrSize;\r
-    int nSepCount;\r
-\r
-    /* Get setted separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszShortDateSep);\r
-\r
-    /* Get setted separator string size */\r
-    nSepStrSize = wcslen(wszShortDateSep);\r
-\r
-    /* Check date components */\r
-    for(nSepCount=0;nSepCount<nSepStrSize;nSepCount++)\r
-    {\r
-        if(iswalnum(wszShortDateSep[nSepCount]) || (wszShortDateSep[nSepCount]=='\''))\r
-        {\r
-            MessageBoxW(NULL,\r
-                        L"Entered short date separator contain incorrect symbol",\r
-                        L"Error", MB_OK | MB_ICONERROR);\r
-            return FALSE;\r
-        }\r
-        \r
-    }\r
-\r
-    /* Save date separator */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDATE, wszShortDateSep);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Setted up short date format to registry */\r
-BOOL\r
-SetShortDateFormat(HWND hwndDlg)\r
-{\r
-    WCHAR wszShortDateFmt[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszShortDateSep[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszFindedDateSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    WCHAR* pwszResultStr;\r
-    BOOL OpenApostFlg = FALSE;\r
-    int nFmtStrSize;\r
-    int nDateCompCount;\r
-\r
-    /* Get setted format */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszShortDateFmt);\r
-\r
-    /* Get setted separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszShortDateSep);\r
-\r
-    /* Get setted format-string size */\r
-    nFmtStrSize = wcslen(wszShortDateFmt);\r
-\r
-    /* Check date components */\r
-    for(nDateCompCount=0;nDateCompCount<nFmtStrSize;nDateCompCount++)\r
-    {\r
-        if(wszShortDateFmt[nDateCompCount]==L'\'')\r
-        {\r
-            OpenApostFlg=!OpenApostFlg;\r
-        }\r
-        if(iswalnum(wszShortDateFmt[nDateCompCount]) &&\r
-           !isDateCompAl(wszShortDateFmt[nDateCompCount]) &&\r
-           !OpenApostFlg)\r
-        {\r
-            MessageBoxW(NULL,\r
-                        L"Entered short date format contain incorrect symbol",\r
-                        L"Error", MB_OK | MB_ICONERROR);\r
-            return FALSE;\r
-        }\r
-        \r
-    }\r
-\r
-    if(OpenApostFlg)\r
-    {\r
-        MessageBoxW(NULL,\r
-                    L"Entered short date format contain incorrect symbol",\r
-                    L"Error", MB_OK | MB_ICONERROR);\r
-        return FALSE;\r
-    }\r
-\r
-    /* substring replacement of separator */\r
-    wcscpy(wszFindedDateSep,FindDateSep(wszShortDateFmt));\r
-    pwszResultStr = ReplaceSubStr(wszShortDateFmt,wszShortDateSep,wszFindedDateSep);\r
-    wcscpy(wszShortDateFmt,pwszResultStr);\r
-    free(pwszResultStr);\r
-\r
-    /* Save short date format */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, wszShortDateFmt);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Setted up long date format to registry */\r
-BOOL\r
-SetLongDateFormat(HWND hwndDlg)\r
-{\r
-    WCHAR wszLongDateFmt[MAX_SAMPLES_STR_SIZE];\r
-    BOOL OpenApostFlg = FALSE;\r
-    int nFmtStrSize;\r
-    int nDateCompCount;\r
-\r
-    /* Get setted format */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszLongDateFmt);\r
-\r
-    /* Get setted format string size */\r
-    nFmtStrSize = wcslen(wszLongDateFmt);\r
-\r
-    /* Check date components */\r
-    for(nDateCompCount=0;nDateCompCount<nFmtStrSize;nDateCompCount++)\r
-    {\r
-        if(wszLongDateFmt[nDateCompCount]==L'\'')\r
-        {\r
-            OpenApostFlg=!OpenApostFlg;\r
-        }\r
-        if(iswalnum(wszLongDateFmt[nDateCompCount]) &&\r
-           !isDateCompAl(wszLongDateFmt[nDateCompCount]) &&\r
-           !OpenApostFlg)\r
-        {\r
-            MessageBoxW(NULL,\r
-                        L"Entered long date format contain incorrect symbol",\r
-                        L"Error", MB_OK | MB_ICONERROR);\r
-            return FALSE;\r
-        }\r
-        \r
-    }\r
-\r
-    if(OpenApostFlg)\r
-    {\r
-        MessageBoxW(NULL,\r
-                    L"Entered long date format contain incorrect symbol",\r
-                    L"Error", MB_OK | MB_ICONERROR);\r
-        return FALSE;\r
-    }\r
-\r
-    /* Save short date format */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, wszLongDateFmt);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Init short date separator control box */\r
-VOID\r
-InitShortDateSepSamples(HWND hwndDlg)\r
-{\r
-    WCHAR ShortDateSepSamples[MAX_SHRT_DATE_SEPARATORS][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L".",\r
-        L"/",\r
-        L"-"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszShortDateSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current short date separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SDATE,\r
-                   wszShortDateSep,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of separators */\r
-    for(nCBIndex=0;nCBIndex<MAX_SHRT_DATE_SEPARATORS;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)ShortDateSepSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszShortDateSep);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_SHRT_DATE_SEPARATORS+1,\r
-                     (LPARAM)wszShortDateSep);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszShortDateSep);\r
-    }\r
-}\r
-\r
-/* Init short date control box */\r
-VOID\r
-InitShortDateCB(HWND hwndDlg)\r
-{\r
-    WCHAR ShortDateFmtSamples[MAX_SHORT_FMT_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"dd.MM.yyyy",\r
-        L"dd.MM.yy",\r
-        L"d.M.yy",\r
-        L"dd/MM/yy",\r
-        L"yyyy-MM-dd"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszShortDateFmt[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current short date format */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SSHORTDATE,\r
-                   wszShortDateFmt,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of date formats */\r
-    for(nCBIndex=0;nCBIndex<MAX_SHORT_FMT_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)ShortDateFmtSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszShortDateFmt);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_SHORT_FMT_SAMPLES+1,\r
-                     (LPARAM)wszShortDateFmt);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszShortDateFmt);\r
-    }\r
-}\r
-\r
-/* Init long date control box */\r
-VOID\r
-InitLongDateCB(HWND hwndDlg)\r
-{\r
-    /* Where this data stored? */\r
-    WCHAR LongDateFmtSamples[MAX_LONG_FMT_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"d MMMM yyyy 'y.'",\r
-        L"dd MMMM yyyy 'y.'"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszLongDateFmt[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current long date format */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SLONGDATE,\r
-                   wszLongDateFmt,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of date formats */\r
-    for(nCBIndex=0;nCBIndex<MAX_LONG_FMT_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)LongDateFmtSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszLongDateFmt);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_LONG_FMT_SAMPLES+1,\r
-                     (LPARAM)wszLongDateFmt);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszLongDateFmt);\r
-    }\r
-}\r
-\r
-/* Set up max date value to registry */\r
-VOID\r
-SetMaxDate(HWND hwndDlg)\r
-{\r
-    const HWND hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);\r
-    WCHAR wszMaxDateVal[YEAR_STR_MAX_SIZE];\r
-    INT nSpinVal;\r
-\r
-    /* Get spin value */\r
-    nSpinVal=LOWORD(SendMessage(hWndYearSpin,\r
-                    UDM_GETPOS,\r
-                    0,\r
-                    0));\r
-\r
-    /* convert to wide char */\r
-    _itow(nSpinVal,wszMaxDateVal,DECIMAL_RADIX);\r
-\r
-    /* Save max date value */\r
-    SetCalendarInfoW(LOCALE_USER_DEFAULT,\r
-                     CAL_GREGORIAN,\r
-                     48 , /* CAL_ITWODIGITYEARMAX */\r
-                     (LPCWSTR)&wszMaxDateVal);\r
-}\r
-\r
-/* Get max date value from registry set */\r
-INT\r
-GetMaxDate()\r
-{\r
-    int nMaxDateVal;\r
-\r
-    GetCalendarInfoW(LOCALE_USER_DEFAULT,\r
-                     CAL_GREGORIAN,\r
-                     CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER,\r
-                     NULL,\r
-                     0, /* ret type - number */\r
-                     (LPDWORD)&nMaxDateVal);\r
-\r
-    return nMaxDateVal;\r
-}\r
-\r
-/* Set's MIN data edit control value to MAX-99 */\r
-static\r
-VOID\r
-SetMinData(HWND hwndDlg)\r
-{\r
-    WCHAR OutBuffer[YEAR_STR_MAX_SIZE];\r
-    const HWND hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);\r
-\r
-    /* Get spin value */\r
-    INT nSpinVal=LOWORD(SendMessage(hWndYearSpin,\r
-                        UDM_GETPOS,\r
-                        0,\r
-                        0));\r
-\r
-    /* Set min year value */\r
-    wsprintf(OutBuffer, L"%d", (DWORD)nSpinVal-YEAR_DIFF);\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_FIRSTYEAR_EDIT),\r
-                 WM_SETTEXT,\r
-                 0,\r
-                 (LPARAM)OutBuffer);\r
-}\r
-\r
-/* Init spin control */\r
-static\r
-VOID\r
-InitMinMaxDateSpin(HWND hwndDlg)\r
-{\r
-    WCHAR OutBuffer[YEAR_STR_MAX_SIZE];\r
-    const HWND hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);\r
-\r
-    /* Init max date value */\r
-    wsprintf(OutBuffer, L"%04d", (DWORD)GetMaxDate());\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_SECONDYEAR_EDIT),\r
-                 WM_SETTEXT,\r
-                 0,\r
-                 (LPARAM)OutBuffer);\r
-\r
-    /* Init min date value */\r
-    wsprintf(OutBuffer, L"%04d", (DWORD)GetMaxDate()-YEAR_DIFF);\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_FIRSTYEAR_EDIT),\r
-                 WM_SETTEXT,\r
-                 0,\r
-                 (LPARAM)OutBuffer);\r
-\r
-    /* Init updown control */\r
-    /* Set bounds */\r
-    SendMessageW(hWndYearSpin,\r
-                 UDM_SETRANGE,\r
-                 0,\r
-                 MAKELONG(MAX_YEAR,YEAR_DIFF));\r
-\r
-    /* Set current value */\r
-    SendMessageW(hWndYearSpin,\r
-                 UDM_SETPOS,\r
-                 0,\r
-                 MAKELONG(GetMaxDate(),0));\r
-\r
-}\r
-\r
-/* Update all date locale samples */\r
-static\r
-VOID\r
-UpdateDateLocaleSamples(HWND hwndDlg,\r
-                        LCID lcidLocale)\r
-{\r
-    WCHAR OutBuffer[MAX_FMT_SIZE];\r
-\r
-    /* Get short date format sample */\r
-    GetDateFormatW(lcidLocale, DATE_SHORTDATE, NULL, NULL, OutBuffer,\r
-        MAX_FMT_SIZE);\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESAMPLE_EDIT), WM_SETTEXT,\r
-        0, (LPARAM)OutBuffer);\r
-\r
-    /* Get long date sample */\r
-    GetDateFormatW(lcidLocale, DATE_LONGDATE, NULL, NULL, OutBuffer,\r
-        MAX_FMT_SIZE);\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATESAMPLE_EDIT),\r
-        WM_SETTEXT, 0, (LPARAM)OutBuffer);\r
-}\r
-\r
-/* Date options setup page dialog callback */\r
-INT_PTR\r
-CALLBACK\r
-DateOptsSetProc(HWND hwndDlg,\r
-                UINT uMsg,\r
-                WPARAM wParam,\r
-                LPARAM lParam)\r
-{\r
-    //int i,j;\r
-    UNREFERENCED_PARAMETER(lParam);\r
-    UNREFERENCED_PARAMETER(wParam);\r
-    UNREFERENCED_PARAMETER(hwndDlg);\r
-\r
-    switch(uMsg)\r
-    {\r
-        case WM_INITDIALOG:\r
-        {\r
-            InitMinMaxDateSpin(hwndDlg);\r
-            UpdateDateLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
-            InitShortDateCB(hwndDlg);\r
-            InitLongDateCB(hwndDlg);\r
-            InitShortDateSepSamples(hwndDlg);\r
-            /* TODO: Add other calendar types */\r
-        }\r
-        break;\r
-\r
-        case WM_COMMAND:\r
-        {\r
-            switch (LOWORD(wParam))\r
-            {\r
-                case IDC_SECONDYEAR_EDIT:\r
-                {\r
-                    if(HIWORD(wParam)==EN_CHANGE)\r
-                    {\r
-                        SetMinData(hwndDlg);\r
-                    }\r
-                }\r
-\r
-                case IDC_SCR_MAX_YEAR:\r
-                {\r
-                    /* Set "Apply" button enabled */\r
-                    PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
-                }\r
-                break;\r
-                case IDC_CALTYPE_COMBO:\r
-                case IDC_HIJCHRON_COMBO:\r
-                case IDC_SHRTDATEFMT_COMBO:\r
-                case IDC_SHRTDATESEP_COMBO:\r
-                case IDC_LONGDATEFMT_COMBO:\r
-                {\r
-                    if (HIWORD(wParam) == CBN_SELCHANGE ||\r
-                        HIWORD(wParam) == CBN_EDITCHANGE)\r
-                    {\r
-                        /* Set "Apply" button enabled */\r
-                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
-                    }\r
-                }\r
-                break;\r
-            }\r
-        }\r
-        break;\r
-\r
-        case WM_NOTIFY:\r
-        {\r
-            LPNMHDR lpnm = (LPNMHDR)lParam;\r
-            /* If push apply button */\r
-            if (lpnm->code == (UINT)PSN_APPLY)\r
-            {\r
-                SetMaxDate(hwndDlg);\r
-                if(!SetShortDateSep(hwndDlg)) break;\r
-                if(!SetShortDateFormat(hwndDlg)) break;\r
-                if(!SetLongDateFormat(hwndDlg)) break;\r
-                InitShortDateCB(hwndDlg);\r
-                /* FIXME: */\r
-                Sleep(15);\r
-                UpdateDateLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
-            }\r
-        }\r
-        break;\r
-\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-/* EOF */\r
index 8ba2042..73a6031 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * PROJECT:         ReactOS International Control Panel
  * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            dll/cpl/intl/extra.c
+ * FILE:            lib/cpl/intl/extra.c
  * PURPOSE:         Extra parameters page
  * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)
 */
@@ -73,10 +73,7 @@ CreateLanguagesList(HWND hWnd)
 /* Extra Parameters page dialog callback */
 INT_PTR
 CALLBACK
-ExtraOptsProc(HWND hwndDlg,
-              UINT uMsg,
-              WPARAM wParam,
-              LPARAM lParam)
+ExtraOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     UNREFERENCED_PARAMETER(wParam);
     switch(uMsg)
index 483d15a..2f30236 100644 (file)
@@ -19,7 +19,7 @@
 /* GLOBALS ******************************************************************/
 
 #define NUM_APPLETS     (1)
-#define NUM_SHEETS       3
+#define NUM_SHEETS      2
 
 LONG APIENTRY Applet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam);
 
@@ -74,7 +74,6 @@ Applet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam)
 
     InitPropSheetPage(&PsPage[0], IDD_REGOPTSPAGE, RegOptsProc);
     InitPropSheetPage(&PsPage[1], IDD_EXTRAOPTSPAGE, ExtraOptsProc);
-    InitPropSheetPage(&PsPage[2], IDD_LANGSOPTSPAGE, LangsOptsProc);
 
     return (LONG)(PropertySheet(&psh) != -1);
 }
index efb32a6..be9f486 100644 (file)
@@ -3,10 +3,8 @@
 
 /* GLOBALS ******************************************************************/
 
-#define MAX_STR_SIZE          128
-#define MAX_FMT_SIZE          30
-#define MAX_SAMPLES_STR_SIZE  70
-#define DECIMAL_RADIX         10
+#define MAX_STR_SIZE    128
+#define MAX_FMT_SIZE    30
 
 typedef struct
 {
@@ -28,46 +26,6 @@ INT_PTR
 CALLBACK
 ExtraOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
-/* langs.c */
-INT_PTR
-CALLBACK
-LangsOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-/* date.c */
-INT_PTR
-CALLBACK
-DateOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-/* nums.c */
-INT_PTR
-CALLBACK
-NumsOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-/* monetary.c */
-INT_PTR
-CALLBACK
-CurrencyOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-/* time.c */
-INT_PTR
-CALLBACK
-TimeOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-/* setupreg.c */
-INT_PTR
-CALLBACK
-RegOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-WCHAR*
-ReplaceSubStr(const WCHAR *wszSourceStr, const WCHAR *wszStrToReplace, const WCHAR *wszTempl);
-
-WCHAR*
-InsSpacesFmt(const WCHAR *wszSourceStr, const WCHAR *wszFmtStr);
-
-LONG
-APIENTRY
-SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam);
-
 #endif /* __INTL_H */
 
 /* EOF */
index ee46eac..d3ee94d 100644 (file)
@@ -1,6 +1,6 @@
 <module name="intl_new" type="win32dll" extension=".cpl" baseaddress="${BASEADDRESS_INTL}" installbase="system32" installname="intl_new.cpl" usewrc="false">
        <importlibrary definition="intl.def" />
-       <include base="intl_new">.</include>
+       <include base="intl">.</include>
        <define name="UNICODE" />
        <define name="_UNICODE" />
        <define name="__REACTOS__" />
        <library>user32</library>
        <library>comctl32</library>
        <library>advapi32</library>
-       <library>shell32</library>
        <library>msvcrt</library>
        <file>intl.c</file>
        <file>locale.c</file>
        <file>extra.c</file>
-       <file>setupreg.c</file>
-       <file>langs.c</file>
-       <file>date.c</file>
-       <file>time.c</file>
-       <file>nums.c</file>
-       <file>currency.c</file>
        <file>intl.rc</file>
 </module>
index 5b48719..83d450c 100644 (file)
@@ -18,4 +18,3 @@ IDC_FLAGS ICON "resources/flags.ico"
 */
 
 #include "En.rc"
-#include "Fr.rc"
diff --git a/reactos/dll/cpl/intl_new/langs.c b/reactos/dll/cpl/intl_new/langs.c
deleted file mode 100644 (file)
index 3c11fd1..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*\r
- * PROJECT:         ReactOS International Control Panel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            dll/cpl/intl/langs.c\r
- * PURPOSE:         Extra parameters page\r
- * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)\r
-*/\r
-\r
-/* INCLUDES *****************************************************************/\r
-\r
-#include <windows.h>\r
-#include <commctrl.h>\r
-#include <shellapi.h>\r
-#include <cpl.h>\r
-\r
-#include "intl.h"\r
-#include "resource.h"\r
-\r
-/* FUNCTIONS ****************************************************************/\r
-\r
-/* Languages Parameters page dialog callback */\r
-INT_PTR\r
-CALLBACK\r
-LangsOptsProc(HWND hwndDlg,\r
-              UINT uMsg,\r
-              WPARAM wParam,\r
-              LPARAM lParam)\r
-{\r
-    SHELLEXECUTEINFOW shInputDll;\r
-\r
-    UNREFERENCED_PARAMETER(wParam);\r
-    switch(uMsg)\r
-    {\r
-        case WM_INITDIALOG:\r
-\r
-        break;\r
-\r
-        case WM_COMMAND:\r
-            switch (LOWORD(wParam))\r
-            {\r
-                /* If "detail" button pressed */\r
-                case IDC_DETAIL_BUTTON:\r
-                    if(HIWORD(wParam)==BN_CLICKED)\r
-                    {\r
-                        memset(&shInputDll, 0x0, sizeof(SHELLEXECUTEINFOW));\r
-                        shInputDll.cbSize = sizeof(shInputDll);\r
-                        shInputDll.hwnd = hwndDlg;\r
-                        shInputDll.lpVerb = L"open";\r
-                        shInputDll.lpFile = L"RunDll32.exe";\r
-                        shInputDll.lpParameters = L"shell32.dll,Control_RunDLL input.dll";\r
-                        if(ShellExecuteExW(&shInputDll)==0)\r
-                        {\r
-                            MessageBox(NULL, L"Can't start input.dll", L"Error",\r
-                                       MB_OK | MB_ICONERROR);\r
-                        }\r
-                    }\r
-\r
-                break;\r
-            }\r
-\r
-\r
-        break;\r
-\r
-        case WM_NOTIFY:\r
-        {\r
-            LPNMHDR Lpnm = (LPNMHDR)lParam;\r
-            /* If push apply button */\r
-            if (Lpnm->code == (UINT)PSN_APPLY)\r
-            {\r
-                // TODO: Implement\r
-            }\r
-        }\r
-        break;\r
-    }\r
-    return FALSE;\r
-}\r
-\r
-/* EOF */\r
index 68f9d13..bbbca25 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * PROJECT:         ReactOS International Control Panel
  * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            dll/cpl/intl/locale.h
+ * FILE:            lib/cpl/intl/locale.h
  * PURPOSE:         Regional parameters page
  * PROGRAMMERS:     Eric Kohl
  *                  Alexey Zavyalov (gen_x@mail.ru)
@@ -235,9 +235,10 @@ RegOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
         case WM_COMMAND:
             switch (LOWORD(wParam))
             {
-                /* If setup button pressed */
                 case IDC_SETUP_BUTTON:
-                    SetupApplet(hwndDlg, uMsg, wParam, lParam);
+                        // setup button code...
+                        MessageBox(NULL, L"Not implemented yet", L"Info",
+                            MB_OK | MB_ICONINFORMATION);
                 break;
 
                 /* If selected other locale */
@@ -255,12 +256,10 @@ RegOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                     }
                 break;
 
-                /* If changed location */
                 case IDC_LOCATION_COMBO:
                     if (HIWORD(wParam) == CBN_SELCHANGE ||
                         HIWORD(wParam) == CBN_EDITCHANGE)
                     {
-                        /* Set "Apply" button enabled */
                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                     }
                 break;
diff --git a/reactos/dll/cpl/intl_new/nums.c b/reactos/dll/cpl/intl_new/nums.c
deleted file mode 100644 (file)
index c19db00..0000000
+++ /dev/null
@@ -1,851 +0,0 @@
-/*\r
- * PROJECT:         ReactOS International Control Panel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            dll/cpl/intl/nums.c\r
- * PURPOSE:         ReactOS International Control Panel\r
- * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)\r
-*/\r
-\r
-/* INCLUDES *****************************************************************/\r
-\r
-#include <windows.h>\r
-#include <commctrl.h>\r
-#include <cpl.h>\r
-\r
-#include "intl.h"\r
-#include "resource.h"\r
-\r
-/* GLOBALS ******************************************************************/\r
-\r
-#define SAMPLE_NUMBER               L"123456789"\r
-#define SAMPLE_NEG_NUMBER           L"-123456789"\r
-#define MAX_NUM_SEP_SAMPLES         2\r
-#define MAX_FRAC_NUM_SAMPLES        9\r
-#define MAX_FIELD_SEP_SAMPLES       1\r
-#define MAX_FIELD_DIG_SAMPLES       3\r
-#define MAX_NEG_SIGN_SAMPLES        1\r
-#define MAX_NEG_NUMBERS_SAMPLES     5\r
-#define MAX_LEAD_ZEROES_SAMPLES     2\r
-#define MAX_LIST_SEP_SAMPLES        1\r
-#define MAX_UNITS_SYS_SAMPLES       2\r
-#define EOLN_SIZE                   sizeof(WCHAR)\r
-\r
-/* FUNCTIONS ****************************************************************/\r
-\r
-/* Init system of units control box */\r
-VOID\r
-InitUnitsSysCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszUnitsSysSamples[MAX_UNITS_SYS_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"Metrics",\r
-        L"Americans"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszUnitsSys[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current system of units */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_IMEASURE,\r
-                   wszUnitsSys,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMUNITSSYS_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create list of standart system of units */\r
-    for(nCBIndex=0;nCBIndex<MAX_UNITS_SYS_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMUNITSSYS_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszUnitsSysSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMUNITSSYS_COMBO),\r
-                           CB_SETCURSEL,\r
-                           (WPARAM)_wtoi(wszUnitsSys),\r
-                           (LPARAM)0);\r
-}\r
-\r
-/* Init elements list separator control box */\r
-VOID\r
-InitListSepCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszListSepSamples[MAX_LIST_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L";"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszListSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current list separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SLIST,\r
-                   wszListSep,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of signs */\r
-    for(nCBIndex=0;nCBIndex<MAX_LIST_SEP_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszListSepSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszListSep);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_LIST_SEP_SAMPLES+1,\r
-                     (LPARAM)wszListSep);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszListSep);\r
-    }\r
-}\r
-\r
-/* Init leading zeroes control box */\r
-VOID\r
-InitLeadingZeroesCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszLeadNumFmtSamples[MAX_LEAD_ZEROES_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L",7",\r
-        L"0,7"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    WCHAR wszLeadNumFmt[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR* pwszResultStr;\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-\r
-    /* Get current leading zeroes format */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_ILZERO,\r
-                   wszLeadNumFmt,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMLEADZERO_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Get current decimal separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SDECIMAL,\r
-                   wszNumSep,\r
-                   dwValueSize);\r
-\r
-    /* Create list of standart leading zeroes formats */\r
-    for(nCBIndex=0;nCBIndex<MAX_LEAD_ZEROES_SAMPLES;nCBIndex++)\r
-    {\r
-        pwszResultStr = ReplaceSubStr(wszLeadNumFmtSamples[nCBIndex],\r
-                                      wszNumSep,\r
-                                      L",");\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMLEADZERO_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)pwszResultStr);\r
-        free(pwszResultStr);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMLEADZERO_COMBO),\r
-                           CB_SETCURSEL,\r
-                           (WPARAM)_wtoi(wszLeadNumFmt),\r
-                           (LPARAM)0);\r
-}\r
-\r
-/* Init negative numbers format control box */\r
-VOID\r
-InitNegNumFmtCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszNegNumFmtSamples[MAX_NEG_NUMBERS_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"(1,1)",\r
-        L"-1,1",\r
-        L"- 1,1",\r
-        L"1,1-",\r
-        L"1,1 -"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    WCHAR wszNegNumFmt[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszNewSample[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR* pwszResultStr;\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-\r
-    /* Get current negative numbers format */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_INEGNUMBER,\r
-                   wszNegNumFmt,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGFMT_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Get current decimal separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SDECIMAL,\r
-                   wszNumSep,\r
-                   dwValueSize);\r
-\r
-    /* Get current negative sign */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SNEGATIVESIGN,\r
-                   wszNegSign,\r
-                   dwValueSize);\r
-\r
-    /* Create standart list of negative numbers formats */\r
-    for(nCBIndex=0;nCBIndex<MAX_NEG_NUMBERS_SAMPLES;nCBIndex++)\r
-    {\r
-        /* Replace standart separator to setted */\r
-        pwszResultStr = ReplaceSubStr(wszNegNumFmtSamples[nCBIndex],\r
-                                      wszNumSep,\r
-                                      L",");\r
-        wcscpy(wszNewSample,pwszResultStr);\r
-        free(pwszResultStr);\r
-        /* Replace standart negative sign to setted */\r
-        pwszResultStr = ReplaceSubStr(wszNewSample,\r
-                                      wszNegSign,\r
-                                      L"-");\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGFMT_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)pwszResultStr);\r
-        free(pwszResultStr);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGFMT_COMBO),\r
-                           CB_SETCURSEL,\r
-                           (WPARAM)_wtoi(wszNegNumFmt),\r
-                           (LPARAM)0);\r
-}\r
-\r
-/* Init negative sign control box */\r
-VOID\r
-InitNegSignCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszNegSignSamples[MAX_NEG_SIGN_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"-"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current negative sign */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SNEGATIVESIGN,\r
-                   wszNegSign,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of signs */\r
-    for(nCBIndex=0;nCBIndex<MAX_NEG_SIGN_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszNegSignSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszNegSign);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_NUM_SEP_SAMPLES+1,\r
-                     (LPARAM)wszNegSign);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszNegSign);\r
-    }\r
-}\r
-\r
-/* Init number of digidts in field control box */\r
-VOID\r
-InitFieldDigNumCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"0;0",\r
-        L"3;0",\r
-        L"3;2;0"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszFieldDigNum[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR* pwszFieldDigNumSmpl;\r
-\r
-    /* Get current field digits num */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SGROUPING,\r
-                   wszFieldDigNum,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of field digits num */\r
-    for(nCBIndex=0;nCBIndex<MAX_FIELD_DIG_SAMPLES;nCBIndex++)\r
-    {\r
-\r
-        pwszFieldDigNumSmpl=InsSpacesFmt(SAMPLE_NUMBER,wszFieldDigNumSamples[nCBIndex]);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)pwszFieldDigNumSmpl);\r
-        free(pwszFieldDigNumSmpl);\r
-    }\r
-\r
-    pwszFieldDigNumSmpl=InsSpacesFmt(SAMPLE_NUMBER,wszFieldDigNum);\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)pwszFieldDigNumSmpl);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_FIELD_DIG_SAMPLES+1,\r
-                     (LPARAM)pwszFieldDigNumSmpl);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)pwszFieldDigNumSmpl);\r
-    }\r
-\r
-    free(pwszFieldDigNumSmpl);\r
-}\r
-\r
-/* Init field separator control box */\r
-VOID\r
-InitNumFieldSepCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszFieldSepSamples[MAX_FIELD_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L" "\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszFieldSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current field separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_STHOUSAND,\r
-                   wszFieldSep,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of field separators */\r
-    for(nCBIndex=0;nCBIndex<MAX_FIELD_SEP_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszFieldSepSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszFieldSep);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_FIELD_SEP_SAMPLES+1,\r
-                     (LPARAM)wszFieldSep);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszFieldSep);\r
-    }\r
-}\r
-\r
-/* Init number of fractional symbols control box */\r
-VOID\r
-InitNumOfFracSymbCB(HWND hwndDlg)\r
-{\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszFracNum[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszFracCount[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current number of fractional symbols */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_IDIGITS,\r
-                   wszFracNum,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of fractional symbols */\r
-    for(nCBIndex=0;nCBIndex<MAX_FRAC_NUM_SAMPLES;nCBIndex++)\r
-    {\r
-        /* convert to wide char */\r
-        _itow(nCBIndex,wszFracCount,DECIMAL_RADIX);\r
-\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszFracCount);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),\r
-                           CB_SETCURSEL,\r
-                           (WPARAM)_wtoi(wszFracNum),\r
-                           (LPARAM)0);\r
-}\r
-\r
-/* Init num decimal separator control box */\r
-VOID\r
-InitNumDecimalSepCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszNumSepSamples[MAX_NUM_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L",",\r
-        L"."\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current decimal separator */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_SDECIMAL,\r
-                   wszNumSep,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of decimal separators */\r
-    for(nCBIndex=0;nCBIndex<MAX_NUM_SEP_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszNumSepSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszNumSep);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_NUM_SEP_SAMPLES+1,\r
-                     (LPARAM)wszNumSep);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszNumSep);\r
-    }\r
-}\r
-\r
-/* Set units system */\r
-BOOL\r
-SetNumUnitsSys(HWND hwndDlg)\r
-{\r
-    WCHAR wszUnitsSys[MAX_SAMPLES_STR_SIZE];\r
-    INT nCurrSel;\r
-\r
-    /* Get setted units system */\r
-    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMUNITSSYS_COMBO),\r
-                          CB_GETCURSEL,\r
-                          (WPARAM)0,\r
-                          (LPARAM)0);\r
-\r
-    /* convert to wide char */\r
-    _itow(nCurrSel,wszUnitsSys,DECIMAL_RADIX);\r
-\r
-    /* Save units system */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IMEASURE, wszUnitsSys);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set elements list separator */\r
-BOOL\r
-SetNumListSep(HWND hwndDlg)\r
-{\r
-    WCHAR wszListSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get setted list separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszListSep);\r
-\r
-    /* Save list separator */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SLIST, wszListSep);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set leading zero */\r
-BOOL\r
-SetNumLeadZero(HWND hwndDlg)\r
-{\r
-    WCHAR wszLeadZero[MAX_SAMPLES_STR_SIZE];\r
-    INT nCurrSel;\r
-\r
-    /* Get setted leading zero format */\r
-    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMLEADZERO_COMBO),\r
-                          CB_GETCURSEL,\r
-                          (WPARAM)0,\r
-                          (LPARAM)0);\r
-\r
-    /* convert to wide char */\r
-    _itow(nCurrSel,wszLeadZero,DECIMAL_RADIX);\r
-\r
-    /* Save leading zero format */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ILZERO, wszLeadZero);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set negative sum format */\r
-BOOL\r
-SetNegSumFmt(HWND hwndDlg)\r
-{\r
-    WCHAR wszNegSumFmt[MAX_SAMPLES_STR_SIZE];\r
-    INT nCurrSel;\r
-\r
-    /* Get setted negative sum format */\r
-    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGFMT_COMBO),\r
-                          CB_GETCURSEL,\r
-                          (WPARAM)0,\r
-                          (LPARAM)0);\r
-\r
-    /* convert to wide char */\r
-    _itow(nCurrSel,wszNegSumFmt,DECIMAL_RADIX);\r
-\r
-    /* Save negative sum format */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_INEGNUMBER, wszNegSumFmt);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set negative sign */\r
-BOOL\r
-SetNumNegSign(HWND hwndDlg)\r
-{\r
-    WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get setted negative sign */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszNegSign);\r
-\r
-    /* Save negative sign */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SNEGATIVESIGN, wszNegSign);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set number of digidts in field  */\r
-BOOL\r
-SetFieldDigNum(HWND hwndDlg)\r
-{\r
-    WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"0;0",\r
-        L"3;0",\r
-        L"3;2;0"\r
-    };\r
-\r
-    int nCurrSel;\r
-\r
-    /* Get setted number of digidts in field */\r
-    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
-                          CB_GETCURSEL,\r
-                          (WPARAM)0,\r
-                          (LPARAM)0);\r
-\r
-    /* Save number of digidts in field */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SGROUPING, wszFieldDigNumSamples[nCurrSel]);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set field separator */\r
-BOOL\r
-SetNumFieldSep(HWND hwndDlg)\r
-{\r
-    WCHAR wszFieldSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get setted field separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszFieldSep);\r
-\r
-    /* Save field separator */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, wszFieldSep);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set number of fractional symbols */\r
-BOOL\r
-SetFracSymNum(HWND hwndDlg)\r
-{\r
-    WCHAR wszFracSymNum[MAX_SAMPLES_STR_SIZE];\r
-    INT nCurrSel;\r
-\r
-    /* Get setted number of fractional symbols */\r
-    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),\r
-                          CB_GETCURSEL,\r
-                          (WPARAM)0,\r
-                          (LPARAM)0);\r
-\r
-    /* convert to wide char */\r
-    _itow(nCurrSel,wszFracSymNum,DECIMAL_RADIX);\r
-\r
-    /* Save number of fractional symbols */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, wszFracSymNum);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Set num decimal separator */\r
-BOOL\r
-SetNumDecimalSep(HWND hwndDlg)\r
-{\r
-    WCHAR wszDecimalSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get setted decimal separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszDecimalSep);\r
-\r
-    /* Save decimal separator */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, wszDecimalSep);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Update all numbers locale samples */\r
-static\r
-VOID\r
-UpdateNumSamples(HWND hwndDlg,\r
-                        LCID lcidLocale)\r
-{\r
-    WCHAR OutBuffer[MAX_FMT_SIZE];\r
-\r
-    /* Get positive number format sample */\r
-    GetNumberFormatW(lcidLocale,\r
-                     0,\r
-                     SAMPLE_NUMBER,\r
-                     NULL,\r
-                     OutBuffer,\r
-                     MAX_FMT_SIZE);\r
-\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NUM_EDIT),\r
-                 WM_SETTEXT,\r
-                 0,\r
-                 (LPARAM)OutBuffer);\r
-\r
-    /* Get positive number format sample */\r
-    GetNumberFormatW(lcidLocale,\r
-                     0,\r
-                     SAMPLE_NEG_NUMBER,\r
-                     NULL,\r
-                     OutBuffer,\r
-                     MAX_FMT_SIZE);\r
-\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_NEGNUM_EDIT),\r
-                 WM_SETTEXT,\r
-                 0,\r
-                 (LPARAM)OutBuffer);\r
-}\r
-\r
-/* Numbers options setup page dialog callback */\r
-INT_PTR\r
-CALLBACK\r
-NumsOptsSetProc(HWND hwndDlg,\r
-                UINT uMsg,\r
-                WPARAM wParam,\r
-                LPARAM lParam)\r
-{\r
-    UNREFERENCED_PARAMETER(lParam);\r
-    UNREFERENCED_PARAMETER(wParam);\r
-    UNREFERENCED_PARAMETER(hwndDlg);\r
-    switch(uMsg)\r
-    {\r
-        case WM_INITDIALOG:\r
-        {\r
-            /* Init combo boxes */\r
-            InitNumDecimalSepCB(hwndDlg);\r
-            InitNumOfFracSymbCB(hwndDlg);\r
-            InitNumFieldSepCB(hwndDlg);\r
-            InitFieldDigNumCB(hwndDlg);\r
-            InitNegSignCB(hwndDlg);\r
-            InitNegNumFmtCB(hwndDlg);\r
-            InitLeadingZeroesCB(hwndDlg);\r
-            InitListSepCB(hwndDlg);\r
-            InitUnitsSysCB(hwndDlg);\r
-\r
-            UpdateNumSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
-        }\r
-        break;\r
-\r
-        case WM_COMMAND:\r
-        {\r
-            switch (LOWORD(wParam))\r
-            {\r
-                case IDC_NUMDECIMALSEP_COMBO:\r
-                case IDC_NUMFRACSYBMS_COMBO:\r
-                case IDC_NUMFIELDSEP_COMBO:\r
-                case IDC_NUMDIGFIELD_COMBO:\r
-                case IDC_NUMNEGSIGN_COMBO:\r
-                case IDC_NUMNEGFMT_COMBO:\r
-                case IDC_NUMLEADZERO_COMBO:\r
-                case IDC_NUMELEMLISTSEP_COMBO:\r
-                case IDC_NUMUNITSSYS_COMBO:\r
-                case IDC_NUMREGDIG_COMBO:\r
-                case IDC_NUMDIGREPL_COMBO:\r
-                {\r
-                    if (HIWORD(wParam) == CBN_SELCHANGE ||\r
-                        HIWORD(wParam) == CBN_EDITCHANGE)\r
-                    {\r
-                        /* Set "Apply" button enabled */\r
-                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
-                    }\r
-                }\r
-                break;\r
-            }\r
-        }\r
-        break;\r
-\r
-        case WM_NOTIFY:\r
-        {\r
-            LPNMHDR lpnm = (LPNMHDR)lParam;\r
-            /* If push apply button */\r
-            if (lpnm->code == (UINT)PSN_APPLY)\r
-            {\r
-                if(!SetNumDecimalSep(hwndDlg)) break;\r
-                if(!SetFracSymNum(hwndDlg)) break;\r
-                if(!SetNumFieldSep(hwndDlg)) break;\r
-                if(!SetFieldDigNum(hwndDlg)) break;\r
-                if(!SetNumNegSign(hwndDlg)) break;\r
-                if(!SetNegSumFmt(hwndDlg)) break;\r
-                if(!SetNumLeadZero(hwndDlg)) break;\r
-                if(!SetNumListSep(hwndDlg)) break;\r
-                if(!SetNumUnitsSys(hwndDlg)) break;\r
-\r
-                /* Update sum format combo boxes */\r
-                InitLeadingZeroesCB(hwndDlg);\r
-                InitNegNumFmtCB(hwndDlg);\r
-\r
-                /* FIXME: */\r
-                Sleep(15);\r
-                /* Update sum format samples */\r
-                UpdateNumSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
-            }\r
-        }\r
-        break;\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-\r
-/* EOF */\r
index 5eae2bb..699f117 100644 (file)
 
 #define IDD_EXTRAOPTSPAGE        200
 
-#define IDC_LANGUAGE_COMBO       201
-
-/* Language page options */
-
-#define IDD_LANGSOPTSPAGE        300
-
-#define IDC_DETAIL_BUTTON        301
-
-/* Date options setup page */
-
-#define IDD_DATEOPTSSETUP       400
-#define IDC_FIRSTYEAR_EDIT      401
-#define IDC_SECONDYEAR_EDIT     402
-#define IDC_SCR_MAX_YEAR        403
-#define IDC_CALTYPE_COMBO       404
-#define IDC_HIJCHRON_COMBO      405
-#define IDC_SHRTDATESAMPLE_EDIT 406
-#define IDC_SHRTDATERTOL_EDIT   407
-#define IDC_SHRTDATEFMT_COMBO   408
-#define IDC_SHRTDATESEP_COMBO   409
-#define IDC_LONGDATESAMPLE_EDIT 410
-#define IDC_LONGDATERTOL_EDIT   411
-#define IDC_LONGDATEFMT_COMBO   412
-
-/* Numbers options setup page */
-
-#define IDD_NUMSOPTSSETUP        500
-#define IDC_NUM_EDIT             501
-#define IDC_NEGNUM_EDIT          502
-#define IDC_NUM1_EDIT            503
-#define IDC_NEGNUM1_EDIT         504
-#define IDC_NUMDECIMALSEP_COMBO  505
-#define IDC_NUMFRACSYBMS_COMBO   506
-#define IDC_NUMFIELDSEP_COMBO    507
-#define IDC_NUMDIGFIELD_COMBO    508
-#define IDC_NUMNEGSIGN_COMBO     509
-#define IDC_NUMNEGFMT_COMBO      510
-#define IDC_NUMLEADZERO_COMBO    511
-#define IDC_NUMELEMLISTSEP_COMBO 512
-#define IDC_NUMUNITSSYS_COMBO    513
-#define IDC_NUMREGDIG_COMBO      514
-#define IDC_NUMDIGREPL_COMBO     515
-
-/* Monetary options setup page */
-
-#define IDD_CURRENCYOPTSSETUP    600
-#define IDC_CURRENCY_EDIT        601
-#define IDC_NEGCURRENCY_EDIT     602
-#define IDC_CURRENCYUNIT_COMBO   603
-#define IDC_POSCURRENCYSUM_COMBO 604
-#define IDC_NEGCURRENCYSUM_COMBO 605
-#define IDC_WHOLEFRACTSEP_COMBO  606
-#define IDC_FRACSYMBSNUM_COMBO   607
-#define IDC_FIELDSEP_COMBO       608
-#define IDC_DIGINFIELDNUM_COMBO  609
-
-/* Time options setup page */
-
-#define IDD_TIMEOPTSSETUP       700
-#define IDC_TIME_EDIT           701
-#define IDC_UNKNOWN_EDIT        702
-#define IDC_TIMEFMT_COMBO       703
-#define IDC_TIMESEP_COMBO       704
-#define IDC_TIMEAM_COMBO        705
-#define IDC_TIMEPM_COMBO        706
-
+#define IDC_LANGUAGE_COMBO       103
 
 /* Other page options */
 
diff --git a/reactos/dll/cpl/intl_new/setupreg.c b/reactos/dll/cpl/intl_new/setupreg.c
deleted file mode 100644 (file)
index fe619fd..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-/*\r
- * PROJECT:         ReactOS International Control Panel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            dll/cpl/intl/setupreg.c\r
- * PURPOSE:         ReactOS International Control Panel\r
- * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)\r
-*/\r
\r
-/* INCLUDES *****************************************************************/\r
-\r
-#include <windows.h>\r
-#include <commctrl.h>\r
-#include <cpl.h>\r
-\r
-#include "intl.h"\r
-#include "resource.h"\r
-\r
-/* GLOBALS ******************************************************************/\r
-\r
-#define NUM_SHEETS           4\r
-\r
-/* FUNCTIONS ****************************************************************/\r
-\r
-/* Insert the space  */\r
-WCHAR*\r
-InsSpacePos(const WCHAR *wszInsStr, const int nPos)\r
-{\r
-       WCHAR* pwszDestStr;\r
-       pwszDestStr=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE);\r
-    \r
-    int nDestStrCnt=0;\r
-    int nStrCnt;\r
-    int nStrSize;\r
-\r
-       wcscpy(pwszDestStr,wszInsStr);  \r
-    \r
-    nStrSize = wcslen(wszInsStr);\r
-\r
-    for(nStrCnt=0; nStrCnt<nStrSize; nStrCnt++)\r
-    {\r
-        if(nStrCnt==nStrSize-nPos)\r
-        {\r
-            pwszDestStr[nDestStrCnt]=' ';\r
-            nDestStrCnt++;\r
-        }\r
-        pwszDestStr[nDestStrCnt]=wszInsStr[nStrCnt];\r
-        nDestStrCnt++;\r
-    }\r
-    pwszDestStr[nDestStrCnt]='\0';\r
-    \r
-    return pwszDestStr;\r
-}\r
-\r
-/* Insert the spaces by format string separated by ';' */\r
-WCHAR*\r
-InsSpacesFmt(const WCHAR *wszSourceStr, const WCHAR *wszFmtStr)\r
-{\r
-       WCHAR* pwszDestStr;\r
-       pwszDestStr=(WCHAR*) malloc(255);\r
-\r
-       WCHAR* pwszTempStr;\r
-\r
-    WCHAR wszFmtVal[255];\r
-\r
-       int nFmtCount=0;\r
-       int nValCount=0;\r
-    int nLastVal=0;\r
-    int nSpaceOffset=0;\r
-    \r
-    BOOL wasNul=FALSE;\r
-\r
-       wcscpy(pwszDestStr,wszSourceStr);\r
-\r
-    /* if format is clean return source string */\r
-    if(!*wszFmtStr) return pwszDestStr;\r
-\r
-    /* Search for all format values */\r
-    for(nFmtCount=0;nFmtCount<=(int)wcslen(wszFmtStr);nFmtCount++)\r
-    {\r
-        if(wszFmtStr[nFmtCount]==';' || wszFmtStr[nFmtCount]=='\0')\r
-        {\r
-            if(_wtoi(wszFmtVal)==0 && !wasNul)\r
-            {\r
-                wasNul=TRUE;\r
-                break;\r
-            }\r
-            /* If was 0, repeat spaces */\r
-            if(wasNul)\r
-            {\r
-                nSpaceOffset+=nLastVal;\r
-            }\r
-            else\r
-            {\r
-                nSpaceOffset+=_wtoi(wszFmtVal);\r
-            }\r
-            wszFmtVal[nValCount]='\0';\r
-            nValCount=0;\r
-            /* insert space to finded position plus all pos before */\r
-            pwszTempStr=InsSpacePos(pwszDestStr,nSpaceOffset);\r
-            wcscpy(pwszDestStr,pwszTempStr);\r
-            free(pwszTempStr);\r
-            /* num of spaces total increment */\r
-\r
-            if(!wasNul)\r
-            {\r
-                nSpaceOffset++;\r
-                nLastVal=_wtoi(wszFmtVal);\r
-            }\r
-              \r
-        }\r
-        else\r
-        {\r
-            wszFmtVal[nValCount++]=wszFmtStr[nFmtCount];\r
-        }\r
-    }\r
-\r
-    /* Create spaces for rest part of string */\r
-    if(wasNul && nLastVal!=0)\r
-    {\r
-        for(nFmtCount=nSpaceOffset+nLastVal;nFmtCount<wcslen(pwszDestStr);nFmtCount+=nLastVal+1)\r
-        {\r
-            pwszTempStr=InsSpacePos(pwszDestStr,nFmtCount);\r
-            wcscpy(pwszDestStr,pwszTempStr);\r
-            free(pwszTempStr);\r
-        }\r
-    }\r
-\r
-    return pwszDestStr;\r
-}\r
-\r
-/* Replace given template in source string with string to replace and return recieved string */\r
-WCHAR*\r
-ReplaceSubStr(const WCHAR *wszSourceStr,\r
-              const WCHAR *wszStrToReplace,\r
-              const WCHAR *wszTempl)\r
-{\r
-       int nCharCnt;\r
-       int nSubStrCnt;\r
-       int nDestStrCnt;\r
-    int nFirstCharCnt;\r
-\r
-       WCHAR* wszDestStr;\r
-       wszDestStr=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE*sizeof(WCHAR));\r
-\r
-       nDestStrCnt=0;\r
-    nFirstCharCnt=0;\r
-\r
-    wcscpy(wszDestStr,L"");\r
-\r
-    while(nFirstCharCnt<(int)wcslen(wszSourceStr))\r
-       {\r
-        if(wszSourceStr[nFirstCharCnt]==wszTempl[0])\r
-        {\r
-            nSubStrCnt=0;\r
-            for(nCharCnt=nFirstCharCnt;nCharCnt<nFirstCharCnt+(int)wcslen(wszTempl);nCharCnt++)\r
-            {\r
-                if(wszSourceStr[nCharCnt]==wszTempl[nSubStrCnt])\r
-                {\r
-                    nSubStrCnt++;\r
-                }\r
-                else\r
-                {\r
-                    break;\r
-                }\r
-                if((int)wcslen(wszTempl)==nSubStrCnt)\r
-                {\r
-                    wcscat(wszDestStr,wszStrToReplace);\r
-                    nDestStrCnt=(int)wcslen(wszDestStr);\r
-                    nFirstCharCnt+=(int)wcslen(wszTempl)-1;\r
-                    break;\r
-                }\r
-            }\r
-        }\r
-        else \r
-        {\r
-            wszDestStr[nDestStrCnt++]=wszSourceStr[nFirstCharCnt];\r
-            wszDestStr[nDestStrCnt]='\0';\r
-        }\r
-        nFirstCharCnt++;\r
-       }\r
-\r
-       return wszDestStr;\r
-}\r
-\r
-static\r
-VOID\r
-InitPropSheetPage(PROPSHEETPAGE *PsPage, WORD IdDlg, DLGPROC DlgProc)\r
-{\r
-    ZeroMemory(PsPage, sizeof(PROPSHEETPAGE));\r
-    PsPage->dwSize = sizeof(PROPSHEETPAGE);\r
-    PsPage->dwFlags = PSP_DEFAULT;\r
-    PsPage->hInstance = hApplet;\r
-    PsPage->pszTemplate = MAKEINTRESOURCE(IdDlg);\r
-    PsPage->pfnDlgProc = DlgProc;\r
-}\r
-\r
-/* Create applets */\r
-LONG\r
-APIENTRY\r
-SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam)\r
-{\r
-\r
-    PROPSHEETPAGE PsPage[NUM_SHEETS];\r
-    PROPSHEETHEADER psh;\r
-    TCHAR Caption[MAX_STR_SIZE];\r
-\r
-    UNREFERENCED_PARAMETER(lParam);\r
-    UNREFERENCED_PARAMETER(wParam);\r
-    UNREFERENCED_PARAMETER(uMsg);\r
-    UNREFERENCED_PARAMETER(hwnd);\r
-\r
-    LoadString(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(TCHAR));\r
-\r
-    ZeroMemory(&psh, sizeof(PROPSHEETHEADER));\r
-    psh.dwSize = sizeof(PROPSHEETHEADER);\r
-    psh.dwFlags =  PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE;\r
-    psh.hwndParent = NULL;\r
-    psh.hInstance = hApplet;\r
-    psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON));\r
-    psh.pszCaption = Caption;\r
-    psh.nPages = sizeof(PsPage) / sizeof(PROPSHEETPAGE);\r
-    psh.nStartPage = 0;\r
-    psh.ppsp = PsPage;\r
-\r
-    InitPropSheetPage(&PsPage[0], IDD_NUMSOPTSSETUP, NumsOptsSetProc);\r
-    InitPropSheetPage(&PsPage[1], IDD_CURRENCYOPTSSETUP, CurrencyOptsSetProc);\r
-    InitPropSheetPage(&PsPage[2], IDD_TIMEOPTSSETUP, TimeOptsSetProc);\r
-    InitPropSheetPage(&PsPage[3], IDD_DATEOPTSSETUP, DateOptsSetProc);\r
-\r
-    return (LONG)(PropertySheet(&psh) != -1);\r
-}\r
-\r
-/* EOF */\r
diff --git a/reactos/dll/cpl/intl_new/time.c b/reactos/dll/cpl/intl_new/time.c
deleted file mode 100644 (file)
index 84b4c75..0000000
+++ /dev/null
@@ -1,536 +0,0 @@
-/*\r
- * PROJECT:         ReactOS International Control Panel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            dll/cpl/intl/time.c\r
- * PURPOSE:         ReactOS International Control Panel\r
- * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)\r
-*/\r
-\r
-/* INCLUDES *****************************************************************/\r
-\r
-#include <windows.h>\r
-#include <commctrl.h>\r
-#include <cpl.h>\r
-\r
-#include "intl.h"\r
-#include "resource.h"\r
-\r
-/* GLOBALS ******************************************************************/\r
-\r
-#define NO_FLAG                 0\r
-#define MAX_TIME_FMT_SAMPLES    3\r
-#define MAX_TIME_SEP_SAMPLES    1\r
-#define MAX_TIME_AM_SAMPLES     2\r
-#define MAX_TIME_PM_SAMPLES     2\r
-#define EOLN_SIZE               sizeof(WCHAR)\r
-#define STD_TIME_SEP            L":"\r
-\r
-/* FUNCTIONS ****************************************************************/\r
-\r
-/* if char is 'h' or 'H' or 'm' or 's' or 't' or ' ' return TRUE, else FALSE */\r
-BOOL\r
-isTimeComp(WCHAR walpha)\r
-{\r
-    \r
-    if((walpha == L'h') ||\r
-       (walpha == L'H') ||\r
-       (walpha == L'm') ||\r
-       (walpha == L's') ||\r
-       (walpha == L't') ||\r
-       (walpha == L' ')) return TRUE;\r
-    else return FALSE;\r
-}\r
-\r
-/* Find first time separator in string */\r
-WCHAR*\r
-FindTimeSep(const WCHAR *wszSourceStr)\r
-{\r
-    int nDateCompCount=0;\r
-    int nDateSepCount=0;\r
-\r
-       WCHAR* wszFindedSep;\r
-       wszFindedSep=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE*sizeof(WCHAR));\r
-\r
-    wcscpy(wszFindedSep,STD_TIME_SEP);\r
-\r
-    while(nDateCompCount<wcslen(wszSourceStr))\r
-    {\r
-        if(!isTimeComp(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))\r
-        {\r
-            while(!isTimeComp(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))\r
-            {\r
-                wszFindedSep[nDateSepCount++]=wszSourceStr[nDateCompCount];\r
-                nDateCompCount++;\r
-            }\r
-            wszFindedSep[nDateSepCount]='\0';\r
-            return wszFindedSep;\r
-        }\r
-        nDateCompCount++;\r
-    }\r
-\r
-    return wszFindedSep;\r
-}\r
-\r
-/* Init time PM control box */\r
-VOID\r
-InitPM(HWND hwndDlg)\r
-{\r
-    WCHAR wszTimePMSamples[MAX_TIME_PM_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"PM",\r
-        L""\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszTimePM[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current time PM */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_S2359,\r
-                   wszTimePM,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of time PM */\r
-    for(nCBIndex=0;nCBIndex<MAX_TIME_PM_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszTimePMSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszTimePM);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_TIME_PM_SAMPLES+1,\r
-                     (LPARAM)wszTimePM);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszTimePM);\r
-    }\r
-\r
-}\r
-\r
-/* Init time AM control box */\r
-VOID\r
-InitAM(HWND hwndDlg)\r
-{\r
-    WCHAR wszTimeAMSamples[MAX_TIME_AM_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"AM",\r
-        L""\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszTimeAM[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current time AM */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_S1159,\r
-                   wszTimeAM,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of time AM */\r
-    for(nCBIndex=0;nCBIndex<MAX_TIME_AM_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszTimeAMSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszTimeAM);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_TIME_AM_SAMPLES+1,\r
-                     (LPARAM)wszTimeAM);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszTimeAM);\r
-    }\r
-\r
-}\r
-\r
-/* Init time separator control box */\r
-VOID\r
-InitTimeSeparatorCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszTimeSepSamples[MAX_TIME_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L":"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszTimeSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current time separator*/\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_STIME,\r
-                   wszTimeSep,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of time separators */\r
-    for(nCBIndex=0;nCBIndex<MAX_TIME_SEP_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszTimeSepSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszTimeSep);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_TIME_SEP_SAMPLES+1,\r
-                     (LPARAM)wszTimeSep);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszTimeSep);\r
-    }\r
-\r
-}\r
-\r
-/* Init time format control box */\r
-VOID\r
-InitTimeFormatCB(HWND hwndDlg)\r
-{\r
-    WCHAR wszTimeFmtSamples[MAX_TIME_FMT_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
-    {\r
-        L"H:mm:ss",\r
-        L"HH:mm:ss",\r
-        L"h:mm:ss tt"\r
-    };\r
-\r
-    int nCBIndex;\r
-    int nRetCode;\r
-\r
-    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
-    WCHAR wszTimeFmt[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get current time format */\r
-    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
-                   LOCALE_STIMEFORMAT,\r
-                   wszTimeFmt,\r
-                   dwValueSize);\r
-\r
-    /* Clear all box content */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
-                 CB_RESETCONTENT,\r
-                 (WPARAM)0,\r
-                 (LPARAM)0);\r
-\r
-    /* Create standart list of time formats */\r
-    for(nCBIndex=0;nCBIndex<MAX_TIME_FMT_SAMPLES;nCBIndex++)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
-                     CB_ADDSTRING,\r
-                     nCBIndex,\r
-                     (LPARAM)wszTimeFmtSamples[nCBIndex]);\r
-    }\r
-\r
-    /* Set current item to value from registry */\r
-    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
-                           CB_SELECTSTRING,\r
-                           -1,\r
-                           (LPARAM)(LPCSTR)wszTimeFmt);\r
-\r
-    /* if is not success, add new value to list and select them */\r
-    if(nRetCode == CB_ERR)\r
-    {\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
-                     CB_ADDSTRING,\r
-                     MAX_TIME_FMT_SAMPLES+1,\r
-                     (LPARAM)wszTimeFmt);\r
-        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
-                     CB_SELECTSTRING,\r
-                     -1,\r
-                     (LPARAM)(LPCSTR)wszTimeFmt);\r
-    }\r
-}\r
-\r
-/* Set time format to registry */\r
-BOOL\r
-SetTimeFormat(HWND hwndDlg)\r
-{\r
-    WCHAR wszTimeFmt[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszTimeSep[MAX_SAMPLES_STR_SIZE];\r
-    WCHAR wszFindedTimeSep[MAX_SAMPLES_STR_SIZE];\r
-\r
-    WCHAR* pwszResultStr;\r
-    BOOL OpenApostFlg = FALSE;\r
-    int nFmtStrSize;\r
-    int nTimeCompCount;\r
-\r
-    /* Get setted format */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszTimeFmt);\r
-\r
-    /* Get setted separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszTimeSep);\r
-\r
-    /* Get setted format-string size */\r
-    nFmtStrSize = wcslen(wszTimeFmt);\r
-\r
-    /* Check date components */\r
-    for(nTimeCompCount=0;nTimeCompCount<nFmtStrSize;nTimeCompCount++)\r
-    {\r
-        if(wszTimeFmt[nTimeCompCount]==L'\'')\r
-        {\r
-            OpenApostFlg=!OpenApostFlg;\r
-        }\r
-        if(iswalnum(wszTimeFmt[nTimeCompCount]) &&\r
-           !isTimeComp(wszTimeFmt[nTimeCompCount]) &&\r
-           !OpenApostFlg)\r
-        {\r
-            MessageBoxW(NULL,\r
-                        L"Entered time format contain incorrect symbol",\r
-                        L"Error", MB_OK | MB_ICONERROR);\r
-            return FALSE;\r
-        }\r
-        \r
-    }\r
-\r
-    if(OpenApostFlg)\r
-    {\r
-        MessageBoxW(NULL,\r
-                    L"Entered time format contain incorrect symbol",\r
-                    L"Error", MB_OK | MB_ICONERROR);\r
-        return FALSE;\r
-    }\r
-\r
-    /* substring replacement of separator */\r
-    wcscpy(wszFindedTimeSep,FindTimeSep(wszTimeFmt));\r
-    pwszResultStr = ReplaceSubStr(wszTimeFmt,wszTimeSep,wszFindedTimeSep);\r
-    wcscpy(wszTimeFmt,pwszResultStr);\r
-    free(pwszResultStr);\r
-\r
-    /* Save time format */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, wszTimeFmt);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Setted up time separator to registry */\r
-BOOL\r
-SetTimeSep(HWND hwndDlg)\r
-{\r
-    WCHAR wszTimeSep[MAX_SAMPLES_STR_SIZE];\r
-    int nSepStrSize;\r
-    int nSepCount;\r
-\r
-    /* Get setted separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszTimeSep);\r
-\r
-    /* Get setted separator string size */\r
-    nSepStrSize = wcslen(wszTimeSep);\r
-\r
-    /* Check time components */\r
-    for(nSepCount=0;nSepCount<nSepStrSize;nSepCount++)\r
-    {\r
-        if(iswalnum(wszTimeSep[nSepCount]) || (wszTimeSep[nSepCount]=='\''))\r
-        {\r
-            MessageBoxW(NULL,\r
-                        L"Entered time separator contain incorrect symbol",\r
-                        L"Error", MB_OK | MB_ICONERROR);\r
-            return FALSE;\r
-        }\r
-        \r
-    }\r
-\r
-    /* Save time separator */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STIME, wszTimeSep);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Setted up time AM to registry */\r
-BOOL\r
-SetTimeAM(HWND hwndDlg)\r
-{\r
-    WCHAR wszTimeAM[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get setted separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszTimeAM);\r
-\r
-    /* Save time AM */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_S1159, wszTimeAM);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Setted up time PM to registry */\r
-BOOL\r
-SetTimePM(HWND hwndDlg)\r
-{\r
-    WCHAR wszTimePM[MAX_SAMPLES_STR_SIZE];\r
-\r
-    /* Get setted separator */\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
-                 WM_GETTEXT,\r
-                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
-                 (LPARAM)(LPCSTR)wszTimePM);\r
-\r
-    /* Save time PM */\r
-    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_S2359, wszTimePM);\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* Update all time locale samples */\r
-static\r
-VOID\r
-UpdateTimeLocaleSamples(HWND hwndDlg,\r
-                        LCID lcidLocale)\r
-{\r
-    WCHAR OutBuffer[MAX_FMT_SIZE];\r
-\r
-    /* Get time format sample */\r
-    GetTimeFormatW(lcidLocale,\r
-                   NO_FLAG,\r
-                   NULL,\r
-                   NULL,\r
-                   OutBuffer,\r
-                   MAX_FMT_SIZE);\r
-    SendMessageW(GetDlgItem(hwndDlg, IDC_TIME_EDIT),\r
-                 WM_SETTEXT,\r
-                 0,\r
-                 (LPARAM)OutBuffer);\r
-\r
-    /* TODO: Add unknown control box processing */\r
-}\r
-\r
-/* Date options setup page dialog callback */\r
-INT_PTR\r
-CALLBACK\r
-TimeOptsSetProc(HWND hwndDlg,\r
-                UINT uMsg,\r
-                WPARAM wParam,\r
-                LPARAM lParam)\r
-{\r
-    UNREFERENCED_PARAMETER(lParam);\r
-    UNREFERENCED_PARAMETER(wParam);\r
-    UNREFERENCED_PARAMETER(hwndDlg);\r
-    switch(uMsg)\r
-    {\r
-        case WM_INITDIALOG:\r
-        {\r
-            InitTimeFormatCB(hwndDlg);\r
-            InitTimeSeparatorCB(hwndDlg);\r
-            InitAM(hwndDlg);\r
-            InitPM(hwndDlg);\r
-            UpdateTimeLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
-        }\r
-        break;\r
-\r
-        case WM_COMMAND:\r
-        {\r
-            switch (LOWORD(wParam))\r
-            {\r
-                case IDC_TIMEFMT_COMBO:\r
-                case IDC_TIMESEP_COMBO:\r
-                case IDC_TIMEAM_COMBO:\r
-                case IDC_TIMEPM_COMBO:\r
-                {\r
-                    if (HIWORD(wParam) == CBN_SELCHANGE ||\r
-                        HIWORD(wParam) == CBN_EDITCHANGE)\r
-                    {\r
-                        /* Set "Apply" button enabled */\r
-                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
-                    }\r
-                }\r
-                break;\r
-            }\r
-        }\r
-        break;\r
-\r
-        case WM_NOTIFY:\r
-        {\r
-            LPNMHDR lpnm = (LPNMHDR)lParam;\r
-            /* If push apply button */\r
-            if (lpnm->code == (UINT)PSN_APPLY)\r
-            {\r
-                if(!SetTimeFormat(hwndDlg)) break;\r
-                if(!SetTimeSep(hwndDlg)) break;\r
-                if(!SetTimeAM(hwndDlg)) break;\r
-                if(!SetTimePM(hwndDlg)) break;\r
-\r
-                InitTimeFormatCB(hwndDlg);\r
-                \r
-\r
-                /* FIXME: */\r
-                Sleep(15);\r
-                UpdateTimeLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
-            }\r
-        }\r
-        break;\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-\r
-/* EOF */\r
index 2b903a4..060a83c 100644 (file)
@@ -20,6 +20,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "\83l\83b\83g\83\8f\81[\83N ID"
+FONT 9, "MS UI Gothic", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "\8e\9f\82Ì\8fî\95ñ\82ð\8eg\82Á\82Ä\83l\83b\83g\83\8f\81[\83N\8fã\82Å\82±\82Ì\83R\83\93\83s\83\85\81[\83^\82ð\8e¯\95Ê\82µ\82Ü\82·\81B",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "\83t\83\8b \83R\83\93\83s\83\85\81[\83^\96¼:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETPADDING(17),LABELLINE(4)-4
+  LTEXT "(Default)",IDC_COMPUTERNAME,PROPSHEETPADDING(17),LABELLINE(4)-5,60,LABELLINE(4)-5
+  LTEXT "\83\8f\81[\83N\83O\83\8b\81[\83v:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETPADDING(17),LABELLINE(6)-6
+  LTEXT "(empty)",IDC_WORKGROUPDOMAIN_NAME,PROPSHEETPADDING(17),LABELLINE(6)-6,60,LABELLINE(6)-6
+  LTEXT "\83l\83b\83g\83\8f\81[\83N\8e¯\95Ê\83E\83B\83U\81[\83h\82ð\8eg\82Á\82Ä\83h\83\81\83C\83\93\82Ö\82Ì\8eQ\89Á\82¨\82æ\82Ñ\83\8d\81[\83J\83\8b \83\86\81[\83U\81[\82Ì\8dì\90¬\82ð\8ds\82¤\82É\82Í\81A[\83l\83b\83g\83\8f\81[\83N ID] \82ð\83N\83\8a\83b\83N\82µ\82Ä\82­\82¾\82³\82¢\81B",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "\83l\83b\83g\83\8f\81[\83N ID(&N)...",IDC_NETWORK_ID,175,LABELLINE(7)+5,70,LABELLINE(1)+4
+  LTEXT "\83R\83\93\83s\83\85\81[\83^\96¼\82ð\95Ï\8dX\82µ\82½\82è\83h\83\81\83C\83\93\82É\8eQ\89Á\82µ\82½\82è\82·\82é\82É\82Í [\83v\83\8d\83p\83e\83B] \82ð\83N\83\8a\83b\83N\82µ\82Ä\82­\82¾\82³\82¢\81B",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "\83v\83\8d\83p\83e\83B(&P)...",IDC_NETWORK_PROPERTY,175,LABELLINE(11)+2,70,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "\83n\81[\83h\83E\83F\83A"
diff --git a/reactos/dll/cpl/sysdm/computer.c b/reactos/dll/cpl/sysdm/computer.c
new file mode 100644 (file)
index 0000000..3ddbebc
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * PROJECT:     ReactOS System Control Panel Applet
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        dll/cpl/sysdm/computer.c
+ * PURPOSE:     Computer settings for networking
+ * COPYRIGHT:   Copyright Thomas Weidenmueller <w3seek@reactos.org>
+ *
+ */
+
+#include "precomp.h"
+
+/* Property page dialog callback */
+INT_PTR CALLBACK
+ComputerPageProc(
+  HWND hwndDlg,
+  UINT uMsg,
+  WPARAM wParam,
+  LPARAM lParam
+)
+{
+  LPWKSTA_INFO_101 wki;
+
+  UNREFERENCED_PARAMETER(lParam);
+  UNREFERENCED_PARAMETER(wParam);
+
+  switch(uMsg)
+  {
+    case WM_INITDIALOG:
+    {
+      /* Display computer name */
+      DWORD Size = MAX_COMPUTERNAME_LENGTH + 1;
+      TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
+      if (GetComputerName(ComputerName,&Size))
+      {
+          SendDlgItemMessage(hwndDlg,IDC_COMPUTERNAME,WM_SETTEXT,0,(LPARAM)ComputerName);
+      }
+      if (NetWkstaGetInfo(NULL,101,(LPBYTE*)&wki) == NERR_Success)
+      {
+        SendDlgItemMessage(hwndDlg,IDC_WORKGROUPDOMAIN_NAME,WM_SETTEXT,0,(LPARAM)wki->wki101_langroup);
+        NetApiBufferFree(&wki);
+      }
+      break;
+    }
+  }
+  return FALSE;
+}
+
diff --git a/reactos/dll/cpl/sysdm/custclicklink.c b/reactos/dll/cpl/sysdm/custclicklink.c
new file mode 100644 (file)
index 0000000..1e3282a
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * PROJECT:     ReactOS System Control Panel Applet
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        dll/cpl/sysdm/custclicklink.c
+ * PURPOSE:     Subclass static control to link to apps
+ * COPYRIGHT:   Copyright 2006 Ged Murphy <gedmurphy@gmail.com>
+ *
+ */
+
+#include "precomp.h"
+
+#define LINK_COLOR RGB(0,0,128)
+#define MAX_PARAMS 256
+
+typedef struct _LINKCTL
+{
+    HWND hSelf;
+    WNDPROC OldProc;
+    TCHAR szApp[MAX_PATH];
+    TCHAR szParams[MAX_PARAMS];
+    HFONT hFont;
+    BOOL bClicked;
+} LINKCTL, *PLINKCTL;
+
+
+
+static VOID
+DoLButtonUp(PLINKCTL pLink, LPARAM lParam)
+{
+    ReleaseCapture();
+    if (pLink->bClicked)
+    {
+        POINT pt;
+        RECT rc;
+
+        pt.x = (short)LOWORD(lParam);
+        pt.y = (short)HIWORD(lParam);
+        ClientToScreen(pLink->hSelf, &pt);
+        GetWindowRect(pLink->hSelf, &rc);
+        if (PtInRect(&rc, pt))
+        {
+            ShellExecute(NULL,
+                        _T("open"),
+                        pLink->szApp,
+                        pLink->szParams,
+                        NULL,
+                        SW_SHOWNORMAL);
+        }
+
+        pLink->bClicked = FALSE;
+    }
+}
+
+
+static VOID
+DoPaint(PLINKCTL pLink, HDC hdc)
+{
+    TCHAR szText[MAX_PATH];
+    DWORD WinStyle, DrawStyle;
+    RECT rc;
+    HANDLE hOld;
+
+    WinStyle = GetWindowLongPtr(pLink->hSelf, GWL_STYLE);
+    DrawStyle = DT_SINGLELINE;
+
+    if (WinStyle & SS_CENTER)
+        DrawStyle |= DT_CENTER;
+    if (WinStyle & SS_RIGHT)
+        DrawStyle |= DT_RIGHT;
+    if (WinStyle & SS_CENTERIMAGE)
+        DrawStyle |= DT_VCENTER;
+
+    SetTextColor(hdc, LINK_COLOR);
+    SetBkMode(hdc, TRANSPARENT);
+    hOld = SelectObject(hdc, pLink->hFont);
+    SetBkColor(hdc, GetSysColor(COLOR_3DFACE));
+
+    GetClientRect(pLink->hSelf, &rc);
+
+    GetWindowText(pLink->hSelf, szText, sizeof(szText));
+    DrawText(hdc, szText, -1, &rc, DrawStyle);
+
+}
+
+
+static LRESULT CALLBACK
+LinkCtlWndProc(HWND hwnd,
+               UINT msg,
+               WPARAM wParam,
+               LPARAM lParam)
+{
+    PLINKCTL pLink = (PLINKCTL)GetWindowLongPtr(hwnd, GWL_USERDATA);
+    WNDPROC oldproc = pLink->OldProc;
+
+    switch(msg)
+    {
+        case WM_PAINT:
+        {
+            PAINTSTRUCT ps;
+            HDC hdc;
+
+            hdc = BeginPaint(hwnd, &ps);
+            DoPaint(pLink, hdc);
+            EndPaint(hwnd, &ps);
+            return 0;
+        }
+
+        case WM_SETCURSOR:
+        {
+            HCURSOR hCur = LoadCursor(NULL, IDC_HAND);
+            SetCursor(hCur);
+            return TRUE;
+        }
+
+        case WM_SETFONT:
+        {
+            LOGFONT LogFont;
+            HFONT hOldFont;
+            
+            hOldFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
+            GetObject(hOldFont, sizeof(LogFont), &LogFont);
+            LogFont.lfUnderline = TRUE;
+            if (pLink->hFont) DeleteObject(hwnd);
+            pLink->hFont = CreateFontIndirect(&LogFont);
+
+            CallWindowProc(pLink->OldProc, hwnd, msg, wParam, lParam);
+
+            if (LOWORD(lParam))
+            {
+                InvalidateRect(hwnd, NULL, TRUE);
+                UpdateWindow(hwnd);
+            }
+            return 0;
+        }
+
+        case WM_NCHITTEST:
+            return HTCLIENT;
+
+        case WM_LBUTTONDOWN:
+        {
+            SetFocus(hwnd);
+            SetCapture(hwnd);
+            pLink->bClicked = TRUE;
+        }
+        break;
+
+        case WM_LBUTTONUP:
+        {
+            DoLButtonUp(pLink, lParam);
+        }
+        break;
+
+        case WM_NCDESTROY:
+        {
+            HeapFree(GetProcessHeap(),
+                     0,
+                     pLink);
+        }
+        break;
+    }
+
+    return CallWindowProc(oldproc,
+                          hwnd,
+                          msg,
+                          wParam,
+                          lParam);
+}
+
+
+BOOL
+TextToLink(HWND hwnd,
+           LPTSTR lpApp,
+           LPTSTR lpParams)
+{
+    PLINKCTL pLink;
+    HFONT hFont;
+
+    /* error checking */
+    if (lstrlen(lpApp) >= (MAX_PATH - 1) ||
+        lstrlen(lpParams) >= (MAX_PARAMS -1))
+    {
+        return FALSE;
+    }
+
+    pLink = (PLINKCTL)HeapAlloc(GetProcessHeap(),
+                                0,
+                                sizeof(LINKCTL));
+    if (pLink == NULL)
+        return FALSE;
+
+    pLink->hSelf = hwnd;
+    lstrcpyn(pLink->szApp, lpApp, MAX_PATH);
+    lstrcpyn(pLink->szParams, lpParams, MAX_PARAMS);
+    pLink->bClicked = FALSE;
+
+    hFont=(HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
+    
+
+    pLink->OldProc = (WNDPROC)SetWindowLongPtr(hwnd,
+                                               GWL_WNDPROC,
+                                               (LONG_PTR)LinkCtlWndProc);
+    SetWindowLongPtr(hwnd,
+                     GWL_USERDATA,
+                     (LONG_PTR)pLink);
+
+    SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, 0);
+
+    return TRUE;
+}
index 16e7ebd..de650d1 100644 (file)
@@ -20,6 +20,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Sí\9dová identifikace"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "ReactOS pou\9eívá následující informace k identifikaci Va\9aeho poèítaèe v síti.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "Název poèítaèe:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETPADDING(17),LABELLINE(4)-4
+  LTEXT "(Výchozí)",IDC_COMPUTERNAME,PROPSHEETPADDING(17),LABELLINE(4)-5,60,LABELLINE(4)-5
+  LTEXT "Skupina:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETPADDING(17),LABELLINE(6)-6
+  LTEXT "(Prázdné)",IDC_WORKGROUPDOMAIN_NAME,PROPSHEETPADDING(17),LABELLINE(6)-6,60,LABELLINE(6)-6
+  LTEXT "Pro spu\9atìní Prùvodce identifikací v síti, klepnìte na Sí\9dová ID.",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "&Sí\9dová ID...",IDC_NETWORK_ID,175,LABELLINE(7)+5,70,LABELLINE(1)+4
+  LTEXT "Pro pøejmenování poèítaèe nebo nastavení domény, klepnìte na Vlastnosti.",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "&Vlastnosti",IDC_NETWORK_PROPERTY,175,LABELLINE(11)+2,70,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Hardware"
index 2346059..c325268 100644 (file)
@@ -25,10 +25,32 @@ BEGIN
     LTEXT       "", IDC_MACHINELINE3, 130, 162, 118, 9
     LTEXT       "", IDC_MACHINELINE4, 130, 171, 118, 9
     LTEXT       "", IDC_MACHINELINE5, 130, 180, 118, 9
-    CONTROL     "<A HREF=""http://www.reactos.de/"">ReactOS-Homepage</A> besuchen", IDC_ROSHOMEPAGE_LINK, "SysLink", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 200, 100, 8
+    LTEXT       "ReactOS-Homepage besuchen", IDC_ROSHOMEPAGE_LINK, 20, 200, 100, 8
     PUSHBUTTON  "&Lizenz anzeigen...", IDC_LICENCE, 170, 199, 78, 13
 END
 
+
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, 256, 218
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Computername"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+    ICON        IDI_COMPNAME, IDC_STATIC, 4, 3, 26, 24, SS_ICON
+    LTEXT       "ReactOS benutzt folgende Informationen, um ihren Computer im Netzwerk zu identifizieren.", IDC_STATIC, 40, 5, 204, 20
+    LTEXT       "Computer-Beschreibung:", IDC_STATIC, 6, 40, 80, 9
+    EDITTEXT    IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+    LTEXT       "Computername:", IDC_STATIC, 6, 68, 64, 9
+    LTEXT       "(Standard)", IDC_COMPUTERNAME, 98, 68, 144, 11
+    LTEXT       "Arbeitsgruppe:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9
+    LTEXT       "(leer)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9
+    LTEXT       "Um den Netzwerk-Identifikations-Assistenten zum Anmelden an einer Domäne und dem Erstellen eines lokalen Benutzers aufzurufen, klicken Sie auf ""Netzwerk-ID"".", IDC_STATIC, 6, 108, 172, 32
+    PUSHBUTTON  "&Netzwerk-ID...", IDC_NETWORK_ID, 190, 114, 58, 15
+    LTEXT       "Um diesen Computer umzubenennen oder sich an einer Domäne anzumelden, klicken Sie auf ""Ändern"".", IDC_STATIC, 6, 149, 170, 17
+    PUSHBUTTON  "&Ändern...",IDC_NETWORK_PROPERTY, 190, 149, 58, 15
+    LTEXT       "Bitte beachten: Nur Administratoren können die Identifikation dieses Computers ändern.", IDC_STATIC, 6, 179, 250, 18
+END
+
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, 256, 218
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Hardware"
@@ -135,7 +157,9 @@ BEGIN
     PUSHBUTTON  "Löschen", IDC_USERPROFILE_DELETE, 134, 156, 56, 13
     PUSHBUTTON  "Kopieren nach", IDC_USERPROFILE_COPY, 194, 156, 56, 13
 
-    CONTROL     "Um neue Benutzerprofile zu erstellen, öffnen Sie <A>Benutzerkonten</A> in der Systemsteuerung.", IDC_USERACCOUNT_LINK, "SysLink", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 7, 175, 319, 8
+    LTEXT       "Um neue Benutzerprofile zu erstellen, öffnen Sie ", IDC_STATIC, 7, 175, 162, 8
+    LTEXT       "Benutzerkonten", IDC_USERACCOUNT_LINK, 167, 175, 56, 8
+    LTEXT       "in der Systemsteuerung.", IDC_STATIC, 8, 185, 101, 8
 
     DEFPUSHBUTTON  "OK", IDOK, 134, 200, 54, 13
     PUSHBUTTON  "Abbrechen", IDCANCEL, 196, 200, 54, 13
index 072bc86..31cbd56 100644 (file)
@@ -18,6 +18,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Netværks Identifikation"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "ReactOS bruger følgende informationer til at identificere din computer på netværket.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "Dit Fulde Computer Navn:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(4)-4
+  LTEXT "",IDC_COMPUTERNAME,120,LABELLINE(4)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(4)-5
+  LTEXT "Arbejdsgruppe:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(6)-6
+  LTEXT "",IDC_WORKGROUPDOMAIN_NAME,120,LABELLINE(6)-6,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(6)-6
+  LTEXT "For at bruge Netværks Identfications Guiden til at melde in et et domæne eller oprette en lokal bruger, Klik på Netværks ID.",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "&Netværks ID...",IDC_NETWORK_ID,175,LABELLINE(7)+5,70,LABELLINE(1)+4
+  LTEXT "For at omdøbe denne computer eller for at melde ind i et Domæne, Klik på Egenskaber.",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "&Egenskaber...",IDC_NETWORK_PROPERTY,175,LABELLINE(11)+2,70,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Hardware"
index 41630e1..ed9fef9 100644 (file)
@@ -16,11 +16,32 @@ BEGIN
     LTEXT       "", IDC_MACHINELINE3, 130, 162, 118, 9
     LTEXT       "", IDC_MACHINELINE4, 130, 171, 118, 9
     LTEXT       "", IDC_MACHINELINE5, 130, 180, 118, 9
-    CONTROL     "Visit the <A HREF=""http://www.reactos.org/"">ReactOS Homepage</A>", IDC_ROSHOMEPAGE_LINK, "SysLink", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 200, 93, 8
+    LTEXT       "Visit the ReactOS Homepage", IDC_ROSHOMEPAGE_LINK, 20, 200, 93, 8
     PUSHBUTTON  "View &licence...", IDC_LICENCE, 170, 199, 78, 13
 END
 
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, 256, 218
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Computer Name"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+    ICON        IDI_COMPNAME, IDC_STATIC, 4, 3, 26, 24, SS_ICON
+    LTEXT       "ReactOS uses the following information to identify your computer on the network.", IDC_STATIC, 40, 5, 204, 20
+    LTEXT       "Computer Description:", IDC_STATIC, 6, 40, 70, 9
+    EDITTEXT    IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+    LTEXT       "Full computer name:", IDC_STATIC, 6, 68, 64, 9
+    LTEXT       "(Default)", IDC_COMPUTERNAME, 98, 68, 144, 11
+    LTEXT       "Workgroup:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9
+    LTEXT       "(empty)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9
+    LTEXT       "To use the Network Identfication Wizard to join a domain and create a local user, click ""Network ID"".", IDC_STATIC, 6, 108, 172, 24
+    PUSHBUTTON  "&Network ID...", IDC_NETWORK_ID, 190, 114, 58, 15
+    LTEXT       "To rename this computer or join a domain, click ""Change"".", IDC_STATIC, 6, 149, 170, 17
+    PUSHBUTTON  "&Change...",IDC_NETWORK_PROPERTY, 190, 149, 58, 15
+    LTEXT       "Note: Only Administrators can change the identification of this computer.", IDC_STATIC, 6, 179, 300, 9
+END
+
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, 256, 218
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Hardware"
@@ -127,7 +148,9 @@ BEGIN
     PUSHBUTTON  "Delete", IDC_USERPROFILE_DELETE, 145, 156, 50, 13
     PUSHBUTTON  "Copy To", IDC_USERPROFILE_COPY, 200, 156, 50, 13
 
-    CONTROL     "To create new user accounts, open <A>User Accounts</A> in Control Panel.", IDC_USERACCOUNT_LINK, "SysLink", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 7, 175, 228, 8
+    LTEXT       "To create new user accounts, open ", IDC_STATIC, 7, 175, 116, 8
+    LTEXT       "User Accounts", IDC_USERACCOUNT_LINK, 123, 175, 48, 8
+    LTEXT       "in Control Panel.", IDC_STATIC, 173, 175, 64, 8
 
     DEFPUSHBUTTON  "OK", IDOK, 134, 200, 54, 13
     PUSHBUTTON  "Cancel", IDCANCEL, 196, 200, 54, 13
index 11715b7..9da4619 100644 (file)
@@ -24,6 +24,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Identificación en el Red"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "ReactOs utiliza la siguiente información para identificar tu computadora en la red.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "Nombre Completo del computador:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETPADDING(17),LABELLINE(4)-4
+  LTEXT "(predeterminado)",IDC_COMPUTERNAME,PROPSHEETPADDING(17),LABELLINE(4)-5,60,LABELLINE(4)-5
+  LTEXT "Grupo de Trabajo:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETPADDING(17),LABELLINE(6)-6
+  LTEXT "(vacio)",IDC_WORKGROUPDOMAIN_NAME,PROPSHEETPADDING(17),LABELLINE(6)-6,60,LABELLINE(6)-6
+  LTEXT "Para usar el asistente de identificación del red unirse a un dominio o crear un usuario local, pulse Identificación de Red.",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "&Network ID...",IDC_NETWORK_ID,175,LABELLINE(7)+5,70,LABELLINE(1)+4
+  LTEXT "Para renombrar la computadora o unirse a un dominio, pulse Propiedades.",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "&Propiedades...",IDC_NETWORK_PROPERTY,175,LABELLINE(11)+2,70,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Hardware"
index a54df87..0d3204f 100644 (file)
@@ -22,6 +22,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Identification réseau"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "ReactOS utilise les informations suivantes pour identifier votre ordinateur sur le réseau.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "Nom complet de l'ordinateur:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETPADDING(17),LABELLINE(4)-4
+  LTEXT "(Défaut)",IDC_COMPUTERNAME,PROPSHEETPADDING(17),LABELLINE(4)-5,60,LABELLINE(4)-5
+  LTEXT "Domaine:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETPADDING(17),LABELLINE(6)-6
+  LTEXT "(vide)",IDC_WORKGROUPDOMAIN_NAME,PROPSHEETPADDING(17),LABELLINE(6)-6,60,LABELLINE(6)-6
+  LTEXT "Pour utiliser l'Assistant Réseau, afin de rejoindre un domaine ou créer un utilisateur local, cliquez sur Identification Réseau.",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(13)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "&Identification &réseau...",IDC_NETWORK_ID,170,LABELLINE(7)+5,80,LABELLINE(1)+4
+  LTEXT "Pour changer le nom de cet ordinateur ou rejoindre un domaine, cliquez sur Propriétés.",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(13)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "&Propriétés...",IDC_NETWORK_PROPERTY,170,LABELLINE(11)+2,80,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Matériel"
index bbb3b25..0e8da08 100644 (file)
@@ -353,6 +353,12 @@ GeneralPageProc(HWND hwndDlg,
     {
         case WM_INITDIALOG:
         {
+            HWND hLink = GetDlgItem(hwndDlg, IDC_ROSHOMEPAGE_LINK);
+
+            TextToLink(hLink,
+                       _T("http://www.reactos.org"),
+                       NULL);
+
             InitImageInfo(&ImgInfo);
             GetSystemInformation(hwndDlg);
         }
@@ -403,24 +409,6 @@ GeneralPageProc(HWND hwndDlg,
             return TRUE;
         }
 
-        case WM_NOTIFY:
-        {
-            NMHDR *nmhdr = (NMHDR *)lParam;
-
-            if (nmhdr->idFrom == IDC_ROSHOMEPAGE_LINK && nmhdr->code == NM_CLICK)
-            {
-                PNMLINK nml = (PNMLINK)nmhdr;
-
-                ShellExecuteW(hwndDlg,
-                              L"open",
-                              nml->item.szUrl,
-                              NULL,
-                              NULL,
-                              SW_SHOWNORMAL);
-            }
-            break;
-        }
-
     }
 
     return FALSE;
index fffbb1a..4d1e684 100644 (file)
@@ -21,6 +21,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Hálózati azonosítás"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "A ReactOS a következõ információkat fogja használni gépe azonosításához a hálózaton.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "Teljes számítógép név:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETPADDING(17),LABELLINE(4)-4
+  LTEXT "(Alapértelmezett)",IDC_COMPUTERNAME,PROPSHEETPADDING(17),LABELLINE(4)-5,60,LABELLINE(4)-5
+  LTEXT "Munkacsoport:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETPADDING(17),LABELLINE(6)-6
+  LTEXT "(üres)",IDC_WORKGROUPDOMAIN_NAME,PROPSHEETPADDING(17),LABELLINE(6)-6,60,LABELLINE(6)-6
+  LTEXT "Ha a Hálózati azonosítás varázsló használatával akar csatlakozni egy tartományhoz és kíván létrehozni egy helyi felhasználói fiókot, akkor kattintson a Hálózati azonosítás gombra.",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "&Hálózati azonosítás...",IDC_NETWORK_ID,175,LABELLINE(7)+5,70,LABELLINE(1)+4
+  LTEXT "A számítógépe átnevezéséhez, vagy annak tartományba léptetéséhez kattintson a Tulajdonságok gombra.",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "&Tulajdonságok...",IDC_NETWORK_PROPERTY,175,LABELLINE(11)+2,70,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Hardver"
diff --git a/reactos/dll/cpl/sysdm/manifest.xml b/reactos/dll/cpl/sysdm/manifest.xml
deleted file mode 100644 (file)
index 4b53560..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <assemblyIdentity
-  version="1.0.0.0"
-  processorArchitecture="X86"
-  name="ReactOS.System.ControlPanel.System"
-  type="win32"
- />
- <description>ReactOS System Control Panel</description>
- <dependency>
-  <dependentAssembly>
-   <assemblyIdentity
-    type="win32"
-    name="Microsoft.Windows.Common-Controls"
-    version="6.0.0.0"
-    processorArchitecture="X86"
-    publicKeyToken="6595b64144ccf1df"
-    language="*"
-   />
-  </dependentAssembly>
- </dependency>
-</assembly>
-
-<!-- EOF -->
index 36b81e2..e981cc3 100644 (file)
@@ -20,6 +20,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Netwerkidentificatie"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "ReactOS gebruikt de volgende informatie om deze computer in het netwerk te identificeren.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "Volledige computernaam:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETPADDING(17),LABELLINE(4)-4
+  LTEXT "(Default)",IDC_COMPUTERNAME,PROPSHEETPADDING(17),LABELLINE(4)-5,60,LABELLINE(4)-5
+  LTEXT "Werkgroep:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETPADDING(17),LABELLINE(6)-6
+  LTEXT "(empty)",IDC_WORKGROUPDOMAIN_NAME,PROPSHEETPADDING(17),LABELLINE(6)-6,60,LABELLINE(6)-6
+  LTEXT "Klik op Netwerkidentificatie als u de wizard Netwerkidentificatie wilt starten. Hiermee kunt u de computer lid maken van een domein en kunt u een account voor een lokale gebruiker maken",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "&Netwerkidentificatie",IDC_NETWORK_ID,175,LABELLINE(7)+5,70,LABELLINE(1)+4
+  LTEXT "Klik op Eigenschappen als u de naam van deze computer wilt wijzigen of de computer lid wilt maken van een domein.",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "&Eigenschappen",IDC_NETWORK_PROPERTY,175,LABELLINE(11)+2,70,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Hardware"
index ff8a12a..d70809c 100644 (file)
@@ -5,13 +5,10 @@
 #include <commctrl.h>
 #include <tchar.h>
 #include <stdio.h>
+#include <lm.h>
 #include <cpl.h>
 #include <shellapi.h>
 #include <shlwapi.h>
-#include <shlguid.h>
-#include <shlobj.h>
-#include <cplext.h>
-#include <regstr.h>
 #include "resource.h"
 
 #define NUM_APPLETS (1)
@@ -32,6 +29,7 @@ void ShowLastWin32Error(HWND hWndOwner);
 
 /* prop sheet pages */
 INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+INT_PTR CALLBACK ComputerPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 INT_PTR CALLBACK HardwarePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 INT_PTR CALLBACK AdvancedPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
@@ -43,6 +41,8 @@ INT_PTR CALLBACK StartRecDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
 INT_PTR CALLBACK VirtMemDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 INT_PTR CALLBACK LicenceDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
 
+BOOL TextToLink(HWND hwnd, LPTSTR lpApp, LPTSTR lpParams);
+
 typedef struct _PAGEFILE
 {
     TCHAR szDrive[3];
index c784346..2153185 100644 (file)
@@ -5,8 +5,9 @@
 
 #define IDI_CPLSYSTEM                   50
 #define IDI_DEVMGR                      51
-#define IDI_HARDPROF                    52
-#define IDI_USERPROF                    53
+#define IDI_COMPNAME                    52
+#define IDI_HARDPROF                    53
+#define IDI_USERPROF                    54
 
 #define IDB_ROSBMP                      55
 
 #define IDC_ROSHOMEPAGE_LINK            108
 
 
+/* propsheet - computer name */
+#define IDD_PROPPAGECOMPUTER            200
+#define IDC_COMPDESC                    201
+#define IDC_COMPUTERNAME                202
+#define IDC_WORKGROUPDOMAIN_NAME        203
+#define IDC_WORKGROUPDOMAIN                204
+#define IDC_NETWORK_ID                  205
+#define IDC_NETWORK_PROPERTY            206
+
+
 /* propsheet - hardware */
 #define IDD_PROPPAGEHARDWARE            300
 #define IDC_HARDWARE_WIZARD                207
index d3cdae6..314c606 100644 (file)
@@ -20,6 +20,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Ñåòåâàÿ èíäåíòèôèêàöèÿ"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "ReactOS èñïîëüçóåò ñëåäóþùóþ èíôîðìàöèþ, ÷òîáû èíäåíòèôèöèðîâàòü âàø êîìïüþòåð â ñåòè.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "Ïîëíîå èìÿ êîìïüþòåðà:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETPADDING(17),LABELLINE(4)-4
+  LTEXT "(ïî óìîë÷àíèþ)",IDC_COMPUTERNAME,PROPSHEETPADDING(17),LABELLINE(4)-5,60,LABELLINE(4)-5
+  LTEXT "Ðàáî÷àÿ ãðàïïà:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETPADDING(17),LABELLINE(6)-6
+  LTEXT "(ïóñòî)",IDC_WORKGROUPDOMAIN_NAME,PROPSHEETPADDING(17),LABELLINE(6)-6,60,LABELLINE(6)-6
+  LTEXT "Èñïîëüçóéòå Ìàñòåð ñåòåâîé èíäåíòèôèêàöèè, ÷òîáû ïðèñîåäèíèòüñÿ ê äîìåíó è ñîçäàòü ëîêàëüíîãî ïîëüçîâàòåëÿ, íàæìèòå êíîïêó Èíäåíòèôèêàöèÿ.",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "&Èíäåíòèôèêàöèÿ...",IDC_NETWORK_ID,175,LABELLINE(7)+5,70,LABELLINE(1)+4
+  LTEXT "×òîáû ïåðåèìåíîâàòü êîìïüþòåð èëè ïðèñîåäèíèòüñÿ ê äîìåíó, íàæìèòå êíîïêó Ñâîéñòâà",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "&Ñâîéñòâà...",IDC_NETWORK_PROPERTY,175,LABELLINE(11)+2,70,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Îáîðóäîâàíèå"
index e1b3151..665090e 100644 (file)
@@ -33,18 +33,17 @@ StartRecDlgProc(HWND hwndDlg,
                 WPARAM wParam,
                 LPARAM lParam)
 {
+    UNREFERENCED_PARAMETER(lParam);
        TCHAR *szSystemDrive;
        TCHAR szDefaultOS[MAX_PATH];
        TCHAR szDefaultOSName[MAX_PATH];
        TCHAR szTimeout[10];
        int iTimeout;
 
-       UNREFERENCED_PARAMETER(lParam);
-       
-       switch(uMsg)
-       {
-               case WM_INITDIALOG:
-               {
+    switch(uMsg)
+    {
+        case WM_INITDIALOG:
+        {
                        /* get Path to freeldr.ini or boot.ini */
                        szSystemDrive = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PATH);
                        if (szSystemDrive != NULL)
@@ -77,11 +76,11 @@ StartRecDlgProc(HWND hwndDlg,
                        if (iTimeout != 0)
                                SendDlgItemMessage(hwndDlg, IDC_STRECLIST, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
 
-               }
-               break;
+        }
+        break;
 
-               case WM_COMMAND:
-               {
+        case WM_COMMAND:
+        {
                        switch(LOWORD(wParam))
                        {
                                case IDC_STRRECEDIT:
@@ -114,8 +113,8 @@ StartRecDlgProc(HWND hwndDlg,
                                                SetTimeout(hwndDlg, 0);
                                }
                        }
-               }
-               break;
+        }
+        break;
   }
   return FALSE;
 }
index 02b2793..6db4fce 100644 (file)
@@ -22,6 +22,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Nätverksidentitet"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "ReactOS använder följande information för att identifiera din dator på nätverket.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "Fullständigt datornamn:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(4)-4
+  LTEXT "",IDC_COMPUTERNAME,120,LABELLINE(4)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(4)-5
+  LTEXT "Arbetsgrupp:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(6)-6
+  LTEXT "",IDC_WORKGROUPDOMAIN_NAME,120,LABELLINE(6)-6,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(6)-6
+  LTEXT "Klicka på Nätverksidentitet för att använda guiden Nätverksidentifikation för att ansluta till en domän och skapa en lokal användare.",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "&Nätverksidentitet...",IDC_NETWORK_ID,175,LABELLINE(7)+5,70,LABELLINE(1)+4
+  LTEXT "Klicka på egenskaper för att ansluta till en domän eller ändra datornamnet.",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "&Egenskaper...",IDC_NETWORK_PROPERTY,175,LABELLINE(11)+2,70,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Hårdvara"
index 8a2785d..99aa816 100644 (file)
@@ -18,132 +18,79 @@ APPLET Applets[NUM_APPLETS] =
   {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
 };
 
-#define MAX_SYSTEM_PAGES    32
-
-static BOOL CALLBACK
-PropSheetAddPage(HPROPSHEETPAGE hpage, LPARAM lParam)
-{
-    PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam;
-    if (ppsh != NULL && ppsh->nPages < MAX_SYSTEM_PAGES)
-    {
-        ppsh->phpage[ppsh->nPages++] = hpage;
-        return TRUE;
-    }
-
-    return FALSE;
-}
-
-static BOOL
-InitPropSheetPage(PROPSHEETHEADER *ppsh, WORD idDlg, DLGPROC DlgProc)
+static void
+InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
 {
-    HPROPSHEETPAGE hPage;
-    PROPSHEETPAGE psp;
-
-    if (ppsh->nPages < MAX_SYSTEM_PAGES)
-    {
-        ZeroMemory(&psp, sizeof(psp));
-        psp.dwSize = sizeof(psp);
-        psp.dwFlags = PSP_DEFAULT;
-        psp.hInstance = hApplet;
-        psp.pszTemplate = MAKEINTRESOURCE(idDlg);
-        psp.pfnDlgProc = DlgProc;
-
-        hPage = CreatePropertySheetPage(&psp);
-        if (hPage != NULL)
-        {
-            return PropSheetAddPage(hPage, (LPARAM)ppsh);
-        }
-    }
-
-    return FALSE;
+  ZeroMemory(psp, sizeof(PROPSHEETPAGE));
+  psp->dwSize = sizeof(PROPSHEETPAGE);
+  psp->dwFlags = PSP_DEFAULT;
+  psp->hInstance = hApplet;
+  psp->pszTemplate = MAKEINTRESOURCE(idDlg);
+  psp->pfnDlgProc = DlgProc;
 }
 
-typedef HPROPSHEETPAGE (WINAPI *PCreateNetIDPropertyPage)(VOID);
-
-static HMODULE
-AddNetIdPage(PROPSHEETHEADER *ppsh)
+/* Property Sheet Callback */
+int CALLBACK
+PropSheetProc(
+       HWND hwndDlg,
+       UINT uMsg,
+       LPARAM lParam
+)
 {
-    HPROPSHEETPAGE hPage;
-    HMODULE hMod;
-    PCreateNetIDPropertyPage pCreateNetIdPage;
-
-    hMod = LoadLibrary(TEXT("netid.dll"));
-    if (hMod != NULL)
-    {
-        pCreateNetIdPage = (PCreateNetIDPropertyPage)GetProcAddress(hMod,
-                                                                    "CreateNetIDPropertyPage");
-        if (pCreateNetIdPage != NULL)
-        {
-            hPage = pCreateNetIdPage();
-            if (hPage == NULL)
-                goto Fail;
-
-            if (!PropSheetAddPage(hPage, (LPARAM)ppsh))
-            {
-                DestroyPropertySheetPage(hPage);
-                goto Fail;
-            }
-        }
-        else
-        {
-Fail:
-            FreeLibrary(hMod);
-            hMod = NULL;
-        }
-    }
+  UNREFERENCED_PARAMETER(hwndDlg);
+  switch(uMsg)
+  {
+    case PSCB_BUTTONPRESSED:
+      switch(lParam)
+      {
+        case PSBTN_OK: /* OK */
+          break;
+        case PSBTN_CANCEL: /* Cancel */
+          break;
+        case PSBTN_APPLYNOW: /* Apply now */
+          break;
+        case PSBTN_FINISH: /* Close */
+          break;
+        default:
+          return FALSE;
+      }
+      break;
 
-    return hMod;
+    case PSCB_INITIALIZED:
+      break;
+  }
+  return TRUE;
 }
 
 /* First Applet */
+
 LONG CALLBACK
 SystemApplet(VOID)
 {
-  HPROPSHEETPAGE hpsp[MAX_SYSTEM_PAGES];
+  PROPSHEETPAGE psp[4];
   PROPSHEETHEADER psh;
-  HMODULE hNetIdDll;
-  HPSXA hpsxa;
-  LONG Ret;
-  static INITCOMMONCONTROLSEX icc = {sizeof(INITCOMMONCONTROLSEX), ICC_LINK_CLASS};
+  TCHAR Caption[1024];
 
-  if (!InitCommonControlsEx(&icc))
-      return 0;
+  LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
 
   ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
   psh.dwSize = sizeof(PROPSHEETHEADER);
-  psh.dwFlags =  PSH_PROPTITLE;
+  psh.dwFlags =  PSH_PROPSHEETPAGE | PSH_PROPTITLE; /* | PSH_USECALLBACK */
   psh.hwndParent = NULL;
   psh.hInstance = hApplet;
   psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
-  psh.pszCaption = MAKEINTRESOURCE(IDS_CPLSYSTEMNAME);
-  psh.nPages = 0;
+  psh.pszCaption = Caption;
+  psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
   psh.nStartPage = 0;
-  psh.phpage = hpsp;
-  psh.pfnCallback = NULL;
-
-  InitPropSheetPage(&psh, IDD_PROPPAGEGENERAL, (DLGPROC) GeneralPageProc);
-  hNetIdDll = AddNetIdPage(&psh);
-  InitPropSheetPage(&psh, IDD_PROPPAGEHARDWARE, (DLGPROC) HardwarePageProc);
-  InitPropSheetPage(&psh, IDD_PROPPAGEADVANCED, (DLGPROC) AdvancedPageProc);
-
-  /* Load additional pages provided by shell extensions */
-  hpsxa = SHCreatePropSheetExtArray(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\System"), MAX_SYSTEM_PAGES - psh.nPages);
-  if (hpsxa != NULL)
-  {
-    SHAddFromPropSheetExtArray(hpsxa, PropSheetAddPage, (LPARAM)&psh);
-  }
-
-  Ret = (LONG)(PropertySheet(&psh) != -1);
-
-  if (hpsxa != NULL)
-  {
-    SHDestroyPropSheetExtArray(hpsxa);
-  }
+  psh.ppsp = psp;
+  psh.pfnCallback = NULL; /* PropSheetProc; */
 
-  if (hNetIdDll != NULL)
-      FreeLibrary(hNetIdDll);
+  InitPropSheetPage(&psp[0], IDD_PROPPAGEGENERAL, (DLGPROC) GeneralPageProc);
+  InitPropSheetPage(&psp[1], IDD_PROPPAGECOMPUTER, (DLGPROC) ComputerPageProc);
+  InitPropSheetPage(&psp[2], IDD_PROPPAGEHARDWARE, (DLGPROC) HardwarePageProc);
+  InitPropSheetPage(&psp[3], IDD_PROPPAGEADVANCED, (DLGPROC) AdvancedPageProc);
 
-  return Ret;
+  return (LONG)(PropertySheet(&psh) != -1);
 }
 
 /* Control Panel Callback */
index f00574a..44873ee 100644 (file)
        <library>user32</library>
        <library>gdi32</library>
        <library>comctl32</library>
+       <library>netapi32</library>
        <library>ntdll</library>
        <library>msimg32</library>
        <library>shell32</library>
        <library>shlwapi</library>
-       <library>ole32</library>
        <file>advanced.c</file>
+       <file>computer.c</file>
+       <file>custclicklink.c</file>
        <file>environment.c</file>
        <file>general.c</file>
        <file>hardprof.c</file>
index de445b3..a410f0a 100644 (file)
@@ -10,11 +10,10 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 #define REACTOS_STR_ORIGINAL_FILENAME "sysdm.cpl\0"
 #include <reactos/version.rc>
 
-123 24 DISCARDABLE "manifest.xml"
-
 IDI_CPLSYSTEM   ICON "resources/applet.ico"
 
 IDI_USERPROF    ICON "resources/devmgr.ico"
+IDI_COMPNAME    ICON "resources/devmgr.ico"
 IDI_HARDPROF    ICON "resources/devmgr.ico"
 IDI_DEVMGR      ICON "resources/devmgr.ico"
 
index c8eb611..c2840eb 100644 (file)
@@ -28,6 +28,23 @@ BEGIN
   EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING(1),LABELLINE(13),PROPSHEETWIDTH-PROPSHEETPADDING(2),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING(1),ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY
 END
 
+IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Ìåðåæåâà ³íäåíò³ô³êàöèÿ"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+  ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING(1),LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON
+  LTEXT "ReactOS âèêîðèñòîâóº íàñòóïíó ³íôîðìàö³þ, ùîá ³äåíòèô³êóâàòè âàø êîìï'þòåð â ìåðåæ³.",-1,PROPSHEETPADDING(4)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-PROPSHEETPADDING(6)-ICONSIZE,LABELLINE(3)
+  LTEXT "Ïîâíå ³ì'ÿ êîìï'þòåðà:",-1,PROPSHEETPADDING(1),LABELLINE(4)-4,PROPSHEETPADDING(17),LABELLINE(4)-4
+  LTEXT "(Çà çàìîâ÷óâàííÿì)",IDC_COMPUTERNAME,PROPSHEETPADDING(17),LABELLINE(4)-5,60,LABELLINE(4)-5
+  LTEXT "Ðîáî÷à ãðóïà:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING(1),LABELLINE(6)-6,PROPSHEETPADDING(17),LABELLINE(6)-6
+  LTEXT "(ïîðîæíüî)",IDC_WORKGROUPDOMAIN_NAME,PROPSHEETPADDING(17),LABELLINE(6)-6,60,LABELLINE(6)-6
+  LTEXT "Ùîá ñêîðèñòóâàòèñÿ Ìàéñòðîì ìåðåæåâî¿ ³äåíòèô³êàö³¿ äëÿ ïðèºäíàííÿ äî äîìåíó ³ ñòâîðåííÿ ëîêàëüíîãî êîðèñòóâà÷à, íàòèñí³òü ²äåíòèô³êàö³ÿ.",-1,PROPSHEETPADDING(1),LABELLINE(7)+5,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(8)+5
+  PUSHBUTTON "&²äåíòèô³êàö³ÿ...",IDC_NETWORK_ID,175,LABELLINE(7)+5,70,LABELLINE(1)+4
+  LTEXT "Ùîá ïåðåéìåíóâàòè öåé êîìï'þòåð àáî ïðèºäíàòèñÿ äî äîìåíó, íàòèñí³òü Âëàñòèâîñò³.",-1,PROPSHEETPADDING(1),LABELLINE(11)+2,PROPSHEETWIDTH-PROPSHEETPADDING(12)-ICONSIZE,LABELLINE(12)+2
+  PUSHBUTTON "&Âëàñòèâîñò³...",IDC_NETWORK_PROPERTY,175,LABELLINE(11)+2,70,LABELLINE(1)+4
+END
+
 IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Óñòàòêóâàííÿ"
index 2165925..da0fc8a 100644 (file)
@@ -25,11 +25,11 @@ UserProfileDlgProc(HWND hwndDlg,
     {
         case WM_INITDIALOG:
         {
-//            HWND hLink = GetDlgItem(hwndDlg, IDC_USERACCOUNT_LINK);
+            HWND hLink = GetDlgItem(hwndDlg, IDC_USERACCOUNT_LINK);
 
-//            TextToLink(hLink, 
-//                       _T("rundll32.exe"),
-//                       _T("shell32.dll, Control_RunDLL nusrmgr.cpl"));
+            TextToLink(hLink, 
+                       _T("rundll32.exe"),
+                       _T("shell32.dll, Control_RunDLL nusrmgr.cpl"));
 
             MessageBox(hwndDlg, _T("Dialog not yet implemented!"), NULL, 0);
         }
@@ -45,22 +45,6 @@ UserProfileDlgProc(HWND hwndDlg,
             }
         }
         break;
-
-        case WM_NOTIFY:
-        {
-            NMHDR *nmhdr = (NMHDR *)lParam;
-
-            if (nmhdr->idFrom == IDC_USERACCOUNT_LINK && nmhdr->code == NM_CLICK)
-            {
-                ShellExecute(hwndDlg,
-                             TEXT("open"),
-                             TEXT("rundll32.exe"),
-                             TEXT("shell32.dll, Control_RunDLL nusrmgr.cpl"),
-                             NULL,
-                             SW_SHOWNORMAL);
-            }
-            break;
-        }
   }
   return FALSE;
 }
index 84ef1c7..08da8ae 100644 (file)
@@ -152,7 +152,7 @@ ParseMemSettings(PVIRTMEM pVirtMem)
                                      NULL,
                                      0))
             {
-                if (szVolume[0] != _T('\0'))
+                if (szVolume != _T('\0'))
                 {
                     TCHAR szVol[MAX_PATH + 2];
 
diff --git a/reactos/dll/keyboard/kbdit/kbdit.c b/reactos/dll/keyboard/kbdit/kbdit.c
deleted file mode 100644 (file)
index adf298b..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * ReactOS Italian Keyboard layout
- * Copyright (C) 2007 ReactOS
- * License: LGPL, see: LGPL.txt
- * 
- */
-
-#include <windows.h>
-#include <internal/kbd.h>
-
-#ifdef _M_IA64
-#define ROSDATA static __declspec(allocate(".data"))
-#else
-#ifdef _MSC_VER
-#pragma data_seg(".data")
-#define ROSDATA static
-#else
-#define ROSDATA static __attribute__((section(".data")))
-#endif
-#endif
-
-#define VK_EMPTY 0xff   /* The non-existent VK */
-#define KSHIFT   0x001  /* Shift modifier */
-#define KCTRL    0x002  /* Ctrl modifier */
-#define KALT     0x004  /* Alt modifier */
-#define KEXT     0x100  /* Extended key code */
-#define KMULTI   0x200  /* Multi-key */
-#define KSPEC    0x400  /* Special key */
-#define KNUMP    0x800  /* Number-pad */
-#define KNUMS    0xc00  /* Special + number pad */
-#define KMEXT    0x300  /* Multi + ext */
-
-ROSDATA USHORT scancode_to_vk[] = {
-  /* Numbers Row */
-  /* - 00 - */
-  /* 1 ...         2 ...         3 ...         4 ... */     
-  VK_EMPTY,     VK_ESCAPE,    '1',          '2',
-  '3',          '4',          '5',          '6',
-  '7',          '8',          '9',          '0',
-  VK_OEM_MINUS, VK_OEM_PLUS,  VK_BACK,
-  /* - 0f - */
-  /* First Letters Row */
-  VK_TAB,       'Q',          'W',          'E',
-  'R',          'T',          'Y',          'U',
-  'I',          'O',          'P',          
-  VK_OEM_4,     VK_OEM_6,     VK_RETURN,
-  /* - 1d - */
-  /* Second Letters Row */
-  VK_LCONTROL,  
-  'A',          'S',          'D',          'F',
-  'G',          'H',          'J',          'K',
-  'L',          VK_OEM_1,     VK_OEM_7,     VK_OEM_3, 
-  VK_LSHIFT,    VK_OEM_5,
-  /* - 2c - */
-  /* Third letters row */
-  'Z',          'X',          'C',          'V',
-  'B',          'N',          'M',          VK_OEM_COMMA,
-  VK_OEM_PERIOD,VK_OEM_2,     VK_RSHIFT,
-  /* - 37 - */
-  /* Bottom Row */
-  VK_MULTIPLY,  VK_LMENU,     VK_SPACE,     VK_CAPITAL,
-  
-  /* - 3b - */
-  /* F-Keys */
-  VK_F1, VK_F2, VK_F3, VK_F4, VK_F5, VK_F6, 
-  VK_F7, VK_F8, VK_F9, VK_F10,
-  /* - 45 - */
-  /* Locks */
-  VK_NUMLOCK | KMEXT,   
-  VK_SCROLL | KMULTI,    
-  /* - 47 - */
-  /* Number-Pad */
-  VK_HOME | KNUMS,      VK_UP | KNUMS,         VK_PRIOR | KNUMS, VK_SUBTRACT,
-  VK_LEFT | KNUMS,      VK_CLEAR | KNUMS,      VK_RIGHT | KNUMS, VK_ADD,
-  VK_END | KNUMS,       VK_DOWN | KNUMS,       VK_NEXT | KNUMS,
-  VK_INSERT | KNUMS,    VK_DELETE | KNUMS,
-  /* - 54 - */
-  /* Presumably PrtSc */
-  VK_SNAPSHOT,
-  /* - 55 - */
-  /* Oddities, and the remaining standard F-Keys */
-  VK_EMPTY,     VK_EMPTY,     VK_F11,       VK_F12,
-  /* - 59 - */
-  VK_CLEAR,     VK_EMPTY,     VK_EMPTY,     VK_EMPTY,     VK_EMPTY, /* EREOF */
-  VK_EMPTY,     VK_EMPTY,     VK_EMPTY,     VK_EMPTY,     VK_EMPTY, /* ZOOM */
-  VK_HELP,      
-  /* - 64 - */
-  /* Even more F-Keys (for example, NCR keyboards from the early 90's) */
-  VK_F13, VK_F14, VK_F15, VK_F16, VK_F17, VK_F18, VK_F19, VK_F20,
-  VK_F21, VK_F22, VK_F23, 
-  /* - 6f - */
-  /* Not sure who uses these codes */
-  VK_EMPTY, VK_EMPTY, VK_EMPTY,
-  /* - 72 - */
-  VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY,
-  /* - 76 - */
-  /* One more f-key */
-  VK_F24,
-  /* - 77 - */
-  VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY,
-  VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* PA1 */
-  VK_EMPTY,
-  /* - 80 - */
-  0
-};
-
-ROSDATA VSC_VK extcode0_to_vk[] = {
-  { 0, 0 },
-};
-
-ROSDATA VSC_VK extcode1_to_vk[] = {
-  { 0, 0 },
-};
-
-ROSDATA VK_TO_BIT modifier_keys[] = {
-  { VK_SHIFT,   KSHIFT },
-  { VK_CONTROL, KCTRL },
-  { VK_MENU,    KALT },
-  { 0,          0 }
-};
-
-ROSDATA MODIFIERS modifier_bits = {
-  modifier_keys,
-  3,
-  { 0, 1, 2, 3 } /* Modifier bit order, NONE, SHIFT, CTRL, ALT */
-};
-
-#define NOCAPS 0
-#define CAPS   KSHIFT /* Caps -> shift */
-
-ROSDATA VK_TO_WCHARS2 key_to_chars_2mod[] = {
-  /* Normal vs Shifted */
-  /* The numbers */
-  { '1',         NOCAPS, {'1', '!'} },
-  /* Ctrl-2 generates NUL */
-  { '3',         NOCAPS, {'3', '£'} },
-  { '4',         NOCAPS, {'4', '$'} },
-  { '5',         NOCAPS, {'5', '%'} },
-  /* Ctrl-6 generates RS */
-  { '7',         NOCAPS, {'7', '/'} },
-  { '8',         NOCAPS, {'8', '('} },
-  { '9',         NOCAPS, {'9', ')'} },
-  { '0',         NOCAPS, {'0', '='} },
-
-  /* Specials */
-  /* Ctrl-_ generates US */
-  { VK_OEM_PLUS    ,NOCAPS, {'ì', '^'} },
-  { VK_OEM_1       ,NOCAPS, {'ò', 'ç'} },
-  { VK_OEM_7       ,NOCAPS, {'à', '°'} },
-  { VK_OEM_3       ,NOCAPS, {'ù', '§'} },
-  { VK_OEM_COMMA   ,NOCAPS, {',', ';'} },
-  { VK_OEM_PERIOD  ,NOCAPS, {'.', ':'} },
-  { VK_OEM_2       ,NOCAPS, {'-', '_'} },
-  /* Keys that do not have shift states */
-  { VK_TAB     ,NOCAPS, {'\t','\t'} },
-  { VK_ADD     ,NOCAPS, {'+', '+'} },
-  { VK_SUBTRACT,NOCAPS, {'-', '-'} },
-  { VK_MULTIPLY,NOCAPS, {'*', '*'} },
-  { VK_DIVIDE  ,NOCAPS, {'/', '/'} },
-  { VK_ESCAPE  ,NOCAPS, {'\x1b','\x1b'} },
-  { VK_SPACE   ,NOCAPS, {' ', ' '} },
-  { 0, 0 }
-};
-
-ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = {
-  /* Normal, Shifted, Ctrl */
-  /* Legacy (telnet-style) ascii escapes */
-  { VK_OEM_4, 0, {'è', 'é', 0x1b /* ESC */} },
-  { VK_OEM_6, 0, {'+', '*', 0x1d /* GS */} },
-  { VK_OEM_5, 0, {'\\','|', 0x1c /* FS */} },
-  { VK_RETURN,0, {'\r', '\r', '\n'} },
-  { 0,0 }
-};
-
-ROSDATA VK_TO_WCHARS4 key_to_chars_4mod[] = {
-  /* Normal, Shifted, Ctrl, C-S-x */
-//VK_OEM_1,     VK_OEM_7,     VK_OEM_3, 
-  { VK_OEM_1,         CAPS,   {'ò', 'ç', 0x01, '@'} },
-  { VK_OEM_7,         CAPS,   {'à', '°', 0x01, '#'} },
-  
-  //VK_OEM_4,     VK_OEM_6
-  { VK_OEM_4,         CAPS,   {'è', 'é', '{', '['} },
-  { VK_OEM_6,         CAPS,   {'+', '*', '}', ']'} },
-
-  /* The alphabet */
-  { 'A',         CAPS,   {'a', 'A', 0x01, 0x01} },
-  { 'B',         CAPS,   {'b', 'B', 0x02, 0x02} },
-  { 'C',         CAPS,   {'c', 'C', 0x03, 0x03} },
-  { 'D',         CAPS,   {'d', 'D', 0x04, 0x04} },
-  { 'E',        CAPS,   {'e', 'E', 0x05, 0x20AC}  }, // eE\80
-  { 'F',         CAPS,   {'f', 'F', 0x06, 0x06} },
-  { 'G',         CAPS,   {'g', 'G', 0x07, 0x07} },
-  { 'H',         CAPS,   {'h', 'H', 0x08, 0x08} },
-  { 'I',         CAPS,   {'i', 'I', 0x09, 0x09} },
-  { 'J',         CAPS,   {'j', 'J', 0x0a, 0x0a} },
-  { 'K',         CAPS,   {'k', 'K', 0x0b, 0x0b} },
-  { 'L',         CAPS,   {'l', 'L', 0x0c, 0x0c} },
-  { 'M',         CAPS,   {'m', 'M', 0x0d, 0x0d} },
-  { 'N',         CAPS,   {'n', 'N', 0x0e, 0x0e} },
-  { 'O',         CAPS,   {'o', 'O', 0x0f, 0x0f} },
-  { 'P',         CAPS,   {'p', 'P', 0x10, 0x10} },
-  { 'Q',         CAPS,   {'q', 'Q', 0x11, 0x11} },
-  { 'R',         CAPS,   {'r', 'R', 0x12, 0x12} },
-  { 'S',         CAPS,   {'s', 'S', 0x13, 0x13} },
-  { 'T',         CAPS,   {'t', 'T', 0x14, 0x14} },
-  { 'U',         CAPS,   {'u', 'U', 0x15, 0x15} },
-  { 'V',         CAPS,   {'v', 'V', 0x16, 0x16} },
-  { 'W',         CAPS,   {'w', 'W', 0x17, 0x17} },
-  { 'X',         CAPS,   {'x', 'X', 0x18, 0x18} },
-  { 'Y',         CAPS,   {'y', 'Y', 0x19, 0x19} },
-  { 'Z',         CAPS,   {'z', 'Z', 0x1a, 0x1a} },
-
-  /* Legacy Ascii generators */
-  { '2', NOCAPS, {'2', '"', WCH_NONE, 0} },
-  { '6', NOCAPS, {'6', '&', WCH_NONE, 0x1e /* RS */} },
-  { VK_OEM_MINUS, NOCAPS, {'\'', '?', WCH_NONE, 0x1f /* US */} },
-  { 0, 0 }
-};
-
-ROSDATA VK_TO_WCHARS1 keypad_numbers[] = {
-  { VK_NUMPAD0, 0, {'0'} },
-  { VK_NUMPAD1, 0, {'1'} },
-  { VK_NUMPAD2, 0, {'2'} },
-  { VK_NUMPAD3, 0, {'3'} },
-  { VK_NUMPAD4, 0, {'4'} },
-  { VK_NUMPAD5, 0, {'5'} },
-  { VK_NUMPAD6, 0, {'6'} },
-  { VK_NUMPAD7, 0, {'7'} },
-  { VK_NUMPAD8, 0, {'8'} },
-  { VK_NUMPAD9, 0, {'9'} },
-  { VK_DECIMAL, 0, {'.'} },
-  { VK_BACK,    0, {'\010'} },
-  { 0,0 }
-};
-
-#define vk_master(n,x) { (PVK_TO_WCHARS1)x, n, sizeof(x[0]) }
-
-ROSDATA VK_TO_WCHAR_TABLE vk_to_wchar_master_table[] = {
-  vk_master(1,keypad_numbers),
-  vk_master(2,key_to_chars_2mod),
-  vk_master(3,key_to_chars_3mod),
-  vk_master(4,key_to_chars_4mod),
-  { 0,0,0 }
-};
-
-ROSDATA VSC_LPWSTR key_names[] = {
-  { 0x00, L"" },
-  { 0x01, L"Esc" },
-  { 0x0e, L"Backspace" },
-  { 0x0f, L"Tab" },
-  { 0x1c, L"Enter" },
-  { 0x1d, L"Ctrl" },
-  { 0x2a, L"Shift" },
-  { 0x36, L"Right Shift" },
-  { 0x37, L"Num *" },
-  { 0x38, L"Alt" },
-  { 0x39, L"Space" },
-  { 0x3a, L"Caps Lock" },
-  { 0x3b, L"F1" },
-  { 0x3c, L"F2" },
-  { 0x3d, L"F3" },
-  { 0x3e, L"F4" },
-  { 0x3f, L"F5" },
-  { 0x40, L"F6" },
-  { 0x41, L"F7" },
-  { 0x42, L"F8" },
-  { 0x43, L"F9" },
-  { 0x44, L"F10" },
-  { 0x45, L"Pause" },
-  { 0x46, L"Scroll Lock" },
-  { 0x47, L"Num 7" },
-  { 0x48, L"Num 8" },
-  { 0x49, L"Num 9" },
-  { 0x4a, L"Num -" },
-  { 0x4b, L"Num 4" },
-  { 0x4c, L"Num 5" },
-  { 0x4d, L"Num 6" },
-  { 0x4e, L"Num +" },
-  { 0x4f, L"Num 1" },
-  { 0x50, L"Num 2" },
-  { 0x51, L"Num 3" },
-  { 0x52, L"Num 0" },
-  { 0x53, L"Num Del" },
-  { 0x54, L"Sys Req" },
-  { 0x57, L"F11" },
-  { 0x58, L"F12" },
-  { 0x7c, L"F13" },
-  { 0x7d, L"F14" },
-  { 0x7e, L"F15" },
-  { 0x7f, L"F16" },
-  { 0x80, L"F17" },
-  { 0x81, L"F18" },
-  { 0x82, L"F19" },
-  { 0x83, L"F20" },
-  { 0x84, L"F21" },
-  { 0x85, L"F22" },
-  { 0x86, L"F23" },
-  { 0x87, L"F24" },
-  { 0, NULL },
-};
-
-ROSDATA VSC_LPWSTR extended_key_names[] = {
-  { 0x1c, L"Num Enter" },
-  { 0x1d, L"Right Ctrl" },
-  { 0x35, L"Num /" },
-  { 0x37, L"Prnt Scrn" },
-  { 0x38, L"Right Alt" },
-  { 0x45, L"Num Lock" },
-  { 0x46, L"Break" },
-  { 0x47, L"Home" },
-  { 0x48, L"Up" },
-  { 0x49, L"Page Up" },
-  { 0x4a, L"Left" },
-  { 0x4c, L"Center" },
-  { 0x4d, L"Right" },
-  { 0x4f, L"End" },
-  { 0x50, L"Down" },
-  { 0x51, L"Page Down" },
-  { 0x52, L"Insert" },
-  { 0x53, L"Delete" },
-  { 0x54, L"<ReactOS>" },
-  { 0x55, L"Help" },
-  { 0x56, L"Left Windows" },
-  { 0x5b, L"Right Windows" },
-  { 0, NULL },
-};
-
-/* Finally, the master table */
-ROSDATA KBDTABLES keyboard_layout_table = {
-  /* modifier assignments */
-  &modifier_bits,
-  
-  /* character from vk tables */
-  vk_to_wchar_master_table,
-  
-  /* diacritical marks -- currently implemented by wine code */
-  /* doesn't have any, anyway */
-  NULL,
-
-  /* Key names */
-  (VSC_LPWSTR *)key_names,
-  (VSC_LPWSTR *)extended_key_names,
-  NULL, /* Dead key names */
-
-  /* scan code to virtual key maps */
-  scancode_to_vk,
-  sizeof(scancode_to_vk) / sizeof(scancode_to_vk[0]),
-  extcode0_to_vk,
-  extcode1_to_vk,
-
-  MAKELONG(0,1), /* Version 1.0 */
-
-  /* Ligatures -- English doesn't have any */
-  0,
-  0,
-  NULL
-};
-
-PKBDTABLES STDCALL KbdLayerDescriptor(VOID) {
-  return &keyboard_layout_table;
-}
-
diff --git a/reactos/dll/keyboard/kbdit/kbdit.def b/reactos/dll/keyboard/kbdit/kbdit.def
deleted file mode 100644 (file)
index 6ba0999..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-LIBRARY kbdit.dll
-
-EXPORTS
-KbdLayerDescriptor
diff --git a/reactos/dll/keyboard/kbdit/kbdit.rbuild b/reactos/dll/keyboard/kbdit/kbdit.rbuild
deleted file mode 100644 (file)
index 7caef36..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<module name="kbdit" type="kernelmodedll" entrypoint="0" installbase="system32" installname="kbdit.dll" allowwarnings="true">
-       <importlibrary definition="kbdit.def" />
-       <include base="ntoskrnl">include</include>
-       <define name="_DISABLE_TIDENTS" />
-       <define name="__USE_W32API" />
-       <define name="_WIN32_WINNT">0x0500</define>
-       <file>kbdit.c</file>
-       <file>kbdit.rc</file>
-</module>
diff --git a/reactos/dll/keyboard/kbdit/kbdit.rc b/reactos/dll/keyboard/kbdit/kbdit.rc
deleted file mode 100644 (file)
index 66f396e..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#define REACTOS_VERSION_DLL
-#define REACTOS_STR_FILE_DESCRIPTION   "ReactOS Italian Keyboard Layout\0"
-#define REACTOS_STR_INTERNAL_NAME      "kbdit\0"
-#define REACTOS_STR_ORIGINAL_FILENAME  "kbdit.dll\0"
-#include <reactos/version.rc>
index fa47713..012d708 100644 (file)
@@ -23,9 +23,6 @@
        <directory name="kbdhu">
                <xi:include href="kbdhu/kbdhu.rbuild" />
        </directory>
-       <directory name="kbdit">
-               <xi:include href="kbdit/kbdit.rbuild" />
-       </directory>
        <directory name="kbdru">
                <xi:include href="kbdru/kbdru.rbuild" />
        </directory>
diff --git a/reactos/dll/lib.mak b/reactos/dll/lib.mak
new file mode 100644 (file)
index 0000000..981cd7f
--- /dev/null
@@ -0,0 +1,5 @@
+LIB_BASE = lib
+LIB_BASE_ = $(LIB_BASE)$(SEP)
+
+include $(LIB_BASE_)zlib/zlib.mak
+include $(LIB_BASE_)inflib/inflib.mak
index fd85585..e76644c 100644 (file)
@@ -29,8 +29,7 @@
 #ifdef NDEBUG
 #if defined(__GNUC__)
 #define TRACE_LDR(args...) if (RtlGetNtGlobalFlags() & FLG_SHOW_LDR_SNAPS) { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); }
-#elif defined(_MSC_VER)
-#define TRACE_LDR(args, ...) if (RtlGetNtGlobalFlags() & FLG_SHOW_LDR_SNAPS) { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(__VA_ARGS__); }
+#else
 #endif /* __GNUC__ */
 #else
 #define TRACE_LDR(args...) do { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } while(0)
@@ -737,7 +736,7 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
 
   TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n",
             Name,
-            SearchPath ? L" from " : L"",
+            SearchPath ? " from " : "",
             SearchPath ? SearchPath : L"");
 
   if (Name == NULL)
index 9c6984a..7fc5e70 100644 (file)
@@ -1,12 +1,12 @@
 LIBRARY acledit.dll
 
 EXPORTS
-EditAuditInfo
-EditOwnerInfo
-EditPermissionInfo
-FMExtensionProcW
-SedDiscretionaryAclEditor
-SedSystemAclEditor
-SedTakeOwnership
+EditAuditInfo@4
+EditOwnerInfo@4
+EditPermissionInfo@4
+FMExtensionProcW@12
+SedDiscretionaryAclEditor@52
+SedSystemAclEditor@48
+SedTakeOwnership@56
 
 ; EOF
index 8c7be8f..65aef08 100644 (file)
@@ -130,7 +130,7 @@ NotifyControlParent(IN PCHECKLISTWND infoPtr,
 
 static PCHECKITEM
 FindCheckItemByIndex(IN PCHECKLISTWND infoPtr,
-                     IN INT Index)
+                     IN UINT Index)
 {
     PCHECKITEM Item, Found = NULL;
     
index 0fb67ad..e8f83d4 100644 (file)
@@ -262,7 +262,7 @@ InvokeObjectPickerDialog(IN IDsObjectPicker *pDsObjectPicker,
         STGMEDIUM stm;
         FORMATETC fe;
 
-        fe.cfFormat = (WORD)RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST);
+        fe.cfFormat = RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST);
         fe.ptd = NULL;
         fe.dwAspect = DVASPECT_CONTENT;
         fe.lindex = -1;
index b621c53..a35ff08 100644 (file)
@@ -1,6 +1,5 @@
 #define WIN32_NO_STATUS
 #define NTOS_MODE_USER
-#define _ACLUI_
 #include <windows.h>
 #include <ndk/ntndk.h>
 #include <commctrl.h>
index 7154c0b..6b38fc5 100644 (file)
@@ -1111,7 +1111,7 @@ IsWellKnownSid(IN PSID pSid,
 
     for (i = 0; i < sizeof(WellKnownSids)/sizeof(WellKnownSids[0]); i++)
         if (WellKnownSids[i].Type == WellKnownSidType)
-            if (EqualSid(pSid, (PSID)((ULONG_PTR)&WellKnownSids[i].Sid.Revision)))
+            if (EqualSid(pSid, (PSID)&(WellKnownSids[i].Sid.Revision)))
                 return TRUE;
 
     return FALSE;
index a0e43fb..5c4fc5d 100644 (file)
@@ -47,7 +47,7 @@ static PACTIVE_SERVICE lpActiveServices = NULL;
 /* FUNCTIONS *****************************************************************/
 
 static PACTIVE_SERVICE
-ScLookupServiceByServiceName(LPCWSTR lpServiceName)
+ScLookupServiceByServiceName(LPWSTR lpServiceName)
 {
     DWORD i;
 
@@ -441,7 +441,7 @@ RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName,
 {
     PACTIVE_SERVICE Service;
 
-    Service = ScLookupServiceByServiceName(lpServiceName);
+    Service = ScLookupServiceByServiceName((LPWSTR)lpServiceName);
     if (Service == NULL)
     {
         return (SERVICE_STATUS_HANDLE)NULL;
diff --git a/reactos/dll/win32/beepmidi/beepmidi.c b/reactos/dll/win32/beepmidi/beepmidi.c
deleted file mode 100644 (file)
index f3b3a3c..0000000
+++ /dev/null
@@ -1,903 +0,0 @@
-/*
-    BeepMidi :: beep.sys MIDI player
-
-    (c) Andrew Greenwood, 2007.
-
-    Released as open-source software. You may copy, re-distribute and modify
-    this software, provided this copyright notice remains intact.
-
-    Please see the included README.TXT for more information
-
-    HISTORY :
-        16th January 2007   Started
-        17th January 2007   Polyphony support and threading added
-        18th January 2007   Made threading optional, added comments
-*/
-
-/* The timeslice to allocate for all playing notes (in milliseconds) */
-#define TIMESLICE_SIZE  60
-
-/*
-    If this is defined, notes are added to the playing list, even if
-    they already exist. As a result, the note will sound twice during
-    each timeslice. Also each note on will require a corresponding note
-    off event.
-*/
-#define ALLOW_DUPLICATE_NOTES
-
-/*
-    The maximum number of notes that may be playing at any one time.
-    Higher values result in a messier sound as all the frequencies get
-    mashed together. Do not set this below 2. Recommended = 4
-*/
-#define POLYPHONY   3
-
-/*
-    Define CONTINUOUS_NOTES to perform note playback in a separate thread.
-    This was originally the intended behaviour, but after experimentation
-    doesn't sound as good for MIDI files which have a lot going on. If not
-    defined, all playing notes are output in sequence as a new note starts.
-*/
-#define CONTINUOUS_NOTES
-
-#define WIN32_NO_STATUS
-#define NTOS_MODE_USER
-#include <windows.h>
-#include <ndk/ntndk.h>
-#include <stdio.h>
-#include <ntddbeep.h>
-#include <math.h>
-
-#include <mmddk.h>
-#include <mmsystem.h>
-
-#define DPRINT printf
-//#define DPRINT //
-
-/* A few MIDI command categories */
-#define MIDI_NOTE_OFF       0x80
-#define MIDI_NOTE_ON        0x90
-#define MIDI_CONTROL_CHANGE 0xB0
-#define MIDI_PROGRAM        0xC0
-#define MIDI_PITCH_BEND     0xE0
-#define MIDI_SYSTEM         0xFF
-
-/* Specific commands */
-#define MIDI_RESET          0xFF
-
-
-typedef struct _NoteNode
-{
-    struct _NoteNode* next;
-    struct _NoteNode* previous;
-
-    UCHAR note;
-    UCHAR velocity; /* 0 is note-off */
-} NoteNode;
-
-typedef struct _DeviceInfo
-{
-    HDRVR mme_handle;
-    HANDLE kernel_device;
-
-    DWORD callback;
-    DWORD instance;
-    DWORD flags;
-
-    UCHAR running_status;
-
-    DWORD playing_notes_count;
-    NoteNode* note_list;
-    BOOL refresh_notes;
-
-    HANDLE thread_handle;
-    BOOL terminate_thread;
-    HANDLE thread_termination_complete;
-} DeviceInfo;
-
-DeviceInfo* the_device;
-CRITICAL_SECTION device_lock;
-
-void
-FakePrintf(char* str, ...)
-{
-    /* Just to shut the compiler up */
-}
-
-
-/*
-    This is designed to be treated as a thread, however it behaves as a
-    normal function if CONTINUOUS_NOTES is not defined.
-*/
-
-DWORD WINAPI
-ProcessPlayingNotes(
-    LPVOID parameter)
-{
-    DeviceInfo* device_info = (DeviceInfo*) parameter;
-    NTSTATUS status;
-    IO_STATUS_BLOCK io_status_block;
-    DWORD arp_notes;
-
-    DPRINT("Note processing started\n");
-
-    /* We lock the note list only while accessing it */
-
-#ifdef CONTINUOUS_NOTES
-    while ( ! device_info->terminate_thread )
-#endif
-    {
-        NoteNode* node;
-
-        /* Number of notes being arpeggiated */
-        arp_notes = 1;
-
-        EnterCriticalSection(&device_lock);
-
-        /* Calculate how much time to allocate to each playing note */
-
-        DPRINT("%d notes active\n", (int) device_info->playing_notes_count);
-
-        node = device_info->note_list;
-
-        while ( ( node != NULL ) && ( arp_notes <= POLYPHONY ) )
-        {
-            DPRINT("playing..\n");
-            BEEP_SET_PARAMETERS beep_data;
-            DWORD actually_playing = 0;
-
-            double frequency = node->note;
-            frequency = frequency / 12;
-            frequency = pow(2, frequency);
-            frequency = 8.1758 * frequency;
-
-            if (device_info->playing_notes_count > POLYPHONY)
-                actually_playing = POLYPHONY;
-            else
-                actually_playing = device_info->playing_notes_count;
-
-            DPRINT("Frequency %f\n", frequency);
-
-            // TODO
-            beep_data.Frequency = (DWORD) frequency;
-            beep_data.Duration = TIMESLICE_SIZE / actually_playing; /* device_info->playing_notes_count; */
-
-            status = NtDeviceIoControlFile(device_info->kernel_device,
-                                           NULL,
-                                           NULL,
-                                           NULL,
-                                           &io_status_block,
-                                           IOCTL_BEEP_SET,
-                                           &beep_data,
-                                           sizeof(BEEP_SET_PARAMETERS),
-                                           NULL,
-                                           0);
-
-            if ( ! NT_SUCCESS(status) )
-            {
-                DPRINT("ERROR %d\n", (int) GetLastError());
-            }
-
-            SleepEx(beep_data.Duration, TRUE);
-
-            if ( device_info->refresh_notes )
-            {
-                device_info->refresh_notes = FALSE;
-                break;
-            }
-
-            arp_notes ++;
-            node = node->next;
-        }
-
-        LeaveCriticalSection(&device_lock);
-    }
-
-#ifdef CONTINUOUS_NOTES
-    SetEvent(device_info->thread_termination_complete);
-#endif
-
-    return 0;
-}
-
-
-/*
-    Fills a MIDIOUTCAPS structure with information about our device.
-*/
-
-MMRESULT
-GetDeviceCapabilities(
-    MIDIOUTCAPS* caps)
-{
-    /* These are ignored for now */
-    caps->wMid = 0;
-    caps->wPid = 0;
-
-    caps->vDriverVersion = 0x0100;
-
-    memset(caps->szPname, 0, sizeof(caps->szPname));
-    memcpy(caps->szPname, L"PC speaker\0", strlen("PC speaker\0") * 2);
-
-    caps->wTechnology = MOD_SQSYNTH;
-
-    caps->wVoices = 1;              /* We only have one voice */
-    caps->wNotes = POLYPHONY;
-    caps->wChannelMask = 0xFFBF;    /* Ignore channel 10 */
-
-    caps->dwSupport = 0;
-
-    return MMSYSERR_NOERROR;
-}
-
-
-/*
-    Helper function that just simplifies calling the application making use
-    of us.
-*/
-
-BOOL
-CallClient(
-    DeviceInfo* device_info,
-    DWORD message,
-    DWORD parameter1,
-    DWORD parameter2)
-{
-    DPRINT("Calling client - callback 0x%x mmhandle 0x%x\n", (int) device_info->callback, (int) device_info->mme_handle);
-    return DriverCallback(device_info->callback,
-                          HIWORD(device_info->flags),
-                          device_info->mme_handle,
-                          message,
-                          device_info->instance,
-                          parameter1,
-                          parameter2);
-
-}
-
-
-/*
-    Open the kernel-mode device and allocate resources. This opens the
-    BEEP.SYS kernel device.
-*/
-
-MMRESULT
-OpenDevice(
-    DeviceInfo** private_data,
-    MIDIOPENDESC* open_desc,
-    DWORD flags)
-{
-    NTSTATUS status;
-    HANDLE heap;
-    HANDLE kernel_device;
-    UNICODE_STRING beep_device_name;
-    OBJECT_ATTRIBUTES attribs;
-    IO_STATUS_BLOCK status_block;
-
-    /* One at a time.. */
-    if ( the_device )
-    {
-        DPRINT("Already allocated\n");
-        return MMSYSERR_ALLOCATED;
-    }
-
-    /* Make the device name into a unicode string and open it */
-
-    RtlInitUnicodeString(&beep_device_name,
-                            L"\\Device\\Beep");
-
-    InitializeObjectAttributes(&attribs,
-                                &beep_device_name,
-                                0,
-                                NULL,
-                                NULL);
-
-    status = NtCreateFile(&kernel_device,
-                            FILE_READ_DATA | FILE_WRITE_DATA,
-                            &attribs,
-                            &status_block,
-                            NULL,
-                            0,
-                            FILE_SHARE_READ | FILE_SHARE_WRITE,
-                            FILE_OPEN_IF,
-                            0,
-                            NULL,
-                            0);
-
-    if ( ! NT_SUCCESS(status) )
-    {
-        DPRINT("Could not connect to BEEP device - %d\n", (int) GetLastError());
-        return MMSYSERR_ERROR;
-    }
-
-    DPRINT("Opened!\n");
-
-    /* Allocate and initialize the device info */
-
-    heap = GetProcessHeap();
-
-    the_device = HeapAlloc(heap, HEAP_ZERO_MEMORY, sizeof(DeviceInfo));
-
-    if ( ! the_device )
-    {
-        DPRINT("Out of memory\n");
-        return MMSYSERR_NOMEM;
-    }
-
-    /* Initialize */
-    the_device->kernel_device = kernel_device;
-    the_device->playing_notes_count = 0;
-    the_device->note_list = NULL;
-    the_device->thread_handle = 0;
-    the_device->terminate_thread = FALSE;
-    the_device->running_status = 0;
-
-    // TODO
-    the_device->mme_handle = (HDRVR) open_desc->hMidi;
-    the_device->callback = open_desc->dwCallback;
-    the_device->instance = open_desc->dwInstance;
-    the_device->flags = flags;
-
-    /* Store the pointer in the user data */
-    *private_data = the_device;
-
-    /* This is threading-related code */
-#ifdef CONTINUOUS_NOTES
-    the_device->thread_termination_complete = CreateEvent(NULL, FALSE, FALSE, NULL);
-
-    if ( ! the_device->thread_termination_complete )
-    {
-        DPRINT("CreateEvent failed\n");
-        HeapFree(heap, 0, the_device);
-        return MMSYSERR_NOMEM;
-    }
-
-    the_device->thread_handle = CreateThread(NULL,
-                                             0,
-                                             ProcessPlayingNotes,
-                                             (PVOID) the_device,
-                                             0,
-                                             NULL);
-
-    if ( ! the_device->thread_handle )
-    {
-        DPRINT("CreateThread failed\n");
-        CloseHandle(the_device->thread_termination_complete);
-        HeapFree(heap, 0, the_device);
-        return MMSYSERR_NOMEM;
-    }
-#endif
-
-    /* Now we call the client application to say the device is open */
-    DPRINT("Sending MOM_OPEN\n");
-    DPRINT("Success? %d\n", (int) CallClient(the_device, MOM_OPEN, 0, 0));
-
-    return MMSYSERR_NOERROR;
-}
-
-
-/*
-    Close the kernel-mode device.
-*/
-
-MMRESULT
-CloseDevice(DeviceInfo* device_info)
-{
-    HANDLE heap = GetProcessHeap();
-
-    /* If we're working in threaded mode we need to wait for thread to die */
-#ifdef CONTINUOUS_NOTES
-    the_device->terminate_thread = TRUE;
-
-    WaitForSingleObject(the_device->thread_termination_complete, INFINITE);
-
-    CloseHandle(the_device->thread_termination_complete);
-#endif
-
-    /* Let the client application know the device is closing */
-    DPRINT("Sending MOM_CLOSE\n");
-    CallClient(device_info, MOM_CLOSE, 0, 0);
-
-    NtClose(device_info->kernel_device);
-
-    /* Free resources */
-    HeapFree(heap, 0, device_info);
-
-    the_device = NULL;
-
-    return MMSYSERR_NOERROR;
-}
-
-
-/*
-    Removes a note from the playing notes list. If the note is not playing,
-    we just pretend nothing happened.
-*/
-
-MMRESULT
-StopNote(
-    DeviceInfo* device_info,
-    UCHAR note)
-{
-    HANDLE heap = GetProcessHeap();
-    NoteNode* node;
-    NoteNode* prev_node = NULL;
-
-    DPRINT("StopNote\n");
-
-    EnterCriticalSection(&device_lock);
-
-    node = device_info->note_list;
-
-    while ( node != NULL )
-    {
-        if ( node->note == note )
-        {
-            /* Found the note - just remove the node from the list */
-
-            DPRINT("Stopping note %d\n", (int) node->note);
-
-            if ( prev_node != NULL )
-                prev_node->next = node->next;
-            else
-                device_info->note_list = node->next;
-
-            HeapFree(heap, 0, node);
-
-            device_info->playing_notes_count --;
-
-            DPRINT("Note stopped - now playing %d notes\n", (int) device_info->playing_notes_count);
-
-            LeaveCriticalSection(&device_lock);
-            device_info->refresh_notes = TRUE;
-
-            return MMSYSERR_NOERROR;
-        }
-
-        prev_node = node;
-        node = node->next;
-    }
-
-    LeaveCriticalSection(&device_lock);
-
-    /* Hmm, a good idea? */
-#ifndef CONTINUOUS_NOTES
-    ProcessPlayingNotes((PVOID) device_info);
-#endif
-
-    return MMSYSERR_NOERROR;
-}
-
-
-/*
-    Adds a note to the playing notes list. If the note is already playing,
-    the definition of ALLOW_DUPLICATE_NOTES determines if an existing note
-    may be duplicated. Otherwise, duplicate notes are ignored.
-*/
-
-MMRESULT
-PlayNote(
-    DeviceInfo* device_info,
-    UCHAR note,
-    UCHAR velocity)
-{
-    HANDLE heap = GetProcessHeap();
-
-    DPRINT("PlayNote\n");
-
-    NoteNode* node;
-
-    if ( velocity == 0 )
-    {
-        DPRINT("Zero velocity\n");
-
-        /* Velocity zero is effectively a "note off" */
-        StopNote(device_info, note);
-    }
-    else
-    {
-        /* Start playing the note */
-        NoteNode* new_node;
-        NoteNode* tail_node = NULL;
-
-        EnterCriticalSection(&device_lock);
-    
-        node = device_info->note_list;
-    
-        while ( node != NULL )
-        {
-#ifndef ALLOW_DUPLICATE_NOTES
-            if ( ( node->note == note ) && ( velocity > 0 ) )
-            {
-                /* The note is already playing - do nothing */
-                DPRINT("Duplicate note playback request ignored\n");
-                LeaveCriticalSection(&device_lock);
-                return MMSYSERR_NOERROR;
-            }
-#endif
-
-            tail_node = node;
-            node = node->next;
-        }
-
-        new_node = HeapAlloc(heap, HEAP_ZERO_MEMORY, sizeof(NoteNode));
-
-        if ( ! new_node )
-        {
-            LeaveCriticalSection(&device_lock);
-            return MMSYSERR_NOMEM;
-        }
-
-        new_node->note = note;
-        new_node->velocity = velocity;
-
-        /*
-            Prepend to the playing notes list. If exceeding polyphony,
-            remove the oldest note (which will be at the tail.)
-        */
-
-        if ( device_info->note_list )
-            device_info->note_list->previous = new_node;
-
-        new_node->next = device_info->note_list;
-        new_node->previous = NULL;
-
-        device_info->note_list = new_node;
-        device_info->playing_notes_count ++;
-
-/*
-        if ( device_info->playing_notes_count > POLYPHONY )
-        {
-            ASSERT(tail_node);
-
-            DPRINT("Polyphony exceeded\n");
-
-            tail_node->previous->next = NULL;
-
-            HeapFree(heap, 0, tail_node);
-
-            device_info->playing_notes_count --;
-        }
-*/
-
-        LeaveCriticalSection(&device_lock);
-
-        DPRINT("Note started - now playing %d notes\n", (int) device_info->playing_notes_count);
-        device_info->refresh_notes = TRUE;
-    }
-
-#ifndef CONTINUOUS_NOTES
-    ProcessPlayingNotes((PVOID) device_info);
-#endif
-
-    return MMSYSERR_NOERROR;
-}
-
-/*
-    Decipher a short MIDI message (which is a MIDI message packed into a DWORD.)
-    This will set "running status", but does not take this into account when
-    processing messages (is this necessary?)
-*/
-
-MMRESULT
-ProcessShortMidiMessage(
-    DeviceInfo* device_info,
-    DWORD message)
-{
-    DWORD status;
-
-    DWORD category;
-    DWORD channel;
-    DWORD data1, data2;
-
-    status = message & 0x000000FF;
-
-    /* Deal with running status */
-
-    if ( status < MIDI_NOTE_OFF )
-    {
-        status = device_info->running_status;
-    }
-
-    /* Ensure the status is sane! */
-
-    if ( status < MIDI_NOTE_OFF )
-    {
-        /* It's garbage, ignore it */
-        return MMSYSERR_NOERROR;
-    }
-
-    /* Figure out the message category and channel */
-
-    category = status & 0xF0;
-    channel = status & 0x0F;    /* we don't use this */
-
-    data1 = (message & 0x0000FF00) >> 8;
-    data2 = (message & 0x00FF0000) >> 16;
-
-    DPRINT("0x%x, %d, %d\n", (int) status, (int) data1, (int) data2);
-
-    /* Filter drums (which are *usually* on channel 10) */
-    if ( channel == 10 )
-    {
-        return MMSYSERR_NOERROR;
-    }
-
-    /* Pass to the appropriate message handler */
-
-    switch ( category )
-    {
-        case MIDI_NOTE_ON :
-        {
-            PlayNote(device_info, data1, data2);
-            break;
-        }
-
-        case MIDI_NOTE_OFF :
-        {
-            StopNote(device_info, data1);
-            break;
-        }
-    }
-
-    return MMSYSERR_NOERROR;
-}
-
-
-#define PACK_MIDI(b1, b2, b3) \
-    ((b3 * 65536) + (b2 * 256) + b1);
-
-
-/*
-    Processes a "long" MIDI message (ie, a MIDI message contained within a
-    buffer.) This is intended for supporting SysEx data, or blocks of MIDI
-    events. However in our case we're only interested in short MIDI messages,
-    so we scan the buffer, and each time we encounter a valid status byte
-    we start recording it as a new event. Once 3 bytes or a new status is
-    received, the event is passed to the short message handler.
-*/
-
-MMRESULT
-ProcessLongMidiMessage(
-    DeviceInfo* device_info,
-    MIDIHDR* header)
-{
-    int index = 0;
-    UCHAR* midi_bytes = (UCHAR*) header->lpData;
-
-    int msg_index = 0;
-    UCHAR msg[3];
-
-    /* Initialize the buffer */
-    msg[0] = msg[1] = msg[2] = 0;
-
-    if ( ! ( header->dwFlags & MHDR_PREPARED ) )
-    {
-        DPRINT("Not prepared!\n");
-        return MIDIERR_UNPREPARED;
-    }
-
-    DPRINT("Processing %d bytes of MIDI\n", (int) header->dwBufferLength);
-
-    while ( index < header->dwBufferLength )
-    {
-        /* New status byte? ( = new event) */
-        if ( midi_bytes[index] & 0x80 )
-        {
-            DWORD short_msg;
-
-            /* Deal with the existing event */
-
-            if ( msg[0] & 0x80 )
-            {
-                short_msg = PACK_MIDI(msg[0], msg[1], msg[2]);
-
-                DPRINT("Complete msg is 0x%x %d %d\n", (int) msg[0], (int) msg[1], (int) msg[2]);
-                ProcessShortMidiMessage(device_info, short_msg);
-            }
-
-            /* Set new running status and start recording the event */
-            DPRINT("Set new running status\n");
-            device_info->running_status = midi_bytes[index];
-            msg[0] = midi_bytes[index];
-            msg_index = 1;
-        }
-
-        /* Unexpected data byte? ( = re-use previous status) */
-        else if ( msg_index == 0 )
-        {
-            if ( device_info->running_status & 0x80 )
-            {
-                DPRINT("Retrieving running status\n");
-                msg[0] = device_info->running_status;
-                msg[1] = midi_bytes[index];
-                msg_index = 2;
-            }
-            else
-                DPRINT("garbage\n");
-        }
-
-        /* Expected data ( = append to message until buffer full) */
-        else
-        {
-            DPRINT("Next byte...\n");
-            msg[msg_index] = midi_bytes[index];
-            msg_index ++;
-
-            if ( msg_index > 2 )
-            {
-                DWORD short_msg;
-
-                short_msg = PACK_MIDI(msg[0], msg[1], msg[2]);
-
-                DPRINT("Complete msg is 0x%x %d %d\n", (int) msg[0], (int) msg[1], (int) msg[2]);
-                ProcessShortMidiMessage(device_info, short_msg);
-
-                /* Reinit */
-                msg_index = 0;
-                msg[0] = msg[1] = msg[2] = 0;
-            }
-        }
-
-        index ++;
-    }
-
-    /*
-        We're meant to clear MHDR_DONE and set MHDR_INQUEUE but since we
-        deal with everything here and now we might as well just say so.
-    */
-    header->dwFlags |= MHDR_DONE;
-    header->dwFlags &= ~ MHDR_INQUEUE;
-
-    DPRINT("Success? %d\n", (int) CallClient(the_device, MOM_DONE, (DWORD) header, 0));
-
-    return MMSYSERR_NOERROR;
-}
-
-
-/*
-    Exported function that receives messages from WINMM (the MME API.)
-*/
-
-FAR PASCAL
-MMRESULT
-modMessage(
-    UINT device_id,
-    UINT message,
-    DWORD private_data,
-    DWORD parameter1,
-    DWORD parameter2)
-{
-    switch ( message )
-    {
-        case MODM_GETNUMDEVS :
-        {
-            /* Only one internal PC speaker device (and even that's too much) */
-            DPRINT("MODM_GETNUMDEVS\n");
-            return 1;
-        }
-
-        case MODM_GETDEVCAPS :
-        {
-            DPRINT("MODM_GETDEVCAPS\n");
-            return GetDeviceCapabilities((MIDIOUTCAPS*) parameter1);
-        }
-
-        case MODM_OPEN :
-        {
-            DPRINT("MODM_OPEN\n");
-
-            return OpenDevice((DeviceInfo**) private_data,
-                              (MIDIOPENDESC*) parameter1,
-                              parameter2);
-        }
-
-        case MODM_CLOSE :
-        {
-            DPRINT("MODM_CLOSE\n");
-            return CloseDevice((DeviceInfo*) private_data);
-        }
-
-        case MODM_DATA :
-        {
-            return ProcessShortMidiMessage((DeviceInfo*) private_data, parameter1);
-        }
-
-        case MODM_PREPARE :
-        {
-            /* We don't bother with this */
-            MIDIHDR* hdr = (MIDIHDR*) parameter1;
-            hdr->dwFlags |= MHDR_PREPARED;
-            return MMSYSERR_NOERROR;
-        }
-
-        case MODM_UNPREPARE :
-        {
-            MIDIHDR* hdr = (MIDIHDR*) parameter1;
-            hdr->dwFlags &= ~MHDR_PREPARED;
-            return MMSYSERR_NOERROR;
-        }
-
-        case MODM_LONGDATA :
-        {
-            DPRINT("LONGDATA\n");
-            return ProcessLongMidiMessage((DeviceInfo*) private_data, (MIDIHDR*) parameter1);
-        }
-
-        case MODM_RESET :
-        {
-            /* TODO */
-            break;
-        }
-    }
-
-    DPRINT("Not supported %d\n", message);
-
-    return MMSYSERR_NOTSUPPORTED;
-}
-
-
-/*
-    Driver entrypoint.
-*/
-
-FAR PASCAL LONG
-DriverProc(
-    DWORD driver_id,
-    HDRVR driver_handle,
-    UINT message,
-    LONG parameter1,
-    LONG parameter2)
-{
-    switch ( message )
-    {
-        case DRV_LOAD :
-            DPRINT("DRV_LOAD\n");
-            the_device = NULL;
-            return 1L;
-
-        case DRV_FREE :
-            DPRINT("DRV_FREE\n");
-            return 1L;
-
-        case DRV_OPEN :
-            DPRINT("DRV_OPEN\n");
-            InitializeCriticalSection(&device_lock);
-            return 1L;
-
-        case DRV_CLOSE :
-            DPRINT("DRV_CLOSE\n");
-            return 1L;
-
-        case DRV_ENABLE :
-            DPRINT("DRV_ENABLE\n");
-            return 1L;
-
-        case DRV_DISABLE :
-            DPRINT("DRV_DISABLE\n");
-            return 1L;
-
-        /*
-            We don't provide configuration capabilities. This used to be
-            for things like I/O port, IRQ, DMA settings, etc.
-        */
-
-        case DRV_QUERYCONFIGURE :
-            DPRINT("DRV_QUERYCONFIGURE\n");
-            return 0L;
-
-        case DRV_CONFIGURE :
-            DPRINT("DRV_CONFIGURE\n");
-            return 0L;
-
-        case DRV_INSTALL :
-            DPRINT("DRV_INSTALL\n");
-            return DRVCNF_RESTART;
-    };
-
-    DPRINT("???\n");
-
-    return DefDriverProc(driver_id,
-                         driver_handle,
-                         message,
-                         parameter1,
-                         parameter2);
-}
diff --git a/reactos/dll/win32/beepmidi/beepmidi.def b/reactos/dll/win32/beepmidi/beepmidi.def
deleted file mode 100644 (file)
index c42076e..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-; beepmidi.def
-;
-; BeepMidi driver by Andrew Greenwood
-;
-; For ReactOS Operating System
-;
-
-LIBRARY beepmidi.dll
-
-EXPORTS
-DriverProc@20
-modMessage@20
diff --git a/reactos/dll/win32/beepmidi/beepmidi.rbuild b/reactos/dll/win32/beepmidi/beepmidi.rbuild
deleted file mode 100644 (file)
index 29b4c9e..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<module name="beepmidi" type="win32dll" installbase="system32" installname="beepmidi.dll">
-       <importlibrary definition="beepmidi.def" />
-       <include base="beepmidi">.</include>
-       <define name="__USE_W32API" />
-       <define name="UNICODE" />
-       <define name="_UNICODE" />
-       <library>ntdll</library>
-       <library>kernel32</library>
-       <library>user32</library>
-       <library>winmm</library>
-       <file>beepmidi.c</file>
-</module>
diff --git a/reactos/dll/win32/beepmidi/readme.txt b/reactos/dll/win32/beepmidi/readme.txt
deleted file mode 100644 (file)
index 0c290f8..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-BEEPMIDI :: BEEP.SYS MIDI DRIVER
-(c) Andrew Greenwood, 2007.
-
-http://www.silverblade.co.uk
-
-Released as open-source software. You may copy, re-distribute and modify
-this software, provided this copyright notice remains intact.
-
-WHAT'S THIS ?
-    BeepMidi is a MME MIDI driver for NT-compatible operating systems,
-    which uses BEEP.SYS (the kernel-mode PC speaker driver) to play
-    MIDI data. It installs as a standard MIDI output device and can even
-    be selected as your default MIDI output device. The fundamental
-    code for interacting with BEEP.SYS was taken from ReactOS' kernel32
-    module.
-
-WHY WAS THIS WRITTEN ?
-    Primarily for educational reasons - in the process, I've learned more
-    about the driver side of the MME API and how to interact with kernel
-    device drivers. It aids as a good starting point from which to
-    move on to bigger and better things :)
-
-HOW TO INSTALL :
-    Copy the file to C:\WINDOWS\SYSTEM32\BEEPMIDI.DLL
-
-    Go into HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
-    Drivers32 in RegEdit and look for the "midi" entries on the right hand
-    side. Find the highest numbered one (eg: midi1) and create a new STRING
-    value. Give it another midi name, but one above the current highest
-    entry present (eg: midi2.)
-
-    You'll now see a "PC Speaker" entry in Sound & Audio Devices.
-
-TWEAKING:
-    See the comments toward the top of beepmidi.c for tweakable driver
-    parameters. These can only be adjusted in the source code at present.
-
-FEATURES :
-    * Supports note-on and note-off messages on channels 1-9 and 11-16
-      (channel 10 is rhythm, which is not supported.)
-    * Fake polyphony (actually just arpeggiates playing notes!)
-    * Threaded design for continuous playback (optional.)
-
-ROOM FOR IMPROVEMENT :
-    * Pitch bend is not supported
-    * Velocity could determine timeslice
-    * Should wait for timeslice to complete before adding/removing notes
-    * Would be nice to allow configuration of polyphony etc. via Control Panel
-
-BUGS :
-    * Crashes when used with Windows Media Player (mplayer2 is fine though)
index e4fa9c5..e440c38 100644 (file)
@@ -21,7 +21,9 @@
 #ifndef _WINE_DLL_CDLG_H
 #define _WINE_DLL_CDLG_H
 
-#include <wownt32.h>
+#define COM_NO_WINDOWS_H
+#include "dlgs.h"
+#include "wownt32.h"
 
 /* Common dialogs implementation globals */
 #define COMDLG32_Atom  ((ATOM)0xa000)  /* MS uses this one to identify props */
@@ -153,6 +155,15 @@ typedef struct {
 
 #define IDS_FAKEDOCTEXT  1300
 
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winnls.h"
+#include "commctrl.h"
+#include "shlobj.h"
+#include "shellapi.h"
+
 /* ITEMIDLIST */
 
 extern LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST);
index c927d1e..09538bf 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <precomp.h>
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "commdlg.h"
+#include "cderr.h"
+#include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
 
+#include "cdlg.h"
+
+
 HINSTANCE      COMDLG32_hInstance = 0;
 
 static DWORD COMDLG32_TlsIndex = TLS_OUT_OF_INDEXES;
index 9646fc9..ca758e3 100644 (file)
    sometimes, especially when 2 instances of the
    dialog are loaded at the same time */
 
-#include <precomp.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "commdlg.h"
+#include "dlgs.h"
+#include "wine/debug.h"
+#include "cderr.h"
+#include "cdlg.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
 
index 89228e0..bef4be9 100644 (file)
@@ -30,5 +30,4 @@
        <file>printdlg.c</file>
        <file>rsrc.rc</file>
        <file>comdlg32.spec</file>
-       <pch>precomp.h</pch>
 </module>
diff --git a/reactos/dll/win32/comdlg32/comdlg32_ros.diff b/reactos/dll/win32/comdlg32/comdlg32_ros.diff
deleted file mode 100644 (file)
index 2771619..0000000
+++ /dev/null
@@ -1,439 +0,0 @@
-Index: colordlg.c
-===================================================================
---- colordlg.c (revision 25649)
-+++ colordlg.c (working copy)
-@@ -23,20 +23,7 @@
-    sometimes, especially when 2 instances of the
-    dialog are loaded at the same time */
--#include <ctype.h>
--#include <stdlib.h>
--#include <stdarg.h>
--#include <stdio.h>
--#include <string.h>
--#include "windef.h"
--#include "winbase.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "commdlg.h"
--#include "dlgs.h"
--#include "wine/debug.h"
--#include "cderr.h"
--#include "cdlg.h"
-+#include <precomp.h>
- WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
-Index: filedlgbrowser.c
-===================================================================
---- filedlgbrowser.c   (revision 25649)
-+++ filedlgbrowser.c   (working copy)
-@@ -19,29 +19,8 @@
-  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-  */
--#include <stdarg.h>
--#include <stdio.h>
--#include <string.h>
-+#include <precomp.h>
--#define COBJMACROS
--#define NONAMELESSUNION
--#define NONAMELESSSTRUCT
--
--#include "windef.h"
--#include "winbase.h"
--#include "winnls.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "winreg.h"
--
--#define NO_SHLWAPI_STREAM
--#include "shlwapi.h"
--#include "filedlgbrowser.h"
--#include "cdlg.h"
--#include "shlguid.h"
--#include "servprov.h"
--#include "wine/debug.h"
--
- WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
- typedef struct
-Index: precomp.h
-===================================================================
---- precomp.h  (revision 0)
-+++ precomp.h  (revision 0)
-@@ -0,0 +1,76 @@
-+#ifndef PRECOMP_H__
-+#define PRECOMP_H__
-+
-+#include <ctype.h>
-+#include <stdlib.h>
-+#include <stdarg.h>
-+#include <stdio.h>
-+#include <string.h>
-+
-+#define COBJMACROS
-+#define NONAMELESSUNION
-+#define NONAMELESSSTRUCT
-+#define NO_SHLWAPI_STREAM
-+#define COM_NO_WINDOWS_H
-+#define _COMDLG32_
-+
-+#if defined (_MSC_VER)
-+#include <windef.h>
-+#include <winbase.h>
-+#include <wingdi.h>
-+#include <winuser.h>
-+#include <commdlg.h>
-+#include <shellapi.h>
-+#include <shlguid.h>
-+#include <shlobj.h>
-+#include <shlwapi.h>
-+#include <guiddef.h>
-+#include <dlgs.h>
-+#include <cderr.h>
-+#endif
-+
-+#include "wine/windef.h"
-+#include "winbase.h"
-+#include "wine/wingdi.h"
-+#include "wine/winuser.h"
-+#include "wine/commdlg.h"
-+#include "wine/shellapi.h"
-+
-+#if !defined (_MSC_VER)
-+#include "psdk/shlguid.h"
-+#include "psdk/shlobj.h"
-+#endif
-+
-+#include "wine/shlguid.h"
-+#include "wine/shlobj.h"
-+
-+#if !defined (_MSC_VER)
-+#include "psdk/shlguid.h"
-+#include "psdk/shlwapi.h"
-+#include "wine/shlwapi.h"
-+#endif
-+
-+#include "wine/winbase16.h"
-+#include "wine/winuser16.h"
-+#include "wine/guiddef.h"
-+#include "wine/dlgs.h"
-+#include "wine/debug.h"
-+#include "wine/unicode.h"
-+
-+#include <cderr.h>
-+#include <cdlg.h>
-+#include <winspool.h>
-+#include <winerror.h>
-+#include <winnls.h>
-+#include <winreg.h>
-+#include <winternl.h>
-+
-+//local headers
-+#include "cdlg.h"
-+#include "printdlg.h"
-+#include "filedlgbrowser.h"
-+#include "cdlg.h"
-+#include "servprov.h"
-+#include "filedlg31.h"
-+
-+#endif
-
-Property changes on: precomp.h
-___________________________________________________________________
-Name: svn:eol-style
-   + native
-
-Index: finddlg32.c
-===================================================================
---- finddlg32.c        (revision 25649)
-+++ finddlg32.c        (working copy)
-@@ -19,23 +19,10 @@
-  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-  */
--#include <stdarg.h>
--#include <string.h>
--#include "windef.h"
--#include "winbase.h"
--#include "winnls.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "commdlg.h"
--#include "cderr.h"
--#include "dlgs.h"
--#include "wine/debug.h"
-+#include <precomp.h>
- WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
--#include "cdlg.h"
--
--
- /*-----------------------------------------------------------------------*/
- static UINT           FindReplaceMessage;
-Index: cdlg.h
-===================================================================
---- cdlg.h     (revision 25649)
-+++ cdlg.h     (working copy)
-@@ -21,9 +21,7 @@
- #ifndef _WINE_DLL_CDLG_H
- #define _WINE_DLL_CDLG_H
--#define COM_NO_WINDOWS_H
--#include "dlgs.h"
--#include "wownt32.h"
-+#include <wownt32.h>
- /* Common dialogs implementation globals */
- #define COMDLG32_Atom ((ATOM)0xa000)  /* MS uses this one to identify props */
-@@ -155,15 +153,6 @@
- #define IDS_FAKEDOCTEXT  1300
--#include "windef.h"
--#include "winbase.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "winnls.h"
--#include "commctrl.h"
--#include "shlobj.h"
--#include "shellapi.h"
--
- /* ITEMIDLIST */
- extern LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST);
-Index: cdlg32.c
-===================================================================
---- cdlg32.c   (revision 25649)
-+++ cdlg32.c   (working copy)
-@@ -19,21 +19,10 @@
-  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-  */
--#include <stdarg.h>
-+#include <precomp.h>
--#include "windef.h"
--#include "winbase.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "commdlg.h"
--#include "cderr.h"
--#include "wine/debug.h"
--
- WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
--#include "cdlg.h"
--
--
- HINSTANCE     COMDLG32_hInstance = 0;
- static DWORD COMDLG32_TlsIndex = TLS_OUT_OF_INDEXES;
-Index: printdlg.c
-===================================================================
---- printdlg.c (revision 25649)
-+++ printdlg.c (revision 25650)
-@@ -20,32 +20,11 @@
-  * License along with this library; if not, write to the Free Software
-  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-  */
--#include <ctype.h>
--#include <stdlib.h>
--#include <stdarg.h>
--#include <stdio.h>
--#include <string.h>
--#define NONAMELESSUNION
--#define NONAMELESSSTRUCT
--#include "windef.h"
--#include "winbase.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "winspool.h"
--#include "winerror.h"
-+#include <precomp.h>
--#include "wine/debug.h"
--
--#include "commdlg.h"
--#include "dlgs.h"
--#include "cderr.h"
--
- WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
--#include "cdlg.h"
--#include "printdlg.h"
--
- /* Yes these constants are the same, but we're just copying win98 */
- #define UPDOWN_ID 0x270f
- #define MAX_COPIES 9999
-Index: fontdlg.c
-===================================================================
---- fontdlg.c  (revision 25649)
-+++ fontdlg.c  (working copy)
-@@ -19,20 +19,7 @@
-  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-  */
--#include <ctype.h>
--#include <stdlib.h>
--#include <stdarg.h>
--#include <stdio.h>
--#include <string.h>
--#include "windef.h"
--#include "winbase.h"
--#include "winnls.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "commdlg.h"
--#include "dlgs.h"
--#include "wine/debug.h"
--#include "cderr.h"
-+#include <precomp.h>
- WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
-Index: filedlg.c
-===================================================================
---- filedlg.c  (revision 25649)
-+++ filedlg.c  (working copy)
-@@ -46,40 +46,11 @@
-  *
-  */
--#include "config.h"
--#include "wine/port.h"
-+//#include "config.h"
-+//#include "wine/port.h"
--#include <ctype.h>
--#include <stdlib.h>
--#include <stdarg.h>
--#include <stdio.h>
--#include <string.h>
-+#include <precomp.h>
--#define COBJMACROS
--#define NONAMELESSUNION
--#define NONAMELESSSTRUCT
--
--#include "windef.h"
--#include "winbase.h"
--#include "winreg.h"
--#include "winternl.h"
--#include "winnls.h"
--#include "wine/unicode.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "winreg.h"
--#include "commdlg.h"
--#include "dlgs.h"
--#include "cdlg.h"
--#include "filedlg31.h"
--#include "wine/debug.h"
--#include "cderr.h"
--#include "shellapi.h"
--#include "shlguid.h"
--#include "shlobj.h"
--#include "filedlgbrowser.h"
--#include "shlwapi.h"
--
- WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
- #define UNIMPLEMENTED_FLAGS \
-Index: comdlg32.rbuild
-===================================================================
---- comdlg32.rbuild    (revision 25649)
-+++ comdlg32.rbuild    (working copy)
-@@ -30,4 +30,5 @@
-       <file>printdlg.c</file>
-       <file>rsrc.rc</file>
-       <file>comdlg32.spec</file>
-+      <pch>precomp.h</pch>
- </module>
-Index: filedlg31.c
-===================================================================
---- filedlg31.c        (revision 25649)
-+++ filedlg31.c        (working copy)
-@@ -18,33 +18,11 @@
-  * License along with this library; if not, write to the Free Software
-  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-  */
--#include <ctype.h>
--#include <stdlib.h>
--#include <stdarg.h>
--#include <stdio.h>
--#include <string.h>
--#include "windef.h"
--#include "winbase.h"
--#include "winnls.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "wine/unicode.h"
--#include "wine/debug.h"
--#include "cderr.h"
--#include "winreg.h"
--#include "winternl.h"
--#include "winuser.h"
--#include "commdlg.h"
--#include "cderr.h"
--#include "winreg.h"
--#include "winternl.h"
--#include "shlwapi.h"
-+#include <precomp.h>
-+
- WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
--#include "cdlg.h"
--#include "filedlg31.h"
--
- #define BUFFILE 512
- #define BUFFILEALLOC 512 * sizeof(WCHAR)
-Index: filetitle.c
-===================================================================
---- filetitle.c        (revision 25649)
-+++ filetitle.c        (working copy)
-@@ -19,22 +19,8 @@
-  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-  */
--#include <stdarg.h>
--#include <string.h>
-+#include <precomp.h>
--#include "windef.h"
--#include "winbase.h"
--#include "winnls.h"
--#include "winreg.h"
--#include "winternl.h"
--#include "wingdi.h"
--#include "winuser.h"
--#include "commdlg.h"
--#include "cdlg.h"
--#include "cdlg16.h"
--#include "wine/unicode.h"
--#include "wine/debug.h"
--
- WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
- /***********************************************************************
-@@ -49,11 +35,11 @@
-     LPWSTR lpWTitle;
-     RtlCreateUnicodeStringFromAsciiz(&strWFile, lpFile);
--    lpWTitle = RtlAllocateHeap( GetProcessHeap(), 0, cbBuf*sizeof(WCHAR));
-+    lpWTitle = HeapAlloc( GetProcessHeap(), 0, cbBuf*sizeof(WCHAR));
-     ret = GetFileTitleW(strWFile.Buffer, lpWTitle, cbBuf);
-     if (!ret) WideCharToMultiByte( CP_ACP, 0, lpWTitle, -1, lpTitle, cbBuf, NULL, NULL );
-     RtlFreeUnicodeString( &strWFile );
--    RtlFreeHeap( GetProcessHeap(), 0, lpWTitle );
-+    HeapFree( GetProcessHeap(), 0, lpWTitle );
-     return ret;
- }
index 8f2c426..37ce6c2 100644 (file)
  *
  */
 
-//#include "config.h"
-//#include "wine/port.h"
-
-#include <precomp.h>
+#include "config.h"
+#include "wine/port.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "winternl.h"
+#include "winnls.h"
+#include "wine/unicode.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "commdlg.h"
+#include "dlgs.h"
+#include "cdlg.h"
+#include "filedlg31.h"
+#include "wine/debug.h"
+#include "cderr.h"
+#include "shellapi.h"
+#include "shlguid.h"
+#include "shlobj.h"
+#include "filedlgbrowser.h"
+#include "shlwapi.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
 
index 060097a..79141fa 100644 (file)
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
-
-#include <precomp.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "wine/unicode.h"
+#include "wine/debug.h"
+#include "cderr.h"
+#include "winreg.h"
+#include "winternl.h"
+#include "winuser.h"
+#include "commdlg.h"
+#include "cderr.h"
+#include "winreg.h"
+#include "winternl.h"
+#include "shlwapi.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
 
+#include "cdlg.h"
+#include "filedlg31.h"
+
 #define BUFFILE 512
 #define BUFFILEALLOC 512 * sizeof(WCHAR)
 
index 7a3ecd1..1ec37ca 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <precomp.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winreg.h"
+
+#define NO_SHLWAPI_STREAM
+#include "shlwapi.h"
+#include "filedlgbrowser.h"
+#include "cdlg.h"
+#include "shlguid.h"
+#include "servprov.h"
+#include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
 
index d426bb3..753285b 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <precomp.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "winreg.h"
+#include "winternl.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "commdlg.h"
+#include "cdlg.h"
+#include "cdlg16.h"
+#include "wine/unicode.h"
+#include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
 
@@ -35,11 +49,11 @@ short WINAPI GetFileTitleA(LPCSTR lpFile, LPSTR lpTitle, WORD cbBuf)
     LPWSTR lpWTitle;
 
     RtlCreateUnicodeStringFromAsciiz(&strWFile, lpFile);
-    lpWTitle = HeapAlloc( GetProcessHeap(), 0, cbBuf*sizeof(WCHAR));
+    lpWTitle = RtlAllocateHeap( GetProcessHeap(), 0, cbBuf*sizeof(WCHAR));
     ret = GetFileTitleW(strWFile.Buffer, lpWTitle, cbBuf);
     if (!ret) WideCharToMultiByte( CP_ACP, 0, lpWTitle, -1, lpTitle, cbBuf, NULL, NULL );
     RtlFreeUnicodeString( &strWFile );
-    HeapFree( GetProcessHeap(), 0, lpWTitle );
+    RtlFreeHeap( GetProcessHeap(), 0, lpWTitle );
     return ret;
 }
 
index d876f6f..8347f15 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <precomp.h>
+#include <stdarg.h>
+#include <string.h>
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "commdlg.h"
+#include "cderr.h"
+#include "dlgs.h"
+#include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
 
+#include "cdlg.h"
+
+
 /*-----------------------------------------------------------------------*/
 
 static UINT            FindReplaceMessage;
index 73e7945..5def9a3 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <precomp.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "commdlg.h"
+#include "dlgs.h"
+#include "wine/debug.h"
+#include "cderr.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
 
diff --git a/reactos/dll/win32/comdlg32/precomp.h b/reactos/dll/win32/comdlg32/precomp.h
deleted file mode 100644 (file)
index f56f4f5..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef PRECOMP_H__
-#define PRECOMP_H__
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-
-#define COBJMACROS
-#define NONAMELESSUNION
-#define NONAMELESSSTRUCT
-#define NO_SHLWAPI_STREAM
-#define COM_NO_WINDOWS_H
-#define _COMDLG32_
-
-#if defined (_MSC_VER)
-#include <windef.h>
-#include <winbase.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include <commdlg.h>
-#include <shellapi.h>
-#include <shlguid.h>
-#include <shlobj.h>
-#include <shlwapi.h>
-#include <guiddef.h>
-#include <dlgs.h>
-#include <cderr.h>
-#endif
-
-#include "wine/windef.h"
-#include "winbase.h"
-#include "wine/wingdi.h"
-#include "wine/winuser.h"
-#include "wine/commdlg.h"
-#include "wine/shellapi.h"
-
-#if !defined (_MSC_VER)
-#include "psdk/shlguid.h"
-#include "psdk/shlobj.h"
-#endif
-
-#include "wine/shlguid.h"
-#include "wine/shlobj.h"
-
-#if !defined (_MSC_VER)
-#include "psdk/shlguid.h"
-#include "psdk/shlwapi.h"
-#include "wine/shlwapi.h"
-#endif
-
-#include "wine/winbase16.h"
-#include "wine/winuser16.h"
-#include "wine/guiddef.h"
-#include "wine/dlgs.h"
-#include "wine/debug.h"
-#include "wine/unicode.h"
-
-#include <cderr.h>
-#include <cdlg.h>
-#include <winspool.h>
-#include <winerror.h>
-#include <winnls.h>
-#include <winreg.h>
-#include <winternl.h>
-
-//local headers
-#include "cdlg.h"
-#include "printdlg.h"
-#include "filedlgbrowser.h"
-#include "cdlg.h"
-#include "servprov.h"
-#include "filedlg31.h"
-
-#endif
index 67669c5..4fb0bdb 100644 (file)
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
-
-#include <precomp.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winspool.h"
+#include "winerror.h"
+
+#include "wine/debug.h"
+
+#include "commdlg.h"
+#include "dlgs.h"
+#include "cderr.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
 
+#include "cdlg.h"
+#include "printdlg.h"
+
 /* Yes these constants are the same, but we're just copying win98 */
 #define UPDOWN_ID 0x270f
 #define MAX_COPIES 9999
index ea8bdc2..acebadc 100644 (file)
@@ -2249,7 +2249,7 @@ BOOL pe_load_debug_directory(const struct process* pcs, struct module* module,
                              const IMAGE_SECTION_HEADER* sectp, DWORD nsect,
                              const IMAGE_DEBUG_DIRECTORY* dbg, int nDbg)
 {
-    BOOL                        ret = FALSE;
+    BOOL                        ret;
     int                         i;
     struct msc_debug_info       msc_dbg;
  
@@ -2261,6 +2261,8 @@ BOOL pe_load_debug_directory(const struct process* pcs, struct module* module,
  
     _SEH_TRY
     {
+        ret = FALSE;
         /* First, watch out for OMAP data */
         for (i = 0; i < nDbg; i++)
         {
index 601131a..ce2f1af 100644 (file)
@@ -109,7 +109,7 @@ BOOL WINAPI StackWalk(DWORD MachineType, HANDLE hProcess, HANDLE hThread,
 
     if (curr_mode == stm_start)
     {
-        /*THREAD_BASIC_INFORMATION info;*/
+        THREAD_BASIC_INFORMATION info;
 
         if ((frame->AddrPC.Mode == AddrModeFlat) &&
             (frame->AddrFrame.Mode != AddrModeFlat))
index 29b28b0..40c4a0b 100644 (file)
 #undef _WIN32_WINNT
 #define _WIN32_WINNT 0x500
 #define WIN32_NO_STATUS
-#include <winsock2.h>
 #include <windows.h>
 #define NTOS_MODE_USER
 #include <ndk/ntndk.h>
+#include <winsock2.h>
 #include <nspapi.h>
 #include <iptypes.h>
 #include "iphlpapi.h"
index 6dd6a9c..4e95d4d 100644 (file)
@@ -119,7 +119,7 @@ FindFirstChangeNotificationW (
                                         NULL,//Buffer,
                                         0,//BufferLength,
                                         dwNotifyFilter,
-                                        (BOOLEAN)bWatchSubtree);
+                                        bWatchSubtree);
    if (!NT_SUCCESS(Status))
    {
       SetLastErrorByStatus(Status);
@@ -200,7 +200,7 @@ ReadDirectoryChangesW(
       lpBuffer,
       nBufferLength,
       dwNotifyFilter,
-      (BOOLEAN)bWatchSubtree
+      bWatchSubtree
       );
 
    if (!NT_SUCCESS(Status))
index e7e6776..47c3f42 100644 (file)
 
 /* INCLUDES *****************************************************************/
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
 #include "../include/debug.h"
 
 
-#define SYMLINK_FLAG_RELATIVE   1
-
-typedef struct _REPARSE_DATA_BUFFER {
-    ULONG  ReparseTag;
-    USHORT ReparseDataLength;
-    USHORT Reserved;
-    union {
-        struct {
-            USHORT SubstituteNameOffset;
-            USHORT SubstituteNameLength;
-            USHORT PrintNameOffset;
-            USHORT PrintNameLength;
-            ULONG Flags;
-            WCHAR PathBuffer[1];
-        } SymbolicLinkReparseBuffer;
-        struct {
-            USHORT SubstituteNameOffset;
-            USHORT SubstituteNameLength;
-            USHORT PrintNameOffset;
-            USHORT PrintNameLength;
-            WCHAR PathBuffer[1];
-        } MountPointReparseBuffer;
-        struct {
-            UCHAR  DataBuffer[1];
-        } GenericReparseBuffer;
-    };
-} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
-
-#define REPARSE_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
-
 /* FUNCTIONS ****************************************************************/
 
 /*
@@ -417,13 +391,13 @@ CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
     ULONG dwCreateOptions;
     DWORD dwErr;
 
-    if(!lpSymlinkFileName || !lpTargetFileName || (dwFlags | SYMBOLIC_LINK_FLAG_DIRECTORY) != SYMBOLIC_LINK_FLAG_DIRECTORY)
+    if(!lpSymlinkFileName || !lpTargetFileName || (dwFlags | SYMLINK_FLAG_DIRECTORY) != SYMLINK_FLAG_DIRECTORY)
     {
         SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
     }
 
-    if(dwFlags & SYMBOLIC_LINK_FLAG_DIRECTORY)
+    if(dwFlags & SYMLINK_FLAG_DIRECTORY)
         dwCreateOptions = FILE_DIRECTORY_FILE;
     else
         dwCreateOptions = FILE_NON_DIRECTORY_FILE;
@@ -494,8 +468,8 @@ CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
 
     pBufTail = (PBYTE)(pReparseData->SymbolicLinkReparseBuffer.PathBuffer);
 
-    pReparseData->ReparseTag = (ULONG)IO_REPARSE_TAG_SYMLINK;
-    pReparseData->ReparseDataLength = (USHORT)cbReparseData - REPARSE_DATA_BUFFER_HEADER_SIZE;
+    pReparseData->ReparseTag = IO_REPARSE_TAG_SYMLINK;
+    pReparseData->ReparseDataLength = cbReparseData - REPARSE_DATA_BUFFER_HEADER_SIZE;
     pReparseData->Reserved = 0;
 
     pReparseData->SymbolicLinkReparseBuffer.SubstituteNameOffset = 0;
@@ -504,7 +478,7 @@ CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
     RtlCopyMemory(pBufTail, TargetFileName.Buffer, TargetFileName.Length);
 
     pReparseData->SymbolicLinkReparseBuffer.PrintNameOffset = pReparseData->SymbolicLinkReparseBuffer.SubstituteNameLength;
-    pReparseData->SymbolicLinkReparseBuffer.PrintNameLength = (USHORT)cbPrintName;
+    pReparseData->SymbolicLinkReparseBuffer.PrintNameLength = cbPrintName;
     pBufTail += pReparseData->SymbolicLinkReparseBuffer.PrintNameOffset;
     RtlCopyMemory(pBufTail, lpTargetFileName, cbPrintName);
 
@@ -600,13 +574,13 @@ Cleanup:
  * @implemented
  */
 BOOLEAN
-NTAPI
+STDCALL
 CreateSymbolicLinkA(IN LPCSTR lpSymlinkFileName,
                     IN LPCSTR lpTargetFileName,
                     IN DWORD dwFlags)
 {
     PWCHAR SymlinkW, TargetW;
-    BOOLEAN Ret;
+    BOOL Ret;
 
     if(!lpSymlinkFileName || !lpTargetFileName)
     {
index 43f8650..3c2a6ad 100644 (file)
@@ -781,7 +781,7 @@ GetShortPathNameW (
             BOOLEAN spaces;
             memcpy(ustr_buf, longpath + lp, tmplen * sizeof(WCHAR));
             ustr_buf[tmplen] = '\0';
-            ustr.Length = (USHORT)tmplen * sizeof(WCHAR);
+            ustr.Length = tmplen * sizeof(WCHAR);
             if (RtlIsNameLegalDOS8Dot3(&ustr, NULL, &spaces) && !spaces)
             {
                 sp += tmplen;
@@ -889,7 +889,7 @@ SearchPathA (
                     goto Cleanup;
         }
 
-        BufferU.MaximumLength = (USHORT)nBufferLength * sizeof(WCHAR);
+        BufferU.MaximumLength = nBufferLength * sizeof(WCHAR);
         BufferU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
                                           0,
                                           BufferU.MaximumLength);
@@ -899,7 +899,7 @@ SearchPathA (
             goto Cleanup;
         }
 
-        Buffer.MaximumLength = (USHORT)nBufferLength;
+        Buffer.MaximumLength = nBufferLength;
         Buffer.Buffer = lpBuffer;
 
         RetValue = SearchPathW (NULL == lpPath ? NULL : PathU.Buffer,
index 781b157..b8491ea 100644 (file)
@@ -135,10 +135,10 @@ QueryDosDeviceA(
     while (ucchMax)
     {
       CurrentLength = min (ucchMax, MAXUSHORT / 2);
-      TargetPathU.MaximumLength = TargetPathU.Length = (USHORT)CurrentLength * sizeof(WCHAR);
+      TargetPathU.MaximumLength = TargetPathU.Length = CurrentLength * sizeof(WCHAR);
      
       TargetPathA.Length = 0;
-      TargetPathA.MaximumLength = (USHORT)CurrentLength;
+      TargetPathA.MaximumLength = CurrentLength;
 
       RtlUnicodeStringToAnsiString (&TargetPathA,
                                    &TargetPathU,
index b5e8b72..a5db894 100644 (file)
 
 /* INCLUDES *****************************************************************/
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
@@ -34,16 +38,16 @@ FilenameA2W(LPCSTR NameA, BOOL alloc)
    PUNICODE_STRING pstrW;
    NTSTATUS Status;
 
-   //ASSERT(NtCurrentTeb()->StaticUnicodeString.Buffer == NtCurrentTeb()->StaticUnicodeBuffer);
+   ASSERT(NtCurrentTeb()->StaticUnicodeString.Buffer == NtCurrentTeb()->StaticUnicodeBuffer);
    ASSERT(NtCurrentTeb()->StaticUnicodeString.MaximumLength == sizeof(NtCurrentTeb()->StaticUnicodeBuffer));
 
    RtlInitAnsiString(&str, NameA);
    pstrW = alloc ? &strW : &NtCurrentTeb()->StaticUnicodeString;
 
    if (bIsFileApiAnsi)
-        Status= RtlAnsiStringToUnicodeString( pstrW, &str, (BOOLEAN)alloc );
+        Status= RtlAnsiStringToUnicodeString( pstrW, &str, alloc );
    else
-        Status= RtlOemStringToUnicodeString( pstrW, &str, (BOOLEAN)alloc );
+        Status= RtlOemStringToUnicodeString( pstrW, &str, alloc );
 
     if (NT_SUCCESS(Status))
        return pstrW->Buffer;
@@ -81,7 +85,7 @@ FilenameU2A_FitOrFail(
       ANSI_STRING str;
 
       str.Buffer = DestA;
-      str.MaximumLength = (USHORT)destLen;
+      str.MaximumLength = destLen;
 
 
       if (bIsFileApiAnsi)
@@ -333,7 +337,7 @@ OpenFile(LPCSTR lpFileName,
                     0,
                     FileNameString.Buffer);
 
-       lpReOpenBuff->nErrCode = (WORD)RtlNtStatusToDosError(errCode);
+       lpReOpenBuff->nErrCode = RtlNtStatusToDosError(errCode);
 
        if (!NT_SUCCESS(errCode))
        {
@@ -1537,7 +1541,7 @@ CheckNameLegalDOS8Dot3W(
     if(lpOemName != NULL)
     {
       AnsiName.Buffer = lpOemName;
-      AnsiName.MaximumLength = (USHORT)OemNameSize * sizeof(CHAR);
+      AnsiName.MaximumLength = OemNameSize * sizeof(CHAR);
       AnsiName.Length = 0;
     }
 
@@ -1579,7 +1583,7 @@ CheckNameLegalDOS8Dot3A(
     if(lpOemName != NULL)
     {
       AnsiName.Buffer = lpOemName;
-      AnsiName.MaximumLength = (USHORT)OemNameSize * sizeof(CHAR);
+      AnsiName.MaximumLength = OemNameSize * sizeof(CHAR);
       AnsiName.Length = 0;
     }
 
@@ -1624,7 +1628,7 @@ GetFinalPathNameByHandleA(IN HANDLE hFile,
         cchFilePath > sizeof(FilePathW) / sizeof(FilePathW[0]))
     {
         FilePathU.Length = 0;
-        FilePathU.MaximumLength = (USHORT)cchFilePath * sizeof(WCHAR);
+        FilePathU.MaximumLength = cchFilePath * sizeof(WCHAR);
         FilePathU.Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
                                            0,
                                            FilePathU.MaximumLength);
index 792cb51..1e9be76 100644 (file)
@@ -95,7 +95,7 @@ InternalCopyFindDataA(LPWIN32_FIND_DATAA            lpFindFileData,
     lpFindFileData->nFileSizeHigh = lpFileInfo->EndOfFile.u.HighPart;
     lpFindFileData->nFileSizeLow = lpFileInfo->EndOfFile.u.LowPart;
 
-    FileNameU.Length = FileNameU.MaximumLength = (USHORT)lpFileInfo->FileNameLength;
+    FileNameU.Length = FileNameU.MaximumLength = lpFileInfo->FileNameLength;
     FileNameU.Buffer = lpFileInfo->FileName;
 
     FileNameA.MaximumLength = sizeof(lpFindFileData->cFileName) - sizeof(CHAR);
@@ -213,7 +213,7 @@ InternalFindFirstFile (
        PWSTR SearchPath;
        PWCHAR SearchPattern;
        ULONG Length;
-       BOOL bResult;
+       BOOLEAN bResult;
 
        DPRINT("FindFirstFileW(lpFileName %S)\n",
               lpFileName);
@@ -698,7 +698,7 @@ static VOID
 InternalCopyStreamInfo(IN OUT PKERNEL32_FIND_STREAM_DATA IData,
                        OUT LPVOID lpFindStreamData)
 {
-    ASSERT(IData->pCurrent);
+    ASSERT(IData->pCurrent != NULL);
 
     switch (IData->InfoLevel)
     {
index 1ced1b1..14c7c03 100644 (file)
@@ -98,8 +98,8 @@ LockFileEx(
                        &Offset,
                        &BytesToLock,
                        0,
-                       (BOOLEAN)LockImmediate,
-                       (BOOLEAN)LockExclusive);
+                       LockImmediate,
+                       LockExclusive);
    if ( !NT_SUCCESS(errCode) )
      {
       SetLastErrorByStatus (errCode);
index 19f3e8f..d34e04e 100644 (file)
@@ -919,7 +919,7 @@ GetNamedPipeHandleStateA(HANDLE hNamedPipe,
 
   if(lpUserName != NULL)
   {
-    UserNameW.MaximumLength = (USHORT)nMaxUserNameSize * sizeof(WCHAR);
+    UserNameW.MaximumLength = nMaxUserNameSize * sizeof(WCHAR);
     UserNameW.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, UserNameW.MaximumLength);
     if (UserNameW.Buffer == NULL)
     {
@@ -929,7 +929,7 @@ GetNamedPipeHandleStateA(HANDLE hNamedPipe,
 
     UserNameA.Buffer = lpUserName;
     UserNameA.Length = 0;
-    UserNameA.MaximumLength = (USHORT)nMaxUserNameSize;
+    UserNameA.MaximumLength = nMaxUserNameSize;
   }
 
   Ret = GetNamedPipeHandleStateW(hNamedPipe,
index 34c2cdb..496d775 100644 (file)
@@ -106,7 +106,7 @@ GetLogicalDriveStringsA(DWORD nBufferLength,
        for (drive = 0; drive < MAX_DOS_DRIVES; drive++)
          if (dwDriveMap & (1<<drive))
          {
-            *p++ = 'A' + (UCHAR)drive;
+            *p++ = 'A' + drive;
             *p++ = ':';
             *p++ = '\\';
             *p++ = '\0';
@@ -464,7 +464,7 @@ GetVolumeInformationA(
 
   if (lpVolumeNameBuffer)
     {
-      VolumeNameU.MaximumLength = (USHORT)nVolumeNameSize * sizeof(WCHAR);
+      VolumeNameU.MaximumLength = nVolumeNameSize * sizeof(WCHAR);
       VolumeNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
                                            0,
                                            VolumeNameU.MaximumLength);
@@ -477,7 +477,7 @@ GetVolumeInformationA(
   if (lpFileSystemNameBuffer)
     {
       FileSystemNameU.Length = 0;
-      FileSystemNameU.MaximumLength = (USHORT)nFileSystemNameSize * sizeof(WCHAR);
+      FileSystemNameU.MaximumLength = nFileSystemNameSize * sizeof(WCHAR);
       FileSystemNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
                                                0,
                                                FileSystemNameU.MaximumLength);
@@ -511,7 +511,7 @@ FailNoMem:
         {
           VolumeNameU.Length = wcslen(VolumeNameU.Buffer) * sizeof(WCHAR);
          VolumeName.Length = 0;
-         VolumeName.MaximumLength = (USHORT)nVolumeNameSize;
+         VolumeName.MaximumLength = nVolumeNameSize;
          VolumeName.Buffer = lpVolumeNameBuffer;
        }
 
@@ -519,7 +519,7 @@ FailNoMem:
        {
          FileSystemNameU.Length = wcslen(FileSystemNameU.Buffer) * sizeof(WCHAR);
          FileSystemName.Length = 0;
-         FileSystemName.MaximumLength = (USHORT)nFileSystemNameSize;
+         FileSystemName.MaximumLength = nFileSystemNameSize;
          FileSystemName.Buffer = lpFileSystemNameBuffer;
        }
 
index a2e52aa..495520b 100644 (file)
 #define DPRINT
 #endif
 #define CHECKPOINT
+#ifdef ASSERT
+#undef ASSERT
+#endif
+#define ASSERT(x)
 #else
 #define DPRINT(...) do { DbgPrint("(KERNEL32:%s:%d) ",__FILE__,__LINE__); DbgPrint(__VA_ARGS__); } while(0);
 #define CHECKPOINT do { DbgPrint("(KERNEL32:%s:%d) Checkpoint\n",__FILE__,__LINE__); } while(0);
-#endif
-
 #ifdef ASSERT
 #undef ASSERT
+#endif
 #define ASSERT(x) do { if(!x) RtlAssert("#x", __FILE__,__LINE__, ""); } while(0);
 #endif
+
 #define DPRINT1(...) do { DbgPrint("(KERNEL32:%s:%d) ",__FILE__,__LINE__); DbgPrint(__VA_ARGS__); } while(0);
 #define CHECKPOINT1 do { DbgPrint("(KERNEL32:%s:%d) Checkpoint\n",__FILE__,__LINE__); } while(0);
 
index 3ed9a64..9966f31 100755 (executable)
@@ -105,11 +105,11 @@ BasepInitializeContext(IN PCONTEXT Context,
                 
 VOID
 STDCALL
-BaseThreadStartupThunk(VOID);
+BaseThreadStartupThunk();
 
 VOID
 STDCALL
-BaseProcessStartThunk(VOID);
+BaseProcessStartThunk();
         
 __declspec(noreturn)
 VOID
index 6121ac6..a719e54 100755 (executable)
@@ -13,6 +13,7 @@
 
 /* PSDK/NDK Headers */
 #define WIN32_NO_STATUS
+#define NTOS_MODE_USER
 #define _KERNEL32_
 #include <windows.h>
 #include <tlhelp32.h>
@@ -28,6 +29,7 @@
 
 /* DDK Driver Headers */
 #include <ntddbeep.h>
+#include <ntddser.h>
 #include <mountmgr.h>
 #include <mountdev.h>
 
index fb4ee6e..347dbb8 100644 (file)
@@ -5,10 +5,15 @@
        <define name="_DISABLE_TIDENTS" />
        <define name="_SEH_NO_NATIVE_NLG" />
        <define name="__USE_W32API" />
-       <define name="_WIN32_WINNT">0x0600</define>
+       <define name="_WIN32_WINNT">0x0502</define>
        <define name="__NO_CTYPE_INLINES" />
-       <define name="WINVER">0x609</define>
+       <define name="WINVER">0x502</define>
+<!--
+       !!!  DO NOT ENABLE PCH! SOME FILES ARE NOT PCH-SAFE AS THEY DEFINE  !!!
+       !!!  _WIN32_WINNT DIFFERENTLY BEFORE INCLUDING k32.h                !!!
+
        <pch>k32.h</pch>
+-->
        <directory name="debug">
                <file>debugger.c</file>
                <file>output.c</file>
@@ -80,7 +85,7 @@
        </directory>
        <directory name="process">
                <file>cmdline.c</file>
-               <file>procsup.c</file>
+               <file>create.c</file>
                <file>job.c</file>
                <file>proc.c</file>
                <file>session.c</file>
        <define name="WINVER">0x0500</define>
        <library>kernel32_base</library>
        <library>pseh</library>
+       <library>intrlck</library>
        <library>ntdll</library>
        <linkerflag>-lgcc</linkerflag>
        <linkerflag>-nostartfiles</linkerflag>
index f52f8c6..820bd01 100644 (file)
@@ -914,12 +914,12 @@ GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer)
         /* Reset the right size and fill out the information */
         lpBuffer->dwLength = sizeof(MEMORYSTATUS);
         lpBuffer->dwMemoryLoad = lpBufferEx.dwMemoryLoad;
-        lpBuffer->dwTotalPhys = (SIZE_T)lpBufferEx.ullTotalPhys;
-        lpBuffer->dwAvailPhys = (SIZE_T)lpBufferEx.ullAvailPhys;
-        lpBuffer->dwTotalPageFile = (SIZE_T)lpBufferEx.ullTotalPageFile;
-        lpBuffer->dwAvailPageFile = (SIZE_T)lpBufferEx.ullAvailPageFile;
-        lpBuffer->dwTotalVirtual = (SIZE_T)lpBufferEx.ullTotalVirtual;
-        lpBuffer->dwAvailVirtual = (SIZE_T)lpBufferEx.ullAvailVirtual;
+        lpBuffer->dwTotalPhys = lpBufferEx.ullTotalPhys;
+        lpBuffer->dwAvailPhys = lpBufferEx.ullAvailPhys;
+        lpBuffer->dwTotalPageFile = lpBufferEx.ullTotalPageFile;
+        lpBuffer->dwAvailPageFile = lpBufferEx.ullAvailPageFile;
+        lpBuffer->dwTotalVirtual = lpBufferEx.ullTotalVirtual;
+        lpBuffer->dwAvailVirtual = lpBufferEx.ullAvailVirtual;
     }
 }
 
index 00af58d..726e454 100644 (file)
@@ -157,8 +157,8 @@ HeapExtend(HANDLE hHeap,
 {
     NTSTATUS Status;
 
-    /* Call the RTL API. Gone in Vista, so commented out. */
-    Status = STATUS_NOT_IMPLEMENTED; //RtlExtendHeap(hHeap, dwFlags, BaseAddress, dwBytes);
+    /* Call the RTL API */
+    Status = RtlExtendHeap(hHeap, dwFlags, BaseAddress, dwBytes);
     if (!NT_SUCCESS(Status))
     {
         /* We failed */
@@ -185,7 +185,7 @@ HeapQueryTagW(HANDLE hHeap,
     return RtlQueryTagHeap(hHeap,
                            dwFlags,
                            wTagIndex,
-                           (BOOLEAN)bResetCounters,
+                           bResetCounters,
                            lpTagInfo);
 }
 
@@ -204,8 +204,8 @@ HeapSummary(HANDLE hHeap,
     /* Fill in the length information */
     Usage.Length = sizeof(Usage);
 
-    /* Call RTL. Gone in Vista, so commented out */
-    Status = STATUS_NOT_IMPLEMENTED; //RtlUsageHeap(hHeap, dwFlags, &Usage);
+    /* Call RTL */
+    Status = RtlUsageHeap(hHeap, dwFlags, &Usage);
     if (!NT_SUCCESS(Status))
     {
         /* We failed */
@@ -231,8 +231,8 @@ HeapUsage(HANDLE hHeap,
 {
     NTSTATUS Status;
 
-    /* Call RTL. Gone in Vista, so commented out */
-    Status = STATUS_NOT_IMPLEMENTED; //RtlUsageHeap(hHeap, dwFlags, &Usage);
+    /* Call RTL */
+    Status = RtlUsageHeap(hHeap, dwFlags, Usage);
     if (!NT_SUCCESS(Status))
     {
         /* We failed */
index a3d64d8..4942cf5 100644 (file)
@@ -40,10 +40,10 @@ FindActCtxSectionStringA(
     }
 
     /* Call the Unicode function */
-    bRetVal = FindActCtxSectionStringW(dwFlags, 
+    bRetVal = FindActCtxSectionStringA(dwFlags, 
                                         lpExtensionGuid,
                                         ulSectionId, 
-                                        lpStringToFindW,
+                                        lpStringToFind,
                                         ReturnedData);
 
     /* Clean up */
index f7af83a..c385f34 100644 (file)
  */
 
 #include <k32.h>
-#undef SERIAL_LSRMST_ESCAPE
-#undef SERIAL_LSRMST_LSR_DATA
-#undef SERIAL_LSRMST_LSR_NODATA
-#undef SERIAL_LSRMST_MST
-#undef SERIAL_IOC_FCR_FIFO_ENABLE
-#undef SERIAL_IOC_FCR_RCVR_RESET
-#undef SERIAL_IOC_FCR_XMIT_RESET
-#undef SERIAL_IOC_FCR_DMA_MODE
-#undef SERIAL_IOC_FCR_RES1
-#undef SERIAL_IOC_FCR_RES2
-#undef SERIAL_IOC_FCR_RCVR_TRIGGER_LSB
-#undef SERIAL_IOC_FCR_RCVR_TRIGGER_MSB
-#undef SERIAL_IOC_MCR_DTR
-#undef SERIAL_IOC_MCR_RTS
-#undef SERIAL_IOC_MCR_OUT1
-#undef SERIAL_IOC_MCR_OUT2
-#undef SERIAL_IOC_MCR_LOOP
-#include <ntddser.h>
 
 #define NDEBUG
 #include "../include/debug.h"
@@ -349,7 +331,7 @@ COMMDCB_PARAM_HANDLER(data)
         return FALSE;
 
     /* success */
-    Dcb->ByteSize = (BYTE)nValue;
+    Dcb->ByteSize = nValue;
     return TRUE;
 }
 
@@ -460,7 +442,7 @@ COMMDCB_PARAM_HANDLER(parity)
         return FALSE;
 
     /* success */
-    Dcb->Parity = (BYTE)nValue;
+    Dcb->Parity = nValue;
     return TRUE;
 }
 
@@ -521,7 +503,7 @@ COMMDCB_PARAM_HANDLER(stop)
     *StopBitsSet = TRUE;
 
     /* success */
-    Dcb->StopBits = (BYTE)nValue;
+    Dcb->StopBits = nValue;
     return TRUE;
 }
 
@@ -1130,8 +1112,8 @@ GetCommState(HANDLE hFile, LPDCB lpDCB)
     if (HandFlow.FlowReplace & SERIAL_XOFF_CONTINUE) {
        lpDCB->fTXContinueOnXoff = 1;
        }
-    lpDCB->XonLim = (WORD)HandFlow.XonLimit;
-    lpDCB->XoffLim = (WORD)HandFlow.XoffLimit;
+    lpDCB->XonLim = HandFlow.XonLimit;
+    lpDCB->XoffLim = HandFlow.XoffLimit;
 
        result = DeviceIoControl(hFile, IOCTL_SERIAL_GET_CHARS,
                        NULL, 0, &SpecialChars, sizeof(SpecialChars), &dwBytesReturned, NULL);
index b2cd61f..11351b9 100644 (file)
@@ -144,7 +144,7 @@ GetComputerNameExW (
 
     case ComputerNameDnsFullyQualified:
         ResultString.Length = 0;
-        ResultString.MaximumLength = (USHORT)*nSize * sizeof(WCHAR);
+        ResultString.MaximumLength = *nSize * sizeof(WCHAR);
         ResultString.Buffer = lpBuffer;
 
         RtlZeroMemory(QueryTable, sizeof(QueryTable));
@@ -238,15 +238,15 @@ GetComputerNameExA (
        return ERROR_OUTOFMEMORY;
     }
 
-    AnsiString.MaximumLength = (USHORT)*nSize;
+    AnsiString.MaximumLength = *nSize;
     AnsiString.Length = 0;
     AnsiString.Buffer = lpBuffer;
 
     Result = GetComputerNameExW( NameType, TempBuffer, nSize );
 
     if( Result ) {
-       UnicodeString.MaximumLength = (USHORT)*nSize * sizeof(WCHAR);
-       UnicodeString.Length = (USHORT)*nSize * sizeof(WCHAR);
+       UnicodeString.MaximumLength = *nSize * sizeof(WCHAR);
+       UnicodeString.Length = *nSize * sizeof(WCHAR);
        UnicodeString.Buffer = TempBuffer;
 
        RtlUnicodeStringToAnsiString (&AnsiString,
index 22b9215..026659c 100644 (file)
 
 /* INCLUDES ******************************************************************/
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
@@ -479,7 +483,7 @@ GetConsoleCommandHistoryLengthA (DWORD      Unknown0)
 /*
  * @unimplemented
  */
-INT STDCALL
+DWORD STDCALL
 GetConsoleDisplayMode (LPDWORD lpdwMode)
      /*
       * FUNCTION: Get the console display mode
@@ -588,7 +592,7 @@ GetConsoleInputWaitHandle (VOID)
 /*
  * @unimplemented
  */
-INT STDCALL
+DWORD STDCALL
 GetCurrentConsoleFont(HANDLE hConsoleOutput,
                      BOOL bMaximumWindow,
                      PCONSOLE_FONT_INFO lpConsoleCurrentFont)
@@ -1122,7 +1126,7 @@ IntWriteConsole(HANDLE hConsoleOutput,
     Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput;
     Request->Data.WriteConsoleRequest.Unicode = bUnicode;
 
-    nChars = (USHORT)min(nNumberOfCharsToWrite, CSRSS_MAX_WRITE_CONSOLE / CharSize);
+    nChars = min(nNumberOfCharsToWrite, CSRSS_MAX_WRITE_CONSOLE / CharSize);
     Request->Data.WriteConsoleRequest.NrCharactersToWrite = nChars;
 
     SizeBytes = nChars * CharSize;
@@ -1241,8 +1245,8 @@ IntReadConsole(HANDLE hConsoleInput,
 
     Request->Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
     Request->Data.ReadConsoleRequest.Unicode = bUnicode;
-    Request->Data.ReadConsoleRequest.NrCharactersToRead = (WORD)min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
-    Request->Data.ReadConsoleRequest.nCharsCanBeDeleted = (WORD)CharsRead;
+    Request->Data.ReadConsoleRequest.NrCharactersToRead = min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
+    Request->Data.ReadConsoleRequest.nCharsCanBeDeleted = CharsRead;
     Status = CsrClientCallServer(Request,
                                  NULL,
                                  CsrRequest,
@@ -1473,7 +1477,7 @@ IntFillConsoleOutputCharacter(HANDLE hConsoleOutput,
   else
     Request.Data.FillOutputRequest.Char.AsciiChar = *((CHAR*)cCharacter);
   Request.Data.FillOutputRequest.Position = dwWriteCoord;
-  Request.Data.FillOutputRequest.Length = (WORD)nLength;
+  Request.Data.FillOutputRequest.Length = nLength;
   Status = CsrClientCallServer(&Request, NULL,
                                CsrRequest,
                                sizeof(CSR_API_MESSAGE));
@@ -2312,7 +2316,7 @@ IntWriteConsoleOutputCharacter(HANDLE hConsoleOutput,
 
     Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput;
     Request->Data.WriteConsoleOutputCharRequest.Unicode = bUnicode;
-    Request->Data.WriteConsoleOutputCharRequest.Length = (WORD)min(nLength, nChars);
+    Request->Data.WriteConsoleOutputCharRequest.Length = min(nLength, nChars);
     BytesWrite = Request->Data.WriteConsoleOutputCharRequest.Length * CharSize;
 
     memcpy(Request->Data.WriteConsoleOutputCharRequest.String, lpCharacter, BytesWrite);
@@ -2426,7 +2430,7 @@ WriteConsoleOutputAttribute(
       *lpNumberOfAttrsWritten = nLength;
    while( nLength )
       {
-        Size = (WORD)min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD));
+        Size = min(nLength, CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB / sizeof(WORD));
          Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle = hConsoleOutput;
         Request->Data.WriteConsoleOutputAttribRequest.Length = Size;
          memcpy(Request->Data.WriteConsoleOutputAttribRequest.Attribute, lpAttribute, Size * sizeof(WORD));
@@ -2475,9 +2479,9 @@ FillConsoleOutputAttribute(
 
    CsrRequest = MAKE_CSR_API(FILL_OUTPUT_ATTRIB, CSR_CONSOLE);
    Request.Data.FillOutputAttribRequest.ConsoleHandle = hConsoleOutput;
-   Request.Data.FillOutputAttribRequest.Attribute = (CHAR)wAttribute;
+   Request.Data.FillOutputAttribRequest.Attribute = wAttribute;
    Request.Data.FillOutputAttribRequest.Coord = dwWriteCoord;
-   Request.Data.FillOutputAttribRequest.Length = (WORD)nLength;
+   Request.Data.FillOutputAttribRequest.Length = nLength;
    Status = CsrClientCallServer( &Request, NULL, CsrRequest, sizeof( CSR_API_MESSAGE ) );
    if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Request.Status ) )
       {
@@ -2761,10 +2765,10 @@ SetConsoleCursorInfo(
 
 static BOOL
 IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput,
-                             const SMALL_RECT *lpScrollRectangle,
-                             const SMALL_RECT *lpClipRectangle,
+                             PSMALL_RECT lpScrollRectangle,
+                             PSMALL_RECT lpClipRectangle,
                              COORD dwDestinationOrigin,
-                             const CHAR_INFO *lpFill,
+                             PCHAR_INFO lpFill,
                              BOOL bUnicode)
 {
   CSR_API_MESSAGE Request; ULONG CsrRequest;
@@ -2842,10 +2846,10 @@ ScrollConsoleScreenBufferW(
        )
 {
   return IntScrollConsoleScreenBuffer(hConsoleOutput,
-                                      lpScrollRectangle,
-                                      lpClipRectangle,
+                                      (PSMALL_RECT)lpScrollRectangle,
+                                      (PSMALL_RECT)lpClipRectangle,
                                       dwDestinationOrigin,
-                                      lpFill,
+                                      (PCHAR_INFO)lpFill,
                                       TRUE);
 }
 
@@ -2887,7 +2891,7 @@ SetConsoleTextAttribute(
 
    CsrRequest = MAKE_CSR_API(SET_ATTRIB, CSR_CONSOLE);
    Request.Data.SetAttribRequest.ConsoleHandle = hConsoleOutput;
-   Request.Data.SetAttribRequest.Attrib = (CHAR)wAttributes;
+   Request.Data.SetAttribRequest.Attrib = wAttributes;
    Status = CsrClientCallServer( &Request, NULL, CsrRequest, sizeof( CSR_API_MESSAGE ) );
    if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Request.Status ) )
       {
@@ -2971,7 +2975,7 @@ BOOL WINAPI
 SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine,
                      BOOL Add)
 {
-  BOOL Ret;
+  BOOLEAN Ret;
 
   RtlEnterCriticalSection(&DllLock);
   if (Add)
@@ -3648,7 +3652,7 @@ GetConsoleInputExeNameA(DWORD nBufferLength, LPSTR lpBuffer)
       RtlInitUnicodeString(&BufferU, Buffer);
 
       BufferA.Length = 0;
-      BufferA.MaximumLength = (USHORT)nBufferLength;
+      BufferA.MaximumLength = nBufferLength;
       BufferA.Buffer = lpBuffer;
 
       RtlUnicodeStringToAnsiString(&BufferA, &BufferU, FALSE);
index e91c44f..16f7fa5 100644 (file)
@@ -323,10 +323,9 @@ DllMain(HANDLE hDll,
             if (hDll == (HANDLE)0x7c800000)
             {
                 PULONG Eip;
-                __debugbreak();
                 Eip = (PULONG)*(PULONG)*(PULONG)NtCurrentTeb()->Tib.ExceptionList +
-                    0x9 +
-                    FIELD_OFFSET(CONTEXT, Eip) / sizeof(ULONG);
+                       0x9 +
+                       FIELD_OFFSET(CONTEXT, Eip) / sizeof(ULONG);
                 *Eip = (ULONG)BaseProcessStartThunk;
             }
         }
@@ -467,43 +466,4 @@ DllMain(HANDLE hDll,
     return TRUE;
 }
 
-LONG
-WINAPI
-InterlockedIncrement(IN OUT LONG volatile *lpAddend)
-{
-    return _InterlockedIncrement(lpAddend);
-}
-
-LONG
-WINAPI
-InterlockedDecrement(IN OUT LONG volatile *lpAddend)
-{
-    return _InterlockedDecrement(lpAddend);
-}
-
-LONG
-WINAPI
-InterlockedExchange(IN OUT LONG volatile *Target,
-                    IN LONG Value)
-{
-    return _InterlockedExchange(Target, Value);
-}
-
-LONG
-WINAPI
-InterlockedExchangeAdd(IN OUT LONG volatile *Addend,
-                       IN LONG Value)
-{
-    return _InterlockedExchangeAdd(Addend, Value);
-}
-
-LONG
-WINAPI
-InterlockedCompareExchange(IN OUT LONG volatile *Destination,
-                           IN LONG Exchange,
-                           IN LONG Comperand)
-{
-    return _InterlockedCompareExchange(Destination, Exchange, Comperand);
-}
-
 /* EOF */
index 5ecc235..150c54f 100644 (file)
@@ -43,14 +43,14 @@ GetEnvironmentVariableA (
 
        /* initialize ansi variable value string */
        VarValue.Length = 0;
-       VarValue.MaximumLength = (USHORT)nSize;
+       VarValue.MaximumLength = nSize;
        VarValue.Buffer = lpBuffer;
 
        /* initialize unicode variable value string and allocate buffer */
        VarValueU.Length = 0;
        if (nSize != 0)
        {
-           VarValueU.MaximumLength = (USHORT)(nSize - 1) * sizeof(WCHAR);
+           VarValueU.MaximumLength = (nSize - 1) * sizeof(WCHAR);
            VarValueU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
                                                0,
                                                nSize * sizeof(WCHAR));
@@ -139,7 +139,7 @@ GetEnvironmentVariableW (
                              lpName);
 
        VarValue.Length = 0;
-       VarValue.MaximumLength = (USHORT)(nSize != 0 ? (nSize - 1) * sizeof(WCHAR) : 0);
+       VarValue.MaximumLength = (nSize != 0 ? (nSize - 1) * sizeof(WCHAR) : 0);
        VarValue.Buffer = lpBuffer;
 
        Status = RtlQueryEnvironmentVariable_U (NULL,
@@ -298,10 +298,10 @@ GetEnvironmentStringsA (
        DPRINT("EnvPtr %p\n", EnvPtr);
 
        /* convert unicode environment to ansi */
-       UnicodeString.MaximumLength = (USHORT)Length * sizeof(WCHAR) + sizeof(WCHAR);
+       UnicodeString.MaximumLength = Length * sizeof(WCHAR) + sizeof(WCHAR);
        UnicodeString.Buffer = EnvU;
 
-       AnsiString.MaximumLength = (USHORT)Length + 1;
+       AnsiString.MaximumLength = Length + 1;
        AnsiString.Length = 0;
        AnsiString.Buffer = EnvPtr;
 
@@ -314,7 +314,7 @@ GetEnvironmentStringsA (
                if (UnicodeString.Length > 0)
                {
                        AnsiString.Length = 0;
-                       AnsiString.MaximumLength = (USHORT)Length + 1 - (AnsiString.Buffer - EnvPtr);
+                       AnsiString.MaximumLength = Length + 1 - (AnsiString.Buffer - EnvPtr);
 
                        RtlUnicodeStringToAnsiString (&AnsiString,
                                                      &UnicodeString,
@@ -407,11 +407,11 @@ ExpandEnvironmentStringsA (
         }
 
        Destination.Length = 0;
-       Destination.MaximumLength = (USHORT)nSize;
+       Destination.MaximumLength = nSize;
        Destination.Buffer = lpDst;
 
        DestinationU.Length = 0;
-       DestinationU.MaximumLength = (USHORT)nSize * sizeof(WCHAR);
+       DestinationU.MaximumLength = nSize * sizeof(WCHAR);
        DestinationU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
                                               0,
                                               DestinationU.MaximumLength);
@@ -473,7 +473,7 @@ ExpandEnvironmentStringsW (
                              (LPWSTR)lpSrc);
 
        Destination.Length = 0;
-       Destination.MaximumLength = (USHORT)nSize * sizeof(WCHAR);
+       Destination.MaximumLength = nSize * sizeof(WCHAR);
        Destination.Buffer = lpDst;
 
        Status = RtlExpandEnvironmentStrings_U (NULL,
index e9b6c33..658a689 100644 (file)
@@ -104,7 +104,7 @@ static LPSTR load_messageA( HMODULE module, UINT id, WORD lang )
         if (!(buffer = HeapAlloc( GetProcessHeap(), 0, len ))) return NULL;
         memcpy( buffer, mre->Text, len );
     }
-    //TRACE("returning %s\n", wine_dbgstr_a(buffer));
+    TRACE("returning %s\n", wine_dbgstr_a(buffer));
     return buffer;
 }
 
@@ -135,7 +135,7 @@ static LPWSTR load_messageW( HMODULE module, UINT id, WORD lang )
         if (!(buffer = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return NULL;
         MultiByteToWideChar( CP_ACP, 0, (const char*)mre->Text, -1, buffer, len );
     }
-    //TRACE("returning %s\n", wine_dbgstr_w(buffer));
+    TRACE("returning %s\n", wine_dbgstr_w(buffer));
     return buffer;
 }
 
@@ -187,9 +187,9 @@ DWORD WINAPI FormatMessageA(
     else {
         from = NULL;
         if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE)
-            from = load_messageA( (HMODULE)lpSource, dwMessageId, (WORD)dwLanguageId );
+            from = load_messageA( (HMODULE)lpSource, dwMessageId, dwLanguageId );
         if (!from && (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM))
-            from = load_messageA( kernel32_handle, dwMessageId, (WORD)dwLanguageId );
+            from = load_messageA( kernel32_handle, dwMessageId, dwLanguageId );
 
         if (!from)
         {
@@ -373,7 +373,7 @@ DWORD WINAPI FormatMessageA(
     if (nSize && talloced<nSize) {
         target = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,nSize);
     }
-    //TRACE("-- %s\n",debugstr_a(target));
+    TRACE("-- %s\n",debugstr_a(target));
     if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) {
         *((LPVOID*)lpBuffer) = (LPVOID)LocalAlloc(LMEM_ZEROINIT,max(nSize, talloced));
         memcpy(*(LPSTR*)lpBuffer,target,talloced);
@@ -439,9 +439,9 @@ DWORD WINAPI FormatMessageW(
     else {
         from = NULL;
         if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE)
-            from = load_messageW( (HMODULE)lpSource, dwMessageId, (WORD)dwLanguageId );
+            from = load_messageW( (HMODULE)lpSource, dwMessageId, dwLanguageId );
         if (!from && (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM))
-            from = load_messageW( kernel32_handle, dwMessageId,(WORD)dwLanguageId );
+            from = load_messageW( kernel32_handle, dwMessageId, dwLanguageId );
 
         if (!from)
         {
@@ -636,8 +636,8 @@ DWORD WINAPI FormatMessageW(
 
     HeapFree(GetProcessHeap(),0,target);
     HeapFree(GetProcessHeap(),0,from);
-    //TRACE("ret=%s\n", wine_dbgstr_w((dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ?
-      //  *(LPWSTR*)lpBuffer : lpBuffer));
+    TRACE("ret=%s\n", wine_dbgstr_w((dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ?
+        *(LPWSTR*)lpBuffer : lpBuffer));
     return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ?
         strlenW(*(LPWSTR*)lpBuffer):
             strlenW(lpBuffer);
index f339480..044735e 100644 (file)
@@ -23,6 +23,8 @@
 /* FIXME:  these are included in winnls.h, however including this file causes alot of
            conflicting type errors. */
 
+#define LOCALE_SYEARMONTH 0x1006
+#define LOCALE_IPAPERSIZE 0x100A
 #define LOCALE_RETURN_NUMBER 0x20000000
 #define LOCALE_USE_CP_ACP 0x40000000
 #define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|LOCALE_RETURN_NUMBER)
@@ -992,7 +994,7 @@ CompareStringW (
     }
     else
         Result = RtlCompareUnicodeString(
-                      &String1, &String2, (BOOLEAN)(dwCmpFlags & NORM_IGNORECASE));
+                      &String1, &String2, dwCmpFlags & NORM_IGNORECASE);
     
     
     if (Result) /* need to translate result */
index 604a738..cec0585 100644 (file)
@@ -85,7 +85,7 @@ static RTL_CRITICAL_SECTION_DEBUG NLS_FormatsCS_debug =
     0, 0, &NLS_FormatsCS,
     { &NLS_FormatsCS_debug.ProcessLocksList,
       &NLS_FormatsCS_debug.ProcessLocksList },
-      0, 0, 0, 0
+      0, 0, { 0, (DWORD)(__FILE__ ": NLS_Formats") }
 };
 static RTL_CRITICAL_SECTION NLS_FormatsCS = { &NLS_FormatsCS_debug, -1, 0, 0, 0, 0 };
 
index cb8f32d..90ae278 100644 (file)
@@ -315,7 +315,7 @@ GetModuleFileNameA (
                        else
                        {
                                FileName.Length = 0;
-                               FileName.MaximumLength = (USHORT)nSize * sizeof(WCHAR);
+                               FileName.MaximumLength = nSize * sizeof(WCHAR);
                                FileName.Buffer = lpFilename;
 
                                /* convert unicode string to ansi (or oem) */
@@ -383,7 +383,7 @@ GetModuleFileNameW (
                        else
                        {
                                FileName.Length = 0;
-                               FileName.MaximumLength =(USHORT)nSize * sizeof(WCHAR);
+                               FileName.MaximumLength = nSize * sizeof(WCHAR);
                                FileName.Buffer = lpFilename;
 
                                RtlCopyUnicodeString (&FileName,
@@ -680,8 +680,7 @@ LoadModule (
   HeapFree(GetProcessHeap(), 0, CommandLine);
 
   /* Wait up to 15 seconds for the process to become idle */
-  /* FIXME: This is user32! Windows soft-loads this only if required. */
-  //WaitForInputIdle(ProcessInformation.hProcess, 15000);
+  WaitForInputIdle(ProcessInformation.hProcess, 15000);
 
   CloseHandle(ProcessInformation.hThread);
   CloseHandle(ProcessInformation.hProcess);
index 1348729..597a724 100644 (file)
@@ -266,9 +266,9 @@ INT WINAPI GetExpandedNameA( LPSTR in, LPSTR out )
        }
        if (isalpha(head.lastchar)) {
                if (fnislowercased)
-                       head.lastchar=(CHAR)tolower(head.lastchar);
+                       head.lastchar=tolower(head.lastchar);
                else
-                       head.lastchar=(CHAR)toupper(head.lastchar);
+                       head.lastchar=toupper(head.lastchar);
        }
 
        /* now look where to replace the last character */
index f3045d4..6da2816 100644 (file)
@@ -489,7 +489,7 @@ IntWideCharToMultiByteUTF8(UINT CodePage, DWORD Flags,
             break;
          }
          TempLength--;
-         *MultiByteString++ = (CHAR)Char;
+         *MultiByteString++ = Char;
          continue;
       }
 
index c9ec937..b8a06d2 100644 (file)
@@ -76,7 +76,7 @@ static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
 {
     0, 0, &PROFILE_CritSect,
     { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
-      0, 0, 0, 0
+      0, 0, { 0, (DWORD)(__FILE__ ": PROFILE_CritSect") }
 };
 static RTL_CRITICAL_SECTION PROFILE_CritSect = { &critsect_debug, -1, 0, 0, 0, 0 };
 
@@ -121,7 +121,7 @@ static void PROFILE_CopyEntry( LPWSTR buffer, LPCWSTR value, int len,
     }
 
     lstrcpynW( buffer, value, len );
-    if (quote && (len >= (int)wcslen(value))) buffer[wcslen(buffer)-1] = '\0';
+    if (quote && (len >= wcslen(value))) buffer[wcslen(buffer)-1] = '\0';
 }
 
 
index eb5500d..105c340 100644 (file)
  *                  10/28/2005 Created stubs (w3)
  */
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
index 8a6c29c..dd70dcd 100644 (file)
@@ -45,16 +45,10 @@ BaseFlushAppcompatCache(VOID)
 /*
  * @unimplemented
  */
-BOOL
-WINAPI
-BaseCheckAppcompatCache(ULONG Unknown1,
-                        ULONG Unknown2,
-                        ULONG Unknown3,
-                        PULONG Unknown4)
+VOID STDCALL
+BaseCheckAppcompatCache(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3, ULONG Unknown4)
 {
     STUB;
-    if (Unknown4) *Unknown4 = 0;
-    return TRUE;
 }
 
 /*
index 2c20dee..d665f20 100644 (file)
@@ -134,21 +134,21 @@ STRINGTABLE LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
   LOCALE_STIMEFORMAT "H:mm:ss"
   LOCALE_SYEARMONTH "MMMM yyyy' ð.'"
 
-  LGRPID_WESTERN_EUROPE+LGRPID_RES_BASE "Çàõ³äíà ªâðîïà ³ Ñïîëó÷åí³ Øòàòè"
-  LGRPID_CENTRAL_EUROPE+LGRPID_RES_BASE "Öåíòðàëüíà ªâðîïà"
-  LGRPID_BALTIC+LGRPID_RES_BASE "Áàëò³éñüêà"
-  LGRPID_GREEK+LGRPID_RES_BASE "Ãðåöüêà"
-  LGRPID_CYRILLIC+LGRPID_RES_BASE "Êèðèëèöÿ"
-  LGRPID_TURKISH+LGRPID_RES_BASE "Òþðêñüê³ ìîâè"
-  LGRPID_JAPANESE+LGRPID_RES_BASE "ßïîíñüêà"
-  LGRPID_KOREAN+LGRPID_RES_BASE "Êîðåéñüêà"
-  LGRPID_TRADITIONAL_CHINESE+LGRPID_RES_BASE "Êèòàéñüêà òðàäèö³éíà"
-  LGRPID_SIMPLIFIED_CHINESE+LGRPID_RES_BASE "Êèòàéñüêà ñïðîùåíà"
-  LGRPID_THAI+LGRPID_RES_BASE "Òàéñüêà"
-  LGRPID_HEBREW+LGRPID_RES_BASE "²âðèò"
-  LGRPID_ARABIC+LGRPID_RES_BASE "Àðàáñüêà
-  LGRPID_VIETNAMESE+LGRPID_RES_BASE "Â'ºòíàìñüêà"
-  LGRPID_INDIC+LGRPID_RES_BASE "Õ³íä³"
-  LGRPID_GEORGIAN+LGRPID_RES_BASE "Ãðóçèíñüêà"
-  LGRPID_ARMENIAN+LGRPID_RES_BASE "³ðìåíñüêà"
+  LGRPID_WESTERN_EUROPE+LGRPID_RES_BASE "Western Europe and United States"
+  LGRPID_CENTRAL_EUROPE+LGRPID_RES_BASE "Central Europe"
+  LGRPID_BALTIC+LGRPID_RES_BASE "Baltic"
+  LGRPID_GREEK+LGRPID_RES_BASE "Greek"
+  LGRPID_CYRILLIC+LGRPID_RES_BASE "Cyrillic"
+  LGRPID_TURKISH+LGRPID_RES_BASE "Turkic"
+  LGRPID_JAPANESE+LGRPID_RES_BASE "Japanese"
+  LGRPID_KOREAN+LGRPID_RES_BASE "Korean"
+  LGRPID_TRADITIONAL_CHINESE+LGRPID_RES_BASE "Traditional Chinese"
+  LGRPID_SIMPLIFIED_CHINESE+LGRPID_RES_BASE "Simplified Chinese"
+  LGRPID_THAI+LGRPID_RES_BASE "Thai"
+  LGRPID_HEBREW+LGRPID_RES_BASE "Hebrew"
+  LGRPID_ARABIC+LGRPID_RES_BASE "Arabic
+  LGRPID_VIETNAMESE+LGRPID_RES_BASE "Vietnamese"
+  LGRPID_INDIC+LGRPID_RES_BASE "Indic"
+  LGRPID_GEORGIAN+LGRPID_RES_BASE "Georgian"
+  LGRPID_ARMENIAN+LGRPID_RES_BASE "Armenian"
 }
similarity index 99%
rename from reactos/dll/win32/kernel32/process/procsup.c
rename to reactos/dll/win32/kernel32/process/create.c
index bff53b7..cd9aa6f 100644 (file)
@@ -199,7 +199,7 @@ BasepConvertUnicodeEnvironment(OUT SIZE_T* EnvSize,
     else
     {
 
-        AnsiEnv.Length = (USHORT)((ULONG_PTR)pcScan - (ULONG_PTR)lpEnvironment + sizeof(CHAR));
+        AnsiEnv.Length = (ULONG_PTR)pcScan - (ULONG_PTR)lpEnvironment + sizeof(CHAR);
     }
     AnsiEnv.MaximumLength = AnsiEnv.Length + 1;
     
@@ -221,7 +221,7 @@ BasepConvertUnicodeEnvironment(OUT SIZE_T* EnvSize,
     }
         
     /* Use the allocated size */
-    UnicodeEnv.MaximumLength = (USHORT)*EnvSize;
+    UnicodeEnv.MaximumLength = *EnvSize;
     
     /* Convert */
     RtlAnsiStringToUnicodeString(&UnicodeEnv, &AnsiEnv, FALSE);
@@ -754,7 +754,7 @@ CreateProcessInternalW(HANDLE hToken,
 
     /* Easy stuff first, convert the process priority class */
     PriorityClass.Foreground = FALSE;
-    PriorityClass.PriorityClass = (UCHAR)BasepConvertPriorityClass(dwCreationFlags);
+    PriorityClass.PriorityClass = BasepConvertPriorityClass(dwCreationFlags);
 
     if (lpCommandLine)
     {
@@ -981,7 +981,7 @@ GetAppName:
                 RtlFreeHeap(RtlGetProcessHeap(), 0, NameBuffer);
                 RtlFreeHeap(RtlGetProcessHeap(), 0, ApplicationName.Buffer);
                 return CreateProcessW(L"ntvdm.exe",
-                                      (LPWSTR)((ULONG_PTR)lpApplicationName), /* FIXME: Buffer must be writable!!! */
+                                      (LPWSTR)lpApplicationName,
                                       lpProcessAttributes,
                                       lpThreadAttributes,
                                       bInheritHandles,
@@ -1052,7 +1052,7 @@ GetAppName:
                 RtlFreeHeap(RtlGetProcessHeap(), 0, NameBuffer);
                 RtlFreeHeap(RtlGetProcessHeap(), 0, ApplicationName.Buffer);
                 return CreateProcessW(L"ntvdm.exe",
-                                      (LPWSTR)((ULONG_PTR)lpApplicationName), /* FIXME: Buffer must be writable!!! */
+                                      (LPWSTR)lpApplicationName,
                                       lpProcessAttributes,
                                       lpThreadAttributes,
                                       bInheritHandles,
@@ -1158,7 +1158,7 @@ GetAppName:
                              PROCESS_ALL_ACCESS,
                              ObjectAttributes,
                              NtCurrentProcess(),
-                             (BOOLEAN)bInheritHandles,
+                             bInheritHandles,
                              hSection,
                              hDebug,
                              NULL);
index bbfa599..b32acdf 100644 (file)
@@ -376,7 +376,7 @@ WinExec(LPCSTR lpCmdLine,
 
    RtlZeroMemory(&StartupInfo, sizeof(StartupInfo));
    StartupInfo.cb = sizeof(STARTUPINFOA);
-   StartupInfo.wShowWindow = (WORD)uCmdShow;
+   StartupInfo.wShowWindow = uCmdShow;
    StartupInfo.dwFlags = 0;
 
    if (! CreateProcessA(NULL,
@@ -419,6 +419,20 @@ RegisterWaitForInputIdle (
        return;
 }
 
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL
+WaitForInputIdle (
+       HANDLE  hProcess,
+       DWORD   dwMilliseconds
+       )
+{
+       return 0;
+}
+
+
 /*
  * @implemented
  */
@@ -446,7 +460,7 @@ GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo)
   lpStartupInfo->dwYCountChars = Params->CountCharsY;
   lpStartupInfo->dwFillAttribute = Params->FillAttribute;
   lpStartupInfo->dwFlags = Params->WindowFlags;
-  lpStartupInfo->wShowWindow = (WORD)Params->ShowWindowFlags;
+  lpStartupInfo->wShowWindow = Params->ShowWindowFlags;
   lpStartupInfo->cbReserved2 = Params->RuntimeData.Length;
   lpStartupInfo->lpReserved2 = (LPBYTE)Params->RuntimeData.Buffer;
   
@@ -517,7 +531,7 @@ GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo)
        lpLocalStartupInfo->dwYCountChars = Params->CountCharsY;
        lpLocalStartupInfo->dwFillAttribute = Params->FillAttribute;
        lpLocalStartupInfo->dwFlags = Params->WindowFlags;
-       lpLocalStartupInfo->wShowWindow = (WORD)Params->ShowWindowFlags;
+       lpLocalStartupInfo->wShowWindow = Params->ShowWindowFlags;
        lpLocalStartupInfo->cbReserved2 = Params->RuntimeData.Length;
        lpLocalStartupInfo->lpReserved2 = (LPBYTE)Params->RuntimeData.Buffer;
 
index 6bb9435..eb9070a 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <k32.h>
 
+
 static _SEH_FILTER(lstr_page_fault)
 {
     if (_SEH_GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
@@ -71,6 +72,7 @@ lstrcmpiA(
    return Result;
 }
 
+
 /*
  * @implemented
  */
index 62bb676..7d1af63 100644 (file)
@@ -4,6 +4,10 @@
  * PROGRAMMER:      Thomas Weidenmueller <w3seek@reactos.com>
  */
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
@@ -34,7 +38,7 @@ SleepConditionVariableCS(IN OUT PCONDITION_VARIABLE ConditionVariable,
                          IN OUT PCRITICAL_SECTION CriticalSection,
                          IN DWORD dwMilliseconds)
 {
-    NTSTATUS Status = 0;
+    NTSTATUS Status;
     LARGE_INTEGER TimeOut;
     PLARGE_INTEGER TimeOutPtr = NULL;
 
@@ -44,11 +48,10 @@ SleepConditionVariableCS(IN OUT PCONDITION_VARIABLE ConditionVariable,
         TimeOutPtr = &TimeOut;
     }
 
-#if 0
     Status = RtlSleepConditionVariableCS((PRTL_CONDITION_VARIABLE)ConditionVariable,
                                          (PRTL_CRITICAL_SECTION)CriticalSection,
                                          TimeOutPtr);
-#endif
+
     if (!NT_SUCCESS(Status))
     {
         SetLastErrorByStatus(Status);
@@ -69,7 +72,7 @@ SleepConditionVariableSRW(IN OUT PCONDITION_VARIABLE ConditionVariable,
                           IN DWORD dwMilliseconds,
                           IN ULONG Flags)
 {
-    NTSTATUS Status = 0;
+    NTSTATUS Status;
     LARGE_INTEGER TimeOut;
     PLARGE_INTEGER TimeOutPtr = NULL;
 
@@ -79,12 +82,11 @@ SleepConditionVariableSRW(IN OUT PCONDITION_VARIABLE ConditionVariable,
         TimeOutPtr = &TimeOut;
     }
 
-#if 0
     Status = RtlSleepConditionVariableSRW((PRTL_CONDITION_VARIABLE)ConditionVariable,
                                           (PRTL_SRWLOCK)SRWLock,
                                           TimeOutPtr,
                                           Flags);
-#endif
+
     if (!NT_SUCCESS(Status))
     {
         SetLastErrorByStatus(Status);
index b629d08..43c1ca9 100644 (file)
@@ -8,6 +8,10 @@
 
 /* INCLUDES *****************************************************************/
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
index ec4e8c8..a7bd3db 100644 (file)
@@ -8,6 +8,10 @@
 
 /* INCLUDES *****************************************************************/
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
index 89cf614..57b9423 100644 (file)
@@ -8,6 +8,10 @@
 
 /* INCLUDES *****************************************************************/
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
index f4610a3..831f4fe 100644 (file)
@@ -8,6 +8,10 @@
 
 /* INCLUDES *****************************************************************/
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
@@ -265,7 +269,7 @@ SetWaitableTimer(IN HANDLE hTimer,
                         (PLARGE_INTEGER)pDueTime,
                         (PTIMER_APC_ROUTINE)pfnCompletionRoutine,
                         lpArgToCompletionRoutine,
-                        (BOOLEAN)fResume,
+                        fResume,
                         lPeriod,
                         NULL);
     if (NT_SUCCESS(Status)) return TRUE;
index af61473..4293951 100644 (file)
@@ -8,6 +8,10 @@
 
 /* INCLUDES *****************************************************************/
 
+/* File contains Vista Semantics */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+
 #include <k32.h>
 
 #define NDEBUG
index c10db83..dab3bf9 100644 (file)
@@ -258,277 +258,292 @@ ExitThread(DWORD uExitCode)
  * @implemented
  */
 HANDLE
-WINAPI
-OpenThread(DWORD dwDesiredAccess,
-           BOOL bInheritHandle,
-           DWORD dwThreadId)
-{
-    NTSTATUS errCode;
-    HANDLE ThreadHandle;
-    OBJECT_ATTRIBUTES ObjectAttributes;
-    CLIENT_ID ClientId ;
-
-    ClientId.UniqueProcess = 0;
-    ClientId.UniqueThread = (HANDLE)dwThreadId;
-
-    InitializeObjectAttributes(&ObjectAttributes,
-                               NULL,
-                               (bInheritHandle ? OBJ_INHERIT : 0),
-                               NULL,
-                               NULL);
-
-    errCode = NtOpenThread(&ThreadHandle,
-                           dwDesiredAccess,
-                           &ObjectAttributes,
-                           &ClientId);
-    if (!NT_SUCCESS(errCode))
-    {
-        SetLastErrorByStatus (errCode);
-        return NULL;
-    }
+STDCALL
+OpenThread(
+    DWORD dwDesiredAccess,
+    BOOL bInheritHandle,
+    DWORD dwThreadId
+    )
+{
+   NTSTATUS errCode;
+   HANDLE ThreadHandle;
+   OBJECT_ATTRIBUTES ObjectAttributes;
+   CLIENT_ID ClientId ;
+
+   ClientId.UniqueProcess = 0;
+   ClientId.UniqueThread = (HANDLE)dwThreadId;
+
+   InitializeObjectAttributes (&ObjectAttributes,
+                             NULL,
+                             (bInheritHandle ? OBJ_INHERIT : 0),
+                             NULL,
+                             NULL);
 
-    return ThreadHandle;
+   errCode = NtOpenThread(&ThreadHandle,
+                          dwDesiredAccess,
+                          &ObjectAttributes,
+                          &ClientId);
+   if (!NT_SUCCESS(errCode))
+     {
+       SetLastErrorByStatus (errCode);
+       return NULL;
+     }
+   return ThreadHandle;
 }
 
+
 /*
  * @implemented
  */
 PTEB
 GetTeb(VOID)
 {
-    return NtCurrentTeb();
+  return(NtCurrentTeb());
 }
 
+
 /*
  * @implemented
  */
-BOOL
-WINAPI
+BOOL STDCALL
 SwitchToThread(VOID)
 {
-    NTSTATUS Status;
-    Status = NtYieldExecution();
-    return Status != STATUS_NO_YIELD_PERFORMED;
+  NTSTATUS Status;
+  Status = NtYieldExecution();
+  return Status != STATUS_NO_YIELD_PERFORMED;
 }
 
 
 /*
  * @implemented
  */
-DWORD
-WINAPI
+DWORD STDCALL
 GetCurrentThreadId(VOID)
 {
-    return (DWORD)(NtCurrentTeb()->Cid).UniqueThread;
+  return((DWORD)(NtCurrentTeb()->Cid).UniqueThread);
 }
 
 /*
  * @implemented
  */
-BOOL
-NTAPI
+BOOL STDCALL
 GetThreadTimes(HANDLE hThread,
-               LPFILETIME lpCreationTime,
-               LPFILETIME lpExitTime,
-               LPFILETIME lpKernelTime,
-               LPFILETIME lpUserTime)
+              LPFILETIME lpCreationTime,
+              LPFILETIME lpExitTime,
+              LPFILETIME lpKernelTime,
+              LPFILETIME lpUserTime)
 {
-    KERNEL_USER_TIMES KernelUserTimes;
-    NTSTATUS Status;
+  KERNEL_USER_TIMES KernelUserTimes;
+  NTSTATUS Status;
 
-    Status = NtQueryInformationThread(hThread,
-                                      ThreadTimes,
-                                      &KernelUserTimes,
-                                      sizeof(KERNEL_USER_TIMES),
-                                      NULL);
-    if (!NT_SUCCESS(Status))
+  Status = NtQueryInformationThread(hThread,
+                                   ThreadTimes,
+                                   &KernelUserTimes,
+                                   sizeof(KERNEL_USER_TIMES),
+                                   NULL);
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return(FALSE);
+      SetLastErrorByStatus(Status);
+      return(FALSE);
     }
 
-    *lpCreationTime = *(LPFILETIME)&KernelUserTimes.CreateTime;
-    *lpExitTime = *(LPFILETIME)&KernelUserTimes.ExitTime;
-    *lpKernelTime = *(LPFILETIME)&KernelUserTimes.KernelTime;
-    *lpUserTime = *(LPFILETIME)&KernelUserTimes.UserTime;
-    return TRUE;
+  lpCreationTime->dwLowDateTime = KernelUserTimes.CreateTime.u.LowPart;
+  lpCreationTime->dwHighDateTime = KernelUserTimes.CreateTime.u.HighPart;
+
+  lpExitTime->dwLowDateTime = KernelUserTimes.ExitTime.u.LowPart;
+  lpExitTime->dwHighDateTime = KernelUserTimes.ExitTime.u.HighPart;
+
+  lpKernelTime->dwLowDateTime = KernelUserTimes.KernelTime.u.LowPart;
+  lpKernelTime->dwHighDateTime = KernelUserTimes.KernelTime.u.HighPart;
+
+  lpUserTime->dwLowDateTime = KernelUserTimes.UserTime.u.LowPart;
+  lpUserTime->dwHighDateTime = KernelUserTimes.UserTime.u.HighPart;
+
+  return(TRUE);
 }
 
+
 /*
  * @implemented
  */
-BOOL
-WINAPI
+BOOL STDCALL
 GetThreadContext(HANDLE hThread,
-                 LPCONTEXT lpContext)
+                LPCONTEXT lpContext)
 {
-    NTSTATUS Status;
+  NTSTATUS Status;
 
-    Status = NtGetContextThread(hThread, lpContext);
-    if (!NT_SUCCESS(Status))
+  Status = NtGetContextThread(hThread,
+                             lpContext);
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return FALSE;
+      SetLastErrorByStatus(Status);
+      return(FALSE);
     }
 
-    return TRUE;
+  return(TRUE);
 }
 
+
 /*
  * @implemented
  */
-BOOL
-WINAPI
+BOOL STDCALL
 SetThreadContext(HANDLE hThread,
-                 CONST CONTEXT *lpContext)
+                CONST CONTEXT *lpContext)
 {
-    NTSTATUS Status;
+  NTSTATUS Status;
 
-    Status = NtSetContextThread(hThread, (PCONTEXT)lpContext);
-    if (!NT_SUCCESS(Status))
+  Status = NtSetContextThread(hThread,
+                             (void *)lpContext);
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return FALSE;
+      SetLastErrorByStatus(Status);
+      return(FALSE);
     }
 
-    return TRUE;
+  return(TRUE);
 }
 
+
 /*
  * @implemented
  */
-BOOL
-WINAPI
+BOOL STDCALL
 GetExitCodeThread(HANDLE hThread,
-                  LPDWORD lpExitCode)
+                 LPDWORD lpExitCode)
 {
-    THREAD_BASIC_INFORMATION ThreadBasic;
-    NTSTATUS Status;
+  THREAD_BASIC_INFORMATION ThreadBasic;
+  NTSTATUS Status;
 
-    Status = NtQueryInformationThread(hThread,
-                                      ThreadBasicInformation,
-                                      &ThreadBasic,
-                                      sizeof(THREAD_BASIC_INFORMATION),
-                                      NULL);
-    if (!NT_SUCCESS(Status))
+  Status = NtQueryInformationThread(hThread,
+                                   ThreadBasicInformation,
+                                   &ThreadBasic,
+                                   sizeof(THREAD_BASIC_INFORMATION),
+                                   NULL);
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return(FALSE);
+      SetLastErrorByStatus(Status);
+      return(FALSE);
     }
 
-    *lpExitCode = ThreadBasic.ExitStatus;
-    return TRUE;
+  memcpy(lpExitCode, &ThreadBasic.ExitStatus, sizeof(DWORD));
+
+  return(TRUE);
 }
 
+
 /*
  * @implemented
  */
-DWORD
-WINAPI
+DWORD STDCALL
 ResumeThread(HANDLE hThread)
 {
-    ULONG PreviousResumeCount;
-    NTSTATUS Status;
+  ULONG PreviousResumeCount;
+  NTSTATUS Status;
 
-    Status = NtResumeThread(hThread, &PreviousResumeCount);
-    if (!NT_SUCCESS(Status))
+  Status = NtResumeThread(hThread,
+                         &PreviousResumeCount);
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return -1;
+      SetLastErrorByStatus(Status);
+      return(-1);
     }
 
-    return PreviousResumeCount;
+  return(PreviousResumeCount);
 }
 
+
 /*
  * @implemented
  */
-BOOL
-WINAPI
+BOOL STDCALL
 TerminateThread(HANDLE hThread,
-                DWORD dwExitCode)
+               DWORD dwExitCode)
 {
-    NTSTATUS Status;
+  NTSTATUS Status;
 
-    if (!hThread)
+  if (0 == hThread)
     {
-        SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
+      SetLastError(ERROR_INVALID_HANDLE);
+      return(FALSE);
     }
 
-    Status = NtTerminateThread(hThread, dwExitCode);
-    if (!NT_SUCCESS(Status))
+  Status = NtTerminateThread(hThread,
+                            dwExitCode);
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return FALSE;
+      SetLastErrorByStatus(Status);
+      return(FALSE);
     }
 
-    return TRUE;
+  return(TRUE);
 }
 
+
 /*
  * @implemented
  */
-DWORD
-WINAPI
+DWORD STDCALL
 SuspendThread(HANDLE hThread)
 {
-    ULONG PreviousSuspendCount;
-    NTSTATUS Status;
+  ULONG PreviousSuspendCount;
+  NTSTATUS Status;
 
-    Status = NtSuspendThread(hThread, &PreviousSuspendCount);
-    if (!NT_SUCCESS(Status))
+  Status = NtSuspendThread(hThread,
+                          &PreviousSuspendCount);
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return -1;
+      SetLastErrorByStatus(Status);
+      return(-1);
     }
 
-    return PreviousSuspendCount;
+  return(PreviousSuspendCount);
 }
 
+
 /*
  * @implemented
  */
-DWORD
-WINAPI
+DWORD STDCALL
 SetThreadAffinityMask(HANDLE hThread,
-                      DWORD dwThreadAffinityMask)
+                     DWORD dwThreadAffinityMask)
 {
-    THREAD_BASIC_INFORMATION ThreadBasic;
-    KAFFINITY AffinityMask;
-    NTSTATUS Status;
+  THREAD_BASIC_INFORMATION ThreadBasic;
+  KAFFINITY AffinityMask;
+  NTSTATUS Status;
 
-    AffinityMask = (KAFFINITY)dwThreadAffinityMask;
+  AffinityMask = (KAFFINITY)dwThreadAffinityMask;
 
-    Status = NtQueryInformationThread(hThread,
-                                      ThreadBasicInformation,
-                                      &ThreadBasic,
-                                      sizeof(THREAD_BASIC_INFORMATION),
-                                      NULL);
-    if (!NT_SUCCESS(Status))
+  Status = NtQueryInformationThread(hThread,
+                                   ThreadBasicInformation,
+                                   &ThreadBasic,
+                                   sizeof(THREAD_BASIC_INFORMATION),
+                                   NULL);
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return 0;
+      SetLastErrorByStatus(Status);
+      return(0);
     }
 
-    Status = NtSetInformationThread(hThread,
-                                    ThreadAffinityMask,
-                                    &AffinityMask,
-                                    sizeof(KAFFINITY));
-    if (!NT_SUCCESS(Status))
-    {
-        SetLastErrorByStatus(Status);
-        ThreadBasic.AffinityMask = 0;
-    }
+  Status = NtSetInformationThread(hThread,
+                                 ThreadAffinityMask,
+                                 &AffinityMask,
+                                 sizeof(KAFFINITY));
+  if (!NT_SUCCESS(Status))
+  {
+    SetLastErrorByStatus(Status);
+    ThreadBasic.AffinityMask = 0;
+  }
 
-    return ThreadBasic.AffinityMask;
+  return(ThreadBasic.AffinityMask);
 }
 
+
 /*
  * @implemented
  */
 BOOL
-WINAPI
+STDCALL
 SetThreadPriority(HANDLE hThread,
                   int nPriority)
 {
@@ -565,7 +580,7 @@ SetThreadPriority(HANDLE hThread,
  * @implemented
  */
 int
-WINAPI
+STDCALL
 GetThreadPriority(HANDLE hThread)
 {
     THREAD_BASIC_INFORMATION ThreadBasic;
@@ -601,55 +616,56 @@ GetThreadPriority(HANDLE hThread)
 /*
  * @implemented
  */
-BOOL
-WINAPI
+BOOL STDCALL
 GetThreadPriorityBoost(IN HANDLE hThread,
-                       OUT PBOOL pDisablePriorityBoost)
+                      OUT PBOOL pDisablePriorityBoost)
 {
-    ULONG PriorityBoost;
-    NTSTATUS Status;
+  ULONG PriorityBoost;
+  NTSTATUS Status;
 
-    Status = NtQueryInformationThread(hThread,
-                                      ThreadPriorityBoost,
-                                      &PriorityBoost,
-                                      sizeof(ULONG),
-                                      NULL);
-    if (!NT_SUCCESS(Status))
+  Status = NtQueryInformationThread(hThread,
+                                   ThreadPriorityBoost,
+                                   &PriorityBoost,
+                                   sizeof(ULONG),
+                                   NULL);
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return FALSE;
+      SetLastErrorByStatus(Status);
+      return(FALSE);
     }
 
-    *pDisablePriorityBoost = PriorityBoost;
-    return TRUE;
+  *pDisablePriorityBoost = !((BOOL)PriorityBoost);
+
+  return(TRUE);
 }
 
+
 /*
  * @implemented
  */
-BOOL
-NTAPI
+BOOL STDCALL
 SetThreadPriorityBoost(IN HANDLE hThread,
-                       IN BOOL bDisablePriorityBoost)
+                      IN BOOL bDisablePriorityBoost)
 {
-    ULONG PriorityBoost;
-    NTSTATUS Status;
+  ULONG PriorityBoost;
+  NTSTATUS Status;
 
-    PriorityBoost = (ULONG)bDisablePriorityBoost;
+  PriorityBoost = (ULONG)!bDisablePriorityBoost;
 
-    Status = NtSetInformationThread(hThread,
-                                    ThreadPriorityBoost,
-                                    &PriorityBoost,
-                                    sizeof(ULONG));
-    if (!NT_SUCCESS(Status))
+  Status = NtSetInformationThread(hThread,
+                                 ThreadPriorityBoost,
+                                 &PriorityBoost,
+                                 sizeof(ULONG));
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return FALSE;
+      SetLastErrorByStatus(Status);
+      return(FALSE);
     }
 
-    return TRUE;
+  return(TRUE);
 }
 
+
 /*
  * @implemented
  */
@@ -677,29 +693,30 @@ GetThreadSelectorEntry(IN HANDLE hThread,
   return TRUE;
 }
 
+
 /*
  * @implemented
  */
-DWORD
-WINAPI
+DWORD STDCALL
 SetThreadIdealProcessor(HANDLE hThread,
-                        DWORD dwIdealProcessor)
+                       DWORD dwIdealProcessor)
 {
-    NTSTATUS Status;
+  NTSTATUS Status;
 
-    Status = NtSetInformationThread(hThread,
-                                    ThreadIdealProcessor,
-                                    &dwIdealProcessor,
-                                    sizeof(ULONG));
-    if (!NT_SUCCESS(Status))
+  Status = NtSetInformationThread(hThread,
+                                 ThreadIdealProcessor,
+                                 &dwIdealProcessor,
+                                 sizeof(ULONG));
+  if (!NT_SUCCESS(Status))
     {
-        SetLastErrorByStatus(Status);
-        return -1;
+      SetLastErrorByStatus(Status);
+      return -1;
     }
 
-    return dwIdealProcessor;
+  return dwIdealProcessor;
 }
 
+
 /*
  * @implemented
  */
@@ -723,6 +740,7 @@ GetProcessIdOfThread(HANDLE Thread)
   return (DWORD)ThreadBasic.ClientId.UniqueProcess;
 }
 
+
 /*
  * @implemented
  */
@@ -838,7 +856,7 @@ SleepEx(DWORD dwMilliseconds,
        * System time units are 100 nanoseconds (a nanosecond is a billionth of
        * a second).
        */
-      Interval.QuadPart = -((LONGLONG)dwMilliseconds * 10000);
+      Interval.QuadPart = -((ULONGLONG)dwMilliseconds * 10000);
     }
   else
     {
@@ -847,7 +865,7 @@ SleepEx(DWORD dwMilliseconds,
     }
 
 dowait:
-  errCode = NtDelayExecution ((BOOLEAN)bAlertable, &Interval);
+  errCode = NtDelayExecution (bAlertable, &Interval);
   if ((bAlertable) && (errCode == STATUS_ALERTED)) goto dowait;
   return (errCode == STATUS_USER_APC) ? WAIT_IO_COMPLETION : 0;
 }
@@ -865,7 +883,7 @@ InternalWorkItemTrampoline(PVOID Context)
 {
     QUEUE_USER_WORKITEM_CONTEXT Info;
 
-    ASSERT(Context);
+    ASSERT(Context != NULL);
 
     /* Save the context to the stack */
     Info = *(volatile QUEUE_USER_WORKITEM_CONTEXT *)Context;
index 2cf304a..be6e259 100644 (file)
@@ -35,8 +35,6 @@ StatusMessageWindowProc(
        IN WPARAM wParam,
        IN LPARAM lParam)
 {
-       UNREFERENCED_PARAMETER(wParam);
-
        switch (uMsg)
        {
                case WM_INITDIALOG:
@@ -77,7 +75,7 @@ StartupWindowThread(LPVOID lpParam)
        DialogBoxParam(
                hDllInstance, 
                MAKEINTRESOURCE(IDD_STATUSWINDOW_DLG),
-               GetDesktopWindow(),
+               0,
                StatusMessageWindowProc,
                (LPARAM)lpParam);
        SetThreadDesktop(OldDesk);
@@ -115,7 +113,7 @@ GUIDisplayStatusMessage(
                msg->pMessage = pMessage;
                msg->hDesktop = hDesktop;
 
-               msg->StartupEvent = CreateEventW(
+               msg->StartupEvent = CreateEvent(
                        NULL,
                        TRUE,
                        FALSE,
@@ -163,21 +161,6 @@ GUIRemoveStatusMessage(
        return TRUE;
 }
 
-static INT_PTR CALLBACK
-EmptyWindowProc(
-       IN HWND hwndDlg,
-       IN UINT uMsg,
-       IN WPARAM wParam,
-       IN LPARAM lParam)
-{
-       UNREFERENCED_PARAMETER(hwndDlg);
-       UNREFERENCED_PARAMETER(uMsg);
-       UNREFERENCED_PARAMETER(wParam);
-       UNREFERENCED_PARAMETER(lParam);
-
-       return FALSE;
-}
-
 static VOID
 GUIDisplaySASNotice(
        IN OUT PGINA_CONTEXT pgContext)
@@ -190,8 +173,8 @@ GUIDisplaySASNotice(
        result = DialogBoxParam(
                pgContext->hDllInstance,
                MAKEINTRESOURCE(IDD_NOTICE_DLG),
-               GetDesktopWindow(),
-               EmptyWindowProc,
+               NULL,
+               NULL,
                (LPARAM)NULL);
        if (result == -1)
        {
@@ -232,8 +215,6 @@ LoggedOnWindowProc(
        IN WPARAM wParam,
        IN LPARAM lParam)
 {
-       UNREFERENCED_PARAMETER(lParam);
-
        switch (uMsg)
        {
                case WM_COMMAND:
@@ -293,7 +274,7 @@ GUILoggedOnSAS(
                pgContext->hWlx,
                pgContext->hDllInstance,
                MAKEINTRESOURCEW(IDD_LOGGEDON_DLG),
-               GetDesktopWindow(),
+               NULL,
                LoggedOnWindowProc,
                (LPARAM)pgContext);
        if (result >= WLX_SAS_ACTION_LOGON &&
@@ -334,7 +315,7 @@ LoggedOutWindowProc(
                        if (pgContext->hBitmap)
                        {
                                hdc = BeginPaint(hwndDlg, &ps);
-                               DrawStateW(hdc, NULL, NULL, (LPARAM)pgContext->hBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
+                               DrawState(hdc, NULL, NULL, (LPARAM)pgContext->hBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
                                EndPaint(hwndDlg, &ps);
                        }
                        return TRUE;
@@ -395,7 +376,7 @@ GUILoggedOutSAS(
                pgContext->hWlx,
                pgContext->hDllInstance,
                MAKEINTRESOURCEW(IDD_LOGGEDOUT_DLG),
-               GetDesktopWindow(),
+               NULL,
                LoggedOutWindowProc,
                (LPARAM)pgContext);
        if (result >= WLX_SAS_ACTION_LOGON &&
@@ -415,8 +396,6 @@ GUILockedSAS(
 {
        TRACE("GUILockedSAS()\n");
 
-       UNREFERENCED_PARAMETER(pgContext);
-
        UNIMPLEMENTED;
        return WLX_SAS_ACTION_UNLOCK_WKSTA;
 }
index 72f5356..755ac53 100644 (file)
@@ -23,10 +23,6 @@ ShellShutdownDialog(
     DWORD Unknown,
     BOOL  bHideLogoff)
 {
-  UNREFERENCED_PARAMETER(hParent);
-  UNREFERENCED_PARAMETER(Unknown);
-  UNREFERENCED_PARAMETER(bHideLogoff);
-
   /* Return values:
    * 0x00: Cancelled/Help
    * 0x01: Log off user
@@ -47,9 +43,8 @@ VOID WINAPI
 WlxDisplayLockedNotice(
        PVOID pWlxContext)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-
   UNIMPLEMENTED;
+  return;
 }
 
 
@@ -60,8 +55,6 @@ BOOL WINAPI
 WlxIsLockOk(
        PVOID pWlxContext)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-
   UNIMPLEMENTED;
   return TRUE;
 }
@@ -74,8 +67,6 @@ BOOL WINAPI
 WlxIsLogoffOk(
        PVOID pWlxContext)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-
   UNIMPLEMENTED;
   return TRUE;
 }
@@ -88,9 +79,8 @@ VOID WINAPI
 WlxLogoff(
        PVOID pWlxContext)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-
   UNIMPLEMENTED;
+  return;
 }
 
 
@@ -102,10 +92,8 @@ WlxShutdown(
        PVOID pWlxContext,
        DWORD ShutdownType)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-  UNREFERENCED_PARAMETER(ShutdownType);
-
   UNIMPLEMENTED;
+  return;
 }
 
 
@@ -117,9 +105,6 @@ WlxScreenSaverNotify(
        PVOID pWlxContext,
        BOOL  *pSecure)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-  UNREFERENCED_PARAMETER(pSecure);
-
   //HKLM\Software\Policies\Microsoft\Windows\Control Panel\Desktop : ScreenSaverIsSecure
   UNIMPLEMENTED;
   return TRUE;
@@ -136,11 +121,6 @@ WlxGetStatusMessage(
        PWSTR pMessage,
        DWORD dwBufferSize)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-  UNREFERENCED_PARAMETER(pdwOptions);
-  UNREFERENCED_PARAMETER(pMessage);
-  UNREFERENCED_PARAMETER(dwBufferSize);
-
   UNIMPLEMENTED;
   return FALSE;
 }
@@ -154,9 +134,6 @@ WlxNetworkProviderLoad(
        PVOID                pWlxContext,
        PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-  UNREFERENCED_PARAMETER(pNprNotifyInfo);
-
   UNIMPLEMENTED;
   return FALSE;
 }
@@ -169,9 +146,8 @@ VOID WINAPI
 WlxDisconnectNotify(
        PVOID pWlxContext)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-
   UNIMPLEMENTED;
+  return;
 }
 
 
@@ -183,9 +159,6 @@ WlxGetConsoleSwitchCredentials(
        PVOID pWlxContext,
        PVOID pCredInfo)
 {
-  UNREFERENCED_PARAMETER(pWlxContext);
-  UNREFERENCED_PARAMETER(pCredInfo);
-
   UNIMPLEMENTED;
   return FALSE;
 }
index 9f10e3e..22f95f6 100644 (file)
@@ -32,11 +32,6 @@ TUIDisplayStatusMessage(
 
        TRACE("TUIDisplayStatusMessage(%ws)\n", pMessage);
 
-       UNREFERENCED_PARAMETER(pgContext);
-       UNREFERENCED_PARAMETER(hDesktop);
-       UNREFERENCED_PARAMETER(dwOptions);
-       UNREFERENCED_PARAMETER(pTitle);
-
        return
                WriteConsoleW(
                        GetStdHandle(STD_OUTPUT_HANDLE),
@@ -56,8 +51,6 @@ static BOOL
 TUIRemoveStatusMessage(
        IN PGINA_CONTEXT pgContext)
 {
-       UNREFERENCED_PARAMETER(pgContext);
-
        /* Nothing to do */
        return TRUE;
 }
@@ -71,7 +64,7 @@ DisplayResourceText(
        static LPCWSTR newLine = L"\n";
        DWORD count;
 
-       if (0 == LoadStringW(hDllInstance, uIdResourceText, Prompt, 256))
+       if (!LoadStringW(hDllInstance, uIdResourceText, Prompt, 256))
                return FALSE;
        if (!WriteConsoleW(
                GetStdHandle(STD_OUTPUT_HANDLE),
@@ -99,8 +92,6 @@ TUIDisplaySASNotice(
 {
        TRACE("TUIDisplaySASNotice()\n");
 
-       UNREFERENCED_PARAMETER(pgContext);
-
        DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE);
        DisplayResourceText(IDS_PRESSCTRLALTDELETE, TRUE);
 }
@@ -112,8 +103,6 @@ TUILoggedOnSAS(
 {
        TRACE("TUILoggedOnSAS()\n");
 
-       UNREFERENCED_PARAMETER(pgContext);
-
        if (dwSasType != WLX_SAS_TYPE_CTRL_ALT_DEL)
        {
                /* Nothing to do for WLX_SAS_TYPE_TIMEOUT */
@@ -126,6 +115,7 @@ TUILoggedOnSAS(
 
 static BOOL
 ReadString(
+       IN PGINA_CONTEXT pgContext,
        IN UINT uIdResourcePrompt,
        IN OUT PWSTR Buffer,
        IN DWORD BufferLength,
@@ -174,7 +164,6 @@ ReadString(
                }
                Buffer[i++] = readChar;
                /* FIXME: buffer overflow if the user writes too many chars! */
-               UNREFERENCED_PARAMETER(BufferLength);
                /* FIXME: handle backspace */
        }
        Buffer[i] = UNICODE_NULL;
@@ -204,9 +193,9 @@ TUILoggedOutSAS(
        TRACE("TUILoggedOutSAS()\n");
 
        /* Ask the user for credentials */
-       if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE))
+       if (!ReadString(pgContext, IDS_ASKFORUSER, UserName, 256, TRUE))
                return WLX_SAS_ACTION_NONE;
-       if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE))
+       if (!ReadString(pgContext, IDS_ASKFORPASSWORD, Password, 256, FALSE))
                return WLX_SAS_ACTION_NONE;
 
        if (DoLoginTasks(pgContext, UserName, NULL, Password))
@@ -224,15 +213,13 @@ TUILockedSAS(
 
        TRACE("TUILockedSAS()\n");
 
-       UNREFERENCED_PARAMETER(pgContext);
-
        if (!DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE))
                return WLX_SAS_ACTION_UNLOCK_WKSTA;
 
        /* Ask the user for credentials */
-       if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE))
+       if (!ReadString(pgContext, IDS_ASKFORUSER, UserName, 256, TRUE))
                return WLX_SAS_ACTION_NONE;
-       if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE))
+       if (!ReadString(pgContext, IDS_ASKFORPASSWORD, Password, 256, FALSE))
                return WLX_SAS_ACTION_NONE;
 
        FIXME("FIXME: Check user/password\n");
diff --git a/reactos/dll/win32/netid/lang/de-DE.rc b/reactos/dll/win32/netid/lang/de-DE.rc
deleted file mode 100644 (file)
index 7de86b3..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * PROJECT:         ReactOS System Configuration Applet
- * LICENSE:         GPL - See COPYING in the top level directory
- * PURPOSE:         German language file for net.dll
- * PROGRAMMERS:     Eric Kohl
- * TRANSLATOR:      Colin Finck <mail@colinfinck.de>
- */
-
-LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
-
-IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, 256, 218
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Computername"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
-    ICON        IDI_COMPNAME, IDC_STATIC, 4, 3, 26, 24, SS_ICON
-    LTEXT       "ReactOS benutzt folgende Informationen, um ihren Computer im Netzwerk zu identifizieren.", IDC_STATIC, 40, 5, 204, 20
-    LTEXT       "Computer-Beschreibung:", IDC_STATIC, 6, 40, 80, 9
-    EDITTEXT    IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP
-    LTEXT       "Computername:", IDC_STATIC, 6, 68, 64, 9
-    LTEXT       "(Standard)", IDC_COMPUTERNAME, 98, 68, 144, 11
-    LTEXT       "Arbeitsgruppe:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9
-    LTEXT       "(leer)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9
-    LTEXT       "Um den Netzwerk-Identifikations-Assistenten zum Anmelden an einer Domäne und dem Erstellen eines lokalen Benutzers aufzurufen, klicken Sie auf ""Netzwerk-ID"".", IDC_STATIC, 6, 108, 172, 32
-    PUSHBUTTON  "&Netzwerk-ID...", IDC_NETWORK_ID, 190, 114, 58, 15
-    LTEXT       "Um diesen Computer umzubenennen oder sich an einer Domäne anzumelden, klicken Sie auf ""Ändern"".", IDC_STATIC, 6, 149, 170, 17
-    PUSHBUTTON  "&Ändern...",IDC_NETWORK_PROPERTY, 190, 149, 58, 15
-    LTEXT       "Bitte beachten: Nur Administratoren können die Identifikation dieses Computers ändern.", IDC_STATIC, 6, 179, 250, 18
-END
-
diff --git a/reactos/dll/win32/netid/lang/en-US.rc b/reactos/dll/win32/netid/lang/en-US.rc
deleted file mode 100644 (file)
index b73e1eb..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-
-IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, 256, 218
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Computer Name"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
-    ICON        IDI_COMPNAME, IDC_STATIC, 4, 3, 26, 24, SS_ICON
-    LTEXT       "ReactOS uses the following information to identify your computer on the network.", IDC_STATIC, 40, 5, 204, 20
-    LTEXT       "Computer Description:", IDC_STATIC, 6, 40, 70, 9
-    EDITTEXT    IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP
-    LTEXT       "Full computer name:", IDC_STATIC, 6, 68, 64, 9
-    LTEXT       "(Default)", IDC_COMPUTERNAME, 98, 68, 144, 11
-    LTEXT       "Workgroup:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9
-    LTEXT       "(empty)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9
-    LTEXT       "To use the Network Identfication Wizard to join a domain and create a local user, click ""Network ID"".", IDC_STATIC, 6, 108, 172, 24
-    PUSHBUTTON  "&Network ID...", IDC_NETWORK_ID, 190, 114, 58, 15
-    LTEXT       "To rename this computer or join a domain, click ""Change"".", IDC_STATIC, 6, 149, 170, 17
-    PUSHBUTTON  "&Change...",IDC_NETWORK_PROPERTY, 190, 149, 58, 15
-    LTEXT       "Note: Only Administrators can change the identification of this computer.", IDC_STATIC, 6, 179, 300, 9
-END
-
diff --git a/reactos/dll/win32/netid/netid.c b/reactos/dll/win32/netid/netid.c
deleted file mode 100644 (file)
index 2383cbb..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * PROJECT:     ReactOS System Control Panel Applet
- * LICENSE:     GPL - See COPYING in the top level directory
- * FILE:        dll/win32/netid/netid.c
- * PURPOSE:     Network ID Page
- * COPYRIGHT:   Copyright Thomas Weidenmueller <w3seek@reactos.org>
- *
- */
-
-#include <windows.h>
-#include <lm.h>
-#include <prsht.h>
-#include "resource.h"
-
-static HINSTANCE hDllInstance;
-
-static INT_PTR CALLBACK
-NetIDPageProc(IN HWND hwndDlg,
-              IN UINT uMsg,
-              IN WPARAM wParam,
-              IN LPARAM lParam)
-{
-    INT_PTR Ret = 0;
-
-    UNREFERENCED_PARAMETER(lParam);
-    UNREFERENCED_PARAMETER(wParam);
-
-    switch (uMsg)
-    {
-        case WM_INITDIALOG:
-        {
-            /* Display computer name */
-            LPWKSTA_INFO_101 wki = NULL;
-            DWORD Size = MAX_COMPUTERNAME_LENGTH + 1;
-            TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
-            if (GetComputerName(ComputerName,&Size))
-            {
-                SetDlgItemText(hwndDlg,
-                               IDC_COMPUTERNAME,
-                               ComputerName);
-            }
-            if (NetWkstaGetInfo(NULL,
-                                101,
-                                (LPBYTE*)&wki) == NERR_Success)
-            {
-                SetDlgItemText(hwndDlg,
-                               IDC_WORKGROUPDOMAIN_NAME,
-                               wki->wki101_langroup);
-            }
-
-            if (wki != NULL)
-                NetApiBufferFree(wki);
-
-            Ret = TRUE;
-            break;
-        }
-    }
-
-    return Ret;
-}
-
-HPROPSHEETPAGE WINAPI
-CreateNetIDPropertyPage(VOID)
-{
-    PROPSHEETPAGE psp = {0};
-
-    psp.dwSize = sizeof(psp);
-    psp.dwFlags = PSP_DEFAULT;
-    psp.hInstance= hDllInstance;
-    psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGECOMPUTER);
-    psp.pfnDlgProc = NetIDPageProc;
-
-    return CreatePropertySheetPage(&psp);
-}
-
-BOOL WINAPI
-DllMain(IN HINSTANCE hinstDLL,
-        IN DWORD dwReason,
-        IN LPVOID lpvReserved)
-{
-    switch (dwReason)
-    {
-        case DLL_PROCESS_ATTACH:
-            hDllInstance = hinstDLL;
-            DisableThreadLibraryCalls(hinstDLL);
-            break;
-    }
-
-    return TRUE;
-}
diff --git a/reactos/dll/win32/netid/netid.rbuild b/reactos/dll/win32/netid/netid.rbuild
deleted file mode 100644 (file)
index 0555a2c..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<module name="netid" type="win32dll" baseaddress="${BASEADDRESS_NETID}" installbase="system32" installname="netid.dll" unicode="true">
-       <importlibrary definition="netid.spec.def" />
-       <include base="netid">.</include>
-       <define name="__USE_W32API" />
-       <define name="_WIN32_IE">0x0500</define>
-       <define name="_WIN32_WINNT">0x0600</define>
-       <define name="WINVER">0x0600</define>
-       <library>ntdll</library>
-       <library>kernel32</library>
-       <library>user32</library>
-       <library>gdi32</library>
-       <library>comctl32</library>
-       <library>advapi32</library>
-       <library>netapi32</library>
-       <file>netid.c</file>
-       <file>netid.rc</file>
-       <file>netid.spec</file>
-</module>
diff --git a/reactos/dll/win32/netid/netid.rc b/reactos/dll/win32/netid/netid.rc
deleted file mode 100644 (file)
index d82e8f0..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <windows.h>
-#include <reactos/resource.h>
-#include "resource.h"
-
-#define REACTOS_VERSION_DLL
-#define REACTOS_STR_FILE_DESCRIPTION   "ReactOS Network ID Page\0"
-#define REACTOS_STR_INTERNAL_NAME      "netid\0"
-#define REACTOS_STR_ORIGINAL_FILENAME  "netid.dll\0"
-#include <reactos/version.rc>
-
-IDI_COMPNAME    ICON "res/netid.ico"
-
-#include "lang/en-US.rc"
-#include "lang/de-DE.rc"
diff --git a/reactos/dll/win32/netid/netid.spec b/reactos/dll/win32/netid/netid.spec
deleted file mode 100644 (file)
index 3b4bc45..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# netid.dll exports
-
- 1 stdcall CreateNetIDPropertyPage()
-# 2 stdcall ShowDcNotFoundErrorDialog(???)
\ No newline at end of file
diff --git a/reactos/dll/win32/netid/res/netid.ico b/reactos/dll/win32/netid/res/netid.ico
deleted file mode 100644 (file)
index 8bb9a29..0000000
Binary files a/reactos/dll/win32/netid/res/netid.ico and /dev/null differ
diff --git a/reactos/dll/win32/netid/resource.h b/reactos/dll/win32/netid/resource.h
deleted file mode 100644 (file)
index f630bb7..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef __NETID_RESOURCE_H
-#define __NETID_RESOURCE_H
-
-#ifndef IDC_STATIC
-#define IDC_STATIC  -1
-#endif
-
-#define IDI_COMPNAME                    50
-
-#define IDD_PROPPAGECOMPUTER            200
-
-#define IDC_COMPDESC                    201
-#define IDC_COMPUTERNAME                202
-#define IDC_WORKGROUPDOMAIN_NAME        203
-#define IDC_WORKGROUPDOMAIN                204
-#define IDC_NETWORK_ID                  205
-#define IDC_NETWORK_PROPERTY            206
-
-#endif /* __NETID_RESOURCE_H */
index dbfc926..7531a56 100644 (file)
@@ -62,7 +62,7 @@ UpdateDriverForPlugAndPlayDevicesW(
        /* Check flags */
        if (InstallFlags & ~(INSTALLFLAG_FORCE | INSTALLFLAG_READONLY | INSTALLFLAG_NONINTERACTIVE))
        {
-               TRACE("Unknown flags: 0x%08lx\n", InstallFlags & ~(INSTALLFLAG_FORCE | INSTALLFLAG_READONLY | INSTALLFLAG_NONINTERACTIVE));
+               DPRINT("Unknown flags: 0x%08lx\n", InstallFlags & ~(INSTALLFLAG_FORCE | INSTALLFLAG_READONLY | INSTALLFLAG_NONINTERACTIVE));
                SetLastError(ERROR_INVALID_FLAGS);
                goto cleanup;
        }
index 1689ac4..7f700d4 100644 (file)
@@ -115,7 +115,7 @@ typedef double GLclampd;
 typedef void GLvoid;
 
 /* Called by the driver to set the dispatch table */
-typedef DWORD WINAPI (*SetContextCallBack)( const ICDTable * );
+typedef DWORD APIENTRY (*SetContextCallBack)( const ICDTable * );
 
 /* OpenGL ICD data */
 typedef struct tagGLDRIVERDATA
@@ -129,23 +129,23 @@ typedef struct tagGLDRIVERDATA
        DWORD   driver_version;         /*!< DriverVersion value from registry */
        DWORD   flags;                  /*!< Flags value from registry */
 
-       BOOL      WINAPI (*DrvCopyContext)( HGLRC, HGLRC, UINT );
-       HGLRC     WINAPI (*DrvCreateContext)( HDC );
-       HGLRC     WINAPI (*DrvCreateLayerContext)( HDC, int );
-       BOOL      WINAPI (*DrvDeleteContext)( HGLRC );
-       BOOL      WINAPI (*DrvDescribeLayerPlane)( HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR );
-       int       WINAPI (*DrvDescribePixelFormat)( IN HDC, IN int, IN UINT, OUT LPPIXELFORMATDESCRIPTOR );
-       int       WINAPI (*DrvGetLayerPaletteEntries)( HDC, int, int, int, COLORREF * );
-       PROC      WINAPI (*DrvGetProcAddress)( LPCSTR lpProcName );
-       void      WINAPI (*DrvReleaseContext)( HGLRC hglrc ); /* maybe returns BOOL? */
-       BOOL      WINAPI (*DrvRealizeLayerPalette)( HDC, int, BOOL );
-       PICDTable WINAPI (*DrvSetContext)( HDC hdc, HGLRC hglrc, SetContextCallBack callback );
-       int       WINAPI (*DrvSetLayerPaletteEntries)( HDC, int, int, int, CONST COLORREF * );
-       BOOL      WINAPI (*DrvSetPixelFormat)( IN HDC, IN int ); /*, IN CONST PIXELFORMATDESCRIPTOR * );*/
-       BOOL      WINAPI (*DrvShareLists)( HGLRC, HGLRC );
-       BOOL      WINAPI (*DrvSwapBuffers)( HDC );
-       BOOL      WINAPI (*DrvSwapLayerBuffers)( HDC, UINT );
-       BOOL      WINAPI (*DrvValidateVersion)( DWORD );
+       BOOL      APIENTRY (*DrvCopyContext)( HGLRC, HGLRC, UINT );
+       HGLRC     APIENTRY (*DrvCreateContext)( HDC );
+       HGLRC     APIENTRY (*DrvCreateLayerContext)( HDC, int );
+       BOOL      APIENTRY (*DrvDeleteContext)( HGLRC );
+       BOOL      APIENTRY (*DrvDescribeLayerPlane)( HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR );
+       int       APIENTRY (*DrvDescribePixelFormat)( IN HDC, IN int, IN UINT, OUT LPPIXELFORMATDESCRIPTOR );
+       int       APIENTRY (*DrvGetLayerPaletteEntries)( HDC, int, int, int, COLORREF * );
+       PROC      APIENTRY (*DrvGetProcAddress)( LPCSTR lpProcName );
+       void      APIENTRY (*DrvReleaseContext)( HGLRC hglrc ); /* maybe returns BOOL? */
+       BOOL      APIENTRY (*DrvRealizeLayerPalette)( HDC, int, BOOL );
+       PICDTable APIENTRY (*DrvSetContext)( HDC hdc, HGLRC hglrc, SetContextCallBack callback );
+       int       APIENTRY (*DrvSetLayerPaletteEntries)( HDC, int, int, int, CONST COLORREF * );
+       BOOL      APIENTRY (*DrvSetPixelFormat)( IN HDC, IN int ); /*, IN CONST PIXELFORMATDESCRIPTOR * );*/
+       BOOL      APIENTRY (*DrvShareLists)( HGLRC, HGLRC );
+       BOOL      APIENTRY (*DrvSwapBuffers)( HDC );
+       BOOL      APIENTRY (*DrvSwapLayerBuffers)( HDC, UINT );
+       BOOL      APIENTRY (*DrvValidateVersion)( DWORD );
 
        struct tagGLDRIVERDATA *next;   /* next ICD -- linked list */
 } GLDRIVERDATA;
index b5e73af..7723865 100644 (file)
@@ -2137,7 +2137,7 @@ void ME_RegisterEditorClass(HINSTANCE hInstance)
   wcW.cbWndExtra = 4;
   wcW.hInstance = NULL; /* hInstance would register DLL-local class */
   wcW.hIcon = NULL;
-  wcW.hCursor = LoadCursorW(NULL, (LPCWSTR) IDC_IBEAM);
+  wcW.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_IBEAM));
   wcW.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
   wcW.lpszMenuName = NULL;
   wcW.lpszClassName = wszClassName;
@@ -2153,7 +2153,7 @@ void ME_RegisterEditorClass(HINSTANCE hInstance)
   wcA.cbWndExtra = 4;
   wcA.hInstance = NULL; /* hInstance would register DLL-local class */
   wcA.hIcon = NULL;
-  wcA.hCursor = LoadCursorA(NULL, (LPCSTR) IDC_IBEAM);
+  wcA.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_IBEAM));
   wcA.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
   wcA.lpszMenuName = NULL;
   wcA.lpszClassName = "RichEdit20A";
index 76a4204..f83e0ea 100644 (file)
@@ -1033,7 +1033,7 @@ WCHAR *PARSER_get_dest_dir( INFCONTEXT *context )
     const WCHAR *dir;
     WCHAR *ptr, *ret;
     INT dirid;
-    unsigned int len1 = 0;
+    unsigned int len1;
     DWORD len2;
 
     if (!SetupGetIntField( context, 1, &dirid )) return NULL;
index a888698..d0e0da7 100644 (file)
@@ -1461,36 +1461,37 @@ DWORD WINAPI SHELL32_714(LPVOID x)
 /*************************************************************************
  *      SHAddFromPropSheetExtArray     [SHELL32.167]
  */
-UINT WINAPI SHAddFromPropSheetExtArray(HPSXA hpsxa, LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam)
+DWORD WINAPI SHAddFromPropSheetExtArray(DWORD a, DWORD b, DWORD c)
 {
-       FIXME("(%p,%p,%08lx)stub\n", hpsxa, lpfnAddPage, lParam);
+       FIXME("(%08lx,%08lx,%08lx)stub\n", a, b, c);
        return 0;
 }
 
 /*************************************************************************
  *      SHCreatePropSheetExtArray      [SHELL32.168]
  */
-HPSXA WINAPI SHCreatePropSheetExtArray(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface)
+DWORD WINAPI SHCreatePropSheetExtArray(DWORD a, LPCSTR b, DWORD c)
 {
-       FIXME("(%p,%s,%u)stub\n", hKey, debugstr_w(pszSubKey), max_iface);
-       return NULL;
+       FIXME("(%08lx,%s,%08lx)stub\n", a, debugstr_a(b), c);
+       return 0;
 }
 
 /*************************************************************************
  *      SHReplaceFromPropSheetExtArray [SHELL32.170]
  */
-UINT WINAPI SHReplaceFromPropSheetExtArray(HPSXA hpsxa, UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam)
+DWORD WINAPI SHReplaceFromPropSheetExtArray(DWORD a, DWORD b, DWORD c, DWORD d)
 {
-       FIXME("(%p,%u,%p,%08lx)stub\n", hpsxa, uPageID, lpfnReplaceWith, lParam);
+       FIXME("(%08lx,%08lx,%08lx,%08lx)stub\n", a, b, c, d);
        return 0;
 }
 
 /*************************************************************************
  *      SHDestroyPropSheetExtArray     [SHELL32.169]
  */
-void WINAPI SHDestroyPropSheetExtArray(HPSXA hpsxa)
+DWORD WINAPI SHDestroyPropSheetExtArray(DWORD a)
 {
-       FIXME("(%p)stub\n", hpsxa);
+       FIXME("(%08lx)stub\n", a);
+       return 0;
 }
 
 /*************************************************************************
index 61b331d..9899ffe 100644 (file)
@@ -51,4 +51,3 @@ IDR_GPL RT_TEXT "COPYING"
 #include "syssetup_Es.rc"
 #include "syssetup_Hu.rc"
 #include "syssetup_Uk.rc"
-#include "syssetup_It.rc"
diff --git a/reactos/dll/win32/syssetup/syssetup_It.rc b/reactos/dll/win32/syssetup/syssetup_It.rc
deleted file mode 100644 (file)
index c1c011d..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * PROJECT:     System Setup
- * LICENSE:     GPL - See COPYING in the top level directory
- * FILE:        dll/win32/syssetup/syssetup_It.rc
- * PURPOSE:     Italian Translation of dll/win32/syssetup/syssetup_En.rc
- * PROGRAMMERS: Copyright (C) 2004 Filip Navara
- *              Copyright (C) 2004 Eric Kohl
- *              Copyright (C) 2007 Daniele Forsi (dforsi at gmail.com) Italian Translation
- */
-
-LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
-
-
-IDD_WELCOMEPAGE DIALOG DISCARDABLE  0, 0, 317, 193
-STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Installazione di ReactOS"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    LTEXT "Benvenuti alla configurazione guidata di ReactOS.", IDC_WELCOMETITLE, 115, 8, 195, 24
-    LTEXT "Questa procedura guidata installa ReactOS su questo computer. La procedura "\
-          "deve raccogliere alcune informazioni sull'utente e sul computer "\
-          "per configurare ReactOS adeguatamente.", IDC_STATIC, 115, 40, 195, 100
-    LTEXT "Selezionare Continua per proseguire con la configurazione.", IDC_STATIC, 115, 169, 195, 17
-END
-
-
-IDD_ACKPAGE DIALOGEX 0, 0, 317, 143
-STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Installazione di ReactOS"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
-    LTEXT           "Gli sviluppatori di ReactOS desiderano citare i seguenti progetti Open Source, "\
-                    "che sono stati usati (in tutto o in parte) per creare ReactOS:",
-                    IDC_STATIC,15,7,286,19
-    LISTBOX         IDC_PROJECTS,15,30,286,75,LBS_NOSEL | LBS_HASSTRINGS | 
-                    LBS_NOINTEGRALHEIGHT | WS_VSCROLL
-    LTEXT           "ReactOS è soggetto alla licenza GPL, per cui se si desidera riusarlo o ridistribuirlo "\
-                    "(in tutto o in parte) è necessario rispettare la GPL",
-                    IDC_STATIC,15,110,227,19
-    PUSHBUTTON      "&Mostra la GPL...",IDC_VIEWGPL,251,110,50,19
-    LTEXT           "Selezionare Continua per proseguire con la configurazione.",IDC_STATIC,15,136,
-                    195,17
-END
-
-
-IDD_OWNERPAGE DIALOG DISCARDABLE  0, 0, 317, 143
-STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Installazione di ReactOS"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    LTEXT "Scrivere il proprio nome completo e il nome della propria ditta o organizzazione.",
-          IDC_STATIC, 54, 7, 242, 21
-    LTEXT "No&me:", IDC_STATIC, 54, 37, 44, 8
-    EDITTEXT IDC_OWNERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL
-    LTEXT "&Organizzazione:", IDC_STATIC, 54, 57, 44, 8
-    EDITTEXT IDC_OWNERORGANIZATION, 132, 55, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL
-END
-
-
-IDD_COMPUTERPAGE DIALOG DISCARDABLE  0, 0, 317, 143
-STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Installazione di ReactOS"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    LTEXT "Scrivere un nome per il computer che sia lungo al massimo 63 caratteri. "\
-          "Se si è in rete, il nome del computer deve essere univoco.",
-          IDC_STATIC, 54, 7, 250, 24
-    LTEXT "Nome del &computer:", IDC_STATIC, 54, 38, 75, 8
-    EDITTEXT IDC_COMPUTERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_UPPERCASE
-    LTEXT "Questa procedura creerà su questo computer un account utente chiamato Administrator. "\
-          "Si potrà usare questo account se si necessita l'accesso completo al computer.",
-          IDC_STATIC, 54, 57, 250, 25
-    LTEXT "Scrivere una password per Administrator che sia lunga al massimo 14 caratteri.",
-          IDC_STATIC, 54, 87, 250, 8
-    LTEXT "Password per &Administrator:", IDC_STATIC, 54, 104, 75, 8
-    EDITTEXT IDC_ADMINPASSWORD1, 132, 101, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD
-    LTEXT "C&onfermare la password:", IDC_STATIC, 54, 123, 75, 8
-    EDITTEXT IDC_ADMINPASSWORD2, 132, 120, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD
-END
-
-
-IDD_LOCALEPAGE DIALOG DISCARDABLE  0, 0, 317, 143
-STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Installazione di ReactOS"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    LTEXT "Le impostazioni linguistiche del sistema devono coincidere con la lingua degli applicativi "\
-          "che si desidera usare. Le impostazioni linguistiche dell'utente stabiliscono come appaiono "\
-          "i numeri, i valori monetari e le date.", IDC_STATIC, 53, 7, 253, 20
-    LTEXT "", IDC_LOCALETEXT, 53, 29, 250, 16
-    LTEXT "Per cambiare le impostazioni linguistiche del sistema o dell'utente, selezionare Personalizza.",
-          IDC_STATIC, 53, 60, 184, 8
-    PUSHBUTTON "&Personalizza...", IDC_CUSTOMLOCALE, 245, 57, 50, 14
-    LTEXT "Il formato della tastiera stabilisce i caratteri che appaiono quando si preme un tasto.",
-          IDC_STATIC, 53, 86, 253, 8
-    LTEXT "", IDC_LAYOUTTEXT, 53, 100, 250, 16
-    LTEXT "Per cambiare il formato della tastiera, selezionare Personalizza.",
-          IDC_STATIC, 53, 126, 184, 8
-    PUSHBUTTON "P&ersonalizza...", IDC_CUSTOMLAYOUT, 245, 122, 50, 14
-END
-
-
-IDD_DATETIMEPAGE DIALOG DISCARDABLE  0, 0, 317, 143
-STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Installazione di ReactOS"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    LTEXT "Data e ora", IDC_STATIC, 53, 7, 253, 8
-    CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
-            DTS_LONGDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 53, 17, 137, 14
-    CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
-            DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 200, 17, 54, 14
-    LTEXT "Fuso orario", IDC_STATIC, 53, 42, 253, 8
-    COMBOBOX IDC_TIMEZONELIST, 53, 52, 201, 93,
-             CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
-    AUTOCHECKBOX "Cambia automaticamente con l'ora &legale",
-                 IDC_AUTODAYLIGHT, 53, 124, 201, 10
-END
-
-
-IDD_PROCESSPAGE DIALOG 0, 0, 317, 143
-STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Installazione di ReactOS"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    LTEXT "", IDC_ACTIVITY, 53, 7, 253, 20
-    LTEXT "", IDC_ITEM, 53, 29, 253, 20
-    CONTROL "", IDC_PROCESSPROGRESS, "msctls_progress32",
-            PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 53, 70, 253, 8
-END
-
-
-IDD_FINISHPAGE DIALOG DISCARDABLE  0, 0, 317, 193
-STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "L'installazione di ReactOS è completata"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    LTEXT "Completamento della procedura guidata di installazione di ReactOS", IDC_FINISHTITLE, 115, 8, 195, 24
-    LTEXT "La procedura guidata di installazione di ReactOS è completata.\n\n" \
-          "Selezionando Fine, il computer sarà riavviato.", IDC_STATIC, 115, 40, 195, 100
-    CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 115, 138, 188, 12
-    LTEXT "Se c'è un CD in un lettore, è necessario rimuoverlo. Poi, per riavviare "\
-          "il computer, selezionare Fine.", IDC_STATIC, 115, 169, 195, 17
-END
-
-
-IDD_GPL DIALOG 0, 0, 333, 230
-STYLE DS_CENTER | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "GNU General Public License"
-FONT 8, "MS Shell Dlg"
-BEGIN
-    EDITTEXT        IDC_GPL_TEXT,7,7,319,190,ES_MULTILINE | ES_AUTOHSCROLL | 
-                    ES_READONLY | WS_VSCROLL
-    DEFPUSHBUTTON   "OK",IDOK,141,209,50,14
-END
-
-
-STRINGTABLE
-BEGIN
-    IDS_ACKTITLE         "Riconoscimenti"
-    IDS_ACKSUBTITLE      "Le spalle su cui ReactOS poggia e le informazioni sulla licenza"
-    IDS_OWNERTITLE       "Personalizzare il software"
-    IDS_OWNERSUBTITLE    "La procedura usa queste informazioni su di voi per personalizzare ReactOS."
-    IDS_COMPUTERTITLE    "Il nome del computer e la password di Administrator"
-    IDS_COMPUTERSUBTITLE "È necessario fornire un nome e una password di Administrator per il proprio computer."
-    IDS_LOCALETITLE      "Impostazioni regionali"
-    IDS_LOCALESUBTITLE   "È possibile personalizzare ReactOS per regioni e lingue differenti."
-    IDS_DATETIMETITLE    "Data e ora"
-    IDS_DATETIMESUBTITLE "Impostare la data e l'ora corrette per il proprio computer."
-    IDS_PROCESSTITLE     "Titolo della pagina di avanzamento"
-    IDS_PROCESSSUBTITLE  "Sottotitolo della pagina di avanzamento"
-END
-
-STRINGTABLE
-BEGIN
-    IDS_CMT_WINEFILE    "Lancia Winefile"
-    IDS_CMT_IBROWSER   "Lancia iBrowser"
-    IDS_CMT_GETFIREFOX "Scarica/installa Firefox"
-    IDS_CMT_DOWNLOADER  "Scarica e installa varie applicazioni"
-END
-
-STRINGTABLE
-BEGIN
-    IDS_ACCESSORIES     "Accessori"
-    IDS_CMT_CALC        "Calcolatrice"
-    IDS_CMT_CMD         "Apri la finestra dei comandi"
-    IDS_CMT_EXPLORER    "Lancia Explorer"
-    IDS_CMT_NOTEPAD     "Lancia l'editor dei testi"
-    IDS_CMT_REGEDIT     "Lancia l'editor del registro"
-    IDS_CMT_WORDPAD     "Lancia l'editor dei documenti"
-    IDS_CMT_SCREENSHOT  "Salva una schermata"
-END
-
-STRINGTABLE
-BEGIN
-    IDS_GAMES              "Giochi"
-    IDS_CMT_SOLITAIRE  "Solitario"
-    IDS_CMT_WINEMINE   "Campo minato"
-END
-
-STRINGTABLE
-BEGIN
-IDS_REACTOS_SETUP                  "Installazione di ReactOS"
-    IDS_UNKNOWN_ERROR           "Errore sconosciuto"
-    IDS_REGISTERING_COMPONENTS  "Registrazione dei componenti..."
-    IDS_LOADLIBRARY_FAILED         "LoadLibrary fallito: "
-    IDS_GETPROCADDR_FAILED         "GetProcAddr fallito: "
-    IDS_REGSVR_FAILED           "DllRegisterServer fallito: "
-    IDS_DLLINSTALL_FAILED          "DllInstall fallito: "
-    IDS_TIMEOUT                                "Tempo scaduto durante la registrazione"
-    IDS_REASON_UNKNOWN          ""
-END
-
-/* EOF */
index 26e78ff..98e094e 100644 (file)
@@ -40,32 +40,6 @@ DesktopWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
     return 0;  /* all other messages are ignored */
 }
 
-VOID
-STDCALL
-LogFontA2W(LPLOGFONTW pW, CONST LOGFONTA *pA)
-{
-#define COPYS(f,len) MultiByteToWideChar ( CP_THREAD_ACP, 0, pA->f, len, pW->f, len )
-#define COPYN(f) pW->f = pA->f
-
-  COPYN(lfHeight);
-  COPYN(lfWidth);
-  COPYN(lfEscapement);
-  COPYN(lfOrientation);
-  COPYN(lfWeight);
-  COPYN(lfItalic);
-  COPYN(lfUnderline);
-  COPYN(lfStrikeOut);
-  COPYN(lfCharSet);
-  COPYN(lfOutPrecision);
-  COPYN(lfClipPrecision);
-  COPYN(lfQuality);
-  COPYN(lfPitchAndFamily);
-  COPYS(lfFaceName,LF_FACESIZE);
-
-#undef COPYN
-#undef COPYS
-}
-
 VOID
 STDCALL
 LogFontW2A(LPLOGFONTA pA, CONST LOGFONTW *pW)
@@ -164,32 +138,6 @@ SystemParametersInfoA(UINT uiAction,
            LogFontW2A(&(nclma->lfMessageFont), &(nclmw.lfMessageFont));
            return TRUE;
         }
-      case SPI_SETNONCLIENTMETRICS:
-        {
-           LPNONCLIENTMETRICSA nclma = (LPNONCLIENTMETRICSA)pvParam;
-           NONCLIENTMETRICSW nclmw;
-           nclmw.cbSize = sizeof(NONCLIENTMETRICSW);
-           nclmw.iBorderWidth = nclma->iBorderWidth;
-           nclmw.iScrollWidth = nclma->iScrollWidth;
-           nclmw.iScrollHeight = nclma->iScrollHeight;
-           nclmw.iCaptionWidth = nclma->iCaptionWidth;
-           nclmw.iCaptionHeight = nclma->iCaptionHeight;
-           nclmw.iSmCaptionWidth = nclma->iSmCaptionWidth;
-           nclmw.iSmCaptionHeight = nclma->iSmCaptionHeight;
-           nclmw.iMenuWidth = nclma->iMenuWidth;
-           nclmw.iMenuHeight = nclma->iMenuHeight;
-           LogFontA2W(&(nclmw.lfCaptionFont), &(nclma->lfCaptionFont));
-           LogFontA2W(&(nclmw.lfSmCaptionFont), &(nclma->lfSmCaptionFont));
-           LogFontA2W(&(nclmw.lfMenuFont), &(nclma->lfMenuFont));
-           LogFontA2W(&(nclmw.lfStatusFont), &(nclma->lfStatusFont));
-           LogFontA2W(&(nclmw.lfMessageFont), &(nclma->lfMessageFont));
-
-           if (!SystemParametersInfoW(uiAction, sizeof(NONCLIENTMETRICSW),
-                                      &nclmw, fWinIni))
-             return FALSE;
-
-           return TRUE;
-        }
       case SPI_GETICONTITLELOGFONT:
         {
            LOGFONTW lfw;
index 38ac260..bf87349 100644 (file)
@@ -233,7 +233,7 @@ HACCEL WINAPI LoadAcceleratorsW(HINSTANCE hInstance, LPCWSTR lpTableName)
  return U32LoadAccelerators
  (
   hInstance,
-  FindResourceExW(hInstance, (LPCWSTR) RT_ACCELERATOR, lpTableName, 0)
+  FindResourceExW(hInstance, MAKEINTRESOURCEW(RT_ACCELERATOR), lpTableName, 0)
  );
 }
 
@@ -245,7 +245,7 @@ HACCEL WINAPI LoadAcceleratorsA(HINSTANCE hInstance, LPCSTR lpTableName)
 {
   HRSRC Accel;
 
-  Accel = FindResourceExA(hInstance, (LPCSTR) RT_ACCELERATOR, lpTableName, 0);
+  Accel = FindResourceExA(hInstance, MAKEINTRESOURCEA(RT_ACCELERATOR), lpTableName, 0);
   if (NULL == Accel)
     {
       return NULL;
index 36dc9af..bdee738 100644 (file)
@@ -231,13 +231,16 @@ LoadCursorIconImage(
       if (IconResDir == NULL)
          return NULL;
 
-      /* Find the best fitting in the IconResDir for this resolution */
+      /*
+       * Find the best fitting in the IconResDir for this resolution
+       */
+
       id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, Icon, width, height,
                                        fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
 
       h2Resource = FindResourceW(hinst, MAKEINTRESOURCEW(id),
-                                 Icon ? (LPCWSTR) RT_ICON :
-                                 (LPCWSTR) RT_CURSOR);
+                                 Icon ? MAKEINTRESOURCEW(RT_ICON) :
+                                 MAKEINTRESOURCEW(RT_CURSOR));
       if (h2Resource == NULL)
          return NULL;
 
@@ -253,7 +256,6 @@ LoadCursorIconImage(
                                        SizeofResource(hinst, h2Resource),
                                        Icon, 0x00030000, width, height,
                                        fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
-
       if (hIcon && 0 != (fuLoad & LR_SHARED))
       {
          NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes,
index 6554ee0..7ee005d 100644 (file)
@@ -724,10 +724,10 @@ static BOOL UITOOLS95_DFC_ButtonRadio(HDC dc, LPRECT r, UINT uFlags)
     HFONT hFont, hOldFont;
     int SmallDiam, i;
 
-    LPCTSTR OutRight = TEXT("j"); // Outer right
+    LPCTSTR OutRight = TEXT("j"); // Outer right 
     LPCTSTR OutLeft  = TEXT("k"); // Outer left
-    LPCTSTR InRight  = TEXT("l"); // inner left
-    LPCTSTR InLeft   = TEXT("m"); // inner right
+    LPCTSTR InRight  = TEXT("l"); // inner right
+    LPCTSTR InLeft   = TEXT("m"); // inner left
     LPCTSTR Center   = TEXT("n"); // center
 
     SmallDiam = UITOOLS_MakeSquareRect(r, &rc);
index b829a1c..ed5a713 100644 (file)
@@ -33,6 +33,9 @@
 #include <wine/debug.h>
 
 
+/* Directory to load key layouts from */
+#define SYSTEMROOT_DIR L"\\SystemRoot\\System32\\"
+
 /* GLOBALS *******************************************************************/
 
 typedef struct __TRACKINGLIST {
@@ -70,11 +73,10 @@ ReadRegistryValue( PUNICODE_STRING KeyName,
    PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo;
    ULONG Length = 0;
    ULONG ResLength = 0;
-   PWCHAR ReturnBuffer;
+   UNICODE_STRING Temp;
 
    InitializeObjectAttributes(&KeyAttributes, KeyName, OBJ_CASE_INSENSITIVE,
                               NULL, NULL);
-
    Status = ZwOpenKey(&KeyHandle, KEY_ALL_ACCESS, &KeyAttributes);
    if( !NT_SUCCESS(Status) )
    {
@@ -114,18 +116,13 @@ ReadRegistryValue( PUNICODE_STRING KeyName,
       return Status;
    }
 
+   Temp.Length = Temp.MaximumLength = KeyValuePartialInfo->DataLength;
+   Temp.Buffer = (PWCHAR)KeyValuePartialInfo->Data;
+
    /* At this point, KeyValuePartialInfo->Data contains the key data */
-   ReturnBuffer = LocalAlloc(0, KeyValuePartialInfo->DataLength);
-   if(!ReturnBuffer)
-   {
-      NtClose(KeyHandle);
-      LocalFree(KeyValuePartialInfo);
-      return STATUS_NO_MEMORY;
-   }
-   
-   RtlCopyMemory(ReturnBuffer, KeyValuePartialInfo->Data, KeyValuePartialInfo->DataLength);
-   RtlInitUnicodeString(ReturnedValue, ReturnBuffer);
-   
+   RtlInitUnicodeString(ReturnedValue,L"");
+   RtlAppendUnicodeStringToString(ReturnedValue,&Temp);
+
    LocalFree(KeyValuePartialInfo);
    NtClose(KeyHandle);
 
@@ -151,12 +148,10 @@ IntLoadKeyboardLayout( LPCWSTR pwszKLID,
   UNICODE_STRING LayoutFile;
   UNICODE_STRING FullLayoutPath;
   LCID LocaleId;  
+  PWCHAR KeyboardLayoutWSTR;
   ULONG_PTR layout;
   LANGID langid;
-  WCHAR FullPathBuffer[MAX_PATH];
-  WCHAR LayoutKeyNameBuffer[128] = L"\\REGISTRY\\Machine\\SYSTEM\\CurrentControlSet"
-                                L"\\Control\\KeyboardLayouts\\";
-  
+
   layout = (ULONG_PTR) wcstoul(pwszKLID, NULL, 16);
 
 //  LocaleId = GetSystemDefaultLCID();
@@ -176,59 +171,55 @@ IntLoadKeyboardLayout( LPCWSTR pwszKLID,
   else
       layout |= layout << 16;
 
-  DPRINT("Input  = %S, DefaultLocale = %lx\n", pwszKLID, LocaleId );
+  DPRINT("Input  = %S\n", pwszKLID );
+
+  DPRINT("DefaultLocale = %lx\n", LocaleId);
+
   swprintf(LocaleBuffer, L"%08lx", LocaleId);
+
   DPRINT("DefaultLocale = %S\n", LocaleBuffer);
   RtlInitUnicodeString(&DefaultLocale, LocaleBuffer);
 
-  RtlInitUnicodeString(&LayoutKeyName, LayoutKeyNameBuffer);
-  LayoutKeyName.MaximumLength = sizeof(LayoutKeyNameBuffer);
-  RtlAppendUnicodeStringToString(&LayoutKeyName, &DefaultLocale);
-  DPRINT("LayoutKeyName=%wZ\n", &LayoutKeyName);
-  RtlInitUnicodeString(&LayoutValueName, L"Layout File");
+  RtlInitUnicodeString(&LayoutKeyName,
+                       L"\\REGISTRY\\Machine\\SYSTEM\\CurrentControlSet"
+                       L"\\Control\\KeyboardLayouts\\");
+
+  RtlAppendUnicodeStringToString(&LayoutKeyName,&DefaultLocale);
+
+  RtlInitUnicodeString(&LayoutValueName,L"Layout File");
+
   Status =  ReadRegistryValue(&LayoutKeyName,&LayoutValueName,&LayoutFile);
+
+  RtlFreeUnicodeString(&LayoutKeyName);
   
-  if(!NT_SUCCESS(Status))
-  {
-     DPRINT1("Failed to read registry value, %x\n", Status);
-     return NULL;
-  }
-    
   DPRINT("Read registry and got %wZ\n", &LayoutFile);
-  
-  Status = GetSystemDirectory(FullPathBuffer, sizeof(FullPathBuffer));
-  if(Status == 0 || Status > sizeof(FullPathBuffer))
-  {
-     DPRINT1("GetSystemDirectory() failed! (%d)\n", GetLastError());
-     RtlFreeUnicodeString(&LayoutFile);
-     return NULL;
-  }
-  
-  RtlInitUnicodeString(&FullLayoutPath, FullPathBuffer);
-  FullLayoutPath.MaximumLength = sizeof(FullPathBuffer);
-  if(FullLayoutPath.Length < FullLayoutPath.MaximumLength-1)
-  {
-    FullLayoutPath.Buffer[FullLayoutPath.Length/sizeof(WCHAR)] = '\\';
-    FullLayoutPath.Buffer[FullLayoutPath.Length/sizeof(WCHAR)+1] = 0;
-    FullLayoutPath.Length+=sizeof(WCHAR);
-  }
-  Status = RtlAppendUnicodeStringToString(&FullLayoutPath, &LayoutFile);
+
+  RtlInitUnicodeString(&FullLayoutPath,SYSTEMROOT_DIR);
+  RtlAppendUnicodeStringToString(&FullLayoutPath,&LayoutFile);
+
   DPRINT("Loading Keyboard DLL %wZ\n", &FullLayoutPath);
+
   RtlFreeUnicodeString(&LayoutFile);
-  
-  if(!NT_SUCCESS(Status))
-  {
-    DPRINT1("RtlAppendUnicodeStringToString() failed! (%x)\n", Status);
-    return NULL;
-  }
 
-  KBModule = LoadLibraryEx(FullPathBuffer, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+  KeyboardLayoutWSTR = LocalAlloc(LMEM_ZEROINIT, 
+                                    FullLayoutPath.Length + sizeof(WCHAR));
 
-  if(!KBModule )
-  { 
-     DPRINT1( "Failed to load %wZ, lasterror = %d\n", &FullLayoutPath, GetLastError() );
+  if( !KeyboardLayoutWSTR )
+  {
+     DPRINT1("Couldn't allocate a string for the keyboard layout name.\n");
+     RtlFreeUnicodeString(&FullLayoutPath);
      return NULL;
   }
+  memcpy(KeyboardLayoutWSTR,FullLayoutPath.Buffer, FullLayoutPath.Length);
+
+  KeyboardLayoutWSTR[FullLayoutPath.Length / sizeof(WCHAR)] = 0;
+
+  KBModule = LoadLibraryW(KeyboardLayoutWSTR);
+
+  DPRINT( "Load Keyboard Layout: %S\n", KeyboardLayoutWSTR );
+
+  if( !KBModule )
+     DPRINT1( "Load Keyboard Layout: No %wZ\n", &FullLayoutPath );
 
   pAddr = GetProcAddress( KBModule, (LPCSTR) 1);
   offTable = (DWORD) pAddr - (DWORD) KBModule; // Weeks to figure this out!
@@ -237,7 +228,7 @@ IntLoadKeyboardLayout( LPCWSTR pwszKLID,
 
   FreeLibrary(KBModule);
 
-  Handle = CreateFileW( FullPathBuffer,
+  Handle = CreateFileW( KeyboardLayoutWSTR,
                         GENERIC_READ,
                         FILE_SHARE_READ,
                         NULL,
@@ -254,6 +245,9 @@ IntLoadKeyboardLayout( LPCWSTR pwszKLID,
 
   NtClose(Handle);
 
+  LocalFree(KeyboardLayoutWSTR);
+  RtlFreeUnicodeString(&FullLayoutPath);
+
   return hKL;
 }
 
index c96e0da..d50ec89 100644 (file)
@@ -259,7 +259,7 @@ static DWORD VERSION_GetFileVersionInfo_PE( LPCWSTR filename, DWORD datasize, LP
     }
     hRsrc = FindResourceW(hModule,
                          MAKEINTRESOURCEW(VS_VERSION_INFO),
-                         (LPCWSTR) VS_FILE_INFO);
+                         MAKEINTRESOURCEW(VS_FILE_INFO));
     if(!hRsrc)
     {
        WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_w(filename));
index 54b7e7e..a440ef1 100644 (file)
@@ -19,9 +19,6 @@
 <directory name="avifil32">
        <xi:include href="avifil32/avifil32.rbuild" />
 </directory>
-<directory name="beepmidi">
-       <xi:include href="beepmidi/beepmidi.rbuild" />
-</directory>
 <directory name="cabinet">
        <xi:include href="cabinet/cabinet.rbuild" />
 </directory>
 <directory name="netcfgx">
        <xi:include href="netcfgx/netcfgx.rbuild" />
 </directory>
-<directory name="netid">
-       <xi:include href="netid/netid.rbuild" />
-</directory>
 <directory name="newdev">
        <xi:include href="newdev/newdev.rbuild" />
 </directory>
index 61db02c..715e148 100644 (file)
@@ -48,7 +48,7 @@
 #define CRTC_CURLO         0x0f
 
 #define CHAR_ATTRIBUTE_BLACK  0x00  /* black on black */
-#define CHAR_ATTRIBUTE        0x07  /* grey on blue */
+#define CHAR_ATTRIBUTE        0x1F  /* grey on blue */
 
 /* GLOBALS *******************************************************************/
 
@@ -65,7 +65,7 @@ VidpVgaTextClearDisplay(VOID)
    ULONG i;
 
    for (i = 0; i < SizeX * SizeY; i++, ptr++)
-      *ptr = (0x0000 + ' ');
+      *ptr = (0x1700 + ' ');
 }
 
 static BOOLEAN NTAPI
index ef8f665..c1dc2ec 100644 (file)
@@ -11,7 +11,7 @@
 #define NDEBUG
 #include <debug.h>
 
-NTSTATUS
+NTSTATUS NTAPI
 GreenCreate(
        IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp)
@@ -24,7 +24,7 @@ GreenCreate(
        return STATUS_SUCCESS;
 }
 
-NTSTATUS
+NTSTATUS NTAPI
 GreenClose(
        IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp)
index b54fa96..6b6260f 100644 (file)
@@ -110,12 +110,12 @@ typedef struct _GREEN_DRIVER_EXTENSION
 
 /************************************ createclose.c */
 
-NTSTATUS
+NTSTATUS NTAPI
 GreenCreate(
        IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp);
 
-NTSTATUS
+NTSTATUS NTAPI
 GreenClose(
        IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp);
index f38a019..ce240a9 100644 (file)
@@ -155,7 +155,7 @@ typedef struct _NIC_ADAPTER
     UINT TXFree;    /* Number of free transmit buffers */
     UINT TXNext;    /* Next buffer to use */
     /* Length of packet. 0 means buffer is unused */
-    UINT TXSize[DRIVER_DEFAULT_TX_BUFFER_COUNT];
+    INT TXSize[DRIVER_DEFAULT_TX_BUFFER_COUNT];
     INT TXCurrent;  /* Current buffer beeing transmitted. -1 means none */
 
     /* Head of transmit queue */
index 5c2381d..a3ad1a3 100644 (file)
@@ -24,7 +24,7 @@ NTSTATUS TiGetProtocolNumber(
   if (*Name++ != (WCHAR)L'\\')
     return STATUS_UNSUCCESSFUL;
 
-  if (*Name == L'\0')
+  if (*Name == (WCHAR)NULL)
     return STATUS_UNSUCCESSFUL;
 
   RtlInitUnicodeString(&us, Name);
index b5a140a..b5495cb 100644 (file)
 //#define NDEBUG
 #include "debug.h"
 
-#include "ntndk.h"
+#include "ndk/obtypes.h"
+#include "ndk/obfuncs.h"
+
+#include "ndk/ifssupp.h"
+#include "ndk/setypes.h"
+#include "ndk/sefuncs.h"
 
 // I ment to make this test scalable, but for now
 // we work with two object types only
index dfc43b6..ca2faf5 100644 (file)
@@ -123,7 +123,7 @@ HalInitSystem(IN ULONG BootPhase,
         ((PKIPCR)KeGetPcr())->IDT[0x30].ExtendedOffset =
             (USHORT)(((ULONG_PTR)HalpClockInterrupt >> 16) & 0xFFFF);
         ((PKIPCR)KeGetPcr())->IDT[0x30].Offset =
-            (ULONG_PTR)HalpClockInterrupt;
+            (USHORT)HalpClockInterrupt;
         HalEnableSystemInterrupt(0x30, CLOCK2_LEVEL, Latched);
 
         /* Initialize DMA. NT does this in Phase 0 */
index bbe2156..c6cf27f 100644 (file)
@@ -123,7 +123,7 @@ HalInitSystem(IN ULONG BootPhase,
         ((PKIPCR)KeGetPcr())->IDT[0x30].ExtendedOffset =\r
             (USHORT)(((ULONG_PTR)HalpClockInterrupt >> 16) & 0xFFFF);\r
         ((PKIPCR)KeGetPcr())->IDT[0x30].Offset =\r
-            (ULONG_PTR)HalpClockInterrupt;\r
+            (USHORT)HalpClockInterrupt;\r
         HalEnableSystemInterrupt(0x30, CLOCK2_LEVEL, Latched);\r
 \r
         /* Initialize DMA. NT does this in Phase 0 */\r
index 1ad9354..f063792 100644 (file)
@@ -1806,7 +1806,7 @@ NdisQueryBufferOffset(
                         VirtualAddress, \
                         Length)         \
 {                                       \
-       if (ARGUMENT_PRESENT(VirtualAddress))                   \
+       if (VirtualAddress)                   \
                *((PVOID*)VirtualAddress) = MmGetSystemAddressForMdl(Buffer); \
                                         \
        *((PUINT)Length) = MmGetMdlByteCount(Buffer); \
@@ -2022,52 +2022,48 @@ NdisQueryBufferOffset(
  *   OUT PNDIS_BUFFER  *FirstBuffer  OPTIONAL,
  *   OUT PUINT  TotalPacketLength  OPTIONAL);
  */
-static __inline
-VOID
-NdisQueryPacket(
-    IN PNDIS_PACKET  Packet,
-    OUT PUINT  PhysicalBufferCount  OPTIONAL,
-    OUT PUINT  BufferCount  OPTIONAL,
-    OUT PNDIS_BUFFER  *FirstBuffer  OPTIONAL,
-    OUT PUINT  TotalPacketLength  OPTIONAL)
-{
-    if (FirstBuffer)
-        *FirstBuffer = Packet->Private.Head;
-    if (TotalPacketLength || BufferCount || PhysicalBufferCount)
-    {
-        if (!Packet->Private.ValidCounts)
-        {
-            UINT Offset;
-            UINT PacketLength;
-            PNDIS_BUFFER NdisBuffer;
-            UINT PhysicalBufferCount = 0;
-            UINT TotalPacketLength = 0;
-            UINT Count = 0;
-
-            for (NdisBuffer = Packet->Private.Head;
-                 NdisBuffer != (PNDIS_BUFFER)NULL;
-                 NdisBuffer = NdisBuffer->Next)
-            {
-                PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(NdisBuffer);
-                NdisQueryBufferOffset(NdisBuffer, &Offset, &PacketLength);
-                TotalPacketLength += PacketLength;
-                Count++;
-            }
-            Packet->Private.PhysicalCount = PhysicalBufferCount;
-            Packet->Private.TotalLength = TotalPacketLength;
-            Packet->Private.Count = Count;
-            Packet->Private.ValidCounts = TRUE;
-        }
-
-        if (PhysicalBufferCount)
-            *PhysicalBufferCount = Packet->Private.PhysicalCount;
-
-        if (BufferCount)
-            *BufferCount = Packet->Private.Count;
-
-        if (TotalPacketLength)
-            *TotalPacketLength = Packet->Private.TotalLength;
-    }
+#define NdisQueryPacket(Packet,                                           \
+                        PhysicalBufferCount,                              \
+                        BufferCount,                                      \
+                        FirstBuffer,                                      \
+                        TotalPacketLength)                                \
+{                                                                         \
+  if (FirstBuffer)                                                        \
+    *((PNDIS_BUFFER*)FirstBuffer) = (Packet)->Private.Head;               \
+  if ((TotalPacketLength) || (BufferCount) || (PhysicalBufferCount))      \
+  {                                                                       \
+    if (!(Packet)->Private.ValidCounts) {                                 \
+      UINT _Offset;                                                       \
+      UINT _PacketLength;                                                 \
+      PNDIS_BUFFER _NdisBuffer;                                           \
+      UINT _PhysicalBufferCount = 0;                                      \
+      UINT _TotalPacketLength   = 0;                                      \
+      UINT _Count               = 0;                                      \
+                                                                          \
+      for (_NdisBuffer = (Packet)->Private.Head;                          \
+        _NdisBuffer != (PNDIS_BUFFER)NULL;                                \
+        _NdisBuffer = _NdisBuffer->Next)                                  \
+      {                                                                   \
+        _PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(_NdisBuffer);   \
+        NdisQueryBufferOffset(_NdisBuffer, &_Offset, &_PacketLength);     \
+        _TotalPacketLength += _PacketLength;                              \
+        _Count++;                                                         \
+      }                                                                   \
+      (Packet)->Private.PhysicalCount = _PhysicalBufferCount;             \
+      (Packet)->Private.TotalLength   = _TotalPacketLength;               \
+      (Packet)->Private.Count         = _Count;                           \
+      (Packet)->Private.ValidCounts   = TRUE;                             \
+       }                                                                       \
+                                                                          \
+  if (PhysicalBufferCount)                                                \
+      *((PUINT)PhysicalBufferCount) = (Packet)->Private.PhysicalCount;    \
+                                                                          \
+  if (BufferCount)                                                        \
+      *((PUINT)BufferCount) = (Packet)->Private.Count;                    \
+                                                                          \
+  if (TotalPacketLength)                                                  \
+      *((PUINT)TotalPacketLength) = (Packet)->Private.TotalLength;        \
+  } \
 }
 
 /*
diff --git a/reactos/include/ddk/ntddft.h b/reactos/include/ddk/ntddft.h
deleted file mode 100644 (file)
index 4966eb2..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-\r
-#ifndef _NTDDFT_\r
-#define _NTDDFT_\r
-\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-#define FTTYPE  ((ULONG)'f')\r
-\r
-#define FT_SECONDARY_READ           CTL_CODE(FTTYPE, 4, METHOD_OUT_DIRECT, FILE_READ_ACCESS)\r
-#define FT_PRIMARY_READ             CTL_CODE(FTTYPE, 5, METHOD_OUT_DIRECT, FILE_READ_ACCESS)\r
-#define FT_BALANCED_READ_MODE       CTL_CODE(FTTYPE, 6, METHOD_NEITHER,  FILE_ANY_ACCESS)\r
-#define FT_SYNC_REDUNDANT_COPY      CTL_CODE(FTTYPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-#endif \r
-\r
index 9cc7e78..2929177 100644 (file)
@@ -50,9 +50,6 @@ extern "C" {
 #define NTSYSAPI
 #endif
 
-#define EX_PUSH_LOCK ULONG_PTR
-#define PEX_PUSH_LOCK PULONG_PTR
-
 #include "csq.h"
 
 typedef struct _SE_EXPORTS                  *PSE_EXPORTS;
@@ -758,36 +755,6 @@ typedef enum _TOKEN_INFORMATION_CLASS {
        TokenSandBoxInert,TokenAuditPolicy,TokenOrigin,
 } TOKEN_INFORMATION_CLASS;
 
-#define SYMLINK_FLAG_RELATIVE   1
-
-typedef struct _REPARSE_DATA_BUFFER {
-    ULONG  ReparseTag;
-    USHORT ReparseDataLength;
-    USHORT Reserved;
-    union {
-        struct {
-            USHORT SubstituteNameOffset;
-            USHORT SubstituteNameLength;
-            USHORT PrintNameOffset;
-            USHORT PrintNameLength;
-            ULONG Flags;
-            WCHAR PathBuffer[1];
-        } SymbolicLinkReparseBuffer;
-        struct {
-            USHORT SubstituteNameOffset;
-            USHORT SubstituteNameLength;
-            USHORT PrintNameOffset;
-            USHORT PrintNameLength;
-            WCHAR PathBuffer[1];
-        } MountPointReparseBuffer;
-        struct {
-            UCHAR  DataBuffer[1];
-        } GenericReparseBuffer;
-    };
-} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
-
-#define REPARSE_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
-
 typedef struct _FILE_ACCESS_INFORMATION {
     ACCESS_MASK AccessFlags;
 } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
@@ -1435,6 +1402,35 @@ typedef struct _PATHNAME_BUFFER {
     WCHAR Name[1];
 } PATHNAME_BUFFER, *PPATHNAME_BUFFER;
 
+#if (VER_PRODUCTBUILD >= 2600)
+
+typedef struct _PRIVATE_CACHE_MAP_FLAGS {
+    ULONG DontUse           : 16;
+    ULONG ReadAheadActive   : 1;
+    ULONG ReadAheadEnabled  : 1;
+    ULONG Available         : 14;
+} PRIVATE_CACHE_MAP_FLAGS, *PPRIVATE_CACHE_MAP_FLAGS;
+
+typedef struct _PRIVATE_CACHE_MAP {
+    _ANONYMOUS_UNION union {
+        CSHORT                  NodeTypeCode;
+        PRIVATE_CACHE_MAP_FLAGS Flags;
+        ULONG                   UlongFlags;
+    } DUMMYUNIONNAME;
+    ULONG                       ReadAheadMask;
+    PFILE_OBJECT                FileObject;
+    LARGE_INTEGER               FileOffset1;
+    LARGE_INTEGER               BeyondLastByte1;
+    LARGE_INTEGER               FileOffset2;
+    LARGE_INTEGER               BeyondLastByte2;
+    LARGE_INTEGER               ReadAheadOffset[2];
+    ULONG                       ReadAheadLength[2];
+    KSPIN_LOCK                  ReadAheadSpinLock;
+    LIST_ENTRY                  PrivateLinks;
+} PRIVATE_CACHE_MAP, *PPRIVATE_CACHE_MAP;
+
+#endif
+
 typedef enum _RTL_GENERIC_COMPARE_RESULTS
 {
     GenericLessThan,
@@ -1564,16 +1560,6 @@ typedef struct _RTL_AVL_TABLE
     PVOID TableContext;
 } RTL_AVL_TABLE, *PRTL_AVL_TABLE;
 
-NTSYSAPI
-VOID
-NTAPI
-RtlInitializeGenericTableAvl(
-    PRTL_AVL_TABLE Table,
-    PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
-    PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
-    PRTL_AVL_FREE_ROUTINE FreeRoutine,
-    PVOID TableContext
-);
 
 #if defined(USE_LPC6432)
 #define LPC_CLIENT_ID CLIENT_ID64
@@ -1729,6 +1715,16 @@ typedef struct _TUNNEL {
     USHORT              NumEntries;
 } TUNNEL, *PTUNNEL;
 
+typedef struct _VACB {
+    PVOID               BaseAddress;
+    PSHARED_CACHE_MAP   SharedCacheMap;
+    union {
+        LARGE_INTEGER   FileOffset;
+        USHORT          ActiveCount;
+    } Overlay;
+    LIST_ENTRY          LruList;
+} VACB, *PVACB;
+
 typedef struct _VAD_HEADER {
     PVOID       StartVPN;
     PVOID       EndVPN;
@@ -3093,14 +3089,6 @@ HalDisplayString (
     IN PCHAR String
 );
 
-NTKERNELAPI
-UCHAR
-NTAPI
-KeSetIdealProcessorThread(
-    IN OUT PKTHREAD Thread,
-    IN UCHAR Processor
-);
-
 NTKERNELAPI
 NTSTATUS
 NTAPI
index 1829506..2b0bc98 100644 (file)
@@ -427,11 +427,6 @@ typedef struct _KSYSTEM_TIME
 
 extern volatile KSYSTEM_TIME KeTickCount;
 
-#define NX_SUPPORT_POLICY_ALWAYSOFF 0
-#define NX_SUPPORT_POLICY_ALWAYSON 1
-#define NX_SUPPORT_POLICY_OPTIN 2
-#define NX_SUPPORT_POLICY_OPTOUT 3
-
 typedef struct _KUSER_SHARED_DATA
 {
     ULONG TickCountLowDeprecated;
@@ -5429,7 +5424,7 @@ KfReleaseSpinLock(
 */
 
 #define ARGUMENT_PRESENT(ArgumentPointer) \
-  ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
+  ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
 
 /*
  * ULONG
@@ -6459,12 +6454,6 @@ RtlxUnicodeStringToAnsiSize(
 #define RtlZeroBytes RtlZeroMemory
 #endif
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeAreAllApcsDisabled(
-    VOID
-);
 
 /* Guarded Mutex routines */
 
@@ -6524,22 +6513,6 @@ KeTryToAcquireGuardedMutex(
     IN OUT PKGUARDED_MUTEX GuardedMutex
 );
 
-NTKERNELAPI
-BOOLEAN
-FASTCALL
-ExAcquireRundownProtectionEx(
-     IN OUT PEX_RUNDOWN_REF RunRef,
-     IN ULONG Count
-);
-
-NTKERNELAPI
-VOID
-FASTCALL
-ExReleaseRundownProtectionEx(
-     IN OUT PEX_RUNDOWN_REF RunRef,
-     IN ULONG Count
-);
-
 /* Fast Mutex */
 #define ExInitializeFastMutex(_FastMutex) \
 { \
index 88cebfc..2bba252 100644 (file)
@@ -20,8 +20,6 @@ Author:
 #ifndef _ASM_H
 #define _ASM_H
 
-#define NEW_SCHEDULER
-
 //
 // PCR Access
 //
@@ -103,16 +101,15 @@ Author:
 #define KTHREAD_STACK_LIMIT                     0x1C
 #define KTHREAD_TEB                             0x74
 #define KTHREAD_KERNEL_STACK                    0x20
+#define KTHREAD_STATE                           0x4C
+#define KTHREAD_NPX_STATE                       0x4D
 #define KTHREAD_ALERTED                         0x5E
 #define KTHREAD_APCSTATE_PROCESS                0x28 + 0x10
 #define KTHREAD_PENDING_USER_APC                0x28 + 0x16
 #define KTHREAD_PENDING_KERNEL_APC              0x28 + 0x15
 #define KTHREAD_CONTEXT_SWITCHES                0x48
-#define KTHREAD_STATE                           0x4C
-#define KTHREAD_NPX_STATE                       0x4D
 #define KTHREAD_WAIT_IRQL                       0x4E
 #define KTHREAD_NEXT_PROCESSOR                  0x40
-#define KTHREAD_WAIT_REASON                     0x5A
 #define KTHREAD_SWAP_BUSY                       0x5D
 #define KTHREAD_SERVICE_TABLE                   0x118
 #define KTHREAD_PREVIOUS_MODE                   0xD7
@@ -139,16 +136,6 @@ Author:
 #define KPROCESS_ACTIVE_PROCESSORS              0x34
 #define EPROCESS_VDM_OBJECTS                    0x144
 
-//
-// KTIMER_TABLE Offsets
-//
-#ifdef __ASM__
-#define KTIMER_TABLE_ENTRY                      0x00
-#define KTIMER_TABLE_TIME                       0x08
-#define TIMER_ENTRY_SIZE                        0x10
-#define TIMER_TABLE_SIZE                        0x200
-#endif
-
 //
 // KPRCB Offsets
 //
@@ -158,8 +145,6 @@ Author:
 #define KPRCB_DR3                               0x304
 #define KPRCB_DR6                               0x308
 #define KPRCB_DR7                               0x20C
-#define KPRCB_TIMER_HAND                        0x964
-#define KPRCB_TIMER_REQUEST                     0x968
 
 //
 // KPCR Offsets
index e1faaa9..2e04cdb 100644 (file)
@@ -31,107 +31,7 @@ Author:
 //
 extern ULONG NTSYSAPI CcFastReadNotPossible;
 extern ULONG NTSYSAPI CcFastReadWait;
-extern ULONG NTSYSAPI CcFastReadResourceMiss;
-extern ULONG NTSYSAPI CcFastReadNoWait;
-extern ULONG NTSYSAPI CcFastMdlReadNotPossible;
 
-//
-// Virtual Address Control BLock
-//
-typedef struct _VACB
-{
-    PVOID BaseAddress;
-    struct _SHARED_CACHE_MAP *SharedCacheMap;
-    union
-    {
-        LARGE_INTEGER FileOffset;
-        USHORT ActiveCount;
-    } Overlay;
-    LIST_ENTRY LruList;
-} VACB, *PVACB;
-
-//
-// Private Cache Map Structure and Flags
-//
-typedef struct _PRIVATE_CACHE_MAP_FLAGS
-{
-    ULONG DontUse:16;
-    ULONG ReadAheadActive:1;
-    ULONG ReadAheadEnabled:1;
-    ULONG Available:14;
-} PRIVATE_CACHE_MAP_FLAGS;
-
-typedef struct _PRIVATE_CACHE_MAP
-{
-    union
-    {
-        CSHORT NodeTypeCode;
-        PRIVATE_CACHE_MAP_FLAGS Flags;
-        ULONG UlongFlags;
-    };
-    ULONG ReadAheadMask;
-    PFILE_OBJECT FileObject;
-    LARGE_INTEGER FileOffset1;
-    LARGE_INTEGER BeyondLastByte1;
-    LARGE_INTEGER FileOffset2;
-    LARGE_INTEGER BeyondLastByte2;
-    LARGE_INTEGER ReadAheadOffset[2];
-    ULONG ReadAheadLength[2];
-    KSPIN_LOCK ReadAheadSpinLock;
-    LIST_ENTRY PrivateLinks;
-} PRIVATE_CACHE_MAP, *PPRIVATE_CACHE_MAP;
-
-#ifdef _NTIFS_INCLUDED_
-
-//
-// Shared Cache Map
-//
-typedef struct _SHARED_CACHE_MAP
-{
-    SHORT NodeTypeCode;
-    SHORT NodeByteSize;
-    ULONG OpenCount;
-    LARGE_INTEGER FileSize;
-    LIST_ENTRY BcbList;
-    LARGE_INTEGER SectionSize;
-    LARGE_INTEGER ValidDataLength;
-    LARGE_INTEGER ValidDataGoal;
-    PVACB InitialVacbs[4];
-    PVACB Vacbs;
-    PFILE_OBJECT FileObject;
-    PVACB ActiveVacb;
-    PVOID NeedToZero;
-    ULONG ActivePage;
-    ULONG NeedToZeroPage;
-    ULONG ActiveVacbSpinLock;
-    ULONG VacbActiveCount;
-    ULONG DirtyPages;
-    LIST_ENTRY SharedCacheMapLinks;
-    ULONG Flags;
-    ULONG Status;
-    PMCB Mbcb;
-    PVOID Section;
-    PKEVENT CreateEvent;
-    PKEVENT WaitOnActiveCount;
-    ULONG PagesToWrite;
-    LONGLONG BeyondLastFlush;
-    PCACHE_MANAGER_CALLBACKS Callbacks;
-    PVOID LazyWriteContext;
-    PLIST_ENTRY PrivateList;
-    PVOID LogHandle;
-    PVOID FlushToLsnRoutine;
-    ULONG DirtyPageThreshold;
-    ULONG LazyWritePassCount;
-    PCACHE_UNINITIALIZE_EVENT UninitializeEvent;
-    PVACB NeedToZeroVacb;
-    ULONG BcbSpinLock;
-    PVOID Reserved;
-    KEVENT Event;
-    PEX_PUSH_LOCK VacbPushLock;
-    PPRIVATE_CACHE_MAP PrivateCacheMap;
-} SHARED_CACHE_MAP;
-
-#endif /* _NTIFS_INCLUDED_  */
-#endif /* NTOS_MODE_USER    */
-#endif /* _CCTYPES_H        */
+#endif
+#endif // _CCTYPES_H
 
index d987c74..0a404ed 100644 (file)
@@ -103,19 +103,6 @@ ExTryToAcquireResourceExclusiveLite(
     IN PERESOURCE Resource
 );
 
-//
-// Handle Table Functions
-//
-NTKERNELAPI
-BOOLEAN
-NTAPI
-ExEnumHandleTable(
-    IN PHANDLE_TABLE HandleTable,
-    IN PEX_ENUM_HANDLE_CALLBACK EnumHandleProcedure,
-    IN OUT PVOID Context,
-    OUT PHANDLE Handle OPTIONAL
-);
-
 #endif
 
 //
index fb221c6..a32a446 100644 (file)
@@ -361,17 +361,6 @@ NTSTATUS
 
 #else
 
-//
-// Handle Enumeration Callback
-//
-struct _HANDLE_TABLE_ENTRY;
-typedef BOOLEAN
-(NTAPI *PEX_ENUM_HANDLE_CALLBACK)(
-    IN struct _HANDLE_TABLE_ENTRY *HandleTableEntry,
-    IN HANDLE Handle,
-    IN PVOID Context
-);
-
 //
 // Compatibility with Windows XP Drivers using ERESOURCE
 //
@@ -499,25 +488,11 @@ typedef __ALIGNED(16) struct _EX_PUSH_LOCK_WAIT_BLOCK
 //
 typedef struct _CALLBACK_OBJECT
 {
-    ULONG Signature;
+    ULONG Name;
     KSPIN_LOCK Lock;
     LIST_ENTRY RegisteredCallbacks;
-    BOOLEAN AllowMultipleCallbacks;
-    UCHAR reserved[3];
-} CALLBACK_OBJECT, *PCALLBACK_OBJECT;
-
-//
-// Callback Handle
-//
-typedef struct _CALLBACK_REGISTRATION
-{
-    LIST_ENTRY Link;
-    PCALLBACK_OBJECT CallbackObject;
-    PCALLBACK_FUNCTION CallbackFunction;
-    PVOID CallbackContext;
-    ULONG Busy;
-    BOOLEAN UnregisterWaiting;
-} CALLBACK_REGISTRATION, *PCALLBACK_REGISTRATION;
+    ULONG AllowMultipleCallbacks;
+} CALLBACK_OBJECT , *PCALLBACK_OBJECT;
 
 //
 // Internal Callback Object
@@ -525,7 +500,7 @@ typedef struct _CALLBACK_REGISTRATION
 typedef struct _EX_CALLBACK_ROUTINE_BLOCK
 {
     EX_RUNDOWN_REF RundownProtect;
-    PEX_CALLBACK_FUNCTION Function;
+    PVOID Function;
     PVOID Context;
 } EX_CALLBACK_ROUTINE_BLOCK, *PEX_CALLBACK_ROUTINE_BLOCK;
 
@@ -603,6 +578,14 @@ typedef struct _HANDLE_TABLE_ENTRY
     };
 } HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;
 
+//
+// FIXME
+//
+#ifdef _REACTOS_
+#undef NTDDI_VERSION
+#define NTDDI_VERSION NTDDI_WIN2K
+#endif
+
 typedef struct _HANDLE_TABLE
 {
 #if (NTDDI_VERSION >= NTDDI_WINXP)
@@ -613,7 +596,7 @@ typedef struct _HANDLE_TABLE
     PEPROCESS QuotaProcess;
     PVOID UniqueProcessId;
 #if (NTDDI_VERSION >= NTDDI_WINXP)
-    EX_PUSH_LOCK HandleTableLock[4];
+    EX_PUSH_LOCK HandleLock;
     LIST_ENTRY HandleTableList;
     EX_PUSH_LOCK HandleContentionEvent;
 #else
index 5217162..d0fe92c 100644 (file)
@@ -23,7 +23,9 @@ Author:
 // Dependencies
 //
 #include <umtypes.h>
-#include <ifssupp.h>
+#if !defined(_NTIFS_)
+typedef PVOID PFS_FILTER_CALLBACKS;
+#endif
 
 //
 // I/O Completion Access Rights
index 60597af..3045cf9 100644 (file)
@@ -161,15 +161,4 @@ typedef struct _SYSDBG_TRIAGE_DUMP
     PHANDLE Handles;
 } SYSDBG_TRIAGE_DUMP, *PSYSDBG_TRIAGE_DUMP;
 
-//
-// KD Structures
-//
-typedef struct _KD_SYMBOLS_INFO
-{
-    PVOID BaseOfDll;
-    PVOID ProcessId;
-    ULONG CheckSum;
-    ULONG SizeOfImage;
-} KD_SYMBOLS_INFO, *PKD_SYMBOLS_INFO;
-
 #endif // _KDTYPES_H
index db0bbe1..e764386 100644 (file)
@@ -195,12 +195,6 @@ KeIsExecutingDpc(
     VOID
 );
 
-VOID
-NTAPI
-KeFlushQueuedDpcs(
-    VOID
-);
-
 BOOLEAN
 NTAPI
 KiIpiServiceRoutine(
index 290c08a..6cb747d 100644 (file)
@@ -39,11 +39,6 @@ Author:
 //
 #define SSDT_MAX_ENTRIES                2
 
-//
-// Processor Architectures
-//
-#define PROCESSOR_ARCHITECTURE_INTEL    0
-
 //
 // Object Type Mask for Kernel Dispatcher Objects
 //
@@ -92,10 +87,8 @@ Author:
 #define KF_3DNOW                        0x00004000
 #define KF_AMDK6MTRR                    0x00008000
 #define KF_XMMI64                       0x00010000
-#define KF_DTS                          0x00020000
-#define KF_NX_BIT                       0x20000000
-#define KF_NX_DISABLED                  0x40000000
-#define KF_NX_ENABLED                   0x80000000
+#define KF_NX_DISABLED                  0x00400000
+#define KF_NX_ENABLED                   0x00800000
 
 //
 // KPCR Access for non-IA64 builds
@@ -287,16 +280,6 @@ typedef enum _KTHREAD_STATE
 #endif
 } KTHREAD_STATE, *PKTHREAD_STATE;
 
-//
-// Adjust reasons
-//
-typedef enum _ADJUST_REASON
-{
-    AdjustNone = 0,
-    AdjustUnwait = 1,
-    AdjustBoost = 2
-} ADJUST_REASON;
-
 //
 // Process States
 //
@@ -686,6 +669,7 @@ typedef enum _KOBJECTS
 //
 // Kernel Thread (KTHREAD)
 //
+#include <pshpack1.h>
 typedef struct _KTHREAD
 {
     DISPATCHER_HEADER DispatcherHeader;
@@ -706,31 +690,31 @@ typedef struct _KTHREAD
         {
             UCHAR ApcStateFill[23];
             UCHAR ApcQueueable;
-            volatile UCHAR NextProcessor;
-            volatile UCHAR DeferredProcessor;
-            UCHAR AdjustReason;
-            SCHAR AdjustIncrement;
         };
     };
+    volatile UCHAR NextProcessor;
+    volatile UCHAR DeferredProcessor;
+    UCHAR AdjustReason;
+    SCHAR AdjustIncrement;
     KSPIN_LOCK ApcQueueLock;
     ULONG ContextSwitches;
     volatile UCHAR State;
     UCHAR NpxState;
-    KIRQL WaitIrql;
-    KPROCESSOR_MODE WaitMode;
-    LONG_PTR WaitStatus;
+    UCHAR WaitIrql;
+    SCHAR WaitMode;
+    LONG WaitStatus;
     union
     {
         PKWAIT_BLOCK WaitBlockList;
         PKGATE GateObject;
     };
-    BOOLEAN Alertable;
-    BOOLEAN WaitNext;
+    UCHAR Alertable;
+    UCHAR WaitNext;
     UCHAR WaitReason;
     SCHAR Priority;
-    BOOLEAN EnableStackSwap;
+    UCHAR EnableStackSwap;
     volatile UCHAR SwapBusy;
-    BOOLEAN Alerted[MaximumMode];
+    UCHAR Alerted[2];
     union
     {
         LIST_ENTRY WaitListEntry;
@@ -751,50 +735,51 @@ typedef struct _KTHREAD
     union
     {
         KTIMER Timer;
+        UCHAR TimerFill[40];
+    };
+    union
+    {
         struct
         {
-            UCHAR TimerFill[40];
-            union
-            {
-                struct
-                {
-                    LONG AutoAlignment:1;
-                    LONG DisableBoost:1;
+            LONG AutoAlignment:1;
+            LONG DisableBoost:1;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-                    LONG EtwStackTrace1ApcInserted:1;
-                    LONG EtwStackTrace2ApcInserted:1;
-                    LONG CycleChargePending:1;
-                    LONG ReservedFlags:27;
+            LONG EtwStackTrace1ApcInserted:1;
+            LONG EtwStackTrace2ApcInserted:1;
+            LONG CycleChargePending:1;
+            LONG ReservedFlags:27;
 #else
-                    LONG ReservedFlags:30;
+            LONG ReservedFlags:30;
 #endif
-                };
-                LONG ThreadFlags;
-            };
         };
+        LONG ThreadFlags;
     };
+    PVOID Padding;
     union
     {
-        KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1];
-        struct
+        KWAIT_BLOCK WaitBlock[4];
+        union
         {
-            UCHAR WaitBlockFill0[23];
-            BOOLEAN SystemAffinityActive;
-        };
-        struct
-        {
-            UCHAR WaitBlockFill1[47];
-            CCHAR PreviousMode;
-        };
-        struct
-        {
-            UCHAR WaitBlockFill2[71];
-            UCHAR ResourceIndex;
-        };
-        struct
-        {
-            UCHAR WaitBlockFill3[95];
-            UCHAR LargeStack;
+            struct
+            {
+                UCHAR WaitBlockFill0[23];
+                UCHAR SystemAffinityActive;
+            };
+            struct
+            {
+                UCHAR WaitBlockFill1[47];
+                SCHAR PreviousMode;
+            };
+            struct
+            {
+                UCHAR WaitBlockFill2[71];
+                UCHAR ResourceIndex;
+            };
+            struct
+            {
+                UCHAR WaitBlockFill3[95];
+                UCHAR LargeStack;
+            };
         };
     };
     LIST_ENTRY QueueListEntry;
@@ -806,15 +791,15 @@ typedef struct _KTHREAD
     PVOID ServiceTable;
     UCHAR ApcStateIndex;
     UCHAR IdealProcessor;
-    BOOLEAN Preempted;
+    UCHAR Preempted;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    BOOLEAN CalloutActive;
+    UCHAR CalloutActive;
 #else
-    BOOLEAN ProcessReadyQueue;
+    UCHAR ProcessReadyQueue;
 #endif
-    BOOLEAN KernelStackResident;
-    SCHAR BasePriority;
-    SCHAR PriorityDecrement;
+    UCHAR KernelStackResident;
+    CHAR BasePriority;
+    CHAR PriorityDecrement;
     CHAR Saturation;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
     ULONG SystemCallNumber;
@@ -838,29 +823,29 @@ typedef struct _KTHREAD
     union
     {
         KAPC_STATE SavedApcState;
-        struct
+        union
         {
             UCHAR SavedApcStateFill[23];
-            CCHAR FreezeCount;
-            CCHAR SuspendCount;
-            UCHAR UserIdealProcessor;
+            SCHAR FreezeCount;
+        };
+    };
+    SCHAR SuspendCount;
+    UCHAR UserIdealProcessor;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-            union
-            {
-                struct
-                {
-                    UCHAR ReservedBits0:1;
-                    UCHAR SegmentsPresent:1;
-                    UCHAR Reservedbits1:1;
-                };
-                UCHAR NestedStateFlags;
-            };
-#else
-            UCHAR CalloutActive;
-#endif
-            UCHAR Iopl;
+    union
+    {
+        struct
+        {
+            UCHAR ReservedBits0:1;
+            UCHAR SegmentsPresent:1;
+            UCHAR Reservedbits1:1;
         };
+        UCHAR NestedStateFlags;
     };
+#else
+    UCHAR CalloutActive;
+#endif
+    UCHAR Iopl;
     PVOID Win32Thread;
     PVOID StackBase;
     union
@@ -899,18 +884,15 @@ typedef struct _KTHREAD
         {
             UCHAR SuspendApcFill5[47];
             UCHAR PowerState;
-            ULONG UserTime;
         };
     };
+    ULONG UserTime;
     union
     {
         KSEMAPHORE SuspendSemaphore;
-        struct
-        {
-            UCHAR SuspendSemaphorefill[20];
-            ULONG SListFaultCount;
-        };
+        UCHAR SuspendSemaphorefill[20];
     };
+    ULONG SListFaultCount;
     LIST_ENTRY ThreadListEntry;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
     LIST_ENTRY MutantListHead;
@@ -920,6 +902,7 @@ typedef struct _KTHREAD
     PVOID MdlForLockedteb;
 #endif
 } KTHREAD;
+#include <poppack.h>
 
 #define ASSERT_THREAD(object) \
     ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
index 0547f9f..30bc239 100644 (file)
@@ -38,7 +38,6 @@ Author:
 #include <excpt.h>          // C Standard Header
 #include <stdarg.h>         // C Standard Header
 #include <umtypes.h>        // General Definitions
-#include <intrin.h>         // Use Inlined Intrinsics
 
 //
 // Type Headers
@@ -82,9 +81,6 @@ Author:
 #include <sefuncs.h>        // Security Subsystem Functions
 #include <umfuncs.h>        // User-Mode NT Library Functions
 
-//
-// Assembly Support
-//
 #include <asm.h>            // Assembly Offsets
 
 #ifdef _MSC_VER
index 6e86a59..070404c 100644 (file)
@@ -23,7 +23,6 @@ Author:
 // Dependencies
 //
 #include <umtypes.h>
-#include <pstypes.h>
 #include <obtypes.h>
 
 #ifndef NTOS_MODE_USER
@@ -109,7 +108,7 @@ ObReferenceObjectByName(
 );
 
 NTKERNELAPI
-BOOLEAN
+NTSTATUS 
 NTAPI
 ObFindHandleForObject(
     IN PEPROCESS Process,
index 0b4ed52..72d50af 100644 (file)
@@ -23,14 +23,16 @@ Author:
 // Dependencies
 //
 #include <umtypes.h>
-#ifndef NTOS_MODE_USER
-#include <extypes.h>
-#endif
 
-#undef NTDDI_VERSION
-#define NTDDI_VERSION NTDDI_WS03SP1
+//
+// If the IFS wasn't included, define this here
+//
+#ifndef EX_PUSH_LOCK
+#define EX_PUSH_LOCK    ULONG_PTR
+#endif
 
 #ifdef NTOS_MODE_USER
+
 //
 // Definitions for Object Creation
 //
@@ -84,7 +86,6 @@ Author:
 #define OB_FLAG_PERMANENT                       0x10
 #define OB_FLAG_SECURITY                        0x20
 #define OB_FLAG_SINGLE_PROCESS                  0x40
-#define OB_FLAG_DEFER_DELETE                    0x80
 
 #define OBJECT_TO_OBJECT_HEADER(o)                          \
     CONTAINING_RECORD((o), OBJECT_HEADER, Body)
@@ -106,11 +107,6 @@ Author:
         OB_FLAG_CREATOR_INFO) ? NULL: ((PCHAR)(h) -         \
         sizeof(OBJECT_HEADER_CREATOR_INFO))))
 
-#define OBJECT_HEADER_TO_EXCLUSIVE_PROCESS(h)               \
-    ((!((h)->Flags & OB_FLAG_EXCLUSIVE)) ?                  \
-        NULL: (((POBJECT_HEADER_QUOTA_INFO)((PCHAR)(h) -    \
-        (h)->QuotaInfoOffset))->ExclusiveProcess))
-
 //
 // Reasons for Open Callback
 //
@@ -269,34 +265,6 @@ typedef struct _OBJECT_DIRECTORY_INFORMATION
     UNICODE_STRING TypeName;
 } OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;
 
-//
-// Object Type Information
-//
-typedef struct _OBJECT_TYPE_INFORMATION
-{
-    UNICODE_STRING TypeName;
-    ULONG TotalNumberOfObjects;
-    ULONG TotalNumberOfHandles;
-    ULONG TotalPagedPoolUsage;
-    ULONG TotalNonPagedPoolUsage;
-    ULONG TotalNamePoolUsage;
-    ULONG TotalHandleTableUsage;
-    ULONG HighWaterNumberOfObjects;
-    ULONG HighWaterNumberOfHandles;
-    ULONG HighWaterPagedPoolUsage;
-    ULONG HighWaterNonPagedPoolUsage;
-    ULONG HighWaterNamePoolUsage;
-    ULONG HighWaterHandleTableUsage;
-    ULONG InvalidAttributes;
-    GENERIC_MAPPING GenericMapping;
-    ULONG ValidAccessMask;
-    BOOLEAN SecurityRequired;
-    BOOLEAN MaintainHandleCount;
-    ULONG PoolType;
-    ULONG DefaultPagedPoolCharge;
-    ULONG DefaultNonPagedPoolCharge;
-} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
-
 #ifndef NTOS_MODE_USER
 
 typedef struct _OBJECT_BASIC_INFORMATION
@@ -334,14 +302,14 @@ typedef struct _OBJECT_CREATE_INFORMATION
 typedef struct _OBJECT_TYPE_INITIALIZER
 {
     USHORT Length;
-    BOOLEAN UseDefaultObject;
-    BOOLEAN CaseInsensitive;
+    UCHAR UseDefaultObject;
+    UCHAR CaseInsensitive;
     ULONG InvalidAttributes;
     GENERIC_MAPPING GenericMapping;
     ULONG ValidAccessMask;
-    BOOLEAN SecurityRequired;
-    BOOLEAN MaintainHandleCount;
-    BOOLEAN MaintainTypeList;
+    UCHAR SecurityRequired;
+    UCHAR MaintainHandleCount;
+    UCHAR MaintainTypeList;
     POOL_TYPE PoolType;
     ULONG DefaultPagedPoolCharge;
     ULONG DefaultNonPagedPoolCharge;
@@ -391,8 +359,8 @@ typedef struct _OBJECT_DIRECTORY
     struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[NUMBER_HASH_BUCKETS];
 #if (NTDDI_VERSION < NTDDI_WINXP)
     ERESOURCE Lock;
-#else
-    EX_PUSH_LOCK Lock;
+#elif (NTDDI_VERSION >= NTDDI_WINXP)
+    ERESOURCE Lock; // FIXME: HACKHACK, SHOULD BE EX_PUSH_LOCK
 #endif
 #if (NTDDI_VERSION < NTDDI_WINXP)
     BOOLEAN CurrentEntryValid;
@@ -427,7 +395,7 @@ typedef struct _OBJECT_HANDLE_COUNT_ENTRY
 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
 {
     ULONG CountEntries;
-    OBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
+    POBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
 } OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
 
 typedef struct _OBJECT_HEADER_HANDLE_INFO
index c85f976..fcb8a08 100644 (file)
@@ -2502,17 +2502,7 @@ DbgPrompt(
 
 VOID
 NTAPI
-DbgBreakPoint(
-    VOID
-);
-
-NTSTATUS
-NTAPI
-DbgLoadImageSymbols(
-    IN PANSI_STRING Name,
-    IN PVOID Base,
-    IN ULONG ProcessId
-);
+DbgBreakPoint(VOID);
 
 //
 // Generic Table Functions
index 7955ac4..bb701d3 100644 (file)
@@ -38,6 +38,9 @@
        implementation - e.g. __stosX; on the other hand, some memory barriers that
        *are* present could have been missed
 */
+/*
+       FIXME: atomic intrinsics haven't been tested yet
+*/
 
 /*
        NOTE: this is a *compatibility* header. Some functions may look wrong at
        would use in the same case
 */
 
+/*
+       BUGBUG: 'long long' arguments and returns mess up GCC royally. There has to
+       be something we can do about them
+*/
 #ifdef __i386__
 
 /*** Stack frame juggling ***/
 
 
 /*** Atomic operations ***/
+/* TODO: _ReadBarrier */
+/* TODO: _WriteBarrier */
 
 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
 #define _ReadWriteBarrier() __sync_synchronize()
 #else
-static void __inline__ __attribute__((always_inline)) _MemoryBarrier(void)
-{
-       __asm__ __volatile__("" : : : "memory");
-}
-#define _ReadWriteBarrier() _MemoryBarrier()
+/* TODO: _ReadWriteBarrier() */
 #endif
 
-/* BUGBUG: GCC only supports full barriers */
-#define _ReadBarrier _ReadWriteBarrier
-#define _WriteBarrier _ReadWriteBarrier
-
 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
 
 static __inline__ __attribute__((always_inline)) char _InterlockedCompareExchange8(volatile char * const Destination, const char Exchange, const char Comperand)
@@ -189,66 +190,82 @@ static __inline__ __attribute__((always_inline)) long _InterlockedXor(volatile l
 static __inline__ __attribute__((always_inline)) char _InterlockedCompareExchange8(volatile char * const Destination, const char Exchange, const char Comperand)
 {
        char retval = Comperand;
-       __asm__("lock; cmpxchgb %b[Exchange], %[Destination]" : [retval] "+a" (retval) : [Destination] "m" (*Destination), [Exchange] "q" (Exchange) : "memory");
+       __asm__("lock; cmpxchgb %b[Exchange], %[Destination]" : "=a" (retval) : [Destination] "rm" (Destination), [Exchange] "r" (Exchange) : "memory");
        return retval;
 }
 
 static __inline__ __attribute__((always_inline)) short _InterlockedCompareExchange16(volatile short * const Destination, const short Exchange, const short Comperand)
 {
        short retval = Comperand;
-       __asm__("lock; cmpxchgw %w[Exchange], %[Destination]" : [retval] "+a" (retval) : [Destination] "m" (*Destination), [Exchange] "q" (Exchange): "memory");
+       __asm__("lock; cmpxchgw %w[Exchange], %[Destination]" : "=a" (retval) : [Destination] "rm" (Destination), [Exchange] "r" (Exchange): "memory");
        return retval;
 }
 
 static __inline__ __attribute__((always_inline)) long _InterlockedCompareExchange(volatile long * const Destination, const long Exchange, const long Comperand)
 {
        long retval = Comperand;
-       __asm__("lock; cmpxchgl %k[Exchange], %[Destination]" : [retval] "+a" (retval) : [Destination] "m" (*Destination), [Exchange] "q" (Exchange): "memory");
+       __asm__("lock; cmpxchgl %k[Exchange], %[Destination]" : "=a" (retval) : [Destination] "rm" (Destination), [Exchange] "r" (Exchange): "memory");
        return retval;
 }
 
 static __inline__ __attribute__((always_inline)) long long _InterlockedCompareExchange64(volatile long long * const Destination, const long long Exchange, const long long Comperand)
 {
-       long long retval = Comperand;
+       unsigned long lo32Retval = (unsigned long)((Comperand >>  0) & 0xFFFFFFFF);
+       long hi32Retval = (unsigned long)((Comperand >> 32) & 0xFFFFFFFF);
+
+       unsigned long lo32Exchange = (unsigned long)((Exchange >>  0) & 0xFFFFFFFF);
+       long hi32Exchange = (unsigned long)((Exchange >> 32) & 0xFFFFFFFF);
 
        __asm__
        (
                "cmpxchg8b %[Destination]" :
-               [retval] "+A" (retval) :
-                       [Destination] "m" (*Destination),
-                       "b" ((unsigned long)((Exchange >>  0) & 0xFFFFFFFF)),
-                       "c" ((unsigned long)((Exchange >> 32) & 0xFFFFFFFF)) :
+               "=a" (lo32Retval), "=d" (hi32Retval) :
+               [Destination] "rm" (Destination), "b" (lo32Exchange), "c" (hi32Exchange) :
                "memory"
        );
 
-       return retval;
+       {
+               union u_
+               {
+                       long long ll;
+                       struct s_
+                       {
+                               unsigned long lo32;
+                               long hi32;
+                       }
+                       s;
+               }
+               u = { s : { lo32 : lo32Retval, hi32 : hi32Retval } };
+
+               return u.ll;
+       }
 }
 
 static __inline__ __attribute__((always_inline)) void * _InterlockedCompareExchangePointer(void * volatile * const Destination, void * const Exchange, void * const Comperand)
 {
-       void * retval = (void *)Comperand;
-       __asm__("lock; cmpxchgl %k[Exchange], %[Destination]" : [retval] "=a" (retval) : "[retval]" (retval), [Destination] "m" (*Destination), [Exchange] "q" (Exchange) : "memory");
+       void * retval;
+       __asm__("lock; cmpxchgl %k[Exchange], %[Destination]" : "=a" (retval) : [Destination] "rm" (Destination), [Exchange] "r" (Exchange), "a" (Comperand) : "memory");
        return retval;
 }
 
 static __inline__ __attribute__((always_inline)) long _InterlockedExchange(volatile long * const Target, const long Value)
 {
        long retval = Value;
-       __asm__("xchgl %[retval], %[Target]" : [retval] "+r" (retval) : [Target] "m" (*Target) : "memory");
+       __asm__("lock; xchgl %[retval], %[Target]" : [retval] "=r" (retval) : [Target] "rm" (Target) : "memory");
        return retval;
 }
 
 static __inline__ __attribute__((always_inline)) void * _InterlockedExchangePointer(void * volatile * const Target, void * const Value)
 {
        void * retval = Value;
-       __asm__("xchgl %[retval], %[Target]" : [retval] "+r" (retval) : [Target] "m" (*Target) : "memory");
+       __asm__("lock; xchgl %[retval], %[Target]" : [retval] "=r" (retval) : [Target] "rm" (Target) : "memory");
        return retval;
 }
 
 static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd(volatile long * const Addend, const long Value)
 {
        long retval = Value;
-       __asm__("lock; xaddl %[retval], %[Addend]" : [retval] "+r" (retval) : [Addend] "m" (*Addend) : "memory");
+       __asm__("lock; xaddl %[retval], %[Addend]" : [retval] "=r" (retval) : [Addend] "rm" (Addend));
        return retval;
 }
 
@@ -432,17 +449,17 @@ static __inline__ __attribute__((always_inline)) long _InterlockedIncrement(vola
        return _InterlockedExchangeAdd(lpAddend, 1) + 1;
 }
 
-static __inline__ __attribute__((always_inline)) unsigned char _interlockedbittestandreset(volatile long * a, const long b)
+static __inline__ __attribute__((always_inline)) unsigned char _interlockedbittestandreset(volatile long * const a, const long b)
 {
        unsigned char retval;
-       __asm__("lock; btrl %[b], %[a]; setb %b[retval]" : [retval] "=r" (retval), [a] "=m" (a) : [b] "Ir" (b) : "memory");
+       __asm__("lock; btr %[b], %[a]; setc %b[retval]" : [retval] "=q" (retval) : [a] "rm" (a), [b] "Nr" (b));
        return retval;
 }
 
-static __inline__ __attribute__((always_inline)) unsigned char _interlockedbittestandset(volatile long * a, const long b)
+static __inline__ __attribute__((always_inline)) unsigned char _interlockedbittestandset(volatile long * const a, const long b)
 {
        unsigned char retval;
-       __asm__("lock; btsl %[b], %[a]; setc %b[retval]" : [retval] "=r" (retval), [a] "=m" (a) : [b] "Ir" (b) : "memory");
+       __asm__("lock; bts %[b], %[a]; setc %b[retval]" : [retval] "=q" (retval) : [a] "rm" (a), [b] "Nr" (b));
        return retval;
 }
 
@@ -678,69 +695,141 @@ static __inline__ __attribute__((always_inline)) unsigned short _rotr16(const un
        return retval;
 }
 
-/*
-       NOTE: in __ll_lshift, __ll_rshift and __ull_rshift we use the "A"
-       constraint (edx:eax) for the Mask argument, because it's the only way GCC
-       can pass 64-bit operands around - passing the two 32 bit parts separately
-       just confuses it. Also we declare Bit as an int and then truncate it to
-       match Visual C++ behavior
-*/
-static __inline__ __attribute__((always_inline)) unsigned long long __ll_lshift(const unsigned long long Mask, const int Bit)
+static __inline__ __attribute__((always_inline)) unsigned long long __ll_lshift(const unsigned long long Mask, int Bit)
 {
-       unsigned long long retval = Mask;
+       unsigned long lo32 = (unsigned long)((Mask >>  0) & 0xFFFFFFFF);
+       unsigned long hi32 = (unsigned long)((Mask >> 32) & 0xFFFFFFFF);
 
        __asm__
        (
-               "shldl %b[Bit], %%eax, %%edx; sall %b[Bit], %%eax" :
-               "+A" (retval) :
-               [Bit] "Nc" ((unsigned char)((unsigned long)Bit) & 0xFF)
+               "shldl %b[Bit], %k[Lo32], %k[Hi32]; sall %b[Bit], %k[Lo32]" :
+               [Lo32] "=q" (lo32), [Hi32] "=qm" (hi32):
+               "[Lo32]" (lo32), "[Hi32]" (hi32), [Bit] "Ic" (Bit)
        );
 
-       return retval;
+       {
+               union u_
+               {
+                       unsigned long long ull;
+                       struct s_
+                       {
+                               unsigned long lo32;
+                               unsigned long hi32;
+                       }
+                       s;
+               }
+               u = { s : { lo32 : lo32, hi32 : hi32 } };
+
+               return u.ull;
+       }
 }
 
 static __inline__ __attribute__((always_inline)) long long __ll_rshift(const long long Mask, const int Bit)
 {
-       unsigned long long retval = Mask;
+       unsigned long lo32 = (unsigned long)((Mask >>  0) & 0xFFFFFFFF);
+       long hi32 = (unsigned long)((Mask >> 32) & 0xFFFFFFFF);
 
        __asm__
        (
-               "shldl %b[Bit], %%eax, %%edx; sarl %b[Bit], %%eax" :
-               "+A" (retval) :
-               [Bit] "Nc" ((unsigned char)((unsigned long)Bit) & 0xFF)
+               "shrdl %b[Bit], %k[Lo32], %k[Hi32]; sarl %b[Bit], %k[Lo32]" :
+               [Lo32] "=q" (lo32), [Hi32] "=qm" (hi32):
+               "[Lo32]" (lo32), "[Hi32]" (hi32), [Bit] "Ic" (Bit)
        );
 
-       return retval;
+       {
+               union u_
+               {
+                       long long ll;
+                       struct s_
+                       {
+                               unsigned long lo32;
+                               long hi32;
+                       }
+                       s;
+               }
+               u = { s : { lo32 : lo32, hi32 : hi32 } };
+
+               return u.ll;
+       }
 }
 
 static __inline__ __attribute__((always_inline)) unsigned long long __ull_rshift(const unsigned long long Mask, int Bit)
 {
-       unsigned long long retval = Mask;
+       unsigned long lo32 = (unsigned long)((Mask >>  0) & 0xFFFFFFFF);
+       unsigned long hi32 = (unsigned long)((Mask >> 32) & 0xFFFFFFFF);
 
        __asm__
        (
-               "shrdl %b[Bit], %%eax, %%edx; shrl %b[Bit], %%eax" :
-               "+A" (retval) :
-               [Bit] "Nc" ((unsigned char)((unsigned long)Bit) & 0xFF)
+               "shrdl %b[Bit], %k[Hi32], %k[Lo32]; shrl %b[Bit], %k[Hi32]" :
+               [Lo32] "=qm" (lo32), [Hi32] "=q" (hi32):
+               "[Lo32]" (lo32), "[Hi32]" (hi32), [Bit] "Ic" (Bit)
        );
 
-       return retval;
+       {
+               union u_
+               {
+                       unsigned long long ull;
+                       struct s_
+                       {
+                               unsigned long lo32;
+                               unsigned long hi32;
+                       }
+                       s;
+               }
+               u = { s : { lo32 : lo32, hi32 : hi32 } };
+
+               return u.ull;
+       }
 }
 
 
 /*** 64-bit math ***/
 static __inline__ __attribute__((always_inline)) long long __emul(const int a, const int b)
 {
-       long long retval;
-       __asm__("imull %[b]" : "=A" (retval) : [a] "a" (a), [b] "rm" (b));
-       return retval;
+       unsigned long lo32;
+       long hi32;
+
+       __asm__("imul %[b]" : "=a" (lo32), "=d" (hi32) : [a] "a" (a), [b] "rm" (b));
+
+       {
+               union u_
+               {
+                       long long ll;
+                       struct s_
+                       {
+                               unsigned long lo32;
+                               long hi32;
+                       }
+                       s;
+               }
+               u = { s : { lo32 : lo32, hi32 : hi32 } };
+
+               return u.ll;
+       }
 }
 
 static __inline__ __attribute__((always_inline)) unsigned long long __emulu(const unsigned int a, const unsigned int b)
 {
-       unsigned long long retval;
-       __asm__("mull %[b]" : "=A" (retval) : [a] "a" (a), [b] "rm" (b));
-       return retval;
+       unsigned long lo32;
+       unsigned long hi32;
+
+       __asm__("mul %[b]" : "=a" (lo32), "=d" (hi32) : [a] "a" (a), [b] "rm" (b));
+
+       {
+               union u_
+               {
+                       unsigned long long ull;
+                       struct s_
+                       {
+                               unsigned long lo32;
+                               unsigned long hi32;
+                       }
+                       s;
+               }
+               u = { s : { lo32 : lo32, hi32 : hi32 } };
+
+               return u.ull;
+       }
 }
 
 
@@ -833,14 +922,31 @@ static __inline__ __attribute__((always_inline)) void __outdwordstring(unsigned
 /*** System information ***/
 static __inline__ __attribute__((always_inline)) void __cpuid(int CPUInfo[], const int InfoType)
 {
-       __asm__ __volatile__("cpuid" : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : "a" (InfoType));
+       __asm__("cpuid" : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : "a" (InfoType));
 }
 
 static __inline__ __attribute__((always_inline)) unsigned long long __rdtsc(void)
 {
-       unsigned long long retval;
-       __asm__ __volatile__("rdtsc" : "=A"(retval));
-       return retval;
+       unsigned long lo32;
+       unsigned long hi32;
+
+       __asm__("rdtsc" : "=a" (lo32), "=d" (hi32));
+
+       {
+               union u_
+               {
+                       unsigned long long ull;
+                       struct s_
+                       {
+                               unsigned long lo32;
+                               unsigned long hi32;
+                       }
+                       s;
+               }
+               u = { s : { lo32 : lo32, hi32 : hi32 } };
+
+               return u.ull;
+       }
 }
 
 
@@ -870,44 +976,44 @@ static __inline__ __attribute__((always_inline)) void _enable(void)
 static __inline__ __attribute__((always_inline)) unsigned long __readcr0(void)
 {
        unsigned long value;
-       __asm__ __volatile__("mov %%cr0, %[value]" : [value] "=q" (value));
+       __asm__("mov %%cr0, %[value]" : [value] "=q" (value));
        return value;
 }
 
 static __inline__ __attribute__((always_inline)) unsigned long __readcr2(void)
 {
        unsigned long value;
-       __asm__ __volatile__("mov %%cr2, %[value]" : [value] "=q" (value));
+       __asm__("mov %%cr2, %[value]" : [value] "=q" (value));
        return value;
 }
 
 static __inline__ __attribute__((always_inline)) unsigned long __readcr3(void)
 {
        unsigned long value;
-       __asm__ __volatile__("mov %%cr3, %[value]" : [value] "=q" (value));
+       __asm__("mov %%cr3, %[value]" : [value] "=q" (value));
        return value;
 }
 
 static __inline__ __attribute__((always_inline)) unsigned long __readcr4(void)
 {
        unsigned long value;
-       __asm__ __volatile__("mov %%cr4, %[value]" : [value] "=q" (value));
+       __asm__("mov %%cr4, %[value]" : [value] "=q" (value));
        return value;
 }
 
 static __inline__ __attribute__((always_inline)) void __writecr0(const unsigned long long Data)
 {
-       __asm__("mov %[Data], %%cr0" : : [Data] "q" ((const unsigned long)(Data & 0xFFFFFFFF)) : "memory");
+       __asm__("mov %[Data], %%cr0" : : [Data] "q" ((const unsigned long)(Data & 0xFFFFFFFF)));
 }
 
 static __inline__ __attribute__((always_inline)) void __writecr3(const unsigned long long Data)
 {
-       __asm__("mov %[Data], %%cr3" : : [Data] "q" ((const unsigned long)(Data & 0xFFFFFFFF)) : "memory");
+       __asm__("mov %[Data], %%cr3" : : [Data] "q" ((const unsigned long)(Data & 0xFFFFFFFF)));
 }
 
 static __inline__ __attribute__((always_inline)) void __writecr4(const unsigned long long Data)
 {
-       __asm__("mov %[Data], %%cr4" : : [Data] "q" ((const unsigned long)(Data & 0xFFFFFFFF)) : "memory");
+       __asm__("mov %[Data], %%cr4" : : [Data] "q" ((const unsigned long)(Data & 0xFFFFFFFF)));
 }
 
 static __inline__ __attribute__((always_inline)) void __invlpg(void * const Address)
@@ -919,21 +1025,62 @@ static __inline__ __attribute__((always_inline)) void __invlpg(void * const Addr
 /*** System operations ***/
 static __inline__ __attribute__((always_inline)) unsigned long long __readmsr(const int reg)
 {
-       unsigned long long retval;
-       __asm__ __volatile__("rdmsr" : "=A" (retval) : "c" (reg));
-       return retval;
+       unsigned long lo32;
+       unsigned long hi32;
+
+       __asm__("rdmsr" : "=a" (lo32), "=d" (hi32) : "c" (reg));
+
+       {
+               union u_
+               {
+                       unsigned long long ull;
+                       struct s_
+                       {
+                               unsigned long lo32;
+                               unsigned long hi32;
+                       }
+                       s;
+               }
+               u = { s : { lo32 : lo32, hi32 : hi32 } };
+
+               return u.ull;
+       }
 }
 
 static __inline__ __attribute__((always_inline)) void __writemsr(const unsigned long Register, const unsigned long long Value)
 {
-       __asm__ __volatile__("wrmsr" : : "A" (Value), "c" (Register));
+       __asm__
+       (
+               "wrmsr" :
+               :
+               "a" ((unsigned long)((Value >>  0) & 0xFFFFFFFF)),
+               "d" ((unsigned long)((Value >> 32) & 0xFFFFFFFF)),
+               "c" (Register)
+       );
 }
 
 static __inline__ __attribute__((always_inline)) unsigned long long __readpmc(const int counter)
 {
-       unsigned long long retval;
-       __asm__ __volatile__("rdpmc" : "=A" (retval) : "c" (counter));
-       return retval;
+       unsigned long lo32;
+       unsigned long hi32;
+
+       __asm__("rdpmc" : "=a" (lo32), "=d" (hi32) : "c" (counter));
+
+       {
+               union u_
+               {
+                       unsigned long long ull;
+                       struct s_
+                       {
+                               unsigned long lo32;
+                               unsigned long hi32;
+                       }
+                       s;
+               }
+               u = { s : { lo32 : lo32, hi32 : hi32 } };
+
+               return u.ull;
+       }
 }
 
 /* NOTE: an immediate value for 'a' will raise an ICE in Visual C++ */
@@ -946,7 +1093,7 @@ static __inline__ __attribute__((always_inline)) unsigned long __segmentlimit(co
 
 static __inline__ __attribute__((always_inline)) void __wbinvd(void)
 {
-       __asm__ __volatile__("wbinvd");
+       __asm__("wbinvd");
 }
 
 #else
index 0700f1f..f77f365 100644 (file)
@@ -431,11 +431,6 @@ extern "C" {
 typedef ULONG SFGAOF;
 typedef DWORD SHGDNF;
 
-#ifndef HPSXA_DEFINED
-#define HPSXA_DEFINED
-DECLARE_HANDLE(HPSXA);
-#endif
-
 typedef struct _IDA {
        UINT cidl;
        UINT aoffset[1];
@@ -999,15 +994,6 @@ DECLARE_INTERFACE_(IShellExtInit, IUnknown)
 #undef INTERFACE
 typedef IShellExtInit *LPSHELLEXTINIT;
 
-#if defined(COBJMACROS)
-/*** IUnknown methods ***/
-#define IShellExtInit_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
-#define IShellExtInit_AddRef(p)             (p)->lpVtbl->AddRef(p)
-#define IShellExtInit_Release(p)            (p)->lpVtbl->Release(p)
-/*** IShellExtInit methods ***/
-#define IShellExtInit_Initialize(p,a,b,c)   (p)->lpVtbl->Initialize(p,a,b,c)
-#endif
-
 #define INTERFACE IShellPropSheetExt
 DECLARE_INTERFACE_(IShellPropSheetExt, IUnknown)
 {
@@ -1020,17 +1006,6 @@ DECLARE_INTERFACE_(IShellPropSheetExt, IUnknown)
 #undef INTERFACE
 typedef IShellPropSheetExt *LPSHELLPROPSHEETEXT;
 
-#if defined(COBJMACROS)
-/*** IUnknown methods ***/
-#define IShellPropSheetExt_QueryInterface(p,a,b)    (p)->lpVtbl->QueryInterface(p,a,b)
-#define IShellPropSheetExt_AddRef(p)                (p)->lpVtbl->AddRef(p)
-#define IShellPropSheetExt_Release(p)               (p)->lpVtbl->Release(p)
-/*** IShellPropSheetExt methods ***/
-#define IShellPropSheetExt_AddPage(p,a,b)           (p)->lpVtbl->AddPage(p,a,b)
-#define IShellPropSheetExt_ReplacePage(p,a,b,c)     (p)->lpVtbl->ReplacePage(p,a,b,c)
-#endif
-
-
 #define INTERFACE IExtractIconA
 DECLARE_INTERFACE_(IExtractIconA, IUnknown)
 {
@@ -1880,18 +1855,14 @@ typedef struct _SFV_CREATE
     IShellFolderViewCB *psfvcb;
 } SFV_CREATE;
 
-
-UINT WINAPI SHAddFromPropSheetExtArray(HPSXA,LPFNADDPROPSHEETPAGE,LPARAM);
 void WINAPI SHAddToRecentDocs(UINT,PCVOID);
 LPITEMIDLIST WINAPI SHBrowseForFolderA(PBROWSEINFOA);
 LPITEMIDLIST WINAPI SHBrowseForFolderW(PBROWSEINFOW);
 DWORD WINAPI SHCLSIDFromStringA(LPCSTR,CLSID*);
 DWORD WINAPI SHCLSIDFromStringW(LPCWSTR,CLSID*);
-HPSXA WINAPI SHCreatePropSheetExtArray(HKEY,LPCWSTR,UINT);
 HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE*,IShellView**);
 HRESULT WINAPI SHCreateShellFolderViewEx(LPCSFV pshfvi, IShellView **ppshv);
 void WINAPI SHChangeNotify(LONG,UINT,PCVOID,PCVOID);
-void WINAPI SHDestroyPropSheetExtArray(HPSXA);
 HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int);
 HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int);
 HRESULT WINAPI SHGetDesktopFolder(LPSHELLFOLDER*);
@@ -1924,7 +1895,6 @@ void WINAPI SHGetSettings(LPSHELLFLAGSTATE,DWORD);
 #if (_WIN32_WINNT >= 0x0500) /* W2K */
 void WINAPI SHGetSetSettings(LPSHELLSTATE,DWORD,BOOL);
 #endif
-UINT WINAPI SHReplaceFromPropSheetExtArray(HPSXA,UINT,LPFNADDPROPSHEETPAGE,LPARAM);
 
 #if (_WIN32_WINNT >= 0x0500) /* W2K */
 BOOL WINAPI ILIsEqual(LPCITEMIDLIST, LPCITEMIDLIST);
index ebdca87..d8c2b93 100644 (file)
@@ -504,7 +504,7 @@ extern "C" {
 #define QUERY_ACTCTX_FLAG_ACTCTX_IS_HMODULE 0x00000008
 #define QUERY_ACTCTX_FLAG_ACTCTX_IS_ADDRESS 0x00000010
 #if (_WIN32_WINNT >= 0x0600)
-#define SYMBOLIC_LINK_FLAG_DIRECTORY 0x1
+#define SYMLINK_FLAG_DIRECTORY 0x1
 #endif
 #endif /* (_WIN32_WINNT >= 0x0501) */
 #if (_WIN32_WINNT >= 0x0500)
@@ -709,8 +709,8 @@ typedef struct _DEBUG_EVENT {
        } u;
 } DEBUG_EVENT,*LPDEBUG_EVENT;
 typedef struct _OVERLAPPED {
-       ULONG_PTR Internal;
-       ULONG_PTR InternalHigh;
+       DWORD Internal;
+       DWORD InternalHigh;
        DWORD Offset;
        DWORD OffsetHigh;
        HANDLE hEvent;
@@ -1070,7 +1070,7 @@ typedef BOOL(CALLBACK *ENUMRESTYPEPROCW)(HMODULE,LPWSTR,LONG);
 typedef void(CALLBACK *LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD,DWORD,LPOVERLAPPED);
 typedef LONG(CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(LPEXCEPTION_POINTERS);
 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
-typedef void(APIENTRY *PAPCFUNC)(ULONG_PTR);
+typedef void(APIENTRY *PAPCFUNC)(DWORD);
 typedef void(CALLBACK *PTIMERAPCROUTINE)(PVOID,DWORD,DWORD);
 #if (_WIN32_WINNT >= 0x0500)
 typedef void(CALLBACK *WAITORTIMERCALLBACK)(PVOID,BOOLEAN);
@@ -1213,7 +1213,7 @@ HANDLE WINAPI CreateFileMappingW(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,
 BOOL WINAPI CreateHardLinkA(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES);
 BOOL WINAPI CreateHardLinkW(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES);
 #endif
-HANDLE WINAPI CreateIoCompletionPort(HANDLE,HANDLE,ULONG_PTR,DWORD);
+HANDLE WINAPI CreateIoCompletionPort(HANDLE,HANDLE,DWORD,DWORD);
 #if (_WIN32_WINNT >= 0x0500)
 HANDLE WINAPI CreateJobObjectA(LPSECURITY_ATTRIBUTES,LPCSTR);
 HANDLE WINAPI CreateJobObjectW(LPSECURITY_ATTRIBUTES,LPCWSTR);
@@ -1538,7 +1538,7 @@ DWORD WINAPI GetProfileSectionA(LPCSTR,LPSTR,DWORD);
 DWORD WINAPI GetProfileSectionW(LPCWSTR,LPWSTR,DWORD);
 DWORD WINAPI GetProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPSTR,DWORD);
 DWORD WINAPI GetProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD);
-BOOL WINAPI GetQueuedCompletionStatus(HANDLE,PDWORD,PULONG_PTR,LPOVERLAPPED*,DWORD);
+BOOL WINAPI GetQueuedCompletionStatus(HANDLE,PDWORD,PDWORD,LPOVERLAPPED*,DWORD);
 BOOL WINAPI GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR_CONTROL,PDWORD);
 BOOL WINAPI GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR,LPBOOL,PACL*,LPBOOL);
 BOOL WINAPI GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR,PSID*,LPBOOL);
@@ -1683,20 +1683,20 @@ VOID WINAPI InitializeSRWLock(PSRWLOCK);
 #endif
 #ifndef __INTERLOCKED_DECLARED
 #define __INTERLOCKED_DECLARED
-LONG WINAPI InterlockedCompareExchange(IN OUT LONG volatile *,LONG,LONG);
+LONG WINAPI InterlockedCompareExchange(LPLONG,LONG,LONG);
 /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */
 #define InterlockedCompareExchangePointer(d,e,c) \
     (PVOID)InterlockedCompareExchange((LPLONG)(d),(LONG)(e),(LONG)(c))
-LONG WINAPI InterlockedDecrement(IN OUT LONG volatile *);
-LONG WINAPI InterlockedExchange(IN OUT LONG volatile *,LONG);
+LONG WINAPI InterlockedDecrement(LPLONG);
+LONG WINAPI InterlockedExchange(LPLONG,LONG);
 /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */
 #define InterlockedExchangePointer(t,v) \
     (PVOID)InterlockedExchange((LPLONG)(t),(LONG)(v))
-LONG WINAPI InterlockedExchangeAdd(IN OUT LONG volatile *,LONG);
+LONG WINAPI InterlockedExchangeAdd(LPLONG,LONG);
 #if (_WIN32_WINNT >= 0x0501)
 PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER);
 #endif
-LONG WINAPI InterlockedIncrement(IN OUT LONG volatile *);
+LONG WINAPI InterlockedIncrement(LPLONG);
 #if (_WIN32_WINNT >= 0x0501)
 PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER);
 PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY);
@@ -1841,7 +1841,7 @@ BOOL WINAPI QueryMemoryResourceNotification(HANDLE,PBOOL);
 #endif
 BOOL WINAPI QueryPerformanceCounter(PLARGE_INTEGER);
 BOOL WINAPI QueryPerformanceFrequency(PLARGE_INTEGER);
-DWORD WINAPI QueueUserAPC(PAPCFUNC,HANDLE,ULONG_PTR);
+DWORD WINAPI QueueUserAPC(PAPCFUNC,HANDLE,DWORD);
 #if (_WIN32_WINNT >= 0x0500)
 BOOL WINAPI QueueUserWorkItem(LPTHREAD_START_ROUTINE,PVOID,ULONG);
 #endif
index 82462d9..3d43153 100644 (file)
@@ -123,8 +123,8 @@ extern "C" {
 #endif /* __GNUC__/__WATCOMC__ */
 #define MAKEWORD(a,b)  ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8)))
 #define MAKELONG(a,b)  ((LONG)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16)))
-#define LOWORD(l)      ((WORD)((DWORD_PTR)(l)))
-#define HIWORD(l)      ((WORD)(((DWORD_PTR)(l)>>16)&0xFFFF))
+#define LOWORD(l)      ((WORD)((DWORD)(l)))
+#define HIWORD(l)      ((WORD)(((DWORD)(l)>>16)&0xFFFF))
 #define LOBYTE(w)      ((BYTE)(w))
 #define HIBYTE(w)      ((BYTE)(((WORD)(w)>>8)&0xFF))
 
index 1c912c9..decbbe5 100644 (file)
@@ -51,45 +51,7 @@ enum {
        DNS_TYPE_HINFO,
        DNS_TYPE_MINFO,
        DNS_TYPE_MX,
-       DNS_TYPE_TEXT,
-       DNS_TYPE_RP,
-       DNS_TYPE_AFSDB,
-       DNS_TYPE_X25,
-       DNS_TYPE_ISDN,
-       DNS_TYPE_RT,
-       DNS_TYPE_NSAP,
-       DNS_TYPE_NSAPPTR,
-       DNS_TYPE_SIG,
-       DNS_TYPE_KEY,
-       DNS_TYPE_PX,
-       DNS_TYPE_GPOS,
-       DNS_TYPE_AAAA,
-       DNS_TYPE_LOC,
-       DNS_TYPE_NXT,
-       DNS_TYPE_EID,
-       DNS_TYPE_NIMLOC,
-       DNS_TYPE_SRV,
-       DNS_TYPE_ATMA,
-       DNS_TYPE_NAPTR,
-       DNS_TYPE_KX,
-       DNS_TYPE_CERT,
-       DNS_TYPE_A6,
-       DNS_TYPE_DNAME,
-       DNS_TYPE_SINK,
-       DNS_TYPE_OPT,
-       DNS_TYPE_UINFO=100,
-       DNS_TYPE_UID,
-       DNS_TYPE_GID,
-       DNS_TYPE_UNSPEC,
-       DNS_TYPE_ADDRS=248,
-       DNS_TYPE_TKEY,
-       DNS_TYPE_TSIG,
-       DNS_TYPE_IXFR,
-       DNS_TYPE_AXFR,
-       DNS_TYPE_MAILB,
-       DNS_TYPE_MAILA,
-       DNS_TYPE_ALL,
-       DNS_TYPE_ANY=DNS_TYPE_ALL
+       DNS_TYPE_TEXT
 };
 typedef enum _DNS_CHARSET
 {
index 885a176..a6cc9fb 100644 (file)
@@ -1598,6 +1598,7 @@ typedef VOID (NTAPI *WORKERCALLBACKFUNC)(PVOID);
 #define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
 #define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
 #define TLS_MINIMUM_AVAILABLE 64
+#define REPARSE_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
 #define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
 #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE 16384
 #define IO_REPARSE_TAG_RESERVED_ZERO 0
@@ -2668,9 +2669,7 @@ typedef struct _RTL_CRITICAL_SECTION_DEBUG {
        LIST_ENTRY ProcessLocksList;
        DWORD EntryCount;
        DWORD ContentionCount;
-    DWORD Flags;
-    WORD CreatorBackTraceIndexHigh;
-    WORD SpareWORD;
+       DWORD Spare[2];
 } RTL_CRITICAL_SECTION_DEBUG,*PRTL_CRITICAL_SECTION_DEBUG;
 typedef struct _RTL_CRITICAL_SECTION {
        PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
@@ -3305,6 +3304,31 @@ typedef struct _NT_TIB {
        PVOID ArbitraryUserPointer;
        struct _NT_TIB *Self;
 } NT_TIB,*PNT_TIB;
+typedef struct _REPARSE_DATA_BUFFER {
+       DWORD  ReparseTag;
+       WORD   ReparseDataLength;
+       WORD   Reserved;
+       _ANONYMOUS_UNION union {
+               struct {
+                       WORD   SubstituteNameOffset;
+                       WORD   SubstituteNameLength;
+                       WORD   PrintNameOffset;
+                       WORD   PrintNameLength;
+                       ULONG  Flags;
+                       WCHAR PathBuffer[1];
+               } SymbolicLinkReparseBuffer;
+               struct {
+                       WORD   SubstituteNameOffset;
+                       WORD   SubstituteNameLength;
+                       WORD   PrintNameOffset;
+                       WORD   PrintNameLength;
+                       WCHAR PathBuffer[1];
+               } MountPointReparseBuffer;
+               struct {
+                       BYTE   DataBuffer[1];
+               } GenericReparseBuffer;
+       } DUMMYUNIONNAME;
+} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
 typedef struct _REPARSE_GUID_DATA_BUFFER {
        DWORD  ReparseTag;
        WORD   ReparseDataLength;
index 3396278..1ed7318 100644 (file)
@@ -540,8 +540,8 @@ extern "C" {
 #define SB_BOTTOM      7
 #define SB_TOP 6
 #define IS_INTRESOURCE(i) (((ULONG_PTR)(i) >> 16) == 0)
-#define MAKEINTRESOURCEA(i) (LPSTR)((ULONG_PTR)((WORD)(i)))
-#define MAKEINTRESOURCEW(i) (LPWSTR)((ULONG_PTR)((WORD)(i)))
+#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
+#define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))
 #ifndef XFree86Server
 # define RT_CURSOR MAKEINTRESOURCE(1)
 # define RT_FONT MAKEINTRESOURCE(8)
index f5ed7db..b72e532 100644 (file)
@@ -18,8 +18,8 @@
 #define __VERSION_H
 
 #define KERNEL_VERSION_MAJOR           0
-#define KERNEL_VERSION_MINOR           4
-#define KERNEL_VERSION_PATCH_LEVEL     0
+#define KERNEL_VERSION_MINOR           3
+#define KERNEL_VERSION_PATCH_LEVEL     1
 
 /* KERNEL_VERSION_BUILD_TYPE is L"SVN", L"RC1", L"RC2" or L"RELEASE" */
 #define KERNEL_VERSION_BUILD_TYPE      L"SVN"
index 66d1363..9dee4d1 100644 (file)
@@ -7,6 +7,4 @@
 #include <objbase.h>
 #endif
 
-#if !defined (_MSC_VER)
 #include_next <commdlg.h>
-#endif
index f6175fc..e1e6bea 100644 (file)
@@ -4,9 +4,7 @@
 #include "../roscfg.h"
 #include <stdarg.h>
 #include <windef.h>
-#if !defined(_MSC_VER)
 #include <winnt.h>
-#endif
 
 /* Add ROS Master debug functions if not added yet */
 #ifndef __INTERNAL_DEBUG
index eda9cb7..c38f865 100644 (file)
@@ -13,8 +13,6 @@
 #define OFN_ENABLEINCLUDENOTIFY      0x00400000
 #define NEWFILEOPENORD                          1547
 
-#if !defined (_MSC_VER)
 #include_next <dlgs.h>
-#endif
 
 #endif /* __WINE_DLGS_H */
index 9dac4dc..9e10ca6 100644 (file)
@@ -24,9 +24,7 @@
 #define DBG 1
 #endif
 
-#if !defined(_MSC_VER)
 #include_next <objbase.h>
-#endif
 
 #ifndef _OBJBASE_H_
 #define _OBJBASE_H_
index f45678a..a325a77 100644 (file)
@@ -7,9 +7,7 @@
  * and definitions that are missing in w32api.
  */
 
-#if !defined (_MSC_VER)
 #include_next <shellapi.h>
-#endif
 
 #ifndef _WINE_SHELLAPI_H
 #define _WINE_SHELLAPI_H
index 260a3b1..f5af4ff 100644 (file)
@@ -7,9 +7,7 @@
  * and definitions that are missing in w32api.
  */
 
-#if !defined (_MSC_VER)
 #include_next <shlguid.h>
-#endif
 
 
 #ifndef __WINE_SHLGUID_H
index 61019fb..43e3525 100644 (file)
@@ -9,9 +9,7 @@
 
 #include <winnetwk.h>
 
-#if !defined (_MSC_VER)
 #include_next <shlobj.h>
-#endif
 
 #include <shlguid.h>
 #include <shobjidl.h>
index 33f0b25..2b81a50 100644 (file)
@@ -6,9 +6,8 @@
  * build system. It contains definitions commonly refered to as Wineisms
  * and definitions that are missing in w32api.
  */
-#if !defined (_MSC_VER)
+
 #include_next <shlwapi.h>
-#endif
 
 #ifndef __WINE_SHLWAPI_H
 #define __WINE_SHLWAPI_H
index 6457255..098413e 100644 (file)
@@ -18,9 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#if !defined(_MSC_VER)
 #include_next "windef.h"
-#endif
 
 #ifndef __WINE_WINDEF_H
 #define __WINE_WINDEF_H
index e7b9d19..d6b31bb 100644 (file)
@@ -12,8 +12,6 @@
 #define NTM_TT_OPENTYPE     0x00040000 /* wingdi.h */
 #define NTM_TYPE1           0x00100000 /* wingdi.h */
 
-#if !defined(_MSC_VER)
 #include_next <wingdi.h>
-#endif
 
 #endif /* __WINE_GDI_H */
index 3721694..706b9ec 100644 (file)
@@ -5,11 +5,9 @@
  * Compatibility header
  */
 
+#include <w32api.h>
 #include <wingdi.h>
-
-#if !defined(_MSC_VER)
 #include_next <winuser.h>
-#endif
 
 #define WS_EX_TRAYWINDOW 0x80000000L
 #define DCX_USESTYLE     0x00010000
diff --git a/reactos/lib/3rdparty/expat/Changes b/reactos/lib/3rdparty/expat/Changes
new file mode 100644 (file)
index 0000000..6381866
--- /dev/null
@@ -0,0 +1,148 @@
+Release 2.0.0 Wed Jan 11 2006
+        - We no longer use the "check" library for C unit testing; we
+          always use the (partial) internal implementation of the API.
+        - Report XML_NS setting via XML_GetFeatureList().
+        - Fixed headers for use from C++.
+        - XML_GetCurrentLineNumber() and  XML_GetCurrentColumnNumber()
+          now return unsigned integers.
+        - Added XML_LARGE_SIZE switch to enable 64-bit integers for
+          byte indexes and line/column numbers.
+        - Updated to use libtool 1.5.22 (the most recent).
+        - Added support for AmigaOS.
+        - Some mostly minor bug fixes. SF issues include: 1006708,
+          1021776, 1023646, 1114960, 1156398, 1221160, 1271642.
+
+Release 1.95.8 Fri Jul 23 2004
+        - Major new feature: suspend/resume.  Handlers can now request
+          that a parse be suspended for later resumption or aborted
+          altogether.  See "Temporarily Stopping Parsing" in the
+          documentation for more details.
+        - Some mostly minor bug fixes, but compilation should no
+          longer generate warnings on most platforms.  SF issues
+          include: 827319, 840173, 846309, 888329, 896188, 923913,
+          928113, 961698, 985192.
+
+Release 1.95.7 Mon Oct 20 2003
+        - Fixed enum XML_Status issue (reported on SourceForge many
+          times), so compilers that are properly picky will be happy.
+        - Introduced an XMLCALL macro to control the calling
+          convention used by the Expat API; this macro should be used
+          to annotate prototypes and definitions of callback
+          implementations in code compiled with a calling convention
+          other than the default convention for the host platform.
+        - Improved ability to build without the configure-generated
+          expat_config.h header.  This is useful for applications
+          which embed Expat rather than linking in the library.
+        - Fixed a variety of bugs: see SF issues 458907, 609603,
+          676844, 679754, 692878, 692964, 695401, 699323, 699487,
+          820946.
+        - Improved hash table lookups.
+        - Added more regression tests and improved documentation.
+
+Release 1.95.6 Tue Jan 28 2003
+        - Added XML_FreeContentModel().
+        - Added XML_MemMalloc(), XML_MemRealloc(), XML_MemFree().
+        - Fixed a variety of bugs: see SF issues 615606, 616863,
+          618199, 653180, 673791.
+        - Enhanced the regression test suite.
+        - Man page improvements: includes SF issue 632146.
+
+Release 1.95.5 Fri Sep 6 2002
+        - Added XML_UseForeignDTD() for improved SAX2 support.
+        - Added XML_GetFeatureList().
+        - Defined XML_Bool type and the values XML_TRUE and XML_FALSE.
+        - Use an incomplete struct instead of a void* for the parser
+          (may not retain).
+        - Fixed UTF-8 decoding bug that caused legal UTF-8 to be rejected.
+        - Finally fixed bug where default handler would report DTD
+          events that were already handled by another handler.
+          Initial patch contributed by Darryl Miles.
+        - Removed unnecessary DllMain() function that caused static
+          linking into a DLL to be difficult.
+        - Added VC++ projects for building static libraries.
+        - Reduced line-length for all source code and headers to be
+          no longer than 80 characters, to help with AS/400 support.
+        - Reduced memory copying during parsing (SF patch #600964).
+        - Fixed a variety of bugs: see SF issues 580793, 434664,
+          483514, 580503, 581069, 584041, 584183, 584832, 585537,
+          596555, 596678, 598352, 598944, 599715, 600479, 600971.
+
+Release 1.95.4 Fri Jul 12 2002
+        - Added support for VMS, contributed by Craig Berry.  See
+          vms/README.vms for more information.
+        - Added Mac OS (classic) support, with a makefile for MPW,
+          contributed by Thomas Wegner and Daryle Walker.
+        - Added Borland C++ Builder 5 / BCC 5.5 support, contributed
+          by Patrick McConnell (SF patch #538032).
+        - Fixed a variety of bugs: see SF issues 441449, 563184,
+          564342, 566334, 566901, 569461, 570263, 575168, 579196.
+        - Made skippedEntityHandler conform to SAX2 (see source comment)
+        - Re-implemented WFC: Entity Declared from XML 1.0 spec and
+          added a new error "entity declared in parameter entity":
+          see SF bug report 569461 and SF patch 578161
+        - Re-implemented section 5.1 from XML 1.0 spec:
+          see SF bug report 570263 and SF patch 578161
+
+Release 1.95.3 Mon Jun 3 2002
+        - Added a project to the MSVC workspace to create a wchar_t
+          version of the library; the DLLs are named libexpatw.dll.
+        - Changed the name of the Windows DLLs from expat.dll to
+          libexpat.dll; this fixes SF bug #432456.
+        - Added the XML_ParserReset() API function.
+        - Fixed XML_SetReturnNSTriplet() to work for element names.
+        - Made the XML_UNICODE builds usable (thanks, Karl!).
+        - Allow xmlwf to read from standard input.
+        - Install a man page for xmlwf on Unix systems.
+        - Fixed many bugs; see SF bug reports 231864, 461380, 464837,
+          466885, 469226, 477667, 484419, 487840, 494749, 496505,
+          547350.  Other bugs which we can't test as easily may also
+          have been fixed, especially in the area of build support.
+
+Release 1.95.2 Fri Jul 27 2001
+        - More changes to make MSVC happy with the build; add a single
+          workspace to support both the library and xmlwf application.
+        - Added a Windows installer for Windows users; includes
+          xmlwf.exe.
+        - Added compile-time constants that can be used to determine the
+          Expat version
+        - Removed a lot of GNU-specific dependencies to aide portability
+          among the various Unix flavors.
+        - Fix the UTF-8 BOM bug.
+        - Cleaned up warning messages for several compilers.
+        - Added the -Wall, -Wstrict-prototypes options for GCC.
+
+Release 1.95.1 Sun Oct 22 15:11:36 EDT 2000
+        - Changes to get expat to build under Microsoft compiler
+        - Removed all aborts and instead return an UNEXPECTED_STATE error.
+        - Fixed a bug where a stray '%' in an entity value would cause an
+          abort.
+        - Defined XML_SetEndNamespaceDeclHandler. Thanks to Darryl Miles for
+          finding this oversight.
+        - Changed default patterns in lib/Makefile.in to fit non-GNU makes
+          Thanks to robin@unrated.net for reporting and providing an
+          account to test on.
+        - The reference had the wrong label for XML_SetStartNamespaceDecl.
+          Reported by an anonymous user.
+
+Release 1.95.0 Fri Sep 29 2000
+        - XML_ParserCreate_MM
+                Allows you to set a memory management suite to replace the
+                standard malloc,realloc, and free.
+        - XML_SetReturnNSTriplet
+                If you turn this feature on when namespace processing is in
+                effect, then qualified, prefixed element and attribute names
+                are returned as "uri|name|prefix" where '|' is whatever
+                separator character is used in namespace processing.
+        - Merged in features from perl-expat
+                o XML_SetElementDeclHandler
+                o XML_SetAttlistDeclHandler
+                o XML_SetXmlDeclHandler
+                o XML_SetEntityDeclHandler
+                o StartDoctypeDeclHandler takes 3 additional parameters:
+                        sysid, pubid, has_internal_subset
+                o Many paired handler setters (like XML_SetElementHandler)
+                  now have corresponding individual handler setters
+                o XML_GetInputContext for getting the input context of
+                  the current parse position.
+        - Added reference material
+        - Packaged into a distribution that builds a sharable library
diff --git a/reactos/lib/3rdparty/expat/MANIFEST b/reactos/lib/3rdparty/expat/MANIFEST
new file mode 100644 (file)
index 0000000..aa83d5b
--- /dev/null
@@ -0,0 +1,128 @@
+amiga/stdlib.c
+amiga/launch.c
+amiga/expat_vectors.c
+amiga/expat_lib.c
+amiga/expat.xml
+amiga/README.txt
+amiga/Makefile
+amiga/include/proto/expat.h
+amiga/include/libraries/expat.h
+amiga/include/interfaces/expat.h
+amiga/include/inline4/expat.h
+bcb5/README.txt
+bcb5/all_projects.bpg
+bcb5/elements.bpf
+bcb5/elements.bpr
+bcb5/elements.mak
+bcb5/expat.bpf
+bcb5/expat.bpr
+bcb5/expat.mak
+bcb5/expat_static.bpf
+bcb5/expat_static.bpr
+bcb5/expat_static.mak
+bcb5/expatw.bpf
+bcb5/expatw.bpr
+bcb5/expatw.mak
+bcb5/expatw_static.bpf
+bcb5/expatw_static.bpr
+bcb5/expatw_static.mak
+bcb5/libexpat_mtd.def
+bcb5/libexpatw_mtd.def
+bcb5/makefile.mak
+bcb5/outline.bpf
+bcb5/outline.bpr
+bcb5/outline.mak
+bcb5/setup.bat
+bcb5/xmlwf.bpf
+bcb5/xmlwf.bpr
+bcb5/xmlwf.mak
+doc/expat.png
+doc/reference.html
+doc/style.css
+doc/valid-xhtml10.png
+doc/xmlwf.1
+doc/xmlwf.sgml
+COPYING
+Changes
+MANIFEST
+Makefile.in
+README
+configure
+configure.in
+expat_config.h.in
+expat.dsw
+conftools/PrintPath
+conftools/ac_c_bigendian_cross.m4
+conftools/config.guess
+conftools/config.sub
+conftools/expat.m4
+conftools/get-version.sh
+conftools/install-sh
+conftools/libtool.m4
+conftools/ltmain.sh
+conftools/mkinstalldirs
+examples/elements.c
+examples/elements.dsp
+examples/outline.c
+examples/outline.dsp
+lib/Makefile.MPW
+lib/amigaconfig.h
+lib/ascii.h
+lib/asciitab.h
+lib/expat.dsp
+lib/expat.h
+lib/expat_external.h
+lib/expat_static.dsp
+lib/expatw.dsp
+lib/expatw_static.dsp
+lib/iasciitab.h
+lib/internal.h
+lib/latin1tab.h
+lib/libexpat.def
+lib/libexpatw.def
+lib/macconfig.h
+lib/nametab.h
+lib/utf8tab.h
+lib/winconfig.h
+lib/xmlparse.c
+lib/xmlrole.c
+lib/xmlrole.h
+lib/xmltok.c
+lib/xmltok.h
+lib/xmltok_impl.c
+lib/xmltok_impl.h
+lib/xmltok_ns.c
+tests/benchmark/README.txt
+tests/benchmark/benchmark.c
+tests/benchmark/benchmark.dsp
+tests/benchmark/benchmark.dsw
+tests/README.txt
+tests/chardata.c
+tests/chardata.h
+tests/minicheck.c
+tests/minicheck.h
+tests/runtests.c
+tests/runtestspp.cpp
+tests/xmltest.sh
+vms/README.vms
+vms/descrip.mms
+vms/expat_config.h
+win32/MANIFEST.txt
+win32/README.txt
+win32/expat.iss
+xmlwf/codepage.c
+xmlwf/codepage.h
+xmlwf/ct.c
+xmlwf/filemap.h
+xmlwf/readfilemap.c
+xmlwf/unixfilemap.c
+xmlwf/win32filemap.c
+xmlwf/xmlfile.c
+xmlwf/xmlfile.h
+xmlwf/xmlmime.c
+xmlwf/xmlmime.h
+xmlwf/xmltchar.h
+xmlwf/xmlurl.h
+xmlwf/xmlwf.c
+xmlwf/xmlwf.dsp
+xmlwf/xmlwin32url.cxx
diff --git a/reactos/lib/3rdparty/expat/bcb5/README.txt b/reactos/lib/3rdparty/expat/bcb5/README.txt
new file mode 100644 (file)
index 0000000..486f1ca
--- /dev/null
@@ -0,0 +1,87 @@
+
+                   Using a Borland compiler product
+
+The files in this directory support using both the free Borland command-line
+compiler tools and the Borland C++ Builder IDE.  The project files have been
+tested with both versions 5 and 6 of the C++ Builder product.
+
+             Using the free BCC32 command line compiler
+
+After downloading and installing the free C++ Builder commandline version,
+perform the following steps (assuming it was installed under C:\Borland\BCC55):
+
+1) Add "C:\Borland\BCC55\BIN" to your path
+2) Set the environment variable BCB to "C:\Borland\BCC55".
+3) edit makefile.mak: enable or comment out the appropriate commands under
+   clean & distclean, depending on whether your OS can use deltree /y or
+   del /s/f/q.
+
+After that, you should simply cd to the bcb5 directory in your Expat directory
+tree (same structure as CVS) and run "make all" or just "make".
+
+                               Naming
+
+The libraries have the base name "libexpat" followed optionally by an "s"
+(static) or a "w" (unicode version), then an underscore and optionally
+"mt" (multi-threaded) and "d" (dynamic RTL).
+
+To change the name of the library a project file produces, edit the project
+option source (see step 1 under Unicode below) and change the name contained in
+the PROJECT tag. In a make file, change the value assigned to the PROJECT
+variable. Also, the LIBRARY entry in the .def file has to be changed to
+correspond to the new executable name.
+
+
+                       Unicode Considerations
+
+There are no facilities in the BCB 5 GUI to create a unicode-enabled
+application. Fortunately, it is not hard to do by hand.
+
+1. The startup .obj system file must be changed to the unicode version.
+   Go to Project|Edit Option Source, and scroll down to the ALLOBJ tag. Change
+   c0x32.obj to c0x32w.obj. Editing this file can be quirky, but usually the
+   following kludge will make the change stick. Close and save the file
+   (CTRL-F4) then open the options dialog (CTRL-Shift-F11), then click OK on
+   the dialog immediately without changing anything in it. If this doesn't work,
+   you will have to close the project completely and edit the .bpr file by hand.
+
+   If you are using a make file, just change the startup .obj file assigned
+   to the ALLOBJ variable.
+
+2. Add the macro define XML_UNICODE_WCHAR_T. In the GUI that goes in the options
+   dialog, Directories/Conditionals tab, in the Conditional define box. In a
+   make file, put it in the USERDEFINES variable.
+
+3. Of course, your code has to be written for unicode. As a start, the "main"
+   function is called "wmain". The tchar macros are an interesting way to
+   write code that can easily switch between unicode and utf-8. If these macros
+   are used, then simply adding the conditional define _UNICODE as well as
+   XML_UNICODE_WCHAR_T will bring in the unicode versions of the tchar macros.
+   Otherwise the utf-8 versions are used. xmlwf uses its own versions of the
+   tchar macros which are switched on and off by the XML_UNICODE macro, which
+   itself is set by the XML_UNICODE_WCHAR_T define.
+
+                              Threading
+
+The libexpat libraries are all built to link with the multi-threaded dynamic RTL's.
+That means they require CC32xxMT.DLL present on the installation target.
+To create single-threaded libs, do the following:
+
+1. The compiler option for multi-threading must be turned off. Following the
+   instructions above to edit the option source, remove the -tWM option from
+   the CFLAG1 tag. In a make file, remove it from the CFLAG1 variable.
+
+2. The single threaded RTL must be called. change the RTL in the ALLLIB tag or
+   variable (GUI or makefile repectively) to the version without the "mt" in the
+   name. For example, change cw32mti.lib to cw32i.lib.
+
+                              Static RTL's
+
+To build the libs with static RTL's do the following,
+
+1. For the static expatlibs, in the Tlib tab on the options dialog, uncheck the
+   "Use dynamic RTL" box. For the dynamic expatlibs, in the Linker tab on the
+   options dialog, uncheck "Use dynamic RTL". If you are using a make file,
+   remove the _RTLDLL assignment to the SYSDEFINES variable, and change the RTL
+   to the version without an "i" in the ALLLIB variable. For example,
+   cw32mti.lib would become cw32mt.lib.
diff --git a/reactos/lib/3rdparty/expat/bcb5/all_projects.bpg b/reactos/lib/3rdparty/expat/bcb5/all_projects.bpg
new file mode 100644 (file)
index 0000000..27c9a1c
--- /dev/null
@@ -0,0 +1,49 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = setup libexpat_mtd.dll libexpats_mtd.lib libexpatw_mtd.dll \
+  libexpatws_mtd.lib elements.exe outline.exe xmlwf.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+libexpat_mtd.dll: expat.bpr
+  $(ROOT)\bin\bpr2mak $**
+  $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak
+
+libexpats_mtd.lib: expat_static.bpr
+  $(ROOT)\bin\bpr2mak -t$(ROOT)\bin\deflib.bmk $**
+  $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak
+
+libexpatw_mtd.dll: expatw.bpr
+  $(ROOT)\bin\bpr2mak $**                                    
+  $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak
+
+libexpatws_mtd.lib: expatw_static.bpr
+  $(ROOT)\bin\bpr2mak -t$(ROOT)\bin\deflib.bmk $**
+  $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak
+
+elements.exe: elements.bpr
+  $(ROOT)\bin\bpr2mak $**
+  $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak
+
+outline.exe: outline.bpr
+  $(ROOT)\bin\bpr2mak $**
+  $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak
+
+xmlwf.exe: xmlwf.bpr
+  $(ROOT)\bin\bpr2mak $**
+  $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak
+
+setup: setup.bat
+  call $**
+
+
diff --git a/reactos/lib/3rdparty/expat/bcb5/elements.bpf b/reactos/lib/3rdparty/expat/bcb5/elements.bpf
new file mode 100644 (file)
index 0000000..5c1e878
--- /dev/null
@@ -0,0 +1,4 @@
+USEUNIT("..\examples\elements.c");
+USELIB("Release\libexpats_mtd.lib");
+//---------------------------------------------------------------------------
+main
diff --git a/reactos/lib/3rdparty/expat/bcb5/elements.bpr b/reactos/lib/3rdparty/expat/bcb5/elements.bpr
new file mode 100644 (file)
index 0000000..c21c0f5
--- /dev/null
@@ -0,0 +1,149 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value="Release\elements.exe"/>
+    <OBJFILES value="Release\obj\examples\elements.obj"/>
+    <RESFILES value=""/>
+    <IDLFILES value=""/>
+    <IDLGENFILES value=""/>
+    <DEFFILE value=""/>
+    <RESDEPEN value="$(RESFILES)"/>
+    <LIBFILES value="Release\libexpats_mtd.lib"/>
+    <LIBRARIES value=""/>
+    <SPARELIBS value=""/>
+    <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi 
+      ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi 
+      VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi 
+      dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/>
+    <PATHCPP value=".;..\examples"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="ilink32"/>
+    <USERDEFINES value="WIN32;NDEBUG;_CONSOLE;XML_STATIC"/>
+    <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/>
+    <MAINSOURCE value="elements.bpf"/>
+    <INCLUDEPATH value="..\examples;$(BCB)\include"/>
+    <LIBPATH value="..\examples;$(BCB)\lib;$(RELEASELIBPATH)"/>
+    <WARNINGS value="-w-par -w-8027 -w-8026"/>
+  </MACROS>
+  <OPTIONS>
+    <IDLCFLAGS value="-I$(BCB)\include"/>
+    <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c"/>
+    <PFLAGS value="-N2Release\obj\examples -N0Release\obj\examples -$Y- -$L- -$D-"/>
+    <RFLAGS value="/l 0x409 /d &quot;NDEBUG&quot; /i$(BCB)\include"/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value="-IRelease\obj\examples -D&quot;&quot; -ap -Tpe -x -Gn -q -L..\LIB\RELEASE_STATIC"/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="c0x32.obj $(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=4
+Item0=..\examples;$(BCB)\include
+Item1=$(BCB)\include
+Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl
+Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl;
+
+[HistoryLists\hlLibraryPath]
+Count=8
+Item0=..\examples;$(BCB)\lib;$(RELEASELIBPATH)
+Item1=..\examples;$(BCB)\lib;..\examples\$(RELEASELIBPATH)
+Item2=$(BCB)\lib;$(RELEASELIBPATH)
+Item3=$(BCB)\lib;$(RELEASELIBPATH);..\lib\Release-w_static
+Item4=$(BCB)\lib;$(RELEASELIBPATH);..\lib\Release_static
+Item5=$(BCB)\lib;$(RELEASELIBPATH);C:\src\expat\lib\Release_static
+Item6=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk
+Item7=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk;
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=17
+Item0=WIN32;NDEBUG;_CONSOLE;XML_STATIC
+Item1=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_STATIC
+Item2=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE;XML_STATIC
+Item3=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE
+Item4=WIN32;NDEBUG;_CONSOLE;_DEBUG
+Item5=WIN32;NDEBUG;_CONSOLE;XML_STATIC;_DEBUG
+Item6=WIN32;NDEBUG;_CONSOLE;XML_STATIC;_DEBUG;_UNICODE
+Item7=WIN32;NDEBUG;_CONSOLE;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T
+Item8=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T
+Item9=WIN32;NDEBUG;_CONSOLE;_UNICODE;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T
+Item10=WIN32;NDEBUG;_CONSOLE;_UNICODE;XML_STATIC;_DEBUG;XML_UNICODE
+Item11=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T;__WCHAR_T
+Item12=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE
+Item13=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE;_UNICODE
+Item14=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE
+Item15=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG
+Item16=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC
+
+[HistoryLists\hlIntOutputDir]
+Count=5
+Item0=Release\obj\examples
+Item1=Release\obj\elements
+Item2=Release\obj\mts
+Item3=..\examples\Release
+Item4=Release
+
+[HistoryLists\hlFinalOutputDir]
+Count=1
+Item0=Release\
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+  </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
diff --git a/reactos/lib/3rdparty/expat/bcb5/elements.mak b/reactos/lib/3rdparty/expat/bcb5/elements.mak
new file mode 100644 (file)
index 0000000..d4427fd
--- /dev/null
@@ -0,0 +1,186 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.05.03
+# ---------------------------------------------------------------------------
+PROJECT = Release\elements.exe
+OBJFILES = Release\obj\examples\elements.obj
+RESFILES = 
+MAINSOURCE = elements.bpf
+RESDEPEN = $(RESFILES)
+LIBFILES = Release\libexpats_mtd.lib
+IDLFILES = 
+IDLGENFILES = 
+LIBRARIES = 
+PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \
+    ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \
+    VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \
+    dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi
+SPARELIBS = 
+DEFFILE = 
+# ---------------------------------------------------------------------------
+PATHCPP = .;..\examples
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+USERDEFINES = WIN32;NDEBUG;_CONSOLE;XML_STATIC
+SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL
+INCLUDEPATH = ..\examples;$(BCB)\include
+LIBPATH = ..\examples;$(BCB)\lib;$(RELEASELIBPATH)
+WARNINGS= -w-par -w-8027 -w-8026
+# ---------------------------------------------------------------------------
+CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -I..\lib -c
+IDLCFLAGS = -I$(BCB)\include
+PFLAGS = -N2Release\obj\examples -N0Release\obj\examples -$Y- -$L- -$D-
+RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include
+AFLAGS = /mx /w2 /zn
+LFLAGS = -IRelease\obj\examples -D"" -ap -Tpe -x -Gn -q -L..\LIB\RELEASE_STATIC
+# ---------------------------------------------------------------------------
+ALLOBJ = c0x32.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+!endif
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE.  It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if "$(USERDEFINES)" != ""
+AUSERDEFINES = -d$(USERDEFINES:;= -d)
+!else
+AUSERDEFINES =
+!endif
+
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(CPP32)
+CPP32 = cpp32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = ilink32
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+
+
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C   = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC  = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+    $(BCB)\BIN\$(LINKER) @&&!
+    $(LFLAGS) -L$(LIBPATH) +
+    $(ALLOBJ), +
+    $(PROJECT),, +
+    $(ALLLIB), +
+    $(DEFFILE), +
+    $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.pas.obj:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.cpp.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.cpp.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.asm.obj:
+    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
+
+.rc.res:
+    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
+# ---------------------------------------------------------------------------
+
+
+
+
diff --git a/reactos/lib/3rdparty/expat/bcb5/expat.bpf b/reactos/lib/3rdparty/expat/bcb5/expat.bpf
new file mode 100644 (file)
index 0000000..2c42328
--- /dev/null
@@ -0,0 +1,6 @@
+USEUNIT("..\lib\xmlparse.c");
+USEUNIT("..\lib\xmlrole.c");
+USEUNIT("..\lib\xmltok.c");
+USEDEF("libexpat_mtd.def");
+//---------------------------------------------------------------------------
+#define DllEntryPoint
diff --git a/reactos/lib/3rdparty/expat/bcb5/expat.bpr b/reactos/lib/3rdparty/expat/bcb5/expat.bpr
new file mode 100644 (file)
index 0000000..291b8ca
--- /dev/null
@@ -0,0 +1,140 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value="Release\libexpat_mtd.dll"/>
+    <OBJFILES value="Release\obj\libexpat\xmlparse.obj Release\obj\libexpat\xmlrole.obj 
+      Release\obj\libexpat\xmltok.obj"/>
+    <RESFILES value=""/>
+    <IDLFILES value=""/>
+    <IDLGENFILES value=""/>
+    <DEFFILE value="libexpat_mtd.def"/>
+    <RESDEPEN value="$(RESFILES)"/>
+    <LIBFILES value=""/>
+    <LIBRARIES value=""/>
+    <SPARELIBS value=""/>
+    <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi 
+      ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi 
+      VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi 
+      dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/>
+    <PATHCPP value=".;..\lib"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="ilink32"/>
+    <USERDEFINES value="_WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS"/>
+    <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/>
+    <MAINSOURCE value="expat.bpf"/>
+    <INCLUDEPATH value="..\lib;$(BCB)\include"/>
+    <LIBPATH value="..\lib;$(BCB)\lib;$(RELEASELIBPATH)"/>
+    <WARNINGS value="-w-rch -w-par -w-8027 -w-8026 -w-ccc"/>
+  </MACROS>
+  <OPTIONS>
+    <IDLCFLAGS value="-I$(BCB)\include"/>
+    <CFLAG1 value="-WD -O2 -X- -a8 -b -k- -vi -q -tWM -c -tWD"/>
+    <PFLAGS value="-N2Release\obj\libexpat -N0Release\obj\libexpat -$Y- -$L- -$D-"/>
+    <RFLAGS value="/l 0x409 /d &quot;NDEBUG&quot; /i$(BCB)\include"/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value="-IRelease\obj\libexpat -D&quot;&quot; -aa -Tpd -x -Gn -Gi -q"/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="c0d32.obj $(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=4
+Item0=..\lib;$(BCB)\include
+Item1=$(BCB)\include
+Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl
+Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl;
+
+[HistoryLists\hlLibraryPath]
+Count=5
+Item0=..\lib;$(BCB)\lib;$(RELEASELIBPATH)
+Item1=..\lib;$(BCB)\lib;..\lib\$(RELEASELIBPATH)
+Item2=$(BCB)\lib;$(RELEASELIBPATH)
+Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk
+Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk;
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=8
+Item0=_WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS
+Item1=_WINDOWS;WIN32;NDEBUG;_DEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS
+Item2=WIN32;_WINDOWS;NDEBUG;_DEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS
+Item3=WIN32;_WINDOWS;NDEBUG;_DEBUG;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP
+Item4=NDEBUG;WIN32;_WINDOWS;_USRDLL;_DEBUG;EXPAT_EXPORTS;COMPILED_FROM_DSP
+Item5=NDEBUG;WIN32;_WINDOWS;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP;_DEBUG
+Item6=NDEBUG;WIN32;_WINDOWS;_MBCS;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP;_DEBUG
+Item7=NDEBUG;WIN32;_WINDOWS;_MBCS;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP
+
+[HistoryLists\hlIntOutputDir]
+Count=7
+Item0=Release\obj\libexpat
+Item1=Release\obj\libexpat_static
+Item2=Release\obj\mtd
+Item3=Release\obj\mt
+Item4=Release\obj
+Item5=Release
+Item6=..\lib\Release
+
+[HistoryLists\hlFinalOutputDir]
+Count=1
+Item0=Release\
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+  </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
diff --git a/reactos/lib/3rdparty/expat/bcb5/expat.mak b/reactos/lib/3rdparty/expat/bcb5/expat.mak
new file mode 100644 (file)
index 0000000..7c9c23f
--- /dev/null
@@ -0,0 +1,187 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.05.03
+# ---------------------------------------------------------------------------
+PROJECT = Release\libexpat_mtd.dll
+OBJFILES = Release\obj\libexpat\xmlparse.obj Release\obj\libexpat\xmlrole.obj \
+    Release\obj\libexpat\xmltok.obj
+RESFILES = 
+MAINSOURCE = expat.bpf
+RESDEPEN = $(RESFILES)
+LIBFILES = 
+IDLFILES = 
+IDLGENFILES = 
+LIBRARIES = 
+PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \
+    ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \
+    VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \
+    dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi
+SPARELIBS = 
+DEFFILE = libexpat_mtd.def
+# ---------------------------------------------------------------------------
+PATHCPP = .;..\lib
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+USERDEFINES = _WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP
+SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL
+INCLUDEPATH = ..\lib;$(BCB)\include
+LIBPATH = ..\lib;$(BCB)\lib;$(RELEASELIBPATH)
+WARNINGS= -w-rch -w-par -w-8027 -w-8026 -w-ccc
+# ---------------------------------------------------------------------------
+CFLAG1 = -WD -O2 -X- -a8 -b -k- -vi -q -tWM -c -tWD
+IDLCFLAGS = -I$(BCB)\include
+PFLAGS = -N2Release\obj\libexpat -N0Release\obj\libexpat -$Y- -$L- -$D-
+RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include
+AFLAGS = /mx /w2 /zn
+LFLAGS = -IRelease\obj\libexpat -D"" -aa -Tpd -x -Gn -Gi -q
+# ---------------------------------------------------------------------------
+ALLOBJ = c0d32.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+!endif
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE.  It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if "$(USERDEFINES)" != ""
+AUSERDEFINES = -d$(USERDEFINES:;= -d)
+!else
+AUSERDEFINES =
+!endif
+
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(CPP32)
+CPP32 = cpp32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = ilink32
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+
+
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C   = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC  = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+    $(BCB)\BIN\$(LINKER) @&&!
+    $(LFLAGS) -L$(LIBPATH) +
+    $(ALLOBJ), +
+    $(PROJECT),, +
+    $(ALLLIB), +
+    $(DEFFILE), +
+    $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.pas.obj:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.cpp.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.cpp.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.asm.obj:
+    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
+
+.rc.res:
+    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
+# ---------------------------------------------------------------------------
+
+
+
+
diff --git a/reactos/lib/3rdparty/expat/bcb5/expat_static.bpf b/reactos/lib/3rdparty/expat/bcb5/expat_static.bpf
new file mode 100644 (file)
index 0000000..5ca458e
--- /dev/null
@@ -0,0 +1,5 @@
+USEUNIT("..\lib\xmlparse.c");
+USEUNIT("..\lib\xmlrole.c");
+USEUNIT("..\lib\xmltok.c");
+//---------------------------------------------------------------------------
+#define Library
diff --git a/reactos/lib/3rdparty/expat/bcb5/expat_static.bpr b/reactos/lib/3rdparty/expat/bcb5/expat_static.bpr
new file mode 100644 (file)
index 0000000..2f6ec4d
--- /dev/null
@@ -0,0 +1,143 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value="Release\libexpats_mtd.lib"/>
+    <OBJFILES value="Release\obj\libexpat_static\xmlparse.obj 
+      Release\obj\libexpat_static\xmlrole.obj 
+      Release\obj\libexpat_static\xmltok.obj"/>
+    <RESFILES value=""/>
+    <IDLFILES value=""/>
+    <IDLGENFILES value=""/>
+    <DEFFILE value=""/>
+    <RESDEPEN value="$(RESFILES)"/>
+    <LIBFILES value=""/>
+    <LIBRARIES value=""/>
+    <SPARELIBS value=""/>
+    <PACKAGES value=""/>
+    <PATHCPP value=".;..\lib"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="TLib"/>
+    <USERDEFINES value="_WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC"/>
+    <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/>
+    <MAINSOURCE value="expat_static.bpf"/>
+    <INCLUDEPATH value="..\lib;$(BCB)\include"/>
+    <LIBPATH value="..\lib;$(BCB)\lib;$(RELEASELIBPATH)"/>
+    <WARNINGS value="-w-rch -w-par -w-8027 -w-8026 -w-ccc"/>
+    <LISTFILE value=""/>
+  </MACROS>
+  <OPTIONS>
+    <IDLCFLAGS value="-I$(BCB)\include"/>
+    <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -c"/>
+    <PFLAGS value="-N2Release\obj\libexpat_static -N0Release\obj\libexpat_static -$Y- -$L- -$D-"/>
+    <RFLAGS value="/l 0x409 /d &quot;NDEBUG&quot; /i$(BCB)\include"/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value=""/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="$(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES)"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=4
+Item0=..\lib;$(BCB)\include
+Item1=$(BCB)\include
+Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl
+Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl;
+
+[HistoryLists\hlLibraryPath]
+Count=5
+Item0=..\lib;$(BCB)\lib;$(RELEASELIBPATH)
+Item1=..\lib;$(BCB)\lib;..\lib\$(RELEASELIBPATH)
+Item2=$(BCB)\lib;$(RELEASELIBPATH)
+Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk
+Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk;
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=7
+Item0=_WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC
+Item1=_WINDOWS;WIN32;NDEBUG;_DEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC
+Item2=WIN32;_WINDOWS;NDEBUG;_DEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC
+Item3=WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP;_DEBUG
+Item4=WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP
+Item5=WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP;_MBCS
+Item6=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP
+
+[HistoryLists\hlIntOutputDir]
+Count=6
+Item0=Release\obj\libexpat_static
+Item1=Release\obj\mts
+Item2=Release\obj\mt
+Item3=Release
+Item4=..\lib\Release_static
+Item5=Release_static
+
+[HistoryLists\hlFinalOutputDir]
+Count=3
+Item0=Release\
+Item1=Release
+Item2=Release_static\
+
+[HistoryLists\hlTlibPageSize]
+Count=1
+Item0=0x0010
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+  </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
diff --git a/reactos/lib/3rdparty/expat/bcb5/expat_static.mak b/reactos/lib/3rdparty/expat/bcb5/expat_static.mak
new file mode 100644 (file)
index 0000000..9137d3b
--- /dev/null
@@ -0,0 +1,189 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.05.03
+# ---------------------------------------------------------------------------
+PROJECT = Release\libexpats_mtd.lib
+OBJFILES = Release\obj\libexpat_static\xmlparse.obj \
+    Release\obj\libexpat_static\xmlrole.obj \
+    Release\obj\libexpat_static\xmltok.obj
+RESFILES = 
+MAINSOURCE = expat_static.bpf
+RESDEPEN = $(RESFILES)
+LIBFILES = 
+IDLFILES = 
+IDLGENFILES = 
+LIBRARIES = 
+PACKAGES = 
+SPARELIBS = 
+DEFFILE = 
+# ---------------------------------------------------------------------------
+PATHCPP = .;..\lib
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+LINKER = TLib
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+USERDEFINES = _WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC
+SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL
+INCLUDEPATH = ..\lib;$(BCB)\include
+LIBPATH = ..\lib;$(BCB)\lib;$(RELEASELIBPATH)
+WARNINGS = -w-rch -w-par -w-8027 -w-8026 -w-ccc
+LISTFILE = 
+# ---------------------------------------------------------------------------
+CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -tWM -c
+IDLCFLAGS = -I$(BCB)\include
+PFLAGS = -N2Release\obj\libexpat_static -N0Release\obj\libexpat_static -$Y- -$L- -$D-
+RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include
+AFLAGS = /mx /w2 /zn
+LFLAGS = 
+# ---------------------------------------------------------------------------
+ALLOBJ = $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES)
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+!endif
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE.  It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if "$(USERDEFINES)" != ""
+AUSERDEFINES = -d$(USERDEFINES:;= -d)
+!else
+AUSERDEFINES =
+!endif
+
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(CPP32)
+CPP32 = cpp32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = TLib
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+
+
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C   = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC  = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+!if "$(LISTFILE)" ==  ""
+COMMA =
+!else
+COMMA = ,
+!endif
+
+$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+    $(BCB)\BIN\$(LINKER) /u $@ @&&!
+    $(LFLAGS) $? $(COMMA) $(LISTFILE)
+
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.pas.obj:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.cpp.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.cpp.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.asm.obj:
+    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
+
+.rc.res:
+    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
+# ---------------------------------------------------------------------------
+
+
+
+
diff --git a/reactos/lib/3rdparty/expat/bcb5/expatw.bpf b/reactos/lib/3rdparty/expat/bcb5/expatw.bpf
new file mode 100644 (file)
index 0000000..188a6d5
--- /dev/null
@@ -0,0 +1,6 @@
+USEUNIT("..\lib\xmlparse.c");
+USEUNIT("..\lib\xmlrole.c");
+USEUNIT("..\lib\xmltok.c");
+USEDEF("libexpatw_mtd.def");
+//---------------------------------------------------------------------------
+#define DllEntryPoint
diff --git a/reactos/lib/3rdparty/expat/bcb5/expatw.bpr b/reactos/lib/3rdparty/expat/bcb5/expatw.bpr
new file mode 100644 (file)
index 0000000..9ec5001
--- /dev/null
@@ -0,0 +1,146 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value="Release\libexpatw_mtd.dll"/>
+    <OBJFILES value="Release\obj\libexpatw\xmlparse.obj Release\obj\libexpatw\xmlrole.obj 
+      Release\obj\libexpatw\xmltok.obj"/>
+    <RESFILES value=""/>
+    <IDLFILES value=""/>
+    <IDLGENFILES value=""/>
+    <DEFFILE value="libexpatw_mtd.def"/>
+    <RESDEPEN value="$(RESFILES)"/>
+    <LIBFILES value=""/>
+    <LIBRARIES value=""/>
+    <SPARELIBS value=""/>
+    <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi 
+      ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi 
+      VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi 
+      dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/>
+    <PATHCPP value=".;..\lib"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="ilink32"/>
+    <USERDEFINES value="_WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T"/>
+    <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/>
+    <MAINSOURCE value="expatw.bpf"/>
+    <INCLUDEPATH value="..\lib;$(BCB)\include"/>
+    <LIBPATH value="..\lib;$(BCB)\lib;$(RELEASELIBPATH)"/>
+    <WARNINGS value="-w-rch -w-par -w-8027 -w-8026 -w-ccc"/>
+  </MACROS>
+  <OPTIONS>
+    <IDLCFLAGS value="-I$(BCB)\include"/>
+    <CFLAG1 value="-WD -O2 -X- -a8 -b -k- -vi -q -tWM -c -tWD"/>
+    <PFLAGS value="-N2Release\obj\libexpatw -N0Release\obj\libexpatw -$Y- -$L- -$D-"/>
+    <RFLAGS value="/l 0x409 /d &quot;NDEBUG&quot; /i$(BCB)\include"/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value="-IRelease\obj\libexpatw -D&quot;&quot; -aa -Tpd -x -Gn -Gi -w -q"/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="c0d32w.obj $(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=4
+Item0=..\lib;$(BCB)\include
+Item1=$(BCB)\include
+Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl
+Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl;
+
+[HistoryLists\hlLibraryPath]
+Count=5
+Item0=..\lib;$(BCB)\lib;$(RELEASELIBPATH)
+Item1=..\lib;$(BCB)\lib;..\lib\$(RELEASELIBPATH)
+Item2=$(BCB)\lib;$(RELEASELIBPATH)
+Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk
+Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk;
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=9
+Item0=_WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T
+Item1=_WINDOWS;WIN32;NDEBUG;_DEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T
+Item2=_WINDOWS;WIN32;NDEBUG;_DEBUG;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T
+Item3=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_USRDLL;EXPAT_EXPORTS;_DEBUG;XML_UNICODE_WCHAR_T
+Item4=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T;_DEBUG
+Item5=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_UNICODE;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T;_DEBUG
+Item6=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_UNICODE;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T
+Item7=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_MBCS;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T;XML_UNICODE
+Item8=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_MBCS;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T
+
+[HistoryLists\hlIntOutputDir]
+Count=8
+Item0=Release\obj\libexpatw
+Item1=Release\obj\libexpat
+Item2=Release\obj\mtd
+Item3=Release\obj\mt
+Item4=Release_w\obj
+Item5=Release-w\obj
+Item6=Release-w
+Item7=..\lib\Release-w
+
+[HistoryLists\hlFinalOutputDir]
+Count=5
+Item0=Release\
+Item1=Release
+Item2=Release_w\
+Item3=Release-w\
+Item4=Release-w
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+  </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
diff --git a/reactos/lib/3rdparty/expat/bcb5/expatw.mak b/reactos/lib/3rdparty/expat/bcb5/expatw.mak
new file mode 100644 (file)
index 0000000..08e17d0
--- /dev/null
@@ -0,0 +1,187 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.05.03
+# ---------------------------------------------------------------------------
+PROJECT = Release\libexpatw_mtd.dll
+OBJFILES = Release\obj\libexpatw\xmlparse.obj Release\obj\libexpatw\xmlrole.obj \
+    Release\obj\libexpatw\xmltok.obj
+RESFILES = 
+MAINSOURCE = expatw.bpf
+RESDEPEN = $(RESFILES)
+LIBFILES = 
+IDLFILES = 
+IDLGENFILES = 
+LIBRARIES = 
+PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \
+    ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \
+    VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \
+    dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi
+SPARELIBS = 
+DEFFILE = libexpatw_mtd.def
+# ---------------------------------------------------------------------------
+PATHCPP = .;..\lib
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+USERDEFINES = _WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T
+SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL
+INCLUDEPATH = ..\lib;$(BCB)\include
+LIBPATH = ..\lib;$(BCB)\lib;$(RELEASELIBPATH)
+WARNINGS= -w-rch -w-par -w-8027 -w-8026 -w-ccc
+# ---------------------------------------------------------------------------
+CFLAG1 = -WD -O2 -X- -a8 -b -k- -vi -q -tWM -c -tWD
+IDLCFLAGS = -I$(BCB)\include
+PFLAGS = -N2Release\obj\libexpatw -N0Release\obj\libexpatw -$Y- -$L- -$D-
+RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include
+AFLAGS = /mx /w2 /zn
+LFLAGS = -IRelease\obj\libexpatw -D"" -aa -Tpd -x -Gn -Gi -w -q
+# ---------------------------------------------------------------------------
+ALLOBJ = c0d32w.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+!endif
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE.  It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if "$(USERDEFINES)" != ""
+AUSERDEFINES = -d$(USERDEFINES:;= -d)
+!else
+AUSERDEFINES =
+!endif
+
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(CPP32)
+CPP32 = cpp32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = ilink32
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+
+
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C   = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC  = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+    $(BCB)\BIN\$(LINKER) @&&!
+    $(LFLAGS) -L$(LIBPATH) +
+    $(ALLOBJ), +
+    $(PROJECT),, +
+    $(ALLLIB), +
+    $(DEFFILE), +
+    $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.pas.obj:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.cpp.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.cpp.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.asm.obj:
+    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
+
+.rc.res:
+    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
+# ---------------------------------------------------------------------------
+
+
+
+
diff --git a/reactos/lib/3rdparty/expat/bcb5/expatw_static.bpf b/reactos/lib/3rdparty/expat/bcb5/expatw_static.bpf
new file mode 100644 (file)
index 0000000..5ca458e
--- /dev/null
@@ -0,0 +1,5 @@
+USEUNIT("..\lib\xmlparse.c");
+USEUNIT("..\lib\xmlrole.c");
+USEUNIT("..\lib\xmltok.c");
+//---------------------------------------------------------------------------
+#define Library
diff --git a/reactos/lib/3rdparty/expat/bcb5/expatw_static.bpr b/reactos/lib/3rdparty/expat/bcb5/expatw_static.bpr
new file mode 100644 (file)
index 0000000..3f12644
--- /dev/null
@@ -0,0 +1,152 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value="Release\libexpatws_mtd.lib"/>
+    <OBJFILES value="Release\obj\libexpatw_static\xmlparse.obj 
+      Release\obj\libexpatw_static\xmlrole.obj 
+      Release\obj\libexpatw_static\xmltok.obj"/>
+    <RESFILES value=""/>
+    <IDLFILES value=""/>
+    <IDLGENFILES value=""/>
+    <DEFFILE value=""/>
+    <RESDEPEN value="$(RESFILES)"/>
+    <LIBFILES value=""/>
+    <LIBRARIES value=""/>
+    <SPARELIBS value=""/>
+    <PACKAGES value=""/>
+    <PATHCPP value=".;..\lib"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="TLib"/>
+    <USERDEFINES value="_WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T"/>
+    <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/>
+    <MAINSOURCE value="expatw_static.bpf"/>
+    <INCLUDEPATH value="..\lib;$(BCB)\include"/>
+    <LIBPATH value="..\lib;$(BCB)\lib;$(RELEASELIBPATH)"/>
+    <WARNINGS value="-w-rch -w-par -w-8027 -w-8026 -w-ccc"/>
+    <LISTFILE value=""/>
+  </MACROS>
+  <OPTIONS>
+    <IDLCFLAGS value="-I$(BCB)\include"/>
+    <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -c"/>
+    <PFLAGS value="-N2Release\obj\libexpatw_static -N0Release\obj\libexpatw_static -$Y- -$L- 
+      -$D-"/>
+    <RFLAGS value="/l 0x409 /d &quot;NDEBUG&quot; /i$(BCB)\include"/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value=""/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="$(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES)"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=4
+Item0=..\lib;$(BCB)\include
+Item1=$(BCB)\include
+Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl
+Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl;
+
+[HistoryLists\hlLibraryPath]
+Count=5
+Item0=..\lib;$(BCB)\lib;$(RELEASELIBPATH)
+Item1=..\lib;$(BCB)\lib;..\lib\$(RELEASELIBPATH)
+Item2=$(BCB)\lib;$(RELEASELIBPATH)
+Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk
+Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk;
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=15
+Item0=_WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T
+Item1=_WINDOWS;WIN32;NDEBUG;_DEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T
+Item2=WIN32;_WINDOWS;NDEBUG;_DEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T
+Item3=WIN32;_WINDOWS;NDEBUG;_DEBUG;_LIB;XML_STATIC;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T
+Item4=WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP;_DEBUG;XML_UNICODE_WCHAR_T
+Item5=WIN32;_WINDOWS;NDEBUG;_UNICODE;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG
+Item6=WIN32;_WINDOWS;NDEBUG;_UNICODE;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG;__cplusplus
+Item7=WIN32;_WINDOWS;NDEBUG;_UNICODE;_LIB;COMPILED_FROM_DSP;XML_UNICODE;_DEBUG
+Item8=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE;_DEBUG
+Item9=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG;__WCHAR_T
+Item10=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG;_UNICODE
+Item11=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE;_DEBUG;_UNICODE
+Item12=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG
+Item13=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T
+Item14=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;XML_UNICODE
+
+[HistoryLists\hlIntOutputDir]
+Count=6
+Item0=Release\obj\libexpatw_static
+Item1=Release\obj\libexpat_static
+Item2=Release\obj\mts
+Item3=Release\obj\mt
+Item4=..\lib\Release-w_static
+Item5=Release-w_static
+
+[HistoryLists\hlFinalOutputDir]
+Count=3
+Item0=Release\
+Item1=Release
+Item2=Release-w_static\
+
+[HistoryLists\hlTlibPageSize]
+Count=1
+Item0=0x0010
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+  </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
diff --git a/reactos/lib/3rdparty/expat/bcb5/expatw_static.mak b/reactos/lib/3rdparty/expat/bcb5/expatw_static.mak
new file mode 100644 (file)
index 0000000..16b7e5b
--- /dev/null
@@ -0,0 +1,190 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.05.03
+# ---------------------------------------------------------------------------
+PROJECT = Release\libexpatws_mtd.lib
+OBJFILES = Release\obj\libexpatw_static\xmlparse.obj \
+    Release\obj\libexpatw_static\xmlrole.obj \
+    Release\obj\libexpatw_static\xmltok.obj
+RESFILES = 
+MAINSOURCE = expatw_static.bpf
+RESDEPEN = $(RESFILES)
+LIBFILES = 
+IDLFILES = 
+IDLGENFILES = 
+LIBRARIES = 
+PACKAGES = 
+SPARELIBS = 
+DEFFILE = 
+# ---------------------------------------------------------------------------
+PATHCPP = .;..\lib
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+LINKER = TLib
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+USERDEFINES = _WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T
+SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL
+INCLUDEPATH = ..\lib;$(BCB)\include
+LIBPATH = ..\lib;$(BCB)\lib;$(RELEASELIBPATH)
+WARNINGS = -w-rch -w-par -w-8027 -w-8026 -w-ccc
+LISTFILE = 
+# ---------------------------------------------------------------------------
+CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -tWM -c
+IDLCFLAGS = -I$(BCB)\include
+PFLAGS = -N2Release\obj\libexpatw_static -N0Release\obj\libexpatw_static -$Y- -$L- \
+    -$D-
+RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include
+AFLAGS = /mx /w2 /zn
+LFLAGS = 
+# ---------------------------------------------------------------------------
+ALLOBJ = $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES)
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+!endif
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE.  It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if "$(USERDEFINES)" != ""
+AUSERDEFINES = -d$(USERDEFINES:;= -d)
+!else
+AUSERDEFINES =
+!endif
+
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(CPP32)
+CPP32 = cpp32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = TLib
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+
+
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C   = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC  = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+!if "$(LISTFILE)" ==  ""
+COMMA =
+!else
+COMMA = ,
+!endif
+
+$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+    $(BCB)\BIN\$(LINKER) /u $@ @&&!
+    $(LFLAGS) $? $(COMMA) $(LISTFILE)
+
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.pas.obj:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.cpp.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.cpp.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.asm.obj:
+    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
+
+.rc.res:
+    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
+# ---------------------------------------------------------------------------
+
+
+
+
diff --git a/reactos/lib/3rdparty/expat/bcb5/libexpat_mtd.def b/reactos/lib/3rdparty/expat/bcb5/libexpat_mtd.def
new file mode 100644 (file)
index 0000000..fc1cb95
--- /dev/null
@@ -0,0 +1,141 @@
+; DEF file for BCB5
+LIBRARY   LIBEXPAT_MTD
+DESCRIPTION "Implements an XML parser."
+EXPORTS
+  _XML_DefaultCurrent @1
+  _XML_ErrorString @2
+  _XML_ExpatVersion @3
+  _XML_ExpatVersionInfo @4
+  _XML_ExternalEntityParserCreate @5
+  _XML_GetBase @6
+  _XML_GetBuffer @7
+  _XML_GetCurrentByteCount @8
+  _XML_GetCurrentByteIndex @9
+  _XML_GetCurrentColumnNumber @10
+  _XML_GetCurrentLineNumber @11
+  _XML_GetErrorCode @12
+  _XML_GetIdAttributeIndex @13
+  _XML_GetInputContext @14
+  _XML_GetSpecifiedAttributeCount @15
+  _XML_Parse @16
+  _XML_ParseBuffer @17
+  _XML_ParserCreate @18
+  _XML_ParserCreateNS @19
+  _XML_ParserCreate_MM @20
+  _XML_ParserFree @21
+  _XML_SetAttlistDeclHandler @22
+  _XML_SetBase @23
+  _XML_SetCdataSectionHandler @24
+  _XML_SetCharacterDataHandler @25
+  _XML_SetCommentHandler @26
+  _XML_SetDefaultHandler @27
+  _XML_SetDefaultHandlerExpand @28
+  _XML_SetDoctypeDeclHandler @29
+  _XML_SetElementDeclHandler @30
+  _XML_SetElementHandler @31
+  _XML_SetEncoding @32
+  _XML_SetEndCdataSectionHandler @33
+  _XML_SetEndDoctypeDeclHandler @34
+  _XML_SetEndElementHandler @35
+  _XML_SetEndNamespaceDeclHandler @36
+  _XML_SetEntityDeclHandler @37
+  _XML_SetExternalEntityRefHandler @38
+  _XML_SetExternalEntityRefHandlerArg @39
+  _XML_SetNamespaceDeclHandler @40
+  _XML_SetNotStandaloneHandler @41
+  _XML_SetNotationDeclHandler @42
+  _XML_SetParamEntityParsing @43
+  _XML_SetProcessingInstructionHandler @44
+  _XML_SetReturnNSTriplet @45
+  _XML_SetStartCdataSectionHandler @46
+  _XML_SetStartDoctypeDeclHandler @47
+  _XML_SetStartElementHandler @48
+  _XML_SetStartNamespaceDeclHandler @49
+  _XML_SetUnknownEncodingHandler @50
+  _XML_SetUnparsedEntityDeclHandler @51
+  _XML_SetUserData @52
+  _XML_SetXmlDeclHandler @53
+  _XML_UseParserAsHandlerArg @54
+; added with version 1.95.3
+  _XML_ParserReset @55
+  _XML_SetSkippedEntityHandler @56
+; added with version 1.95.5
+  _XML_GetFeatureList @57
+  _XML_UseForeignDTD @58
+; added with version 1.95.6
+  _XML_FreeContentModel @59
+  _XML_MemMalloc @60
+  _XML_MemRealloc @61
+  _XML_MemFree @62
+; added with version 1.95.8
+  _XML_StopParser @63
+  _XML_ResumeParser @64
+  _XML_GetParsingStatus @65
+
+; Aliases for MS compatible names
+  XML_DefaultCurrent = _XML_DefaultCurrent
+  XML_ErrorString = _XML_ErrorString
+  XML_ExpatVersion = _XML_ExpatVersion
+  XML_ExpatVersionInfo = _XML_ExpatVersionInfo
+  XML_ExternalEntityParserCreate = _XML_ExternalEntityParserCreate
+  XML_GetBase = _XML_GetBase
+  XML_GetBuffer = _XML_GetBuffer
+  XML_GetCurrentByteCount = _XML_GetCurrentByteCount
+  XML_GetCurrentByteIndex = _XML_GetCurrentByteIndex
+  XML_GetCurrentColumnNumber = _XML_GetCurrentColumnNumber
+  XML_GetCurrentLineNumber = _XML_GetCurrentLineNumber
+  XML_GetErrorCode = _XML_GetErrorCode
+  XML_GetIdAttributeIndex = _XML_GetIdAttributeIndex
+  XML_GetInputContext = _XML_GetInputContext
+  XML_GetSpecifiedAttributeCount = _XML_GetSpecifiedAttributeCount
+  XML_Parse = _XML_Parse
+  XML_ParseBuffer = _XML_ParseBuffer
+  XML_ParserCreate = _XML_ParserCreate
+  XML_ParserCreateNS = _XML_ParserCreateNS
+  XML_ParserCreate_MM = _XML_ParserCreate_MM
+  XML_ParserFree = _XML_ParserFree
+  XML_SetAttlistDeclHandler = _XML_SetAttlistDeclHandler
+  XML_SetBase = _XML_SetBase
+  XML_SetCdataSectionHandler = _XML_SetCdataSectionHandler
+  XML_SetCharacterDataHandler = _XML_SetCharacterDataHandler
+  XML_SetCommentHandler = _XML_SetCommentHandler
+  XML_SetDefaultHandler = _XML_SetDefaultHandler
+  XML_SetDefaultHandlerExpand = _XML_SetDefaultHandlerExpand
+  XML_SetDoctypeDeclHandler = _XML_SetDoctypeDeclHandler
+  XML_SetElementDeclHandler = _XML_SetElementDeclHandler
+  XML_SetElementHandler = _XML_SetElementHandler
+  XML_SetEncoding = _XML_SetEncoding
+  XML_SetEndCdataSectionHandler = _XML_SetEndCdataSectionHandler
+  XML_SetEndDoctypeDeclHandler = _XML_SetEndDoctypeDeclHandler
+  XML_SetEndElementHandler = _XML_SetEndElementHandler
+  XML_SetEndNamespaceDeclHandler = _XML_SetEndNamespaceDeclHandler
+  XML_SetEntityDeclHandler = _XML_SetEntityDeclHandler
+  XML_SetExternalEntityRefHandler = _XML_SetExternalEntityRefHandler
+  XML_SetExternalEntityRefHandlerArg = _XML_SetExternalEntityRefHandlerArg
+  XML_SetNamespaceDeclHandler = _XML_SetNamespaceDeclHandler
+  XML_SetNotStandaloneHandler = _XML_SetNotStandaloneHandler
+  XML_SetNotationDeclHandler = _XML_SetNotationDeclHandler
+  XML_SetParamEntityParsing = _XML_SetParamEntityParsing
+  XML_SetProcessingInstructionHandler = _XML_SetProcessingInstructionHandler
+  XML_SetReturnNSTriplet = _XML_SetReturnNSTriplet
+  XML_SetStartCdataSectionHandler = _XML_SetStartCdataSectionHandler
+  XML_SetStartDoctypeDeclHandler = _XML_SetStartDoctypeDeclHandler
+  XML_SetStartElementHandler = _XML_SetStartElementHandler
+  XML_SetStartNamespaceDeclHandler = _XML_SetStartNamespaceDeclHandler
+  XML_SetUnknownEncodingHandler = _XML_SetUnknownEncodingHandler
+  XML_SetUnparsedEntityDeclHandler = _XML_SetUnparsedEntityDeclHandler
+  XML_SetUserData = _XML_SetUserData
+  XML_SetXmlDeclHandler = _XML_SetXmlDeclHandler
+  XML_UseParserAsHandlerArg = _XML_UseParserAsHandlerArg
+  XML_ParserReset = _XML_ParserReset
+  XML_SetSkippedEntityHandler = _XML_SetSkippedEntityHandler
+  XML_GetFeatureList = _XML_GetFeatureList
+  XML_UseForeignDTD = _XML_UseForeignDTD
+  XML_FreeContentModel = _XML_FreeContentModel
+  XML_MemMalloc = _XML_MemMalloc
+  XML_MemRealloc = _XML_MemRealloc
+  XML_MemFree = _XML_MemFree
+  XML_StopParser = _XML_StopParser
+  XML_ResumeParser = _XML_ResumeParser
+  XML_GetParsingStatus = _XML_GetParsingStatus
+
diff --git a/reactos/lib/3rdparty/expat/bcb5/libexpatw_mtd.def b/reactos/lib/3rdparty/expat/bcb5/libexpatw_mtd.def
new file mode 100644 (file)
index 0000000..418462d
--- /dev/null
@@ -0,0 +1,140 @@
+; DEF file for BCB5
+LIBRARY   LIBEXPATW_MTD
+DESCRIPTION "Implements an XML parser."
+EXPORTS
+  _XML_DefaultCurrent @1
+  _XML_ErrorString @2
+  _XML_ExpatVersion @3
+  _XML_ExpatVersionInfo @4
+  _XML_ExternalEntityParserCreate @5
+  _XML_GetBase @6
+  _XML_GetBuffer @7
+  _XML_GetCurrentByteCount @8
+  _XML_GetCurrentByteIndex @9
+  _XML_GetCurrentColumnNumber @10
+  _XML_GetCurrentLineNumber @11
+  _XML_GetErrorCode @12
+  _XML_GetIdAttributeIndex @13
+  _XML_GetInputContext @14
+  _XML_GetSpecifiedAttributeCount @15
+  _XML_Parse @16
+  _XML_ParseBuffer @17
+  _XML_ParserCreate @18
+  _XML_ParserCreateNS @19
+  _XML_ParserCreate_MM @20
+  _XML_ParserFree @21
+  _XML_SetAttlistDeclHandler @22
+  _XML_SetBase @23
+  _XML_SetCdataSectionHandler @24
+  _XML_SetCharacterDataHandler @25
+  _XML_SetCommentHandler @26
+  _XML_SetDefaultHandler @27
+  _XML_SetDefaultHandlerExpand @28
+  _XML_SetDoctypeDeclHandler @29
+  _XML_SetElementDeclHandler @30
+  _XML_SetElementHandler @31
+  _XML_SetEncoding @32
+  _XML_SetEndCdataSectionHandler @33
+  _XML_SetEndDoctypeDeclHandler @34
+  _XML_SetEndElementHandler @35
+  _XML_SetEndNamespaceDeclHandler @36
+  _XML_SetEntityDeclHandler @37
+  _XML_SetExternalEntityRefHandler @38
+  _XML_SetExternalEntityRefHandlerArg @39
+  _XML_SetNamespaceDeclHandler @40
+  _XML_SetNotStandaloneHandler @41
+  _XML_SetNotationDeclHandler @42
+  _XML_SetParamEntityParsing @43
+  _XML_SetProcessingInstructionHandler @44
+  _XML_SetReturnNSTriplet @45
+  _XML_SetStartCdataSectionHandler @46
+  _XML_SetStartDoctypeDeclHandler @47
+  _XML_SetStartElementHandler @48
+  _XML_SetStartNamespaceDeclHandler @49
+  _XML_SetUnknownEncodingHandler @50
+  _XML_SetUnparsedEntityDeclHandler @51
+  _XML_SetUserData @52
+  _XML_SetXmlDeclHandler @53
+  _XML_UseParserAsHandlerArg @54
+; added with version 1.95.3
+  _XML_ParserReset @55
+  _XML_SetSkippedEntityHandler @56
+; added with version 1.95.5
+  _XML_GetFeatureList @57
+  _XML_UseForeignDTD @58
+; added with version 1.95.6
+  _XML_FreeContentModel @59
+  _XML_MemMalloc @60
+  _XML_MemRealloc @61
+  _XML_MemFree @62
+; added with version 1.95.8
+  _XML_StopParser @63
+  _XML_ResumeParser @64
+  _XML_GetParsingStatus @65
+
+; Aliases for MS compatible names
+  XML_DefaultCurrent = _XML_DefaultCurrent
+  XML_ErrorString = _XML_ErrorString
+  XML_ExpatVersion = _XML_ExpatVersion
+  XML_ExpatVersionInfo = _XML_ExpatVersionInfo
+  XML_ExternalEntityParserCreate = _XML_ExternalEntityParserCreate
+  XML_GetBase = _XML_GetBase
+  XML_GetBuffer = _XML_GetBuffer
+  XML_GetCurrentByteCount = _XML_GetCurrentByteCount
+  XML_GetCurrentByteIndex = _XML_GetCurrentByteIndex
+  XML_GetCurrentColumnNumber = _XML_GetCurrentColumnNumber
+  XML_GetCurrentLineNumber = _XML_GetCurrentLineNumber
+  XML_GetErrorCode = _XML_GetErrorCode
+  XML_GetIdAttributeIndex = _XML_GetIdAttributeIndex
+  XML_GetInputContext = _XML_GetInputContext
+  XML_GetSpecifiedAttributeCount = _XML_GetSpecifiedAttributeCount
+  XML_Parse = _XML_Parse
+  XML_ParseBuffer = _XML_ParseBuffer
+  XML_ParserCreate = _XML_ParserCreate
+  XML_ParserCreateNS = _XML_ParserCreateNS
+  XML_ParserCreate_MM = _XML_ParserCreate_MM
+  XML_ParserFree = _XML_ParserFree
+  XML_SetAttlistDeclHandler = _XML_SetAttlistDeclHandler
+  XML_SetBase = _XML_SetBase
+  XML_SetCdataSectionHandler = _XML_SetCdataSectionHandler
+  XML_SetCharacterDataHandler = _XML_SetCharacterDataHandler
+  XML_SetCommentHandler = _XML_SetCommentHandler
+  XML_SetDefaultHandler = _XML_SetDefaultHandler
+  XML_SetDefaultHandlerExpand = _XML_SetDefaultHandlerExpand
+  XML_SetDoctypeDeclHandler = _XML_SetDoctypeDeclHandler
+  XML_SetElementDeclHandler = _XML_SetElementDeclHandler
+  XML_SetElementHandler = _XML_SetElementHandler
+  XML_SetEncoding = _XML_SetEncoding
+  XML_SetEndCdataSectionHandler = _XML_SetEndCdataSectionHandler
+  XML_SetEndDoctypeDeclHandler = _XML_SetEndDoctypeDeclHandler
+  XML_SetEndElementHandler = _XML_SetEndElementHandler
+  XML_SetEndNamespaceDeclHandler = _XML_SetEndNamespaceDeclHandler
+  XML_SetEntityDeclHandler = _XML_SetEntityDeclHandler
+  XML_SetExternalEntityRefHandler = _XML_SetExternalEntityRefHandler
+  XML_SetExternalEntityRefHandlerArg = _XML_SetExternalEntityRefHandlerArg
+  XML_SetNamespaceDeclHandler = _XML_SetNamespaceDeclHandler
+  XML_SetNotStandaloneHandler = _XML_SetNotStandaloneHandler
+  XML_SetNotationDeclHandler = _XML_SetNotationDeclHandler
+  XML_SetParamEntityParsing = _XML_SetParamEntityParsing
+  XML_SetProcessingInstructionHandler = _XML_SetProcessingInstructionHandler
+  XML_SetReturnNSTriplet = _XML_SetReturnNSTriplet
+  XML_SetStartCdataSectionHandler = _XML_SetStartCdataSectionHandler
+  XML_SetStartDoctypeDeclHandler = _XML_SetStartDoctypeDeclHandler
+  XML_SetStartElementHandler = _XML_SetStartElementHandler
+  XML_SetStartNamespaceDeclHandler = _XML_SetStartNamespaceDeclHandler
+  XML_SetUnknownEncodingHandler = _XML_SetUnknownEncodingHandler
+  XML_SetUnparsedEntityDeclHandler = _XML_SetUnparsedEntityDeclHandler
+  XML_SetUserData = _XML_SetUserData
+  XML_SetXmlDeclHandler = _XML_SetXmlDeclHandler
+  XML_UseParserAsHandlerArg = _XML_UseParserAsHandlerArg
+  XML_ParserReset = _XML_ParserReset
+  XML_SetSkippedEntityHandler = _XML_SetSkippedEntityHandler
+  XML_GetFeatureList = _XML_GetFeatureList
+  XML_UseForeignDTD = _XML_UseForeignDTD
+  XML_FreeContentModel = _XML_FreeContentModel
+  XML_MemMalloc = _XML_MemMalloc
+  XML_MemRealloc = _XML_MemRealloc
+  XML_MemFree = _XML_MemFree
+  XML_StopParser = _XML_StopParser
+  XML_ResumeParser = _XML_ResumeParser
+  XML_GetParsingStatus = _XML_GetParsingStatus
diff --git a/reactos/lib/3rdparty/expat/bcb5/makefile.mak b/reactos/lib/3rdparty/expat/bcb5/makefile.mak
new file mode 100644 (file)
index 0000000..548815e
--- /dev/null
@@ -0,0 +1,37 @@
+all: setup expat expatw expat_static expatw_static elements outline xmlwf
+
+setup:
+ setup
+
+expat:
+ make -l -fexpat.mak
+
+expatw:
+ make -l -fexpatw.mak
+
+expat_static:
+ make -l -fexpat_static.mak
+
+expatw_static:
+ make -l -fexpatw_static.mak
+
+elements:
+ make -l -felements.mak
+
+outline:
+ make -l -foutline.mak
+
+xmlwf:
+ make -l -fxmlwf.mak
+
+clean:
+# works on Win98/ME
+# deltree /y release\obj
+# works on WinNT/2000
+ del /s/f/q release\obj
+
+distclean:
+# works on Win98/ME
+# deltree /y release\*.*
+# works on WinNT/2000
+ del /s/f/q release\*
diff --git a/reactos/lib/3rdparty/expat/bcb5/outline.bpf b/reactos/lib/3rdparty/expat/bcb5/outline.bpf
new file mode 100644 (file)
index 0000000..52dce83
--- /dev/null
@@ -0,0 +1,4 @@
+USEUNIT("..\examples\outline.c");
+USELIB("Release\libexpat_mtd.lib");
+//---------------------------------------------------------------------------
+main
diff --git a/reactos/lib/3rdparty/expat/bcb5/outline.bpr b/reactos/lib/3rdparty/expat/bcb5/outline.bpr
new file mode 100644 (file)
index 0000000..e0ae5cd
--- /dev/null
@@ -0,0 +1,132 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value="Release\outline.exe"/>
+    <OBJFILES value="Release\obj\examples\outline.obj"/>
+    <RESFILES value=""/>
+    <IDLFILES value=""/>
+    <IDLGENFILES value=""/>
+    <DEFFILE value=""/>
+    <RESDEPEN value="$(RESFILES)"/>
+    <LIBFILES value="Release\libexpat_mtd.lib"/>
+    <LIBRARIES value=""/>
+    <SPARELIBS value=""/>
+    <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi 
+      ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi 
+      VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi 
+      dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/>
+    <PATHCPP value=".;..\examples"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="ilink32"/>
+    <USERDEFINES value="WIN32;NDEBUG;_CONSOLE"/>
+    <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/>
+    <MAINSOURCE value="outline.bpf"/>
+    <INCLUDEPATH value="..\examples;$(BCB)\include"/>
+    <LIBPATH value="..\examples;$(BCB)\lib;$(RELEASELIBPATH)"/>
+    <WARNINGS value="-w-par -w-8027 -w-8026"/>
+  </MACROS>
+  <OPTIONS>
+    <IDLCFLAGS value="-I$(BCB)\include"/>
+    <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c"/>
+    <PFLAGS value="-N2Release\obj\examples -N0Release\obj\examples -$Y- -$L- -$D-"/>
+    <RFLAGS value="/l 0x409 /d &quot;NDEBUG&quot; /i$(BCB)\include"/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value="-IRelease\obj\examples -D&quot;&quot; -ap -Tpe -x -Gn -q"/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="c0x32.obj $(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=3
+Item0=..\examples;$(BCB)\include
+Item1=$(BCB)\include
+Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl;
+
+[HistoryLists\hlLibraryPath]
+Count=4
+Item0=..\examples;$(BCB)\lib;$(RELEASELIBPATH)
+Item1=..\examples;$(BCB)\lib;..\examples\$(RELEASELIBPATH)
+Item2=$(BCB)\lib;$(RELEASELIBPATH)
+Item3=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk;
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=6
+Item0=WIN32;NDEBUG;_CONSOLE
+Item1=WIN32;NDEBUG;_CONSOLE;XML_STATIC
+Item2=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_STATIC
+Item3=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE;XML_STATIC
+Item4=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE
+Item5=WIN32;NDEBUG;_CONSOLE;_DEBUG
+
+[HistoryLists\hlIntOutputDir]
+Count=4
+Item0=Release\obj\examples
+Item1=Release\obj\outline
+Item2=..\examples\Release
+Item3=Release
+
+[HistoryLists\hlFinalOutputDir]
+Count=1
+Item0=Release\
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+  </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
diff --git a/reactos/lib/3rdparty/expat/bcb5/outline.mak b/reactos/lib/3rdparty/expat/bcb5/outline.mak
new file mode 100644 (file)
index 0000000..510b541
--- /dev/null
@@ -0,0 +1,186 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.05.03
+# ---------------------------------------------------------------------------
+PROJECT = Release\outline.exe
+OBJFILES = Release\obj\examples\outline.obj
+RESFILES = 
+MAINSOURCE = outline.bpf
+RESDEPEN = $(RESFILES)
+LIBFILES = Release\libexpat_mtd.lib
+IDLFILES = 
+IDLGENFILES = 
+LIBRARIES = 
+PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \
+    ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \
+    VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \
+    dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi
+SPARELIBS = 
+DEFFILE = 
+# ---------------------------------------------------------------------------
+PATHCPP = .;..\examples
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+USERDEFINES = WIN32;NDEBUG;_CONSOLE
+SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL
+INCLUDEPATH = ..\examples;$(BCB)\include
+LIBPATH = ..\examples;$(BCB)\lib;$(RELEASELIBPATH)
+WARNINGS= -w-par -w-8027 -w-8026
+# ---------------------------------------------------------------------------
+CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c
+IDLCFLAGS = -I$(BCB)\include
+PFLAGS = -N2Release\obj\examples -N0Release\obj\examples -$Y- -$L- -$D-
+RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include
+AFLAGS = /mx /w2 /zn
+LFLAGS = -IRelease\obj\examples -D"" -ap -Tpe -x -Gn -q
+# ---------------------------------------------------------------------------
+ALLOBJ = c0x32.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+!endif
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE.  It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if "$(USERDEFINES)" != ""
+AUSERDEFINES = -d$(USERDEFINES:;= -d)
+!else
+AUSERDEFINES =
+!endif
+
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(CPP32)
+CPP32 = cpp32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = ilink32
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+
+
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C   = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC  = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+    $(BCB)\BIN\$(LINKER) @&&!
+    $(LFLAGS) -L$(LIBPATH) +
+    $(ALLOBJ), +
+    $(PROJECT),, +
+    $(ALLLIB), +
+    $(DEFFILE), +
+    $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.pas.obj:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.cpp.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.cpp.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.asm.obj:
+    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
+
+.rc.res:
+    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
+# ---------------------------------------------------------------------------
+
+
+
+
diff --git a/reactos/lib/3rdparty/expat/bcb5/setup.bat b/reactos/lib/3rdparty/expat/bcb5/setup.bat
new file mode 100755 (executable)
index 0000000..6f4b573
--- /dev/null
@@ -0,0 +1,9 @@
+REM CommandInterpreter: $(COMSPEC)
+if not exist .\release\nul mkdir release
+if not exist .\release\obj\nul mkdir release\obj
+if not exist .\release\obj\libexpat\nul mkdir release\obj\libexpat
+if not exist .\release\obj\libexpatw\nul mkdir release\obj\libexpatw
+if not exist .\release\obj\libexpat_static\nul mkdir release\obj\libexpat_static
+if not exist .\release\obj\libexpatw_static\nul mkdir release\obj\libexpatw_static
+if not exist .\release\obj\examples\nul mkdir release\obj\examples
+if not exist .\release\obj\xmlwf\nul mkdir release\obj\xmlwf
diff --git a/reactos/lib/3rdparty/expat/bcb5/xmlwf.bpf b/reactos/lib/3rdparty/expat/bcb5/xmlwf.bpf
new file mode 100644 (file)
index 0000000..d06208e
--- /dev/null
@@ -0,0 +1,7 @@
+USEUNIT("..\xmlwf\codepage.c");
+USEUNIT("..\xmlwf\win32filemap.c");
+USEUNIT("..\xmlwf\xmlfile.c");
+USEUNIT("..\xmlwf\xmlwf.c");
+USELIB("Release\libexpat_mtd.lib");
+//---------------------------------------------------------------------------
+main
diff --git a/reactos/lib/3rdparty/expat/bcb5/xmlwf.bpr b/reactos/lib/3rdparty/expat/bcb5/xmlwf.bpr
new file mode 100644 (file)
index 0000000..d33a153
--- /dev/null
@@ -0,0 +1,136 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value="Release\xmlwf.exe"/>
+    <OBJFILES value="Release\obj\xmlwf\codepage.obj Release\obj\xmlwf\win32filemap.obj 
+      Release\obj\xmlwf\xmlfile.obj Release\obj\xmlwf\xmlwf.obj"/>
+    <RESFILES value=""/>
+    <IDLFILES value=""/>
+    <IDLGENFILES value=""/>
+    <DEFFILE value=""/>
+    <RESDEPEN value="$(RESFILES)"/>
+    <LIBFILES value="Release\libexpat_mtd.lib"/>
+    <LIBRARIES value=""/>
+    <SPARELIBS value=""/>
+    <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi 
+      ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi 
+      VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi 
+      dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/>
+    <PATHCPP value=".;..\xmlwf"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="ilink32"/>
+    <USERDEFINES value="NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP"/>
+    <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/>
+    <MAINSOURCE value="xmlwf.bpf"/>
+    <INCLUDEPATH value="..\xmlwf;$(BCB)\include"/>
+    <LIBPATH value="..\xmlwf;$(BCB)\lib;$(RELEASELIBPATH)"/>
+    <WARNINGS value="-w-8065 -w-par -w-8027 -w-8026"/>
+  </MACROS>
+  <OPTIONS>
+    <IDLCFLAGS value="-I$(BCB)\include"/>
+    <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c"/>
+    <PFLAGS value="-N2Release\obj\xmlwf -N0Release\obj\xmlwf -$Y- -$L- -$D-"/>
+    <RFLAGS value="/l 0x409 /d &quot;NDEBUG&quot; /i$(BCB)\include"/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value="-IRelease\obj\xmlwf -D&quot;&quot; -ap -Tpe -x -Gn -q"/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="c0x32.obj $(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=4
+Item0=..\xmlwf;$(BCB)\include
+Item1=$(BCB)\include
+Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl
+Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl;
+
+[HistoryLists\hlLibraryPath]
+Count=5
+Item0=..\xmlwf;$(BCB)\lib;$(RELEASELIBPATH)
+Item1=..\xmlwf;$(BCB)\lib;..\xmlwf\$(RELEASELIBPATH)
+Item2=$(BCB)\lib;$(RELEASELIBPATH)
+Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk
+Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk;
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=6
+Item0=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP
+Item1=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE
+Item2=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG;XML_UNICODE_WCHAR_T
+Item3=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG
+Item4=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG;_UNICODE;XML_UNICODE_WCHAR_T
+Item5=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG;_UNICODE
+
+[HistoryLists\hlIntOutputDir]
+Count=3
+Item0=Release\obj\xmlwf
+Item1=..\xmlwf\Release
+Item2=Release
+
+[HistoryLists\hlFinalOutputDir]
+Count=3
+Item0=Release\
+Item1=Release
+Item2=.\Release\
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=sample.xml
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+  </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
diff --git a/reactos/lib/3rdparty/expat/bcb5/xmlwf.mak b/reactos/lib/3rdparty/expat/bcb5/xmlwf.mak
new file mode 100644 (file)
index 0000000..f74126e
--- /dev/null
@@ -0,0 +1,187 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.05.03
+# ---------------------------------------------------------------------------
+PROJECT = Release\xmlwf.exe
+OBJFILES = Release\obj\xmlwf\codepage.obj Release\obj\xmlwf\win32filemap.obj \
+    Release\obj\xmlwf\xmlfile.obj Release\obj\xmlwf\xmlwf.obj
+RESFILES = 
+MAINSOURCE = xmlwf.bpf
+RESDEPEN = $(RESFILES)
+LIBFILES = Release\libexpat_mtd.lib
+IDLFILES = 
+IDLGENFILES = 
+LIBRARIES = 
+PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \
+    ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \
+    VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \
+    dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi
+SPARELIBS = 
+DEFFILE = 
+# ---------------------------------------------------------------------------
+PATHCPP = .;..\xmlwf
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+USERDEFINES = NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP
+SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL
+INCLUDEPATH = ..\xmlwf;$(BCB)\include
+LIBPATH = ..\xmlwf;$(BCB)\lib;$(RELEASELIBPATH)
+WARNINGS= -w-8065 -w-par -w-8027 -w-8026
+# ---------------------------------------------------------------------------
+CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c
+IDLCFLAGS = -I$(BCB)\include
+PFLAGS = -N2Release\obj\xmlwf -N0Release\obj\xmlwf -$Y- -$L- -$D-
+RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include
+AFLAGS = /mx /w2 /zn
+LFLAGS = -IRelease\obj\xmlwf -D"" -ap -Tpe -x -Gn -q
+# ---------------------------------------------------------------------------
+ALLOBJ = c0x32.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+!endif
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE.  It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if "$(USERDEFINES)" != ""
+AUSERDEFINES = -d$(USERDEFINES:;= -d)
+!else
+AUSERDEFINES =
+!endif
+
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(CPP32)
+CPP32 = cpp32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = ilink32
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+
+
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C   = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC  = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+    $(BCB)\BIN\$(LINKER) @&&!
+    $(LFLAGS) -L$(LIBPATH) +
+    $(ALLOBJ), +
+    $(PROJECT),, +
+    $(ALLLIB), +
+    $(DEFFILE), +
+    $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.pas.obj:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.cpp.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.cpp.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.asm.obj:
+    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
+
+.rc.res:
+    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
+# ---------------------------------------------------------------------------
+
+
+
+
diff --git a/reactos/lib/3rdparty/expat/buildconf.sh b/reactos/lib/3rdparty/expat/buildconf.sh
new file mode 100644 (file)
index 0000000..2fc5932
--- /dev/null
@@ -0,0 +1,102 @@
+#! /bin/sh
+
+#--------------------------------------------------------------------------
+# autoconf 2.52 or newer
+#
+ac_version="`${AUTOCONF:-autoconf} --version 2> /dev/null | head -1 | sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`"
+if test -z "$ac_version"; then
+  echo "ERROR: autoconf not found."
+  echo "       You need autoconf version 2.52 or newer installed."
+  exit 1
+fi
+IFS=.; set $ac_version; IFS=' '
+if test "$1" = "2" -a "$2" -lt "52" || test "$1" -lt "2"; then
+  echo "ERROR: autoconf version $ac_version found."
+  echo "       You need autoconf version 2.52 or newer installed."
+  exit 1
+fi
+
+echo "found: autoconf version $ac_version (ok)"
+
+#--------------------------------------------------------------------------
+# libtool 1.4 or newer
+#
+
+#
+# find libtoolize, or glibtoolize on MacOS X
+#
+libtoolize=`conftools/PrintPath glibtoolize libtoolize`
+if [ "x$libtoolize" = "x" ]; then
+  echo "ERROR: libtoolize not found."
+  echo "       You need libtool version 1.4 or newer installed"
+  exit 1
+fi
+
+lt_pversion="`$libtoolize --version 2> /dev/null | sed -e 's/^[^0-9]*//'`"
+
+# convert something like 1.4p1 to 1.4.p1
+lt_version="`echo $lt_pversion | sed -e 's/\([a-z]*\)$/.\1/'`"
+
+IFS=.; set $lt_version; IFS=' '
+if test "$1" = "1" -a "$2" -lt "4"; then
+  echo "ERROR: libtool version $lt_pversion found."
+  echo "       You need libtool version 1.4 or newer installed"
+  exit 1
+fi
+
+echo "found: libtool version $lt_pversion (ok)"
+
+#--------------------------------------------------------------------------
+
+# Remove any libtool files so one can switch between libtool 1.3
+# and libtool 1.4 by simply rerunning the buildconf script.
+(cd conftools/; rm -f ltmain.sh ltconfig)
+
+#
+# Create the libtool helper files
+#
+echo "Copying libtool helper files ..."
+
+#
+# Note: we don't use --force (any more) since we have a special
+# config.guess/config.sub that we want to ensure is used.
+#
+# --copy to avoid symlinks; we want originals for the distro
+# --automake to make it shut up about "things to do"
+#
+$libtoolize --copy --automake
+
+#
+# Find the libtool.m4 file. The developer/packager can set the LIBTOOL_M4
+# environment variable to specify its location. If that variable is not
+# set, then we'll assume a "standard" libtool installation and try to
+# derive its location.
+#
+ltpath=`dirname $libtoolize`
+ltfile=${LIBTOOL_M4-`cd $ltpath/../share/aclocal ; pwd`/libtool.m4}
+cp $ltfile conftools/libtool.m4
+
+echo "Using libtool.m4 from ${ltfile}."
+
+#--------------------------------------------------------------------------
+
+### for a little while... remove stray aclocal.m4 files from
+### developers' working copies. we no longer use it. (nothing else
+### will remove it, and leaving it creates big problems)
+rm -f aclocal.m4
+
+#
+# Generate the autoconf header template (expat_config.h.in) and ./configure
+#
+echo "Creating expat_config.h.in ..."
+${AUTOHEADER:-autoheader}
+
+echo "Creating configure ..."
+### do some work to toss config.cache?
+${AUTOCONF:-autoconf}
+
+# toss this; it gets created by autoconf on some systems
+rm -rf autom4te*.cache
+
+# exit with the right value, so any calling script can continue
+exit 0
diff --git a/reactos/lib/3rdparty/expat/configure.in b/reactos/lib/3rdparty/expat/configure.in
new file mode 100644 (file)
index 0000000..9d3a6f7
--- /dev/null
@@ -0,0 +1,153 @@
+dnl   configuration script for expat
+dnl   Process this file with autoconf to produce a configure script.
+dnl
+dnl   Copyright 2000 Clark Cooper
+dnl
+dnl   This file is part of EXPAT.
+dnl
+dnl   EXPAT is free software; you can redistribute it and/or modify it
+dnl   under the terms of the License (based on the MIT/X license) contained
+dnl   in the file COPYING that comes with this distribution.
+dnl
+
+dnl Ensure that Expat is configured with autoconf 2.52 or newer
+AC_PREREQ(2.52)
+
+dnl Get the version number of Expat, using m4's esyscmd() command to run
+dnl the command at m4-generation time. This allows us to create an m4
+dnl symbol holding the correct version number. AC_INIT() requires the
+dnl version number at m4-time, rather than when ./configure is run, so
+dnl all this must happen as part of m4, not as part of the shell code
+dnl contained in ./configure.
+dnl
+dnl NOTE: esyscmd() is a GNU M4 extension. Thus, we wrap it in an appropriate
+dnl test. I believe this test will work, but I don't have a place with non-
+dnl GNU M4 to test it right now.
+define([expat_version], ifdef([__gnu__],
+                              [esyscmd(conftools/get-version.sh lib/expat.h)],
+                              [2.0.x]))
+AC_INIT(expat, expat_version, expat-bugs@libexpat.org)
+undefine([expat_version])
+
+AC_CONFIG_SRCDIR(Makefile.in)
+AC_CONFIG_AUX_DIR(conftools)
+
+
+dnl
+dnl Increment LIBREVISION if source code has changed at all
+dnl
+dnl If the API has changed, increment LIBCURRENT and set LIBREVISION to 0
+dnl
+dnl If the API changes compatibly (i.e. simply adding a new function
+dnl without changing or removing earlier interfaces), then increment LIBAGE.
+dnl 
+dnl If the API changes incompatibly set LIBAGE back to 0
+dnl
+
+LIBCURRENT=6
+LIBREVISION=0
+LIBAGE=5
+
+AC_CONFIG_HEADER(expat_config.h)
+
+sinclude(conftools/libtool.m4)
+sinclude(conftools/ac_c_bigendian_cross.m4)
+
+AC_LIBTOOL_WIN32_DLL
+AC_PROG_LIBTOOL
+
+AC_SUBST(LIBCURRENT)
+AC_SUBST(LIBREVISION)
+AC_SUBST(LIBAGE)
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+
+if test "$GCC" = yes ; then
+    dnl
+    dnl Be careful about adding the -fexceptions option; some versions of
+    dnl GCC don't support it and it causes extra warnings that are only
+    dnl distracting; avoid.
+    dnl
+    OLDCFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wstrict-prototypes"
+    CFLAGS="$OLDCFLAGS -fexceptions"
+    AC_MSG_CHECKING(whether gcc accepts -fexceptions)
+    AC_TRY_COMPILE(,(void)1,
+                   AC_MSG_RESULT(yes),
+                   AC_MSG_RESULT(no); CFLAGS="$OLDCFLAGS")
+fi
+
+dnl Checks for header files.
+AC_HEADER_STDC
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+
+dnl Note: Avoid using AC_C_BIGENDIAN because it does not
+dnl work in a cross compile.
+AC_C_BIGENDIAN_CROSS
+
+AC_C_CONST
+AC_TYPE_SIZE_T
+AC_CHECK_FUNCS(memmove bcopy)
+
+dnl Only needed for xmlwf:
+AC_CHECK_HEADERS(fcntl.h unistd.h)
+AC_TYPE_OFF_T
+AC_FUNC_MMAP
+
+if test "$ac_cv_func_mmap_fixed_mapped" = "yes"; then
+    FILEMAP=unixfilemap
+else
+    FILEMAP=readfilemap
+fi
+AC_SUBST(FILEMAP)
+
+dnl Needed for the test support code; this was found at
+dnl http://lists.gnu.org/archive/html/bug-autoconf/2002-07/msg00028.html
+
+# AC_CPP_FUNC
+# ------------------ #
+# Checks to see if ANSI C99 CPP variable __func__ works.
+# If not, perhaps __FUNCTION__ works instead. 
+# If not, we'll just define __func__ to "". 
+AC_DEFUN([AC_CPP_FUNC],
+[AC_REQUIRE([AC_PROG_CC_STDC])dnl
+AC_CACHE_CHECK([for an ANSI C99-conforming __func__], ac_cv_cpp_func,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
+[[char *foo = __func__;]])],
+  [ac_cv_cpp_func=yes], 
+  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
+[[char *foo = __FUNCTION__;]])],
+  [ac_cv_cpp_func=__FUNCTION__], 
+  [ac_cv_cpp_func=no])])])
+if test $ac_cv_cpp_func = __FUNCTION__; then
+  AC_DEFINE(__func__,__FUNCTION__,
+            [Define to __FUNCTION__ or "" if `__func__' does not conform to 
+ANSI C.])
+elif test $ac_cv_cpp_func = no; then
+  AC_DEFINE(__func__,"",
+            [Define to __FUNCTION__ or "" if `__func__' does not conform to 
+ANSI C.])
+fi
+])# AC_CPP_FUNC
+
+AC_CPP_FUNC
+
+
+dnl Some basic configuration:
+AC_DEFINE([XML_NS], 1,
+          [Define to make XML Namespaces functionality available.])
+AC_DEFINE([XML_DTD], 1,
+          [Define to make parameter entity parsing functionality available.])
+AC_DEFINE([XML_CONTEXT_BYTES], 1024,
+          [Define to specify how much context to retain around the current parse point.])
+
+AC_CONFIG_FILES(Makefile)
+AC_OUTPUT
+
+abs_srcdir="`cd $srcdir && pwd`"
+abs_builddir="`pwd`"
+if test "$abs_srcdir" != "$abs_builddir"; then
+  make mkdir-init
+fi
diff --git a/reactos/lib/3rdparty/expat/conftools/PrintPath b/reactos/lib/3rdparty/expat/conftools/PrintPath
new file mode 100644 (file)
index 0000000..869f2aa
--- /dev/null
@@ -0,0 +1,116 @@
+#!/bin/sh
+# Look for program[s] somewhere in $PATH.
+#
+# Options:
+#  -s
+#    Do not print out full pathname. (silent)
+#  -pPATHNAME
+#    Look in PATHNAME instead of $PATH
+#
+# Usage:
+#  PrintPath [-s] [-pPATHNAME] program [program ...]
+#
+# Initially written by Jim Jagielski for the Apache configuration mechanism
+#  (with kudos to Kernighan/Pike)
+#
+# This script falls under the Apache License.
+# See http://www.apache.org/licenses/LICENSE
+
+##
+# Some "constants"
+##
+pathname=$PATH
+echo="yes"
+
+##
+# Find out what OS we are running for later on
+##
+os=`(uname) 2>/dev/null`
+
+##
+# Parse command line
+##
+for args in $*
+do
+    case $args in
+       -s  ) echo="no" ;;
+       -p* ) pathname="`echo $args | sed 's/^..//'`" ;;
+       *   ) programs="$programs $args" ;;
+    esac
+done
+
+##
+# Now we make the adjustments required for OS/2 and everyone
+# else :)
+#
+# First of all, all OS/2 programs have the '.exe' extension.
+# Next, we adjust PATH (or what was given to us as PATH) to
+# be whitespace seperated directories.
+# Finally, we try to determine the best flag to use for
+# test/[] to look for an executable file. OS/2 just has '-r'
+# but with other OSs, we do some funny stuff to check to see
+# if test/[] knows about -x, which is the prefered flag.
+##
+
+if [ "x$os" = "xOS/2" ]
+then
+    ext=".exe"
+    pathname=`echo -E $pathname |
+     sed 's/^;/.;/
+         s/;;/;.;/g
+         s/;$/;./
+         s/;/ /g
+         s/\\\\/\\//g' `
+    test_exec_flag="-r"
+else
+    ext=""     # No default extensions
+    pathname=`echo $pathname |
+     sed 's/^:/.:/
+         s/::/:.:/g
+         s/:$/:./
+         s/:/ /g' `
+    # Here is how we test to see if test/[] can handle -x
+    testfile="pp.t.$$"
+
+    cat > $testfile <<ENDTEST
+#!/bin/sh
+if [ -x / ] || [ -x /bin ] || [ -x /bin/ls ]; then
+    exit 0
+fi
+exit 1
+ENDTEST
+
+    if `/bin/sh $testfile 2>/dev/null`; then
+       test_exec_flag="-x"
+    else
+       test_exec_flag="-r"
+    fi
+    rm -f $testfile
+fi
+
+for program in $programs
+do
+    for path in $pathname
+    do
+       if [ $test_exec_flag $path/${program}${ext} ] && \
+          [ ! -d $path/${program}${ext} ]; then
+           if [ "x$echo" = "xyes" ]; then
+               echo $path/${program}${ext}
+           fi
+           exit 0
+       fi
+
+# Next try without extension (if one was used above)
+       if [ "x$ext" != "x" ]; then
+            if [ $test_exec_flag $path/${program} ] && \
+               [ ! -d $path/${program} ]; then
+                if [ "x$echo" = "xyes" ]; then
+                    echo $path/${program}
+                fi
+                exit 0
+            fi
+        fi
+    done
+done
+exit 1
+
diff --git a/reactos/lib/3rdparty/expat/conftools/ac_c_bigendian_cross.m4 b/reactos/lib/3rdparty/expat/conftools/ac_c_bigendian_cross.m4
new file mode 100644 (file)
index 0000000..8ed3edb
--- /dev/null
@@ -0,0 +1,81 @@
+dnl @synopsis AC_C_BIGENDIAN_CROSS
+dnl
+dnl Check endianess even when crosscompiling
+dnl (partially based on the original AC_C_BIGENDIAN).
+dnl
+dnl The implementation will create a binary, and instead of running
+dnl the binary it will be grep'ed for some symbols that will look
+dnl different for different endianess of the binary.
+dnl
+dnl @version $Id: ac_c_bigendian_cross.m4,v 1.2 2001/10/01 20:03:13 fdrake Exp $
+dnl @author Guido Draheim <guidod@gmx.de>
+dnl
+AC_DEFUN([AC_C_BIGENDIAN_CROSS],
+[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian,
+[ac_cv_c_bigendian=unknown
+# See if sys/param.h defines the BYTE_ORDER macro.
+AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/param.h>], [
+#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+ bogus endian macros
+#endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
+AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/param.h>], [
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)])
+if test $ac_cv_c_bigendian = unknown; then
+AC_TRY_RUN([main () {
+  /* Are we little or big endian?  From Harbison&Steele.  */
+  union
+  {
+    long l;
+    char c[sizeof (long)];
+  } u;
+  u.l = 1;
+  exit (u.c[sizeof (long) - 1] == 1);
+}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes,
+[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ])
+fi])
+if test $ac_cv_c_bigendian = unknown; then
+AC_MSG_CHECKING(to probe for byte ordering)
+[
+cat >conftest.c <<EOF
+short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; }
+short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; }
+int main() { _ascii (); _ebcdic (); return 0; }
+EOF
+] if test -f conftest.c ; then
+     if ${CC-cc} -c conftest.c -o conftest.o && test -f conftest.o ; then
+        if test `grep -l BIGenDianSyS conftest.o` ; then
+           echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG
+           ac_cv_c_bigendian=yes
+        fi
+        if test `grep -l LiTTleEnDian conftest.o` ; then
+           echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG
+           if test $ac_cv_c_bigendian = yes ; then
+            ac_cv_c_bigendian=unknown;
+           else
+            ac_cv_c_bigendian=no
+           fi
+        fi
+        echo $ac_n 'guessing bigendian ...  ' >&AC_FD_MSG
+     fi
+  fi
+AC_MSG_RESULT($ac_cv_c_bigendian)
+fi
+if test $ac_cv_c_bigendian = yes; then
+  AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian])
+  BYTEORDER=4321
+else
+  BYTEORDER=1234
+fi
+AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN])
+if test $ac_cv_c_bigendian = unknown; then
+  AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian)
+fi
+])
diff --git a/reactos/lib/3rdparty/expat/conftools/config.guess b/reactos/lib/3rdparty/expat/conftools/config.guess
new file mode 100644 (file)
index 0000000..6cfac28
--- /dev/null
@@ -0,0 +1,1344 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002 Free Software Foundation, Inc.
+
+timestamp='2002-03-20'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+#####################################################################
+# This file contains changes for Apache, clearly marked below.
+# These changes are hereby donated to the public domain.
+#####################################################################
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+       for c in cc gcc c89 c99 ; do
+         ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+         if test $? = 0 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       rm -f $dummy.c $dummy.o $dummy.rel ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep __ELF__ >/dev/null
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit 0 ;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    macppc:OpenBSD:*:*)
+       echo powerpc-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvmeppc:OpenBSD:*:*)
+       echo powerpc-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mipseb-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       cat <<EOF >$dummy.s
+       .data
+\$Lformat:
+       .byte 37,100,45,37,120,10,0     # "%d-%x\n"
+
+       .text
+       .globl main
+       .align 4
+       .ent main
+main:
+       .frame \$30,16,\$26,0
+       ldgp \$29,0(\$27)
+       .prologue 1
+       .long 0x47e03d80 # implver \$0
+       lda \$2,-1
+       .long 0x47e20c21 # amask \$2,\$1
+       lda \$16,\$Lformat
+       mov \$0,\$17
+       not \$1,\$18
+       jsr \$26,printf
+       ldgp \$29,0(\$26)
+       mov 0,\$16
+       jsr \$26,exit
+       .end main
+EOF
+       eval $set_cc_for_build
+       $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+       if test "$?" = 0 ; then
+               case `./$dummy` in
+                       0-0)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       1-0)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       1-1)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       1-101)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       2-303)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+                       2-307)
+                               UNAME_MACHINE="alphaev67"
+                               ;;
+                       2-1307)
+                               UNAME_MACHINE="alphaev68"
+                               ;;
+               esac
+       fi
+       rm -f $dummy.s $dummy
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit 0;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit 0 ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit 0 ;;
+#########################
+# Apache changes
+#
+#   *:OS/390:*:*)
+#      echo i370-ibm-openedition
+#      exit 0 ;;
+    *:OS390:*:* | *:OS/390:*:*)
+       echo s390-ibm-os390
+       exit 0 ;; 
+    *:OS400:*:* | *:OS/400:*:*) 
+       echo as400-ibm-os400
+       exit 0 ;;
+    *:OS/2:*:*)
+       echo "i386-pc-os2_emx"
+       exit 0;;
+#
+# end Apache changes
+#########################
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit 0 ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD $dummy.c -o $dummy \
+         && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm -f $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               eval $set_cc_for_build
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+               rm -f $dummy.c $dummy
+               echo rs6000-ibm-aix3.2.5
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit 0 ;;
+    *:AIX:*:[45])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if [ -x /usr/bin/getconf ]; then
+                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                         '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+               fi
+               if [ "${HP_ARCH}" = "" ]; then
+                   eval $set_cc_for_build
+                   sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits)
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+                   (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy`
+                   if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+                   rm -f $dummy.c $dummy
+               fi ;;
+       esac
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3D:*:*:*)
+       echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit 0 ;;
+    x86:Interix*:3*)
+       echo i386-pc-interix3
+       exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i386-pc-interix
+       exit 0 ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit 0 ;;
+    arm*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    mips:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef mips
+       #undef mipsel
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=mipsel
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=mips
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+       rm -f $dummy.c
+       test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0
+       ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit 0 ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit 0 ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+       objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit 0 ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    x86_64:Linux:*:*)
+       echo x86_64-unknown-linux-gnu
+       exit 0 ;;
+    i*86:Linux:*:*)
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us. cd to the root directory to prevent
+       # problems with other programs or directories called `ld' in the path.
+       # Set LC_ALL=C to ensure ld outputs messages in English.
+       ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+                        | sed -ne '/supported targets:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported targets: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_targets" in
+         elf32-i386)
+               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+               ;;
+         a.out-i386-linux)
+               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+               exit 0 ;;               
+         coff-i386)
+               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+               exit 0 ;;
+         "")
+               # Either a pre-BFD a.out linker (linux-gnuoldld) or
+               # one that does not give us useful --help.
+               echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+               exit 0 ;;
+       esac
+       # Determine whether the default compiler is a.out or elf
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <features.h>
+       #ifdef __ELF__
+       # ifdef __GLIBC__
+       #  if __GLIBC__ >= 2
+       LIBC=gnu
+       #  else
+       LIBC=gnulibc1
+       #  endif
+       # else
+       LIBC=gnulibc1
+       # endif
+       #else
+       #ifdef __INTEL_COMPILER
+       LIBC=gnu
+       #else
+       LIBC=gnuaout
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+       rm -f $dummy.c
+       test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+       test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+       ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+       fi
+       exit 0 ;;
+    i*86:*:5:[78]*)
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+       exit 0 ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit 0 ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+       echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit 0 ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit 0 ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit 0 ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Darwin:*:*)
+       echo `uname -p`-apple-darwin${UNAME_RELEASE}
+       exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       UNAME_PROCESSOR=`uname -p`
+       if test "$UNAME_PROCESSOR" = "x86"; then
+               UNAME_PROCESSOR=i386
+               UNAME_MACHINE=pc
+       fi
+       echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+       exit 0 ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit 0 ;;
+    NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit 0 ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit 0 ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit 0 ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit 0 ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo ${UNAME_MACHINE}-pc-os2-emx
+       exit 0 ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit 0 ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit 0 ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit 0 ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit 0 ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit 0 ;;
+    i*86:atheos:*:*)
+       echo ${UNAME_MACHINE}-unknown-atheos
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/reactos/lib/3rdparty/expat/conftools/config.sub b/reactos/lib/3rdparty/expat/conftools/config.sub
new file mode 100644 (file)
index 0000000..043d45b
--- /dev/null
@@ -0,0 +1,1507 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002 Free Software Foundation, Inc.
+
+timestamp='2002-03-07'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+#####################################################################
+# This file contains changes for Apache, clearly marked below.
+# These changes are hereby donated to the public domain.
+#####################################################################
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit 0;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+########################
+# changes for Apache
+#
+  tpf | os390 | vmcms)
+    os=-$maybe_os
+    basic_machine=s390;
+    ;;
+  os400)
+    os=-$maybe_os
+    basic_machine=as400;
+    ;;
+  mvs)
+    os=-mvs
+    basic_machine=i370;
+    ;;
+#
+# end Apache changes
+########################
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis)
+               os=
+               basic_machine=$1
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+       | c4x | clipper \
+       | d10v | d30v | dsp16xx \
+       | fr30 \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | i370 | i860 | i960 | ia64 \
+       | m32r | m68000 | m68k | m88k | mcore \
+       | mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
+       | mips64vr4100 | mips64vr4100el | mips64vr4300 \
+       | mips64vr4300el | mips64vr5000 | mips64vr5000el \
+       | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
+       | mipsisa32 | mipsisa64 \
+       | mn10200 | mn10300 \
+       | ns16k | ns32k \
+       | openrisc | or32 \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | pyramid \
+       | sh | sh[34] | sh[34]eb | shbe | shle | sh64 \
+       | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
+       | strongarm \
+       | tahoe | thumb | tic80 | tron \
+       | v850 | v850e \
+       | we32k \
+       | x86 | xscale | xstormy16 | xtensa \
+       | z8k)
+               basic_machine=$basic_machine-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12)
+               # Motorola 68HC11/12.
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armv*-* \
+       | avr-* \
+       | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c54x-* \
+       | clipper-* | cydra-* \
+       | d10v-* | d30v-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fr30-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | m32r-* \
+       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | mcore-* \
+       | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
+       | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
+       | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | pyramid-* \
+       | romp-* | rs6000-* \
+       | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \
+       | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+       | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+       | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
+       | v850-* | v850e-* | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+       | xtensa-* \
+       | ymp-* \
+       | z8k-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       c90)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | j90)
+               basic_machine=j90-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       decsystem10* | dec10*)
+               basic_machine=pdp10-dec
+               os=-tops10
+               ;;
+       decsystem20* | dec20*)
+               basic_machine=pdp10-dec
+               os=-tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       mmix*)
+               basic_machine=mmix-knuth
+               os=-mmixware
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       or32 | or32-*)
+               basic_machine=or32-unknown
+               os=-coff
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+        pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i686-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       s390 | s390-*)
+               basic_machine=s390-ibm
+               ;;
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+########################
+# changes for Apache
+#
+       as400*)
+               basic_machine=as400-ibm
+               ;;
+# 
+# end Apache changes
+########################
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sparclite-wrs | simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+        sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3d)
+               basic_machine=alpha-cray
+               os=-unicos
+               ;;
+       t3e)
+               basic_machine=alphaev5-cray
+               os=-unicos
+               ;;
+       t90)
+               basic_machine=t90-cray
+               os=-unicos
+               ;;
+       tic54x | c54x*)
+               basic_machine=tic54x-unknown
+               os=-coff
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       windows32)
+               basic_machine=i386-pc
+               os=-windows32-msvcrt
+               ;;
+        xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh3 | sh4 | sh3eb | sh4eb)
+               basic_machine=sh-unknown
+               ;;
+       sh64)
+               basic_machine=sh64-unknown
+               ;;
+       sparc | sparcv9 | sparcv9b)
+               basic_machine=sparc-sun
+               ;;
+        cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       c4x*)
+               basic_machine=c4x-none
+               os=-coff
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+########################
+# changes for Apache
+#
+       -os2_emx | -tpf* | -os390* | -vmcms* | -os400* )
+               ;;
+#
+# end Apache changes
+########################
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+             | -morphos* | -superux* | -rtmk* | -rtmk-nova*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto*)
+               os=-nto-qnx
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -nova*)
+               os=-rtmk-nova
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=-tops20
+               ;;
+        pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       or32-*)
+               os=-coff
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+########################
+# changes for Apache
+#
+#      *-ibm)
+#              os=-aix
+#              ;;
+#
+       *-ibm)
+               case $basic_machine in
+                       s390*)
+                               os=-os390;
+                               ;;
+                       i370*)
+                               os=-mvs;
+                               ;;
+                       as400*)
+                               os=-os400;
+                               ;;
+                       *)
+                               os=-aix
+                               ;;
+               esac
+                ;;
+# 
+# end Apache changes
+########################
+
+       *-wec)
+               os=-proelf
+               ;;
+       *-winbond)
+               os=-proelf
+               ;;
+       *-oki)
+               os=-proelf
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+        *-gould)
+               os=-sysv
+               ;;
+        *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+        *-sgi)
+               os=-irix
+               ;;
+        *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=-uxpv
+               ;;
+       *-rom68k)
+               os=-coff
+               ;;
+       *-*bug)
+               os=-coff
+               ;;
+       *-apple)
+               os=-macos
+               ;;
+       *-atari*)
+               os=-mint
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -beos*)
+                               vendor=be
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/reactos/lib/3rdparty/expat/conftools/expat.m4 b/reactos/lib/3rdparty/expat/conftools/expat.m4
new file mode 100644 (file)
index 0000000..e5d4871
--- /dev/null
@@ -0,0 +1,43 @@
+dnl Check if --with-expat[=PREFIX] is specified and
+dnl Expat >= 1.95.0 is installed in the system.
+dnl If yes, substitute EXPAT_CFLAGS, EXPAT_LIBS with regard to
+dnl the specified PREFIX and set with_expat to PREFIX, or 'yes' if PREFIX
+dnl has not been specified. Also HAVE_LIBEXPAT, HAVE_EXPAT_H are defined.
+dnl If --with-expat has not been specified, set with_expat to 'no'.
+dnl In addition, an Automake conditional EXPAT_INSTALLED is set accordingly.
+dnl This is necessary to adapt a whole lot of packages that have expat
+dnl bundled as a static library.
+AC_DEFUN(AM_WITH_EXPAT,
+[ AC_ARG_WITH(expat,
+             [  --with-expat=PREFIX     Use system Expat library],
+             , with_expat=no)
+
+  AM_CONDITIONAL(EXPAT_INSTALLED, test $with_expat != no)
+
+  EXPAT_CFLAGS=
+  EXPAT_LIBS=
+  if test $with_expat != no; then
+       if test $with_expat != yes; then
+               EXPAT_CFLAGS="-I$with_expat/include"
+               EXPAT_LIBS="-L$with_expat/lib"
+       fi
+       AC_CHECK_LIB(expat, XML_ParserCreate,
+                    [ EXPAT_LIBS="$EXPAT_LIBS -lexpat"
+                      expat_found=yes ],
+                    [ expat_found=no ],
+                    "$EXPAT_LIBS")
+       if test $expat_found = no; then
+               AC_MSG_ERROR([Could not find the Expat library])
+       fi
+       expat_save_CFLAGS="$CFLAGS"
+       CFLAGS="$CFLAGS $EXPAT_CFLAGS"
+       AC_CHECK_HEADERS(expat.h, , expat_found=no)
+       if test $expat_found = no; then
+               AC_MSG_ERROR([Could not find expat.h])
+       fi
+       CFLAGS="$expat_save_CFLAGS"
+  fi
+
+  AC_SUBST(EXPAT_CFLAGS)
+  AC_SUBST(EXPAT_LIBS)
+])
diff --git a/reactos/lib/3rdparty/expat/conftools/get-version.sh b/reactos/lib/3rdparty/expat/conftools/get-version.sh
new file mode 100644 (file)
index 0000000..a70e0fb
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/sh
+#
+# USAGE: get-version.sh path/to/expat.h
+#
+# This script will print Expat's version number on stdout. For example:
+#
+#   $ ./conftools/get-version.sh ./lib/expat.h
+#   1.95.3
+#   $
+#
+
+if test $# = 0; then
+  echo "ERROR: pathname for expat.h was not provided."
+  echo ""
+  echo "USAGE: $0 path/to/expat.h"
+  exit 1
+fi
+if test $# != 1; then
+  echo "ERROR: too many arguments were provided."
+  echo ""
+  echo "USAGE: $0 path/to/expat.h"
+  exit 1
+fi
+
+hdr="$1"
+if test ! -r "$hdr"; then
+  echo "ERROR: '$hdr' does not exist, or is not readable."
+  exit 1
+fi
+
+MAJOR_VERSION="`sed -n -e '/MAJOR_VERSION/s/[^0-9]*//gp' $hdr`"
+MINOR_VERSION="`sed -n -e '/MINOR_VERSION/s/[^0-9]*//gp' $hdr`"
+MICRO_VERSION="`sed -n -e '/MICRO_VERSION/s/[^0-9]*//gp' $hdr`"
+
+# Determine how to tell echo not to print the trailing \n. This is
+# similar to Autoconf's @ECHO_C@ and @ECHO_N@; however, we don't
+#  generate this file via autoconf (in fact, get-version.sh is used
+# to *create* ./configure), so we just do something similar inline.
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ;;
+  *)      ECHO_N= ECHO_C='\c' ;;
+esac
+
+echo $ECHO_N "$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$ECHO_C"
diff --git a/reactos/lib/3rdparty/expat/conftools/install-sh b/reactos/lib/3rdparty/expat/conftools/install-sh
new file mode 100644 (file)
index 0000000..e9de238
--- /dev/null
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+               chmodcmd=""
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/reactos/lib/3rdparty/expat/conftools/mkinstalldirs b/reactos/lib/3rdparty/expat/conftools/mkinstalldirs
new file mode 100644 (file)
index 0000000..c5291db
--- /dev/null
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1 2000/09/18 16:26:21 coopercc Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+         errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/reactos/lib/3rdparty/expat/doc/expat.png b/reactos/lib/3rdparty/expat/doc/expat.png
new file mode 100644 (file)
index 0000000..c41a7e6
Binary files /dev/null and b/reactos/lib/3rdparty/expat/doc/expat.png differ
diff --git a/reactos/lib/3rdparty/expat/doc/reference.html b/reactos/lib/3rdparty/expat/doc/reference.html
new file mode 100644 (file)
index 0000000..e812c7d
--- /dev/null
@@ -0,0 +1,2334 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+<!-- Copyright 1999,2000 Clark Cooper <coopercc@netheaven.com>
+     All rights reserved.
+     This is free software. You may distribute or modify according to
+     the terms of the MIT/X License -->
+  <title>Expat XML Parser</title>
+  <meta name="author" content="Clark Cooper, coopercc@netheaven.com" />
+  <meta http-equiv="Content-Style-Type" content="text/css" />
+  <link href="style.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+  <table cellspacing="0" cellpadding="0" width="100%">
+    <tr>
+      <td class="corner"><img src="expat.png" alt="(Expat logo)" /></td>
+      <td class="banner"><h1>The Expat XML Parser</h1></td>
+    </tr>
+    <tr>
+      <td class="releaseno">Release 2.0.0</td>
+      <td></td>
+    </tr>
+  </table>
+<div class="content">
+
+<p>Expat is a library, written in C, for parsing XML documents. It's
+the underlying XML parser for the open source Mozilla project, Perl's
+<code>XML::Parser</code>, Python's <code>xml.parsers.expat</code>, and
+other open-source XML parsers.</p>
+
+<p>This library is the creation of James Clark, who's also given us
+groff (an nroff look-alike), Jade (an implemention of ISO's DSSSL
+stylesheet language for SGML), XP (a Java XML parser package), XT (a
+Java XSL engine).  James was also the technical lead on the XML
+Working Group at W3C that produced the XML specification.</p>
+
+<p>This is free software, licensed under the <a
+href="../COPYING">MIT/X Consortium license</a>. You may download it
+from <a href="http://www.libexpat.org/">the Expat home page</a>.
+</p>
+
+<p>The bulk of this document was originally commissioned as an article
+by <a href="http://www.xml.com/">XML.com</a>. They graciously allowed
+Clark Cooper to retain copyright and to distribute it with Expat.
+This version has been substantially extended to include documentation
+on features which have been added since the original article was
+published, and additional information on using the original
+interface.</p>
+
+<hr />
+<h2>Table of Contents</h2>
+<ul>
+  <li><a href="#overview">Overview</a></li>
+  <li><a href="#building">Building and Installing</a></li>
+  <li><a href="#using">Using Expat</a></li>
+  <li><a href="#reference">Reference</a>
+  <ul>
+    <li><a href="#creation">Parser Creation Functions</a>
+    <ul>
+      <li><a href="#XML_ParserCreate">XML_ParserCreate</a></li>
+      <li><a href="#XML_ParserCreateNS">XML_ParserCreateNS</a></li>
+      <li><a href="#XML_ParserCreate_MM">XML_ParserCreate_MM</a></li>
+      <li><a href="#XML_ExternalEntityParserCreate">XML_ExternalEntityParserCreate</a></li>
+      <li><a href="#XML_ParserFree">XML_ParserFree</a></li>
+      <li><a href="#XML_ParserReset">XML_ParserReset</a></li>
+    </ul>
+    </li>
+    <li><a href="#parsing">Parsing Functions</a>
+    <ul>
+      <li><a href="#XML_Parse">XML_Parse</a></li>
+      <li><a href="#XML_ParseBuffer">XML_ParseBuffer</a></li>
+      <li><a href="#XML_GetBuffer">XML_GetBuffer</a></li>
+      <li><a href="#XML_StopParser">XML_StopParser</a></li>
+      <li><a href="#XML_ResumeParser">XML_ResumeParser</a></li>
+      <li><a href="#XML_GetParsingStatus">XML_GetParsingStatus</a></li>
+    </ul>
+    </li>
+    <li><a href="#setting">Handler Setting Functions</a>
+    <ul>
+      <li><a href="#XML_SetStartElementHandler">XML_SetStartElementHandler</a></li>
+      <li><a href="#XML_SetEndElementHandler">XML_SetEndElementHandler</a></li>
+      <li><a href="#XML_SetElementHandler">XML_SetElementHandler</a></li>
+      <li><a href="#XML_SetCharacterDataHandler">XML_SetCharacterDataHandler</a></li>
+      <li><a href="#XML_SetProcessingInstructionHandler">XML_SetProcessingInstructionHandler</a></li>
+      <li><a href="#XML_SetCommentHandler">XML_SetCommentHandler</a></li>
+      <li><a href="#XML_SetStartCdataSectionHandler">XML_SetStartCdataSectionHandler</a></li>
+      <li><a href="#XML_SetEndCdataSectionHandler">XML_SetEndCdataSectionHandler</a></li>
+      <li><a href="#XML_SetCdataSectionHandler">XML_SetCdataSectionHandler</a></li>
+      <li><a href="#XML_SetDefaultHandler">XML_SetDefaultHandler</a></li>
+      <li><a href="#XML_SetDefaultHandlerExpand">XML_SetDefaultHandlerExpand</a></li>
+      <li><a href="#XML_SetExternalEntityRefHandler">XML_SetExternalEntityRefHandler</a></li>
+      <li><a href="#XML_SetExternalEntityRefHandlerArg">XML_SetExternalEntityRefHandlerArg</a></li>
+      <li><a href="#XML_SetSkippedEntityHandler">XML_SetSkippedEntityHandler</a></li>
+      <li><a href="#XML_SetUnknownEncodingHandler">XML_SetUnknownEncodingHandler</a></li>
+      <li><a href="#XML_SetStartNamespaceDeclHandler">XML_SetStartNamespaceDeclHandler</a></li>
+      <li><a href="#XML_SetEndNamespaceDeclHandler">XML_SetEndNamespaceDeclHandler</a></li>
+      <li><a href="#XML_SetNamespaceDeclHandler">XML_SetNamespaceDeclHandler</a></li>
+      <li><a href="#XML_SetXmlDeclHandler">XML_SetXmlDeclHandler</a></li>                
+      <li><a href="#XML_SetStartDoctypeDeclHandler">XML_SetStartDoctypeDeclHandler</a></li>
+      <li><a href="#XML_SetEndDoctypeDeclHandler">XML_SetEndDoctypeDeclHandler</a></li>
+      <li><a href="#XML_SetDoctypeDeclHandler">XML_SetDoctypeDeclHandler</a></li>
+      <li><a href="#XML_SetElementDeclHandler">XML_SetElementDeclHandler</a></li>
+      <li><a href="#XML_SetAttlistDeclHandler">XML_SetAttlistDeclHandler</a></li>
+      <li><a href="#XML_SetEntityDeclHandler">XML_SetEntityDeclHandler</a></li>
+      <li><a href="#XML_SetUnparsedEntityDeclHandler">XML_SetUnparsedEntityDeclHandler</a></li>
+      <li><a href="#XML_SetNotationDeclHandler">XML_SetNotationDeclHandler</a></li>
+      <li><a href="#XML_SetNotStandaloneHandler">XML_SetNotStandaloneHandler</a></li>
+    </ul>
+    </li>
+    <li><a href="#position">Parse Position and Error Reporting Functions</a>
+    <ul>
+      <li><a href="#XML_GetErrorCode">XML_GetErrorCode</a></li>
+      <li><a href="#XML_ErrorString">XML_ErrorString</a></li>
+      <li><a href="#XML_GetCurrentByteIndex">XML_GetCurrentByteIndex</a></li>
+      <li><a href="#XML_GetCurrentLineNumber">XML_GetCurrentLineNumber</a></li>
+      <li><a href="#XML_GetCurrentColumnNumber">XML_GetCurrentColumnNumber</a></li>
+      <li><a href="#XML_GetCurrentByteCount">XML_GetCurrentByteCount</a></li>
+      <li><a href="#XML_GetInputContext">XML_GetInputContext</a></li>
+    </ul>
+    </li>
+    <li><a href="#miscellaneous">Miscellaneous Functions</a>
+    <ul>
+      <li><a href="#XML_SetUserData">XML_SetUserData</a></li>
+      <li><a href="#XML_GetUserData">XML_GetUserData</a></li>
+      <li><a href="#XML_UseParserAsHandlerArg">XML_UseParserAsHandlerArg</a></li>
+      <li><a href="#XML_SetBase">XML_SetBase</a></li>
+      <li><a href="#XML_GetBase">XML_GetBase</a></li>
+      <li><a href="#XML_GetSpecifiedAttributeCount">XML_GetSpecifiedAttributeCount</a></li>
+      <li><a href="#XML_GetIdAttributeIndex">XML_GetIdAttributeIndex</a></li>
+      <li><a href="#XML_SetEncoding">XML_SetEncoding</a></li>
+      <li><a href="#XML_SetParamEntityParsing">XML_SetParamEntityParsing</a></li>
+      <li><a href="#XML_UseForeignDTD">XML_UseForeignDTD</a></li>
+      <li><a href="#XML_SetReturnNSTriplet">XML_SetReturnNSTriplet</a></li>
+      <li><a href="#XML_DefaultCurrent">XML_DefaultCurrent</a></li>
+      <li><a href="#XML_ExpatVersion">XML_ExpatVersion</a></li>
+      <li><a href="#XML_ExpatVersionInfo">XML_ExpatVersionInfo</a></li>
+      <li><a href="#XML_GetFeatureList">XML_GetFeatureList</a></li>
+      <li><a href="#XML_FreeContentModel">XML_FreeContentModel</a></li>
+      <li><a href="#XML_MemMalloc">XML_MemMalloc</a></li>
+      <li><a href="#XML_MemRealloc">XML_MemRealloc</a></li>
+      <li><a href="#XML_MemFree">XML_MemFree</a></li>
+    </ul>
+    </li>
+  </ul>  
+  </li>
+</ul>
+
+<hr />
+<h2><a name="overview">Overview</a></h2>
+
+<p>Expat is a stream-oriented parser. You register callback (or
+handler) functions with the parser and then start feeding it the
+document.  As the parser recognizes parts of the document, it will
+call the appropriate handler for that part (if you've registered one.) 
+The document is fed to the parser in pieces, so you can start parsing
+before you have all the document. This also allows you to parse really
+huge documents that won't fit into memory.</p>
+
+<p>Expat can be intimidating due to the many kinds of handlers and
+options you can set. But you only need to learn four functions in
+order to do 90% of what you'll want to do with it:</p>
+
+<dl>
+
+<dt><code><a href= "#XML_ParserCreate"
+             >XML_ParserCreate</a></code></dt>
+  <dd>Create a new parser object.</dd>
+
+<dt><code><a href= "#XML_SetElementHandler"
+             >XML_SetElementHandler</a></code></dt>
+  <dd>Set handlers for start and end tags.</dd>
+
+<dt><code><a href= "#XML_SetCharacterDataHandler"
+             >XML_SetCharacterDataHandler</a></code></dt>
+  <dd>Set handler for text.</dd>
+
+<dt><code><a href= "#XML_Parse"
+             >XML_Parse</a></code></dt>
+  <dd>Pass a buffer full of document to the parser</dd>
+</dl>
+
+<p>These functions and others are described in the <a
+href="#reference">reference</a> part of this document. The reference
+section also describes in detail the parameters passed to the
+different types of handlers.</p>
+
+<p>Let's look at a very simple example program that only uses 3 of the
+above functions (it doesn't need to set a character handler.) The
+program <a href="../examples/outline.c">outline.c</a> prints an
+element outline, indenting child elements to distinguish them from the
+parent element that contains them. The start handler does all the
+work.  It prints two indenting spaces for every level of ancestor
+elements, then it prints the element and attribute
+information. Finally it increments the global <code>Depth</code>
+variable.</p>
+
+<pre class="eg">
+int Depth;
+
+void XMLCALL
+start(void *data, const char *el, const char **attr) {
+  int i;
+
+  for (i = 0; i &lt; Depth; i++)
+    printf("  ");
+
+  printf("%s", el);
+
+  for (i = 0; attr[i]; i += 2) {
+    printf(" %s='%s'", attr[i], attr[i + 1]);
+  }
+
+  printf("\n");
+  Depth++;
+}  /* End of start handler */
+</pre>
+
+<p>The end tag simply does the bookkeeping work of decrementing
+<code>Depth</code>.</p>
+<pre class="eg">
+void XMLCALL
+end(void *data, const char *el) {
+  Depth--;
+}  /* End of end handler */
+</pre>
+
+<p>Note the <code>XMLCALL</code> annotation used for the callbacks.
+This is used to ensure that the Expat and the callbacks are using the
+same calling convention in case the compiler options used for Expat
+itself and the client code are different.  Expat tries not to care
+what the default calling convention is, though it may require that it
+be compiled with a default convention of "cdecl" on some platforms.
+For code which uses Expat, however, the calling convention is
+specified by the <code>XMLCALL</code> annotation on most platforms;
+callbacks should be defined using this annotation.</p>
+
+<p>The <code>XMLCALL</code> annotation was added in Expat 1.95.7, but
+existing working Expat applications don't need to add it (since they
+are already using the "cdecl" calling convention, or they wouldn't be
+working).  The annotation is only needed if the default calling
+convention may be something other than "cdecl".  To use the annotation
+safely with older versions of Expat, you can conditionally define it
+<em>after</em> including Expat's header file:</p>
+
+<pre class="eg">
+#include &lt;expat.h&gt;
+
+#ifndef XMLCALL
+#if defined(_MSC_EXTENSIONS) &amp;&amp; !defined(__BEOS__) &amp;&amp; !defined(__CYGWIN__)
+#define XMLCALL __cdecl
+#elif defined(__GNUC__)
+#define XMLCALL __attribute__((cdecl))
+#else
+#define XMLCALL
+#endif
+#endif
+</pre>
+
+<p>After creating the parser, the main program just has the job of
+shoveling the document to the parser so that it can do its work.</p>
+
+<hr />
+<h2><a name="building">Building and Installing Expat</a></h2>
+
+<p>The Expat distribution comes as a compressed (with GNU gzip) tar
+file.  You may download the latest version from <a href=
+"http://sourceforge.net/projects/expat/" >Source Forge</a>.  After
+unpacking this, cd into the directory. Then follow either the Win32
+directions or Unix directions below.</p>
+
+<h3>Building under Win32</h3>
+
+<p>If you're using the GNU compiler under cygwin, follow the Unix
+directions in the next section. Otherwise if you have Microsoft's
+Developer Studio installed, then from Windows Explorer double-click on
+"expat.dsp" in the lib directory and build and install in the usual
+manner.</p>
+
+<p>Alternatively, you may download the Win32 binary package that
+contains the "expat.h" include file and a pre-built DLL.</p>
+
+<h3>Building under Unix (or GNU)</h3>
+
+<p>First you'll need to run the configure shell script in order to
+configure the Makefiles and headers for your system.</p>
+
+<p>If you're happy with all the defaults that configure picks for you,
+and you have permission on your system to install into /usr/local, you
+can install Expat with this sequence of commands:</p>
+
+<pre class="eg">
+./configure
+make
+make install
+</pre>
+
+<p>There are some options that you can provide to this script, but the
+only one we'll mention here is the <code>--prefix</code> option. You
+can find out all the options available by running configure with just
+the <code>--help</code> option.</p>
+
+<p>By default, the configure script sets things up so that the library
+gets installed in <code>/usr/local/lib</code> and the associated
+header file in <code>/usr/local/include</code>.  But if you were to
+give the option, <code>--prefix=/home/me/mystuff</code>, then the
+library and header would get installed in
+<code>/home/me/mystuff/lib</code> and
+<code>/home/me/mystuff/include</code> respectively.</p>
+
+<h3>Configuring Expat Using the Pre-Processor</h3>
+
+<p>Expat's feature set can be configured using a small number of
+pre-processor definitions.  The definition of this symbols does not
+affect the set of entry points for Expat, only the behavior of the API
+and the definition of character types in the case of
+<code>XML_UNICODE_WCHAR_T</code>.  The symbols are:</p>
+
+<dl class="cpp-symbols">
+<dt>XML_DTD</dt>
+<dd>Include support for using and reporting DTD-based content.  If
+this is defined, default attribute values from an external DTD subset
+are reported and attribute value normalization occurs based on the
+type of attributes defined in the external subset.  Without
+this, Expat has a smaller memory footprint and can be faster, but will
+not load external entities or process conditional sections.  This does
+not affect the set of functions available in the API.</dd>
+
+<dt>XML_NS</dt>
+<dd>When defined, support for the <cite><a href=
+"http://www.w3.org/TR/REC-xml-names/" >Namespaces in XML</a></cite>
+specification is included.</dd>
+
+<dt>XML_UNICODE</dt>
+<dd>When defined, character data reported to the application is
+encoded in UTF-16 using wide characters of the type
+<code>XML_Char</code>.  This is implied if
+<code>XML_UNICODE_WCHAR_T</code> is defined.</dd>
+
+<dt>XML_UNICODE_WCHAR_T</dt>
+<dd>If defined, causes the <code>XML_Char</code> character type to be
+defined using the <code>wchar_t</code> type; otherwise, <code>unsigned
+short</code> is used.  Defining this implies
+<code>XML_UNICODE</code>.</dd>
+
+<dt>XML_LARGE_SIZE</dt>
+<dd>If defined, causes the <code>XML_Size</code> and <code>XML_Index</code>
+integer types to be at least 64 bits in size. This is intended to support
+processing of very large input streams, where the return values of
+<code><a href="#XML_GetCurrentByteIndex" >XML_GetCurrentByteIndex</a></code>,
+<code><a href="#XML_GetCurrentLineNumber" >XML_GetCurrentLineNumber</a></code> and
+<code><a href="#XML_GetCurrentColumnNumber" >XML_GetCurrentColumnNumber</a></code>
+could overflow. It may not be supported by all compilers, and is turned
+off by default.</dd>
+
+<dt>XML_CONTEXT_BYTES</dt>
+<dd>The number of input bytes of markup context which the parser will
+ensure are available for reporting via <code><a href=
+"#XML_GetInputContext" >XML_GetInputContext</a></code>.  This is
+normally set to 1024, and must be set to a positive interger.  If this
+is not defined, the input context will not be available and <code><a
+href= "#XML_GetInputContext" >XML_GetInputContext</a></code> will
+always report NULL.  Without this, Expat has a smaller memory
+footprint and can be faster.</dd>
+
+<dt>XML_STATIC</dt>
+<dd>On Windows, this should be set if Expat is going to be linked
+statically with the code that calls it; this is required to get all
+the right MSVC magic annotations correct.  This is ignored on other
+platforms.</dd>
+</dl>
+
+<hr />
+<h2><a name="using">Using Expat</a></h2>
+
+<h3>Compiling and Linking Against Expat</h3>
+
+<p>Unless you installed Expat in a location not expected by your
+compiler and linker, all you have to do to use Expat in your programs
+is to include the Expat header (<code>#include &lt;expat.h&gt;</code>)
+in your files that make calls to it and to tell the linker that it
+needs to link against the Expat library.  On Unix systems, this would
+usually be done with the <code>-lexpat</code> argument.  Otherwise,
+you'll need to tell the compiler where to look for the Expat header
+and the linker where to find the Expat library.  You may also need to
+take steps to tell the operating system where to find this libary at
+run time.</p>
+
+<p>On a Unix-based system, here's what a Makefile might look like when
+Expat is installed in a standard location:</p>
+
+<pre class="eg">
+CC=cc
+LDFLAGS=
+LIBS= -lexpat
+xmlapp: xmlapp.o
+        $(CC) $(LDFLAGS) -o xmlapp xmlapp.o $(LIBS)
+</pre>
+
+<p>If you installed Expat in, say, <code>/home/me/mystuff</code>, then
+the Makefile would look like this:</p>
+
+<pre class="eg">
+CC=cc
+CFLAGS= -I/home/me/mystuff/include
+LDFLAGS=
+LIBS= -L/home/me/mystuff/lib -lexpat
+xmlapp: xmlapp.o
+        $(CC) $(LDFLAGS) -o xmlapp xmlapp.o $(LIBS)
+</pre>
+
+<p>You'd also have to set the environment variable
+<code>LD_LIBRARY_PATH</code> to <code>/home/me/mystuff/lib</code> (or
+to <code>${LD_LIBRARY_PATH}:/home/me/mystuff/lib</code> if
+LD_LIBRARY_PATH already has some directories in it) in order to run
+your application.</p>
+
+<h3>Expat Basics</h3>
+
+<p>As we saw in the example in the overview, the first step in parsing
+an XML document with Expat is to create a parser object. There are <a
+href="#creation">three functions</a> in the Expat API for creating a
+parser object.  However, only two of these (<code><a href=
+"#XML_ParserCreate" >XML_ParserCreate</a></code> and <code><a href=
+"#XML_ParserCreateNS" >XML_ParserCreateNS</a></code>) can be used for
+constructing a parser for a top-level document.  The object returned
+by these functions is an opaque pointer (i.e. "expat.h" declares it as
+void *) to data with further internal structure. In order to free the
+memory associated with this object you must call <code><a href=
+"#XML_ParserFree" >XML_ParserFree</a></code>. Note that if you have
+provided any <a href="#userdata">user data</a> that gets stored in the
+parser, then your application is responsible for freeing it prior to
+calling <code>XML_ParserFree</code>.</p>
+
+<p>The objects returned by the parser creation functions are good for
+parsing only one XML document or external parsed entity. If your
+application needs to parse many XML documents, then it needs to create
+a parser object for each one. The best way to deal with this is to
+create a higher level object that contains all the default
+initialization you want for your parser objects.</p>
+
+<p>Walking through a document hierarchy with a stream oriented parser
+will require a good stack mechanism in order to keep track of current
+context.  For instance, to answer the simple question, "What element
+does this text belong to?" requires a stack, since the parser may have
+descended into other elements that are children of the current one and
+has encountered this text on the way out.</p>
+
+<p>The things you're likely to want to keep on a stack are the
+currently opened element and it's attributes. You push this
+information onto the stack in the start handler and you pop it off in
+the end handler.</p>
+
+<p>For some tasks, it is sufficient to just keep information on what
+the depth of the stack is (or would be if you had one.) The outline
+program shown above presents one example. Another such task would be
+skipping over a complete element. When you see the start tag for the
+element you want to skip, you set a skip flag and record the depth at
+which the element started.  When the end tag handler encounters the
+same depth, the skipped element has ended and the flag may be
+cleared. If you follow the convention that the root element starts at
+1, then you can use the same variable for skip flag and skip
+depth.</p>
+
+<pre class="eg">
+void
+init_info(Parseinfo *info) {
+  info->skip = 0;
+  info->depth = 1;
+  /* Other initializations here */
+}  /* End of init_info */
+
+void XMLCALL
+rawstart(void *data, const char *el, const char **attr) {
+  Parseinfo *inf = (Parseinfo *) data;
+
+  if (! inf->skip) {
+    if (should_skip(inf, el, attr)) {
+      inf->skip = inf->depth;
+    }
+    else
+      start(inf, el, attr);     /* This does rest of start handling */
+  }
+
+  inf->depth++;
+}  /* End of rawstart */
+
+void XMLCALL
+rawend(void *data, const char *el) {
+  Parseinfo *inf = (Parseinfo *) data;
+
+  inf->depth--;
+
+  if (! inf->skip)
+    end(inf, el);              /* This does rest of end handling */
+
+  if (inf->skip == inf->depth)
+    inf->skip = 0;
+}  /* End rawend */
+</pre>
+
+<p>Notice in the above example the difference in how depth is
+manipulated in the start and end handlers. The end tag handler should
+be the mirror image of the start tag handler. This is necessary to
+properly model containment. Since, in the start tag handler, we
+incremented depth <em>after</em> the main body of start tag code, then
+in the end handler, we need to manipulate it <em>before</em> the main
+body.  If we'd decided to increment it first thing in the start
+handler, then we'd have had to decrement it last thing in the end
+handler.</p>
+
+<h3 id="userdata">Communicating between handlers</h3>
+
+<p>In order to be able to pass information between different handlers
+without using globals, you'll need to define a data structure to hold
+the shared variables. You can then tell Expat (with the <code><a href=
+"#XML_SetUserData" >XML_SetUserData</a></code> function) to pass a
+pointer to this structure to the handlers.  This is the first
+argument received by most handlers.  In the <a href="#reference"
+>reference section</a>, an argument to a callback function is named
+<code>userData</code> and have type <code>void *</code> if the user
+data is passed; it will have the type <code>XML_Parser</code> if the
+parser itself is passed.  When the parser is passed, the user data may
+be retrieved using <code><a href="#XML_GetUserData"
+>XML_GetUserData</a></code>.</p>
+
+<p>One common case where multiple calls to a single handler may need
+to communicate using an application data structure is the case when
+content passed to the character data handler (set by <code><a href=
+"#XML_SetCharacterDataHandler"
+>XML_SetCharacterDataHandler</a></code>) needs to be accumulated.  A
+common first-time mistake with any of the event-oriented interfaces to
+an XML parser is to expect all the text contained in an element to be
+reported by a single call to the character data handler.  Expat, like
+many other XML parsers, reports such data as a sequence of calls;
+there's no way to know when the end of the sequence is reached until a
+different callback is made.  A buffer referenced by the user data
+structure proves both an effective and convenient place to accumulate
+character data.</p>
+
+<!-- XXX example needed here -->
+
+
+<h3>XML Version</h3>
+
+<p>Expat is an XML 1.0 parser, and as such never complains based on
+the value of the <code>version</code> pseudo-attribute in the XML
+declaration, if present.</p>
+
+<p>If an application needs to check the version number (to support
+alternate processing), it should use the <code><a href=
+"#XML_SetXmlDeclHandler" >XML_SetXmlDeclHandler</a></code> function to
+set a handler that uses the information in the XML declaration to
+determine what to do.  This example shows how to check that only a
+version number of <code>"1.0"</code> is accepted:</p>
+
+<pre class="eg">
+static int wrong_version;
+static XML_Parser parser;
+
+static void XMLCALL
+xmldecl_handler(void            *userData,
+                const XML_Char  *version,
+                const XML_Char  *encoding,
+                int              standalone)
+{
+  static const XML_Char Version_1_0[] = {'1', '.', '0', 0};
+
+  int i;
+
+  for (i = 0; i &lt; (sizeof(Version_1_0) / sizeof(Version_1_0[0])); ++i) {
+    if (version[i] != Version_1_0[i]) {
+      wrong_version = 1;
+      /* also clear all other handlers: */
+      XML_SetCharacterDataHandler(parser, NULL);
+      ...
+      return;
+    }
+  }
+  ...
+}
+</pre>
+
+<h3>Namespace Processing</h3>
+
+<p>When the parser is created using the <code><a href=
+"#XML_ParserCreateNS" >XML_ParserCreateNS</a></code>, function, Expat
+performs namespace processing. Under namespace processing, Expat
+consumes <code>xmlns</code> and <code>xmlns:...</code> attributes,
+which declare namespaces for the scope of the element in which they
+occur. This means that your start handler will not see these
+attributes.  Your application can still be informed of these
+declarations by setting namespace declaration handlers with <a href=
+"#XML_SetNamespaceDeclHandler"
+><code>XML_SetNamespaceDeclHandler</code></a>.</p>
+
+<p>Element type and attribute names that belong to a given namespace
+are passed to the appropriate handler in expanded form. By default
+this expanded form is a concatenation of the namespace URI, the
+separator character (which is the 2nd argument to <code><a href=
+"#XML_ParserCreateNS" >XML_ParserCreateNS</a></code>), and the local
+name (i.e. the part after the colon). Names with undeclared prefixes
+are not well-formed when namespace processing is enabled, and will
+trigger an error. Unprefixed attribute names are never expanded,
+and unprefixed element names are only expanded when they are in the
+scope of a default namespace.</p>
+
+<p>However if <code><a href= "#XML_SetReturnNSTriplet"
+>XML_SetReturnNSTriplet</a></code> has been called with a non-zero
+<code>do_nst</code> parameter, then the expanded form for names with
+an explicit prefix is a concatenation of: URI, separator, local name,
+separator, prefix.</p>
+
+<p>You can set handlers for the start of a namespace declaration and
+for the end of a scope of a declaration with the <code><a href=
+"#XML_SetNamespaceDeclHandler" >XML_SetNamespaceDeclHandler</a></code>
+function.  The StartNamespaceDeclHandler is called prior to the start
+tag handler and the EndNamespaceDeclHandler is called after the
+corresponding end tag that ends the namespace's scope.  The namespace
+start handler gets passed the prefix and URI for the namespace.  For a
+default namespace declaration (xmlns='...'), the prefix will be null.
+The URI will be null for the case where the default namespace is being
+unset.  The namespace end handler just gets the prefix for the closing
+scope.</p>
+
+<p>These handlers are called for each declaration. So if, for
+instance, a start tag had three namespace declarations, then the
+StartNamespaceDeclHandler would be called three times before the start
+tag handler is called, once for each declaration.</p>
+
+<h3>Character Encodings</h3>
+
+<p>While XML is based on Unicode, and every XML processor is required
+to recognized UTF-8 and UTF-16 (1 and 2 byte encodings of Unicode),
+other encodings may be declared in XML documents or entities. For the
+main document, an XML declaration may contain an encoding
+declaration:</p>
+<pre>
+&lt;?xml version="1.0" encoding="ISO-8859-2"?&gt;
+</pre>
+
+<p>External parsed entities may begin with a text declaration, which
+looks like an XML declaration with just an encoding declaration:</p>
+<pre>
+&lt;?xml encoding="Big5"?&gt;
+</pre>
+
+<p>With Expat, you may also specify an encoding at the time of
+creating a parser. This is useful when the encoding information may
+come from a source outside the document itself (like a higher level
+protocol.)</p>
+
+<p><a name="builtin_encodings"></a>There are four built-in encodings
+in Expat:</p>
+<ul>
+<li>UTF-8</li>
+<li>UTF-16</li>
+<li>ISO-8859-1</li>
+<li>US-ASCII</li>
+</ul>
+
+<p>Anything else discovered in an encoding declaration or in the
+protocol encoding specified in the parser constructor, triggers a call
+to the <code>UnknownEncodingHandler</code>. This handler gets passed
+the encoding name and a pointer to an <code>XML_Encoding</code> data
+structure. Your handler must fill in this structure and return
+<code>XML_STATUS_OK</code> if it knows how to deal with the
+encoding. Otherwise the handler should return
+<code>XML_STATUS_ERROR</code>.  The handler also gets passed a pointer
+to an optional application data structure that you may indicate when
+you set the handler.</p>
+
+<p>Expat places restrictions on character encodings that it can
+support by filling in the <code>XML_Encoding</code> structure.
+include file:</p>
+<ol>
+<li>Every ASCII character that can appear in a well-formed XML document
+must be represented by a single byte, and that byte must correspond to
+it's ASCII encoding (except for the characters $@\^'{}~)</li>
+<li>Characters must be encoded in 4 bytes or less.</li>
+<li>All characters encoded must have Unicode scalar values less than or
+equal to 65535 (0xFFFF)<em>This does not apply to the built-in support
+for UTF-16 and UTF-8</em></li>
+<li>No character may be encoded by more that one distinct sequence of
+bytes</li>
+</ol>
+
+<p><code>XML_Encoding</code> contains an array of integers that
+correspond to the 1st byte of an encoding sequence. If the value in
+the array for a byte is zero or positive, then the byte is a single
+byte encoding that encodes the Unicode scalar value contained in the
+array. A -1 in this array indicates a malformed byte. If the value is
+-2, -3, or -4, then the byte is the beginning of a 2, 3, or 4 byte
+sequence respectively. Multi-byte sequences are sent to the convert
+function pointed at in the <code>XML_Encoding</code> structure. This
+function should return the Unicode scalar value for the sequence or -1
+if the sequence is malformed.</p>
+
+<p>One pitfall that novice Expat users are likely to fall into is that
+although Expat may accept input in various encodings, the strings that
+it passes to the handlers are always encoded in UTF-8 or UTF-16
+(depending on how Expat was compiled). Your application is responsible
+for any translation of these strings into other encodings.</p>
+
+<h3>Handling External Entity References</h3>
+
+<p>Expat does not read or parse external entities directly. Note that
+any external DTD is a special case of an external entity.  If you've
+set no <code>ExternalEntityRefHandler</code>, then external entity
+references are silently ignored. Otherwise, it calls your handler with
+the information needed to read and parse the external entity.</p>
+
+<p>Your handler isn't actually responsible for parsing the entity, but
+it is responsible for creating a subsidiary parser with <code><a href=
+"#XML_ExternalEntityParserCreate"
+>XML_ExternalEntityParserCreate</a></code> that will do the job. This
+returns an instance of <code>XML_Parser</code> that has handlers and
+other data structures initialized from the parent parser. You may then
+use <code><a href= "#XML_Parse" >XML_Parse</a></code> or <code><a
+href= "#XML_ParseBuffer">XML_ParseBuffer</a></code> calls against this
+parser.  Since external entities my refer to other external entities,
+your handler should be prepared to be called recursively.</p>
+
+<h3>Parsing DTDs</h3>
+
+<p>In order to parse parameter entities, before starting the parse,
+you must call <code><a href= "#XML_SetParamEntityParsing"
+>XML_SetParamEntityParsing</a></code> with one of the following
+arguments:</p>
+<dl>
+<dt><code>XML_PARAM_ENTITY_PARSING_NEVER</code></dt>
+<dd>Don't parse parameter entities or the external subset</dd>
+<dt><code>XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE</code></dt>
+<dd>Parse parameter entites and the external subset unless
+<code>standalone</code> was set to "yes" in the XML declaration.</dd>
+<dt><code>XML_PARAM_ENTITY_PARSING_ALWAYS</code></dt>
+<dd>Always parse parameter entities and the external subset</dd>
+</dl>
+
+<p>In order to read an external DTD, you also have to set an external
+entity reference handler as described above.</p>
+
+<h3 id="stop-resume">Temporarily Stopping Parsing</h3>
+
+<p>Expat 1.95.8 introduces a new feature: its now possible to stop
+parsing temporarily from within a handler function, even if more data
+has already been passed into the parser.  Applications for this
+include</p>
+
+<ul>
+  <li>Supporting the <a href= "http://www.w3.org/TR/xinclude/"
+  >XInclude</a> specification.</li>
+
+  <li>Delaying further processing until additional information is
+  available from some other source.</li>
+
+  <li>Adjusting processor load as task priorities shift within an
+  application.</li>
+
+  <li>Stopping parsing completely (simply free or reset the parser
+  instead of resuming in the outer parsing loop).  This can be useful
+  if a application-domain error is found in the XML being parsed or if
+  the result of the parse is determined not to be useful after
+  all.</li>
+</ul>
+
+<p>To take advantage of this feature, the main parsing loop of an
+application needs to support this specifically.  It cannot be
+supported with a parsing loop compatible with Expat 1.95.7 or
+earlier (though existing loops will continue to work without
+supporting the stop/resume feature).</p>
+
+<p>An application that uses this feature for a single parser will have
+the rough structure (in pseudo-code):</p>
+
+<pre class="pseudocode">
+fd = open_input()
+p = create_parser()
+
+if parse_xml(p, fd) {
+  /* suspended */
+
+  int suspended = 1;
+
+  while (suspended) {
+    do_something_else()
+    if ready_to_resume() {
+      suspended = continue_parsing(p, fd);
+    }
+  }
+}
+</pre>
+
+<p>An application that may resume any of several parsers based on
+input (either from the XML being parsed or some other source) will
+certainly have more interesting control structures.</p>
+
+<p>This C function could be used for the <code>parse_xml</code>
+function mentioned in the pseudo-code above:</p>
+
+<pre class="eg">
+#define BUFF_SIZE 10240
+
+/* Parse a document from the open file descriptor 'fd' until the parse
+   is complete (the document has been completely parsed, or there's
+   been an error), or the parse is stopped.  Return non-zero when
+   the parse is merely suspended.
+*/
+int
+parse_xml(XML_Parser p, int fd)
+{
+  for (;;) {
+    int last_chunk;
+    int bytes_read;
+    enum XML_Status status;
+
+    void *buff = XML_GetBuffer(p, BUFF_SIZE);
+    if (buff == NULL) {
+      /* handle error... */
+      return 0;
+    }
+    bytes_read = read(fd, buff, BUFF_SIZE);
+    if (bytes_read &lt; 0) {
+      /* handle error... */
+      return 0;
+    }
+    status = XML_ParseBuffer(p, bytes_read, bytes_read == 0);
+    switch (status) {
+      case XML_STATUS_ERROR:
+        /* handle error... */
+        return 0;
+      case XML_STATUS_SUSPENDED:
+        return 1;
+    }
+    if (bytes_read == 0)
+      return 0;
+  }
+}
+</pre>
+
+<p>The corresponding <code>continue_parsing</code> function is
+somewhat simpler, since it only need deal with the return code from
+<code><a href= "#XML_ResumeParser">XML_ResumeParser</a></code>; it can
+delegate the input handling to the <code>parse_xml</code>
+function:</p>
+
+<pre class="eg">
+/* Continue parsing a document which had been suspended.  The 'p' and
+   'fd' arguments are the same as passed to parse_xml().  Return
+   non-zero when the parse is suspended.
+*/
+int
+continue_parsing(XML_Parser p, int fd)
+{
+  enum XML_Status status = XML_ResumeParser(p);
+  switch (status) {
+    case XML_STATUS_ERROR:
+      /* handle error... */
+      return 0;
+    case XML_ERROR_NOT_SUSPENDED:
+      /* handle error... */
+      return 0;.
+    case XML_STATUS_SUSPENDED:
+      return 1;
+  }
+  return parse_xml(p, fd);
+}
+</pre>
+
+<p>Now that we've seen what a mess the top-level parsing loop can
+become, what have we gained?  Very simply, we can now use the <code><a
+href= "#XML_StopParser" >XML_StopParser</a></code> function to stop
+parsing, without having to go to great lengths to avoid additional
+processing that we're expecting to ignore.  As a bonus, we get to stop
+parsing <em>temporarily</em>, and come back to it when we're
+ready.</p>
+
+<p>To stop parsing from a handler function, use the <code><a href=
+"#XML_StopParser" >XML_StopParser</a></code> function.  This function
+takes two arguments; the parser being stopped and a flag indicating
+whether the parse can be resumed in the future.</p>
+
+<!-- XXX really need more here -->
+
+
+<hr />
+<!-- ================================================================ -->
+
+<h2><a name="reference">Expat Reference</a></h2>
+
+<h3><a name="creation">Parser Creation</a></h3>
+
+<pre class="fcndec" id="XML_ParserCreate">
+XML_Parser XMLCALL
+XML_ParserCreate(const XML_Char *encoding);
+</pre>
+<div class="fcndef">
+Construct a new parser. If encoding is non-null, it specifies a
+character encoding to use for the document. This overrides the document
+encoding declaration. There are four built-in encodings:
+<ul>
+<li>US-ASCII</li>
+<li>UTF-8</li>
+<li>UTF-16</li>
+<li>ISO-8859-1</li>
+</ul>
+Any other value will invoke a call to the UnknownEncodingHandler.
+</div>
+
+<pre class="fcndec" id="XML_ParserCreateNS">
+XML_Parser XMLCALL
+XML_ParserCreateNS(const XML_Char *encoding,
+                   XML_Char sep);
+</pre>
+<div class="fcndef">
+Constructs a new parser that has namespace processing in effect. Namespace
+expanded element names and attribute names are returned as a concatenation
+of the namespace URI, <em>sep</em>, and the local part of the name. This
+means that you should pick a character for <em>sep</em> that can't be
+part of a legal URI. There is a special case when <em>sep</em> is the null
+character <code>'\0'</code>: the namespace URI and the local part will be
+concatenated without any separator - this is intended to support RDF processors.
+It is a programming error to use the null separator with 
+<a href= "#XML_SetReturnNSTriplet">namespace triplets</a>.</div>
+
+<pre class="fcndec" id="XML_ParserCreate_MM">
+XML_Parser XMLCALL
+XML_ParserCreate_MM(const XML_Char *encoding,
+                    const XML_Memory_Handling_Suite *ms,
+                   const XML_Char *sep);
+</pre>
+<pre class="signature">
+typedef struct {
+  void *(XMLCALL *malloc_fcn)(size_t size);
+  void *(XMLCALL *realloc_fcn)(void *ptr, size_t size);
+  void (XMLCALL *free_fcn)(void *ptr);
+} XML_Memory_Handling_Suite;
+</pre>
+<div class="fcndef">
+<p>Construct a new parser using the suite of memory handling functions
+specified in <code>ms</code>. If <code>ms</code> is NULL, then use the
+standard set of memory management functions. If <code>sep</code> is
+non NULL, then namespace processing is enabled in the created parser
+and the character pointed at by sep is used as the separator between
+the namespace URI and the local part of the name.</p>
+</div>
+
+<pre class="fcndec" id="XML_ExternalEntityParserCreate">
+XML_Parser XMLCALL
+XML_ExternalEntityParserCreate(XML_Parser p,
+                               const XML_Char *context,
+                               const XML_Char *encoding);
+</pre>
+<div class="fcndef">
+Construct a new <code>XML_Parser</code> object for parsing an external
+general entity. Context is the context argument passed in a call to a
+ExternalEntityRefHandler. Other state information such as handlers,
+user data, namespace processing is inherited from the parser passed as
+the 1st argument. So you shouldn't need to call any of the behavior
+changing functions on this parser (unless you want it to act
+differently than the parent parser).
+</div>
+
+<pre class="fcndec" id="XML_ParserFree">
+void XMLCALL
+XML_ParserFree(XML_Parser p);
+</pre>
+<div class="fcndef">
+Free memory used by the parser. Your application is responsible for
+freeing any memory associated with <a href="#userdata">user data</a>.
+</div>
+
+<pre class="fcndec" id="XML_ParserReset">
+XML_Bool XMLCALL
+XML_ParserReset(XML_Parser p,
+                const XML_Char *encoding);
+</pre>
+<div class="fcndef">
+Clean up the memory structures maintained by the parser so that it may
+be used again.  After this has been called, <code>parser</code> is
+ready to start parsing a new document.  All handlers are cleared from
+the parser, except for the unknownEncodingHandler.  The parser's external
+state is re-initialized except for the values of ns and ns_triplets.
+This function may not be used on a parser created using <code><a href=
+"#XML_ExternalEntityParserCreate" >XML_ExternalEntityParserCreate</a
+></code>; it will return <code>XML_FALSE</code> in that case.  Returns
+<code>XML_TRUE</code> on success.  Your application is responsible for
+dealing with any memory associated with <a href="#userdata">user data</a>.
+</div>
+
+<h3><a name="parsing">Parsing</a></h3>
+
+<p>To state the obvious: the three parsing functions <code><a href=
+"#XML_Parse" >XML_Parse</a></code>, <code><a href= "#XML_ParseBuffer">
+XML_ParseBuffer</a></code> and <code><a href= "#XML_GetBuffer">
+XML_GetBuffer</a></code> must not be called from within a handler
+unless they operate on a separate parser instance, that is, one that
+did not call the handler. For example, it is OK to call the parsing
+functions from within an <code>XML_ExternalEntityRefHandler</code>,
+if they apply to the parser created by
+<code><a href= "#XML_ExternalEntityParserCreate"
+>XML_ExternalEntityParserCreate</a></code>.</p>
+
+<p>Note: the <code>len</code> argument passed to these functions
+should be considerably less than the maximum value for an integer,
+as it could create an integer overflow situation if the added
+lengths of a buffer and the unprocessed portion of the previous buffer
+exceed the maximum integer value. Input data at the end of a buffer
+will remain unprocessed if it is part of an XML token for which the
+end is not part of that buffer.</p>
+
+<pre class="fcndec" id="XML_Parse">
+enum XML_Status XMLCALL
+XML_Parse(XML_Parser p,
+          const char *s,
+          int len,
+          int isFinal);
+</pre>
+<pre class="signature">
+enum XML_Status {
+  XML_STATUS_ERROR = 0,
+  XML_STATUS_OK = 1
+};
+</pre>
+<div class="fcndef">
+Parse some more of the document. The string <code>s</code> is a buffer
+containing part (or perhaps all) of the document. The number of bytes of s
+that are part of the document is indicated by <code>len</code>. This means
+that <code>s</code> doesn't have to be null terminated. It also means that
+if <code>len</code> is larger than the number of bytes in the block of
+memory that <code>s</code> points at, then a memory fault is likely. The
+<code>isFinal</code> parameter informs the parser that this is the last
+piece of the document. Frequently, the last piece is empty (i.e.
+<code>len</code> is zero.)
+If a parse error occurred, it returns <code>XML_STATUS_ERROR</code>.
+Otherwise it returns <code>XML_STATUS_OK</code> value.
+</div>
+
+<pre class="fcndec" id="XML_ParseBuffer">
+enum XML_Status XMLCALL
+XML_ParseBuffer(XML_Parser p,
+                int len,
+                int isFinal);
+</pre>
+<div class="fcndef">
+This is just like <code><a href= "#XML_Parse" >XML_Parse</a></code>,
+except in this case Expat provides the buffer.  By obtaining the
+buffer from Expat with the <code><a href= "#XML_GetBuffer"
+>XML_GetBuffer</a></code> function, the application can avoid double
+copying of the input.
+</div>
+
+<pre class="fcndec" id="XML_GetBuffer">
+void * XMLCALL
+XML_GetBuffer(XML_Parser p,
+              int len);
+</pre>
+<div class="fcndef">
+Obtain a buffer of size <code>len</code> to read a piece of the document
+into. A NULL value is returned if Expat can't allocate enough memory for
+this buffer. This has to be called prior to every call to
+<code><a href= "#XML_ParseBuffer" >XML_ParseBuffer</a></code>. A
+typical use would look like this:
+
+<pre class="eg">
+for (;;) {
+  int bytes_read;
+  void *buff = XML_GetBuffer(p, BUFF_SIZE);
+  if (buff == NULL) {
+    /* handle error */
+  }
+
+  bytes_read = read(docfd, buff, BUFF_SIZE);
+  if (bytes_read &lt; 0) {
+    /* handle error */
+  }
+
+  if (! XML_ParseBuffer(p, bytes_read, bytes_read == 0)) {
+    /* handle parse error */
+  }
+
+  if (bytes_read == 0)
+    break;
+}
+</pre>
+</div>
+
+<pre class="fcndec" id="XML_StopParser">
+enum XML_Status XMLCALL
+XML_StopParser(XML_Parser p,
+               XML_Bool resumable);
+</pre>
+<div class="fcndef">
+
+<p>Stops parsing, causing <code><a href= "#XML_Parse"
+>XML_Parse</a></code> or <code><a href= "#XML_ParseBuffer"
+>XML_ParseBuffer</a></code> to return.  Must be called from within a
+call-back handler, except when aborting (when <code>resumable</code>
+is <code>XML_FALSE</code>) an already suspended parser.  Some
+call-backs may still follow because they would otherwise get
+lost, including
+<ul>
+  <li> the end element handler for empty elements when stopped in the
+       start element handler,</li>
+  <li> end namespace declaration handler when stopped in the end
+       element handler,</li>
+</ul>
+and possibly others.</p>
+
+<p>This can be called from most handlers, including DTD related
+call-backs, except when parsing an external parameter entity and
+<code>resumable</code> is <code>XML_TRUE</code>.  Returns
+<code>XML_STATUS_OK</code> when successful,
+<code>XML_STATUS_ERROR</code> otherwise.  The possible error codes
+are:</p>
+<dl>
+  <dt><code>XML_ERROR_SUSPENDED</code></dt>
+  <dd>when suspending an already suspended parser.</dd>
+  <dt><code>XML_ERROR_FINISHED</code></dt>
+  <dd>when the parser has already finished.</dd>
+  <dt><code>XML_ERROR_SUSPEND_PE</code></dt>
+  <dd>when suspending while parsing an external PE.</dd>
+</dl>
+
+<p>Since the stop/resume feature requires application support in the
+outer parsing loop, it is an error to call this function for a parser
+not being handled appropriately; see <a href= "#stop-resume"
+>Temporarily Stopping Parsing</a> for more information.</p>
+
+<p>When <code>resumable</code> is <code>XML_TRUE</code> then parsing
+is <em>suspended</em>, that is, <code><a href= "#XML_Parse"
+>XML_Parse</a></code> and <code><a href= "#XML_ParseBuffer"
+>XML_ParseBuffer</a></code> return <code>XML_STATUS_SUSPENDED</code>.
+Otherwise, parsing is <em>aborted</em>, that is, <code><a href=
+"#XML_Parse" >XML_Parse</a></code> and <code><a href=
+"#XML_ParseBuffer" >XML_ParseBuffer</a></code> return
+<code>XML_STATUS_ERROR</code> with error code
+<code>XML_ERROR_ABORTED</code>.</p>
+
+<p><strong>Note:</strong>
+This will be applied to the current parser instance only, that is, if
+there is a parent parser then it will continue parsing when the
+external entity reference handler returns.  It is up to the
+implementation of that handler to call <code><a href=
+"#XML_StopParser" >XML_StopParser</a></code> on the parent parser
+(recursively), if one wants to stop parsing altogether.</p>
+
+<p>When suspended, parsing can be resumed by calling <code><a href=
+"#XML_ResumeParser" >XML_ResumeParser</a></code>.</p>
+
+<p>New in Expat 1.95.8.</p>
+</div>
+
+<pre class="fcndec" id="XML_ResumeParser">
+enum XML_Status XMLCALL
+XML_ResumeParser(XML_Parser p);
+</pre>
+<div class="fcndef">
+<p>Resumes parsing after it has been suspended with <code><a href=
+"#XML_StopParser" >XML_StopParser</a></code>.  Must not be called from
+within a handler call-back.  Returns same status codes as <code><a
+href= "#XML_Parse">XML_Parse</a></code> or <code><a href=
+"#XML_ParseBuffer" >XML_ParseBuffer</a></code>.  An additional error
+code, <code>XML_ERROR_NOT_SUSPENDED</code>, will be returned if the
+parser was not currently suspended.</p>
+
+<p><strong>Note:</strong>
+This must be called on the most deeply nested child parser instance
+first, and on its parent parser only after the child parser has
+finished, to be applied recursively until the document entity's parser
+is restarted.  That is, the parent parser will not resume by itself
+and it is up to the application to call <code><a href=
+"#XML_ResumeParser" >XML_ResumeParser</a></code> on it at the
+appropriate moment.</p>
+
+<p>New in Expat 1.95.8.</p>
+</div>
+
+<pre class="fcndec" id="XML_GetParsingStatus">
+void XMLCALL
+XML_GetParsingStatus(XML_Parser p,
+                     XML_ParsingStatus *status);
+</pre>
+<pre class="signature">
+enum XML_Parsing {
+  XML_INITIALIZED,
+  XML_PARSING,
+  XML_FINISHED,
+  XML_SUSPENDED
+};
+
+typedef struct {
+  enum XML_Parsing parsing;
+  XML_Bool finalBuffer;
+} XML_ParsingStatus;
+</pre>
+<div class="fcndef">
+<p>Returns status of parser with respect to being initialized,
+parsing, finished, or suspended, and whether the final buffer is being
+processed.  The <code>status</code> parameter <em>must not</em> be
+NULL.</p>
+
+<p>New in Expat 1.95.8.</p>
+</div>
+
+
+<h3><a name="setting">Handler Setting</a></h3>
+
+<p>Although handlers are typically set prior to parsing and left alone, an
+application may choose to set or change the handler for a parsing event
+while the parse is in progress. For instance, your application may choose
+to ignore all text not descended from a <code>para</code> element. One
+way it could do this is to set the character handler when a para start tag
+is seen, and unset it for the corresponding end tag.</p>
+
+<p>A handler may be <em>unset</em> by providing a NULL pointer to the
+appropriate handler setter. None of the handler setting functions have
+a return value.</p>
+
+<p>Your handlers will be receiving strings in arrays of type
+<code>XML_Char</code>. This type is conditionally defined in expat.h as
+either <code>char</code>, <code>wchar_t</code> or <code>unsigned short</code>.
+The former implies UTF-8 encoding, the latter two imply UTF-16 encoding.
+Note that you'll receive them in this form independent of the original
+encoding of the document.</p>
+
+<div class="handler">
+<pre class="setter" id="XML_SetStartElementHandler">
+void XMLCALL
+XML_SetStartElementHandler(XML_Parser p,
+                           XML_StartElementHandler start);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_StartElementHandler)(void *userData,
+                                   const XML_Char *name,
+                                   const XML_Char **atts);
+</pre>
+<p>Set handler for start (and empty) tags. Attributes are passed to the start
+handler as a pointer to a vector of char pointers. Each attribute seen in
+a start (or empty) tag occupies 2 consecutive places in this vector: the
+attribute name followed by the attribute value. These pairs are terminated
+by a null pointer.</p>
+<p>Note that an empty tag generates a call to both start and end handlers
+(in that order).</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetEndElementHandler">
+void XMLCALL
+XML_SetEndElementHandler(XML_Parser p,
+                         XML_EndElementHandler);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_EndElementHandler)(void *userData,
+                                 const XML_Char *name);
+</pre>
+<p>Set handler for end (and empty) tags. As noted above, an empty tag
+generates a call to both start and end handlers.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetElementHandler">
+void XMLCALL
+XML_SetElementHandler(XML_Parser p,
+                      XML_StartElementHandler start,
+                      XML_EndElementHandler end);
+</pre>
+<p>Set handlers for start and end tags with one call.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetCharacterDataHandler">
+void XMLCALL
+XML_SetCharacterDataHandler(XML_Parser p,
+                            XML_CharacterDataHandler charhndl)
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_CharacterDataHandler)(void *userData,
+                                    const XML_Char *s,
+                                    int len);
+</pre>
+<p>Set a text handler. The string your handler receives
+is <em>NOT nul-terminated</em>. You have to use the length argument
+to deal with the end of the string. A single block of contiguous text
+free of markup may still result in a sequence of calls to this handler.
+In other words, if you're searching for a pattern in the text, it may
+be split across calls to this handler.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetProcessingInstructionHandler">
+void XMLCALL
+XML_SetProcessingInstructionHandler(XML_Parser p,
+                                    XML_ProcessingInstructionHandler proc)
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_ProcessingInstructionHandler)(void *userData,
+                                            const XML_Char *target,
+                                            const XML_Char *data);
+
+</pre>
+<p>Set a handler for processing instructions. The target is the first word
+in the processing instruction. The data is the rest of the characters in
+it after skipping all whitespace after the initial word.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetCommentHandler">
+void XMLCALL
+XML_SetCommentHandler(XML_Parser p,
+                      XML_CommentHandler cmnt)
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_CommentHandler)(void *userData,
+                              const XML_Char *data);
+</pre>
+<p>Set a handler for comments. The data is all text inside the comment
+delimiters.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetStartCdataSectionHandler">
+void XMLCALL
+XML_SetStartCdataSectionHandler(XML_Parser p,
+                                XML_StartCdataSectionHandler start);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_StartCdataSectionHandler)(void *userData);
+</pre>
+<p>Set a handler that gets called at the beginning of a CDATA section.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetEndCdataSectionHandler">
+void XMLCALL
+XML_SetEndCdataSectionHandler(XML_Parser p,
+                              XML_EndCdataSectionHandler end);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_EndCdataSectionHandler)(void *userData);
+</pre>
+<p>Set a handler that gets called at the end of a CDATA section.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetCdataSectionHandler">
+void XMLCALL
+XML_SetCdataSectionHandler(XML_Parser p,
+                           XML_StartCdataSectionHandler start,
+                           XML_EndCdataSectionHandler end)
+</pre>
+<p>Sets both CDATA section handlers with one call.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetDefaultHandler">
+void XMLCALL
+XML_SetDefaultHandler(XML_Parser p,
+                      XML_DefaultHandler hndl)
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_DefaultHandler)(void *userData,
+                              const XML_Char *s,
+                              int len);
+</pre>
+
+<p>Sets a handler for any characters in the document which wouldn't
+otherwise be handled. This includes both data for which no handlers
+can be set (like some kinds of DTD declarations) and data which could
+be reported but which currently has no handler set.  The characters
+are passed exactly as they were present in the XML document except
+that they will be encoded in UTF-8 or UTF-16. Line boundaries are not
+normalized. Note that a byte order mark character is not passed to the
+default handler. There are no guarantees about how characters are
+divided between calls to the default handler: for example, a comment
+might be split between multiple calls.  Setting the handler with
+this call has the side effect of turning off expansion of references
+to internally defined general entities. Instead these references are
+passed to the default handler.</p>
+
+<p>See also <code><a
+href="#XML_DefaultCurrent">XML_DefaultCurrent</a></code>.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetDefaultHandlerExpand">
+void XMLCALL
+XML_SetDefaultHandlerExpand(XML_Parser p,
+                            XML_DefaultHandler hndl)
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_DefaultHandler)(void *userData,
+                              const XML_Char *s,
+                              int len);
+</pre>
+<p>This sets a default handler, but doesn't inhibit the expansion of
+internal entity references.  The entity reference will not be passed
+to the default handler.</p>
+
+<p>See also <code><a
+href="#XML_DefaultCurrent">XML_DefaultCurrent</a></code>.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetExternalEntityRefHandler">
+void XMLCALL
+XML_SetExternalEntityRefHandler(XML_Parser p,
+                                XML_ExternalEntityRefHandler hndl)
+</pre>
+<pre class="signature">
+typedef int
+(XMLCALL *XML_ExternalEntityRefHandler)(XML_Parser p,
+                                        const XML_Char *context,
+                                        const XML_Char *base,
+                                        const XML_Char *systemId,
+                                        const XML_Char *publicId);
+</pre>
+<p>Set an external entity reference handler. This handler is also
+called for processing an external DTD subset if parameter entity parsing
+is in effect. (See <a href="#XML_SetParamEntityParsing">
+<code>XML_SetParamEntityParsing</code></a>.)</p>
+
+<p>The <code>context</code> parameter specifies the parsing context in
+the format expected by the <code>context</code> argument to <code><a
+href="#XML_ExternalEntityParserCreate"
+>XML_ExternalEntityParserCreate</a></code>.  <code>code</code> is
+valid only until the handler returns, so if the referenced entity is
+to be parsed later, it must be copied.  <code>context</code> is NULL
+only when the entity is a parameter entity, which is how one can
+differentiate between general and parameter entities.</p>
+
+<p>The <code>base</code> parameter is the base to use for relative
+system identifiers.  It is set by <code><a
+href="#XML_SetBase">XML_SetBase</a></code> and may be NULL. The
+<code>publicId</code> parameter is the public id given in the entity
+declaration and may be NULL.  <code>systemId</code> is the system
+identifier specified in the entity declaration and is never NULL.</p>
+
+<p>There are a couple of ways in which this handler differs from
+others.  First, this handler returns a status indicator (an
+integer). <code>XML_STATUS_OK</code> should be returned for successful
+handling of the external entity reference.  Returning
+<code>XML_STATUS_ERROR</code> indicates failure, and causes the
+calling parser to return an
+<code>XML_ERROR_EXTERNAL_ENTITY_HANDLING</code> error.</p>
+
+<p>Second, instead of having the user data as its first argument, it
+receives the parser that encountered the entity reference. This, along
+with the context parameter, may be used as arguments to a call to
+<code><a href= "#XML_ExternalEntityParserCreate"
+>XML_ExternalEntityParserCreate</a></code>.  Using the returned
+parser, the body of the external entity can be recursively parsed.</p>
+
+<p>Since this handler may be called recursively, it should not be saving
+information into global or static variables.</p>
+</div>
+
+<pre class="fcndec" id="XML_SetExternalEntityRefHandlerArg">
+void XMLCALL
+XML_SetExternalEntityRefHandlerArg(XML_Parser p,
+                                   void *arg)
+</pre>
+<div class="fcndef">
+<p>Set the argument passed to the ExternalEntityRefHandler.  If
+<code>arg</code> is not NULL, it is the new value passed to the
+handler set using <code><a href="#XML_SetExternalEntityRefHandler"
+>XML_SetExternalEntityRefHandler</a></code>; if <code>arg</code> is
+NULL, the argument passed to the handler function will be the parser
+object itself.</p>
+
+<p><strong>Note:</strong>
+The type of <code>arg</code> and the type of the first argument to the
+ExternalEntityRefHandler do not match.  This function takes a
+<code>void *</code> to be passed to the handler, while the handler
+accepts an <code>XML_Parser</code>.  This is a historical accident,
+but will not be corrected before Expat 2.0 (at the earliest) to avoid
+causing compiler warnings for code that's known to work with this
+API.  It is the responsibility of the application code to know the
+actual type of the argument passed to the handler and to manage it
+properly.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetSkippedEntityHandler">
+void XMLCALL
+XML_SetSkippedEntityHandler(XML_Parser p,
+                            XML_SkippedEntityHandler handler)
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_SkippedEntityHandler)(void *userData,
+                                    const XML_Char *entityName,
+                                    int is_parameter_entity);
+</pre>
+<p>Set a skipped entity handler. This is called in two situations:</p>
+<ol>
+   <li>An entity reference is encountered for which no declaration
+       has been read <em>and</em> this is not an error.</li>
+   <li>An internal entity reference is read, but not expanded, because
+       <a href="#XML_SetDefaultHandler"><code>XML_SetDefaultHandler</code></a>
+          has been called.</li>
+</ol>
+<p>The <code>is_parameter_entity</code> argument will be non-zero for
+a parameter entity and zero for a general entity.</p> <p>Note: skipped
+parameter entities in declarations and skipped general entities in
+attribute values cannot be reported, because the event would be out of
+sync with the reporting of the declarations or attribute values</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetUnknownEncodingHandler">
+void XMLCALL
+XML_SetUnknownEncodingHandler(XML_Parser p,
+                              XML_UnknownEncodingHandler enchandler,
+                             void *encodingHandlerData)
+</pre>
+<pre class="signature">
+typedef int
+(XMLCALL *XML_UnknownEncodingHandler)(void *encodingHandlerData,
+                                      const XML_Char *name,
+                                      XML_Encoding *info);
+
+typedef struct {
+  int map[256];
+  void *data;
+  int (XMLCALL *convert)(void *data, const char *s);
+  void (XMLCALL *release)(void *data);
+} XML_Encoding;
+</pre>
+<p>Set a handler to deal with encodings other than the <a
+href="#builtin_encodings">built in set</a>. This should be done before
+<code><a href= "#XML_Parse" >XML_Parse</a></code> or <code><a href=
+"#XML_ParseBuffer" >XML_ParseBuffer</a></code> have been called on the
+given parser.</p> <p>If the handler knows how to deal with an encoding
+with the given name, it should fill in the <code>info</code> data
+structure and return <code>XML_STATUS_OK</code>. Otherwise it
+should return <code>XML_STATUS_ERROR</code>. The handler will be called
+at most once per parsed (external) entity. The optional application
+data pointer <code>encodingHandlerData</code> will be passed back to
+the handler.</p>
+
+<p>The map array contains information for every possible possible leading
+byte in a byte sequence. If the corresponding value is &gt;= 0, then it's
+a single byte sequence and the byte encodes that Unicode value. If the
+value is -1, then that byte is invalid as the initial byte in a sequence.
+If the value is -n, where n is an integer &gt; 1, then n is the number of
+bytes in the sequence and the actual conversion is accomplished by a
+call to the function pointed at by convert. This function may return -1
+if the sequence itself is invalid. The convert pointer may be null if
+there are only single byte codes. The data parameter passed to the convert
+function is the data pointer from <code>XML_Encoding</code>. The
+string s is <em>NOT</em> nul-terminated and points at the sequence of
+bytes to be converted.</p>
+
+<p>The function pointed at by <code>release</code> is called by the
+parser when it is finished with the encoding. It may be NULL.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetStartNamespaceDeclHandler">
+void XMLCALL
+XML_SetStartNamespaceDeclHandler(XML_Parser p,
+                                XML_StartNamespaceDeclHandler start);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_StartNamespaceDeclHandler)(void *userData,
+                                         const XML_Char *prefix,
+                                         const XML_Char *uri);
+</pre>
+<p>Set a handler to be called when a namespace is declared. Namespace
+declarations occur inside start tags. But the namespace declaration start
+handler is called before the start tag handler for each namespace declared
+in that start tag.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetEndNamespaceDeclHandler">
+void XMLCALL
+XML_SetEndNamespaceDeclHandler(XML_Parser p,
+                              XML_EndNamespaceDeclHandler end);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_EndNamespaceDeclHandler)(void *userData,
+                                       const XML_Char *prefix);
+</pre>
+<p>Set a handler to be called when leaving the scope of a namespace
+declaration. This will be called, for each namespace declaration,
+after the handler for the end tag of the element in which the
+namespace was declared.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetNamespaceDeclHandler">
+void XMLCALL
+XML_SetNamespaceDeclHandler(XML_Parser p,
+                            XML_StartNamespaceDeclHandler start,
+                            XML_EndNamespaceDeclHandler end)
+</pre>
+<p>Sets both namespace declaration handlers with a single call.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetXmlDeclHandler">
+void XMLCALL
+XML_SetXmlDeclHandler(XML_Parser p,
+                     XML_XmlDeclHandler xmldecl);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_XmlDeclHandler)(void            *userData,
+                              const XML_Char  *version,
+                              const XML_Char  *encoding,
+                              int             standalone);
+</pre>
+<p>Sets a handler that is called for XML declarations and also for
+text declarations discovered in external entities. The way to
+distinguish is that the <code>version</code> parameter will be NULL
+for text declarations. The <code>encoding</code> parameter may be NULL
+for an XML declaration. The <code>standalone</code> argument will
+contain -1, 0, or 1 indicating respectively that there was no
+standalone parameter in the declaration, that it was given as no, or
+that it was given as yes.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetStartDoctypeDeclHandler">
+void XMLCALL
+XML_SetStartDoctypeDeclHandler(XML_Parser p,
+                              XML_StartDoctypeDeclHandler start);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_StartDoctypeDeclHandler)(void           *userData,
+                                       const XML_Char *doctypeName,
+                                       const XML_Char *sysid,
+                                       const XML_Char *pubid,
+                                       int            has_internal_subset);
+</pre>
+<p>Set a handler that is called at the start of a DOCTYPE declaration,
+before any external or internal subset is parsed. Both <code>sysid</code>
+and <code>pubid</code> may be NULL. The <code>has_internal_subset</code>
+will be non-zero if the DOCTYPE declaration has an internal subset.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetEndDoctypeDeclHandler">
+void XMLCALL
+XML_SetEndDoctypeDeclHandler(XML_Parser p,
+                            XML_EndDoctypeDeclHandler end);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_EndDoctypeDeclHandler)(void *userData);
+</pre>
+<p>Set a handler that is called at the end of a DOCTYPE declaration,
+after parsing any external subset.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetDoctypeDeclHandler">
+void XMLCALL
+XML_SetDoctypeDeclHandler(XML_Parser p,
+                         XML_StartDoctypeDeclHandler start,
+                         XML_EndDoctypeDeclHandler end);
+</pre>
+<p>Set both doctype handlers with one call.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetElementDeclHandler">
+void XMLCALL
+XML_SetElementDeclHandler(XML_Parser p,
+                         XML_ElementDeclHandler eldecl);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_ElementDeclHandler)(void *userData,
+                                  const XML_Char *name,
+                                  XML_Content *model);
+</pre>
+<pre class="signature">
+enum XML_Content_Type {
+  XML_CTYPE_EMPTY = 1,
+  XML_CTYPE_ANY,
+  XML_CTYPE_MIXED,
+  XML_CTYPE_NAME,
+  XML_CTYPE_CHOICE,
+  XML_CTYPE_SEQ
+};
+
+enum XML_Content_Quant {
+  XML_CQUANT_NONE,
+  XML_CQUANT_OPT,
+  XML_CQUANT_REP,
+  XML_CQUANT_PLUS
+};
+
+typedef struct XML_cp XML_Content;
+
+struct XML_cp {
+  enum XML_Content_Type                type;
+  enum XML_Content_Quant       quant;
+  const XML_Char *             name;
+  unsigned int                 numchildren;
+  XML_Content *                        children;
+};
+</pre>
+<p>Sets a handler for element declarations in a DTD. The handler gets
+called with the name of the element in the declaration and a pointer
+to a structure that contains the element model. It is the
+application's responsibility to free this data structure using
+<code><a href="#XML_FreeContentModel"
+>XML_FreeContentModel</a></code>.</p>
+
+<p>The <code>model</code> argument is the root of a tree of
+<code>XML_Content</code> nodes. If <code>type</code> equals
+<code>XML_CTYPE_EMPTY</code> or <code>XML_CTYPE_ANY</code>, then
+<code>quant</code> will be <code>XML_CQUANT_NONE</code>, and the other
+fields will be zero or NULL.  If <code>type</code> is
+<code>XML_CTYPE_MIXED</code>, then <code>quant</code> will be
+<code>XML_CQUANT_NONE</code> or <code>XML_CQUANT_REP</code> and
+<code>numchildren</code> will contain the number of elements that are
+allowed to be mixed in and <code>children</code> points to an array of
+<code>XML_Content</code> structures that will all have type
+XML_CTYPE_NAME with no quantification.  Only the root node can be type
+<code>XML_CTYPE_EMPTY</code>, <code>XML_CTYPE_ANY</code>, or
+<code>XML_CTYPE_MIXED</code>.</p>
+
+<p>For type <code>XML_CTYPE_NAME</code>, the <code>name</code> field
+points to the name and the <code>numchildren</code> and
+<code>children</code> fields will be zero and NULL. The
+<code>quant</code> field will indicate any quantifiers placed on the
+name.</p>
+
+<p>Types <code>XML_CTYPE_CHOICE</code> and <code>XML_CTYPE_SEQ</code>
+indicate a choice or sequence respectively. The
+<code>numchildren</code> field indicates how many nodes in the choice
+or sequence and <code>children</code> points to the nodes.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetAttlistDeclHandler">
+void XMLCALL
+XML_SetAttlistDeclHandler(XML_Parser p,
+                          XML_AttlistDeclHandler attdecl);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_AttlistDeclHandler)(void           *userData,
+                                  const XML_Char *elname,
+                                  const XML_Char *attname,
+                                  const XML_Char *att_type,
+                                  const XML_Char *dflt,
+                                  int            isrequired);
+</pre>
+<p>Set a handler for attlist declarations in the DTD. This handler is
+called for <em>each</em> attribute. So a single attlist declaration
+with multiple attributes declared will generate multiple calls to this
+handler. The <code>elname</code> parameter returns the name of the
+element for which the attribute is being declared. The attribute name
+is in the <code>attname</code> parameter. The attribute type is in the
+<code>att_type</code> parameter.  It is the string representing the
+type in the declaration with whitespace removed.</p>
+
+<p>The <code>dflt</code> parameter holds the default value. It will be
+NULL in the case of "#IMPLIED" or "#REQUIRED" attributes. You can
+distinguish these two cases by checking the <code>isrequired</code>
+parameter, which will be true in the case of "#REQUIRED" attributes.
+Attributes which are "#FIXED" will have also have a true
+<code>isrequired</code>, but they will have the non-NULL fixed value
+in the <code>dflt</code> parameter.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetEntityDeclHandler">
+void XMLCALL
+XML_SetEntityDeclHandler(XML_Parser p,
+                        XML_EntityDeclHandler handler);
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_EntityDeclHandler)(void           *userData,
+                                 const XML_Char *entityName,
+                                 int            is_parameter_entity,
+                                 const XML_Char *value,
+                                 int            value_length, 
+                                 const XML_Char *base,
+                                 const XML_Char *systemId,
+                                 const XML_Char *publicId,
+                                 const XML_Char *notationName);
+</pre>
+<p>Sets a handler that will be called for all entity declarations.
+The <code>is_parameter_entity</code> argument will be non-zero in the
+case of parameter entities and zero otherwise.</p>
+
+<p>For internal entities (<code>&lt;!ENTITY foo "bar"&gt;</code>),
+<code>value</code> will be non-NULL and <code>systemId</code>,
+<code>publicId</code>, and <code>notationName</code> will all be NULL.
+The value string is <em>not</em> NULL terminated; the length is
+provided in the <code>value_length</code> parameter. Do not use
+<code>value_length</code> to test for internal entities, since it is
+legal to have zero-length values. Instead check for whether or not
+<code>value</code> is NULL.</p> <p>The <code>notationName</code>
+argument will have a non-NULL value only for unparsed entity
+declarations.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetUnparsedEntityDeclHandler">
+void XMLCALL
+XML_SetUnparsedEntityDeclHandler(XML_Parser p,
+                                 XML_UnparsedEntityDeclHandler h)
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_UnparsedEntityDeclHandler)(void *userData,
+                                         const XML_Char *entityName, 
+                                         const XML_Char *base,
+                                         const XML_Char *systemId,
+                                         const XML_Char *publicId,
+                                         const XML_Char *notationName);
+</pre>
+<p>Set a handler that receives declarations of unparsed entities. These
+are entity declarations that have a notation (NDATA) field:</p>
+
+<div id="eg"><pre>
+&lt;!ENTITY logo SYSTEM "images/logo.gif" NDATA gif&gt;
+</pre></div>
+<p>This handler is obsolete and is provided for backwards
+compatibility.  Use instead <a href= "#XML_SetEntityDeclHandler"
+>XML_SetEntityDeclHandler</a>.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetNotationDeclHandler">
+void XMLCALL
+XML_SetNotationDeclHandler(XML_Parser p,
+                           XML_NotationDeclHandler h)
+</pre>
+<pre class="signature">
+typedef void
+(XMLCALL *XML_NotationDeclHandler)(void *userData, 
+                                   const XML_Char *notationName,
+                                   const XML_Char *base,
+                                   const XML_Char *systemId,
+                                   const XML_Char *publicId);
+</pre>
+<p>Set a handler that receives notation declarations.</p>
+</div>
+
+<div class="handler">
+<pre class="setter" id="XML_SetNotStandaloneHandler">
+void XMLCALL
+XML_SetNotStandaloneHandler(XML_Parser p,
+                            XML_NotStandaloneHandler h)
+</pre>
+<pre class="signature">
+typedef int 
+(XMLCALL *XML_NotStandaloneHandler)(void *userData);
+</pre>
+<p>Set a handler that is called if the document is not "standalone".
+This happens when there is an external subset or a reference to a
+parameter entity, but does not have standalone set to "yes" in an XML
+declaration.  If this handler returns <code>XML_STATUS_ERROR</code>,
+then the parser will throw an <code>XML_ERROR_NOT_STANDALONE</code>
+error.</p>
+</div>
+
+<h3><a name="position">Parse position and error reporting functions</a></h3>
+
+<p>These are the functions you'll want to call when the parse
+functions return <code>XML_STATUS_ERROR</code> (a parse error has
+occurred), although the position reporting functions are useful outside
+of errors. The position reported is the byte position (in the original
+document or entity encoding) of the first of the sequence of
+characters that generated the current event (or the error that caused
+the parse functions to return <code>XML_STATUS_ERROR</code>.)  The
+exceptions are callbacks trigged by declarations in the document
+prologue, in which case they exact position reported is somewhere in the
+relevant markup, but not necessarily as meaningful as for other
+events.</p>
+
+<p>The position reporting functions are accurate only outside of the
+DTD.  In other words, they usually return bogus information when
+called from within a DTD declaration handler.</p>
+
+<pre class="fcndec" id="XML_GetErrorCode">
+enum XML_Error XMLCALL
+XML_GetErrorCode(XML_Parser p);
+</pre>
+<div class="fcndef">
+Return what type of error has occurred.
+</div>
+
+<pre class="fcndec" id="XML_ErrorString">
+const XML_LChar * XMLCALL
+XML_ErrorString(enum XML_Error code);
+</pre>
+<div class="fcndef">
+Return a string describing the error corresponding to code.
+The code should be one of the enums that can be returned from
+<code><a href= "#XML_GetErrorCode" >XML_GetErrorCode</a></code>.
+</div>
+
+<pre class="fcndec" id="XML_GetCurrentByteIndex">
+XML_Index XMLCALL
+XML_GetCurrentByteIndex(XML_Parser p);
+</pre>
+<div class="fcndef">
+Return the byte offset of the position.  This always corresponds to
+the values returned by <code><a href= "#XML_GetCurrentLineNumber"
+>XML_GetCurrentLineNumber</a></code> and <code><a href=
+"#XML_GetCurrentColumnNumber" >XML_GetCurrentColumnNumber</a></code>.
+</div>
+
+<pre class="fcndec" id="XML_GetCurrentLineNumber">
+XML_Size XMLCALL
+XML_GetCurrentLineNumber(XML_Parser p);
+</pre>
+<div class="fcndef">
+Return the line number of the position.  The first line is reported as
+<code>1</code>.
+</div>
+
+<pre class="fcndec" id="XML_GetCurrentColumnNumber">
+XML_Size XMLCALL
+XML_GetCurrentColumnNumber(XML_Parser p);
+</pre>
+<div class="fcndef">
+Return the offset, from the beginning of the current line, of
+the position.
+</div>
+
+<pre class="fcndec" id="XML_GetCurrentByteCount">
+int XMLCALL
+XML_GetCurrentByteCount(XML_Parser p);
+</pre>
+<div class="fcndef">
+Return the number of bytes in the current event. Returns
+<code>0</code> if the event is inside a reference to an internal
+entity and for the end-tag event for empty element tags (the later can
+be used to distinguish empty-element tags from empty elements using
+separate start and end tags).
+</div>
+
+<pre class="fcndec" id="XML_GetInputContext">
+const char * XMLCALL
+XML_GetInputContext(XML_Parser p,
+                    int *offset,
+                    int *size);
+</pre>
+<div class="fcndef">
+
+<p>Returns the parser's input buffer, sets the integer pointed at by
+<code>offset</code> to the offset within this buffer of the current
+parse position, and set the integer pointed at by <code>size</code> to
+the size of the returned buffer.</p>
+
+<p>This should only be called from within a handler during an active
+parse and the returned buffer should only be referred to from within
+the handler that made the call. This input buffer contains the
+untranslated bytes of the input.</p>
+
+<p>Only a limited amount of context is kept, so if the event
+triggering a call spans over a very large amount of input, the actual
+parse position may be before the beginning of the buffer.</p>
+
+<p>If <code>XML_CONTEXT_BYTES</code> is not defined, this will always
+return NULL.</p>
+</div>
+
+<h3><a name="miscellaneous">Miscellaneous functions</a></h3>
+
+<p>The functions in this section either obtain state information from
+the parser or can be used to dynamicly set parser options.</p>
+
+<pre class="fcndec" id="XML_SetUserData">
+void XMLCALL
+XML_SetUserData(XML_Parser p,
+                void *userData);
+</pre>
+<div class="fcndef">
+This sets the user data pointer that gets passed to handlers.  It
+overwrites any previous value for this pointer. Note that the
+application is responsible for freeing the memory associated with
+<code>userData</code> when it is finished with the parser. So if you
+call this when there's already a pointer there, and you haven't freed
+the memory associated with it, then you've probably just leaked
+memory.
+</div>
+
+<pre class="fcndec" id="XML_GetUserData">
+void * XMLCALL
+XML_GetUserData(XML_Parser p);
+</pre>
+<div class="fcndef">
+This returns the user data pointer that gets passed to handlers.
+It is actually implemented as a macro.
+</div>
+
+<pre class="fcndec" id="XML_UseParserAsHandlerArg">
+void XMLCALL
+XML_UseParserAsHandlerArg(XML_Parser p);
+</pre>
+<div class="fcndef">
+After this is called, handlers receive the parser in their
+<code>userData</code> arguments.  The user data can still be obtained
+using the <code><a href= "#XML_GetUserData"
+>XML_GetUserData</a></code> function.
+</div>
+
+<pre class="fcndec" id="XML_SetBase">
+enum XML_Status XMLCALL
+XML_SetBase(XML_Parser p,
+            const XML_Char *base);
+</pre>
+<div class="fcndef">
+Set the base to be used for resolving relative URIs in system
+identifiers.  The return value is <code>XML_STATUS_ERROR</code> if
+there's no memory to store base, otherwise it's
+<code>XML_STATUS_OK</code>.
+</div>
+
+<pre class="fcndec" id="XML_GetBase">
+const XML_Char * XMLCALL
+XML_GetBase(XML_Parser p);
+</pre>
+<div class="fcndef">
+Return the base for resolving relative URIs.
+</div>
+
+<pre class="fcndec" id="XML_GetSpecifiedAttributeCount">
+int XMLCALL
+XML_GetSpecifiedAttributeCount(XML_Parser p);
+</pre>
+<div class="fcndef">
+When attributes are reported to the start handler in the atts vector,
+attributes that were explicitly set in the element occur before any
+attributes that receive their value from default information in an
+ATTLIST declaration. This function returns the number of attributes
+that were explicitly set times two, thus giving the offset in the
+<code>atts</code> array passed to the start tag handler of the first
+attribute set due to defaults. It supplies information for the last
+call to a start handler. If called inside a start handler, then that
+means the current call.
+</div>
+
+<pre class="fcndec" id="XML_GetIdAttributeIndex">
+int XMLCALL
+XML_GetIdAttributeIndex(XML_Parser p);
+</pre>
+<div class="fcndef">
+Returns the index of the ID attribute passed in the atts array in the
+last call to <code><a href= "#XML_StartElementHandler"
+>XML_StartElementHandler</a></code>, or -1 if there is no ID
+attribute. If called inside a start handler, then that means the
+current call.
+</div>
+
+<pre class="fcndec" id="XML_SetEncoding">
+enum XML_Status XMLCALL
+XML_SetEncoding(XML_Parser p,
+                const XML_Char *encoding);
+</pre>
+<div class="fcndef">
+Set the encoding to be used by the parser. It is equivalent to
+passing a non-null encoding argument to the parser creation functions.
+It must not be called after <code><a href= "#XML_Parse"
+>XML_Parse</a></code> or <code><a href= "#XML_ParseBuffer"
+>XML_ParseBuffer</a></code> have been called on the given parser.
+Returns <code>XML_STATUS_OK</code> on success or
+<code>XML_STATUS_ERROR</code> on error.
+</div>
+
+<pre class="fcndec" id="XML_SetParamEntityParsing">
+int XMLCALL
+XML_SetParamEntityParsing(XML_Parser p,
+                          enum XML_ParamEntityParsing code);
+</pre>
+<div class="fcndef">
+This enables parsing of parameter entities, including the external
+parameter entity that is the external DTD subset, according to
+<code>code</code>.
+The choices for <code>code</code> are:
+<ul>
+<li><code>XML_PARAM_ENTITY_PARSING_NEVER</code></li>
+<li><code>XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE</code></li>
+<li><code>XML_PARAM_ENTITY_PARSING_ALWAYS</code></li>
+</ul>
+</div>
+
+<pre class="fcndec" id="XML_UseForeignDTD">
+enum XML_Error XMLCALL
+XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD);
+</pre>
+<div class="fcndef">
+<p>This function allows an application to provide an external subset
+for the document type declaration for documents which do not specify
+an external subset of their own.  For documents which specify an
+external subset in their DOCTYPE declaration, the application-provided
+subset will be ignored.  If the document does not contain a DOCTYPE
+declaration at all and <code>useDTD</code> is true, the
+application-provided subset will be parsed, but the
+<code>startDoctypeDeclHandler</code> and
+<code>endDoctypeDeclHandler</code> functions, if set, will not be
+called.  The setting of parameter entity parsing, controlled using
+<code><a href= "#XML_SetParamEntityParsing"
+>XML_SetParamEntityParsing</a></code>, will be honored.</p>
+
+<p>The application-provided external subset is read by calling the
+external entity reference handler set via <code><a href=
+"#XML_SetExternalEntityRefHandler"
+>XML_SetExternalEntityRefHandler</a></code> with both
+<code>publicId</code> and <code>systemId</code> set to NULL.</p>
+
+<p>If this function is called after parsing has begun, it returns
+<code>XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING</code> and ignores
+<code>useDTD</code>.  If called when Expat has been compiled without
+DTD support, it returns
+<code>XML_ERROR_FEATURE_REQUIRES_XML_DTD</code>.  Otherwise, it
+returns <code>XML_ERROR_NONE</code>.</p>
+
+<p><b>Note:</b> For the purpose of checking WFC: Entity Declared, passing
+<code>useDTD == XML_TRUE</code> will make the parser behave as if
+the document had a DTD with an external subset. This holds true even if
+the external entity reference handler returns without action.</p>
+</div>
+
+<pre class="fcndec" id="XML_SetReturnNSTriplet">
+void XMLCALL
+XML_SetReturnNSTriplet(XML_Parser parser,
+                       int        do_nst);
+</pre>
+<div class="fcndef">
+<p>
+This function only has an effect when using a parser created with
+<code><a href= "#XML_ParserCreateNS" >XML_ParserCreateNS</a></code>,
+i.e. when namespace processing is in effect. The <code>do_nst</code>
+sets whether or not prefixes are returned with names qualified with a
+namespace prefix. If this function is called with <code>do_nst</code>
+non-zero, then afterwards namespace qualified names (that is qualified
+with a prefix as opposed to belonging to a default namespace) are
+returned as a triplet with the three parts separated by the namespace
+separator specified when the parser was created.  The order of
+returned parts is URI, local name, and prefix.</p> <p>If
+<code>do_nst</code> is zero, then namespaces are reported in the
+default manner, URI then local_name separated by the namespace
+separator.</p>
+</div>
+
+<pre class="fcndec" id="XML_DefaultCurrent">
+void XMLCALL
+XML_DefaultCurrent(XML_Parser parser);
+</pre>
+<div class="fcndef">
+This can be called within a handler for a start element, end element,
+processing instruction or character data.  It causes the corresponding
+markup to be passed to the default handler set by <code><a
+href="#XML_SetDefaultHandler" >XML_SetDefaultHandler</a></code> or
+<code><a href="#XML_SetDefaultHandlerExpand"
+>XML_SetDefaultHandlerExpand</a></code>.  It does nothing if there is
+not a default handler.
+</div>
+
+<pre class="fcndec" id="XML_ExpatVersion">
+XML_LChar * XMLCALL
+XML_ExpatVersion();
+</pre>
+<div class="fcndef">
+Return the library version as a string (e.g. <code>"expat_1.95.1"</code>).
+</div>
+
+<pre class="fcndec" id="XML_ExpatVersionInfo">
+struct XML_Expat_Version XMLCALL
+XML_ExpatVersionInfo();
+</pre>
+<pre class="signature">
+typedef struct {
+  int major;
+  int minor;
+  int micro;
+} XML_Expat_Version;
+</pre>
+<div class="fcndef">
+Return the library version information as a structure.
+Some macros are also defined that support compile-time tests of the
+library version:
+<ul>
+<li><code>XML_MAJOR_VERSION</code></li>
+<li><code>XML_MINOR_VERSION</code></li>
+<li><code>XML_MICRO_VERSION</code></li>
+</ul>
+Testing these constants is currently the best way to determine if
+particular parts of the Expat API are available.
+</div>
+
+<pre class="fcndec" id="XML_GetFeatureList">
+const XML_Feature * XMLCALL
+XML_GetFeatureList();
+</pre>
+<pre class="signature">
+enum XML_FeatureEnum {
+  XML_FEATURE_END = 0,
+  XML_FEATURE_UNICODE,
+  XML_FEATURE_UNICODE_WCHAR_T,
+  XML_FEATURE_DTD,
+  XML_FEATURE_CONTEXT_BYTES,
+  XML_FEATURE_MIN_SIZE,
+  XML_FEATURE_SIZEOF_XML_CHAR,
+  XML_FEATURE_SIZEOF_XML_LCHAR
+};
+
+typedef struct {
+  enum XML_FeatureEnum  feature;
+  XML_LChar            *name;
+  long int              value;
+} XML_Feature;
+</pre>
+<div class="fcndef">
+<p>Returns a list of "feature" records, providing details on how
+Expat was configured at compile time.  Most applications should not
+need to worry about this, but this information is otherwise not
+available from Expat.  This function allows code that does need to
+check these features to do so at runtime.</p>
+
+<p>The return value is an array of <code>XML_Feature</code>,
+terminated by a record with a <code>feature</code> of
+<code>XML_FEATURE_END</code> and <code>name</code> of NULL,
+identifying the feature-test macros Expat was compiled with.  Since an
+application that requires this kind of information needs to determine
+the type of character the <code>name</code> points to, records for the
+<code>XML_FEATURE_SIZEOF_XML_CHAR</code> and
+<code>XML_FEATURE_SIZEOF_XML_LCHAR</code> will be located at the
+beginning of the list, followed by <code>XML_FEATURE_UNICODE</code>
+and <code>XML_FEATURE_UNICODE_WCHAR_T</code>, if they are present at
+all.</p>
+
+<p>Some features have an associated value.  If there isn't an
+associated value, the <code>value</code> field is set to 0.  At this
+time, the following features have been defined to have values:</p>
+
+<dl>
+  <dt><code>XML_FEATURE_SIZEOF_XML_CHAR</code></dt>
+  <dd>The number of bytes occupied by one <code>XML_Char</code>
+  character.</dd>
+  <dt><code>XML_FEATURE_SIZEOF_XML_LCHAR</code></dt>
+  <dd>The number of bytes occupied by one <code>XML_LChar</code>
+  character.</dd>
+  <dt><code>XML_FEATURE_CONTEXT_BYTES</code></dt>
+  <dd>The maximum number of characters of context which can be
+  reported by <code><a href= "#XML_GetInputContext"
+  >XML_GetInputContext</a></code>.</dd>
+</dl>
+</div>
+
+<pre class="fcndec" id="XML_FreeContentModel">
+void XMLCALL
+XML_FreeContentModel(XML_Parser parser, XML_Content *model);
+</pre>
+<div class="fcndef">
+Function to deallocate the <code>model</code> argument passed to the
+<code>XML_ElementDeclHandler</code> callback set using <code><a
+href="#XML_SetElementDeclHandler" >XML_ElementDeclHandler</a></code>.
+This function should not be used for any other purpose.
+</div>
+
+<p>The following functions allow external code to share the memory
+allocator an <code>XML_Parser</code> has been configured to use.  This
+is especially useful for third-party libraries that interact with a
+parser object created by application code, or heavily layered
+applications.  This can be essential when using dynamically loaded
+libraries which use different C standard libraries (this can happen on
+Windows, at least).</p>
+
+<pre class="fcndec" id="XML_MemMalloc">
+void * XMLCALL
+XML_MemMalloc(XML_Parser parser, size_t size);
+</pre>
+<div class="fcndef">
+Allocate <code>size</code> bytes of memory using the allocator the
+<code>parser</code> object has been configured to use.  Returns a
+pointer to the memory or NULL on failure.  Memory allocated in this
+way must be freed using <code><a href="#XML_MemFree"
+>XML_MemFree</a></code>.
+</div>
+
+<pre class="fcndec" id="XML_MemRealloc">
+void * XMLCALL
+XML_MemRealloc(XML_Parser parser, void *ptr, size_t size);
+</pre>
+<div class="fcndef">
+Allocate <code>size</code> bytes of memory using the allocator the
+<code>parser</code> object has been configured to use.
+<code>ptr</code> must point to a block of memory allocated by <code><a
+href="#XML_MemMalloc" >XML_MemMalloc</a></code> or
+<code>XML_MemRealloc</code>, or be NULL.  This function tries to
+expand the block pointed to by <code>ptr</code> if possible.  Returns
+a pointer to the memory or NULL on failure.  On success, the original
+block has either been expanded or freed.  On failure, the original
+block has not been freed; the caller is responsible for freeing the
+original block.  Memory allocated in this way must be freed using
+<code><a href="#XML_MemFree"
+>XML_MemFree</a></code>.
+</div>
+
+<pre class="fcndec" id="XML_MemFree">
+void XMLCALL
+XML_MemFree(XML_Parser parser, void *ptr);
+</pre>
+<div class="fcndef">
+Free a block of memory pointed to by <code>ptr</code>.  The block must
+have been allocated by <code><a href="#XML_MemMalloc"
+>XML_MemMalloc</a></code> or <code>XML_MemRealloc</code>, or be NULL.
+</div>
+
+<hr />
+<p><a href="http://validator.w3.org/check/referer"><img
+        src="valid-xhtml10.png" alt="Valid XHTML 1.0!"
+        height="31" width="88" class="noborder" /></a></p>
+</div>
+</body>
+</html>
diff --git a/reactos/lib/3rdparty/expat/doc/style.css b/reactos/lib/3rdparty/expat/doc/style.css
new file mode 100644 (file)
index 0000000..69df30b
--- /dev/null
@@ -0,0 +1,101 @@
+body {
+  background-color: white;
+  border: 0px;
+  margin: 0px;
+  padding: 0px;
+}
+
+.corner {
+  width: 200px;
+  height: 80px;
+  text-align: center;
+}
+
+.banner {
+  background-color: rgb(110,139,61);
+  color: rgb(255,236,176);
+  padding-left: 2em;
+}
+
+.banner h1 {
+  font-size: 200%;
+}
+
+.content {
+  padding: 0em 2em 1em 2em;
+}
+
+.releaseno {
+  background-color: rgb(110,139,61);
+  color: rgb(255,236,176);
+  padding-bottom: 0.3em;
+  padding-top: 0.5em;
+  text-align: center;
+  font-weight: bold;
+}
+
+.noborder {
+  border-width: 0px;
+}
+
+.eg {
+  padding-left: 1em;
+  padding-top: .5em;
+  padding-bottom: .5em;
+  border: solid thin;
+  margin: 1em 0;
+  background-color: tan;
+  margin-left: 2em;
+  margin-right: 10%;
+}
+
+.pseudocode {
+  padding-left: 1em;
+  padding-top: .5em;
+  padding-bottom: .5em;
+  border: solid thin;
+  margin: 1em 0;
+  background-color: rgb(250,220,180);
+  margin-left: 2em;
+  margin-right: 10%;
+}
+
+.handler {
+  width: 100%;
+  border-top-width: thin;  
+  margin-bottom: 1em;
+}
+
+.handler p {
+  margin-left: 2em;
+}
+
+.setter {
+  font-weight: bold;
+}
+
+.signature {
+  color: navy;
+}
+
+.fcndec {
+  width: 100%;
+  border-top-width: thin;
+  font-weight: bold;
+}
+
+.fcndef {
+  margin-left: 2em;
+  margin-bottom: 2em;
+}
+
+dd {
+  margin-bottom: 2em;
+}
+
+.cpp-symbols dt {
+  font-family: monospace;
+}
+.cpp-symbols dd {
+  margin-bottom: 1em;
+}
diff --git a/reactos/lib/3rdparty/expat/doc/valid-xhtml10.png b/reactos/lib/3rdparty/expat/doc/valid-xhtml10.png
new file mode 100644 (file)
index 0000000..2275ee6
Binary files /dev/null and b/reactos/lib/3rdparty/expat/doc/valid-xhtml10.png differ
diff --git a/reactos/lib/3rdparty/expat/doc/xmlwf.1 b/reactos/lib/3rdparty/expat/doc/xmlwf.1
new file mode 100644 (file)
index 0000000..907d6c3
--- /dev/null
@@ -0,0 +1,251 @@
+.\" This manpage has been automatically generated by docbook2man 
+.\" from a DocBook document.  This tool can be found at:
+.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> 
+.\" Please send any bug reports, improvements, comments, patches, 
+.\" etc. to Steve Cheng <steve@ggi-project.org>.
+.TH "XMLWF" "1" "24 January 2003" "" ""
+.SH NAME
+xmlwf \- Determines if an XML document is well-formed
+.SH SYNOPSIS
+
+\fBxmlwf\fR [ \fB-s\fR]  [ \fB-n\fR]  [ \fB-p\fR]  [ \fB-x\fR]  [ \fB-e \fIencoding\fB\fR]  [ \fB-w\fR]  [ \fB-d \fIoutput-dir\fB\fR]  [ \fB-c\fR]  [ \fB-m\fR]  [ \fB-r\fR]  [ \fB-t\fR]  [ \fB-v\fR]  [ \fBfile ...\fR] 
+
+.SH "DESCRIPTION"
+.PP
+\fBxmlwf\fR uses the Expat library to
+determine if an XML document is well-formed.  It is
+non-validating.
+.PP
+If you do not specify any files on the command-line, and you
+have a recent version of \fBxmlwf\fR, the
+input file will be read from standard input.
+.SH "WELL-FORMED DOCUMENTS"
+.PP
+A well-formed document must adhere to the
+following rules:
+.TP 0.2i
+\(bu
+The file begins with an XML declaration.  For instance,
+<?xml version="1.0" standalone="yes"?>.
+\fBNOTE:\fR
+\fBxmlwf\fR does not currently
+check for a valid XML declaration.
+.TP 0.2i
+\(bu
+Every start tag is either empty (<tag/>)
+or has a corresponding end tag.
+.TP 0.2i
+\(bu
+There is exactly one root element.  This element must contain
+all other elements in the document.  Only comments, white
+space, and processing instructions may come after the close
+of the root element.
+.TP 0.2i
+\(bu
+All elements nest properly.
+.TP 0.2i
+\(bu
+All attribute values are enclosed in quotes (either single
+or double).
+.PP
+If the document has a DTD, and it strictly complies with that
+DTD, then the document is also considered \fBvalid\fR.
+\fBxmlwf\fR is a non-validating parser --
+it does not check the DTD.  However, it does support
+external entities (see the \fB-x\fR option).
+.SH "OPTIONS"
+.PP
+When an option includes an argument, you may specify the argument either
+separately ("\fB-d\fR output") or concatenated with the
+option ("\fB-d\fRoutput").  \fBxmlwf\fR
+supports both.
+.TP
+\fB-c\fR
+If the input file is well-formed and \fBxmlwf\fR
+doesn't encounter any errors, the input file is simply copied to
+the output directory unchanged.
+This implies no namespaces (turns off \fB-n\fR) and
+requires \fB-d\fR to specify an output file.
+.TP
+\fB-d output-dir\fR
+Specifies a directory to contain transformed
+representations of the input files.
+By default, \fB-d\fR outputs a canonical representation
+(described below).
+You can select different output formats using \fB-c\fR
+and \fB-m\fR.
+
+The output filenames will
+be exactly the same as the input filenames or "STDIN" if the input is
+coming from standard input.  Therefore, you must be careful that the
+output file does not go into the same directory as the input
+file.  Otherwise, \fBxmlwf\fR will delete the
+input file before it generates the output file (just like running
+cat < file > file in most shells).
+
+Two structurally equivalent XML documents have a byte-for-byte
+identical canonical XML representation.
+Note that ignorable white space is considered significant and
+is treated equivalently to data.
+More on canonical XML can be found at
+http://www.jclark.com/xml/canonxml.html .
+.TP
+\fB-e encoding\fR
+Specifies the character encoding for the document, overriding
+any document encoding declaration.  \fBxmlwf\fR
+supports four built-in encodings:
+US-ASCII,
+UTF-8,
+UTF-16, and
+ISO-8859-1.
+Also see the \fB-w\fR option.
+.TP
+\fB-m\fR
+Outputs some strange sort of XML file that completely
+describes the the input file, including character postitions.
+Requires \fB-d\fR to specify an output file.
+.TP
+\fB-n\fR
+Turns on namespace processing.  (describe namespaces)
+\fB-c\fR disables namespaces.
+.TP
+\fB-p\fR
+Tells xmlwf to process external DTDs and parameter
+entities.
+
+Normally \fBxmlwf\fR never parses parameter
+entities.  \fB-p\fR tells it to always parse them.
+\fB-p\fR implies \fB-x\fR.
+.TP
+\fB-r\fR
+Normally \fBxmlwf\fR memory-maps the XML file
+before parsing; this can result in faster parsing on many
+platforms.
+\fB-r\fR turns off memory-mapping and uses normal file
+IO calls instead.
+Of course, memory-mapping is automatically turned off
+when reading from standard input.
+
+Use of memory-mapping can cause some platforms to report
+substantially higher memory usage for
+\fBxmlwf\fR, but this appears to be a matter of
+the operating system reporting memory in a strange way; there is
+not a leak in \fBxmlwf\fR.
+.TP
+\fB-s\fR
+Prints an error if the document is not standalone. 
+A document is standalone if it has no external subset and no
+references to parameter entities.
+.TP
+\fB-t\fR
+Turns on timings.  This tells Expat to parse the entire file,
+but not perform any processing.
+This gives a fairly accurate idea of the raw speed of Expat itself
+without client overhead.
+\fB-t\fR turns off most of the output options
+(\fB-d\fR, \fB-m\fR, \fB-c\fR,
+\&...).
+.TP
+\fB-v\fR
+Prints the version of the Expat library being used, including some
+information on the compile-time configuration of the library, and
+then exits.
+.TP
+\fB-w\fR
+Enables support for Windows code pages.
+Normally, \fBxmlwf\fR will throw an error if it
+runs across an encoding that it is not equipped to handle itself.  With
+\fB-w\fR, xmlwf will try to use a Windows code
+page.  See also \fB-e\fR.
+.TP
+\fB-x\fR
+Turns on parsing external entities.
+
+Non-validating parsers are not required to resolve external
+entities, or even expand entities at all.
+Expat always expands internal entities (?),
+but external entity parsing must be enabled explicitly.
+
+External entities are simply entities that obtain their
+data from outside the XML file currently being parsed.
+
+This is an example of an internal entity:
+
+.nf
+<!ENTITY vers '1.0.2'>
+.fi
+
+And here are some examples of external entities:
+
+.nf
+<!ENTITY header SYSTEM "header-&vers;.xml">  (parsed)
+<!ENTITY logo SYSTEM "logo.png" PNG>         (unparsed)
+.fi
+.TP
+\fB--\fR
+(Two hyphens.)
+Terminates the list of options.  This is only needed if a filename
+starts with a hyphen.  For example:
+
+.nf
+xmlwf -- -myfile.xml
+.fi
+
+will run \fBxmlwf\fR on the file
+\fI-myfile.xml\fR.
+.PP
+Older versions of \fBxmlwf\fR do not support
+reading from standard input.
+.SH "OUTPUT"
+.PP
+If an input file is not well-formed,
+\fBxmlwf\fR prints a single line describing
+the problem to standard output.  If a file is well formed,
+\fBxmlwf\fR outputs nothing.
+Note that the result code is \fBnot\fR set.
+.SH "BUGS"
+.PP
+According to the W3C standard, an XML file without a
+declaration at the beginning is not considered well-formed.
+However, \fBxmlwf\fR allows this to pass.
+.PP
+\fBxmlwf\fR returns a 0 - noerr result,
+even if the file is not well-formed.  There is no good way for
+a program to use \fBxmlwf\fR to quickly
+check a file -- it must parse \fBxmlwf\fR's
+standard output.
+.PP
+The errors should go to standard error, not standard output.
+.PP
+There should be a way to get \fB-d\fR to send its
+output to standard output rather than forcing the user to send
+it to a file.
+.PP
+I have no idea why anyone would want to use the
+\fB-d\fR, \fB-c\fR, and
+\fB-m\fR options.  If someone could explain it to
+me, I'd like to add this information to this manpage.
+.SH "ALTERNATIVES"
+.PP
+Here are some XML validators on the web:
+
+.nf
+http://www.hcrc.ed.ac.uk/~richard/xml-check.html
+http://www.stg.brown.edu/service/xmlvalid/
+http://www.scripting.com/frontier5/xml/code/xmlValidator.html
+http://www.xml.com/pub/a/tools/ruwf/check.html
+.fi
+.SH "SEE ALSO"
+.PP
+
+.nf
+The Expat home page:        http://www.libexpat.org/
+The W3 XML specification:   http://www.w3.org/TR/REC-xml
+.fi
+.SH "AUTHOR"
+.PP
+This manual page was written by Scott Bronson <bronson@rinspin.com> for
+the Debian GNU/Linux system (but may be used by others).  Permission is
+granted to copy, distribute and/or modify this document under
+the terms of the GNU Free Documentation
+License, Version 1.1.
diff --git a/reactos/lib/3rdparty/expat/doc/xmlwf.sgml b/reactos/lib/3rdparty/expat/doc/xmlwf.sgml
new file mode 100644 (file)
index 0000000..139c95e
--- /dev/null
@@ -0,0 +1,473 @@
+<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+
+<!-- Process this file with docbook-to-man to generate an nroff manual
+     page: `docbook-to-man manpage.sgml > manpage.1'.  You may view
+     the manual page with: `docbook-to-man manpage.sgml | nroff -man |
+     less'.  A typical entry in a Makefile or Makefile.am is:
+
+manpage.1: manpage.sgml
+       docbook-to-man $< > $@
+  -->
+
+  <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+  <!ENTITY dhfirstname "<firstname>Scott</firstname>">
+  <!ENTITY dhsurname   "<surname>Bronson</surname>">
+  <!-- Please adjust the date whenever revising the manpage. -->
+  <!ENTITY dhdate      "<date>December  5, 2001</date>">
+  <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
+       allowed: see man(7), man(1). -->
+  <!ENTITY dhsection   "<manvolnum>1</manvolnum>">
+  <!ENTITY dhemail     "<email>bronson@rinspin.com</email>">
+  <!ENTITY dhusername  "Scott Bronson">
+  <!ENTITY dhucpackage "<refentrytitle>XMLWF</refentrytitle>">
+  <!ENTITY dhpackage   "xmlwf">
+
+  <!ENTITY debian      "<productname>Debian GNU/Linux</productname>">
+  <!ENTITY gnu         "<acronym>GNU</acronym>">
+]>
+
+<refentry>
+  <refentryinfo>
+    <address>
+      &dhemail;
+    </address>
+    <author>
+      &dhfirstname;
+      &dhsurname;
+    </author>
+    <copyright>
+      <year>2001</year>
+      <holder>&dhusername;</holder>
+    </copyright>
+    &dhdate;
+  </refentryinfo>
+  <refmeta>
+    &dhucpackage;
+
+    &dhsection;
+  </refmeta>
+  <refnamediv>
+    <refname>&dhpackage;</refname>
+
+    <refpurpose>Determines if an XML document is well-formed</refpurpose>
+  </refnamediv>
+  <refsynopsisdiv>
+    <cmdsynopsis>
+      <command>&dhpackage;</command>
+         <arg><option>-s</option></arg>
+         <arg><option>-n</option></arg>
+         <arg><option>-p</option></arg>
+         <arg><option>-x</option></arg>
+
+         <arg><option>-e <replaceable>encoding</replaceable></option></arg>
+         <arg><option>-w</option></arg>
+
+         <arg><option>-d <replaceable>output-dir</replaceable></option></arg>
+         <arg><option>-c</option></arg>
+         <arg><option>-m</option></arg>
+
+         <arg><option>-r</option></arg>
+         <arg><option>-t</option></arg>
+
+         <arg><option>-v</option></arg>
+
+         <arg>file ...</arg>
+    </cmdsynopsis>
+  </refsynopsisdiv>
+  <refsect1>
+    <title>DESCRIPTION</title>
+
+    <para>
+       <command>&dhpackage;</command> uses the Expat library to
+       determine if an XML document is well-formed.  It is
+       non-validating.
+       </para>
+
+       <para>
+       If you do not specify any files on the command-line, and you
+       have a recent version of <command>&dhpackage;</command>, the
+       input file will be read from standard input.
+       </para>
+
+  </refsect1>
+
+  <refsect1>
+    <title>WELL-FORMED DOCUMENTS</title>
+
+       <para>
+         A well-formed document must adhere to the
+         following rules:
+       </para>
+
+       <itemizedlist>
+      <listitem><para>
+           The file begins with an XML declaration.  For instance,
+               <literal>&lt;?xml version="1.0" standalone="yes"?&gt;</literal>.
+               <emphasis>NOTE:</emphasis>
+               <command>&dhpackage;</command> does not currently
+               check for a valid XML declaration.
+      </para></listitem>
+      <listitem><para>
+               Every start tag is either empty (&lt;tag/&gt;)
+               or has a corresponding end tag.
+      </para></listitem>
+      <listitem><para>
+           There is exactly one root element.  This element must contain
+               all other elements in the document.  Only comments, white
+               space, and processing instructions may come after the close
+               of the root element.
+      </para></listitem>
+      <listitem><para>
+               All elements nest properly.
+      </para></listitem>
+      <listitem><para>
+               All attribute values are enclosed in quotes (either single
+               or double).
+      </para></listitem>
+    </itemizedlist>
+
+       <para>
+         If the document has a DTD, and it strictly complies with that
+         DTD, then the document is also considered <emphasis>valid</emphasis>.
+         <command>&dhpackage;</command> is a non-validating parser --
+         it does not check the DTD.  However, it does support
+         external entities (see the <option>-x</option> option).
+       </para>
+  </refsect1>
+
+  <refsect1>
+    <title>OPTIONS</title>
+
+<para>
+When an option includes an argument, you may specify the argument either
+separately ("<option>-d</option> output") or concatenated with the
+option ("<option>-d</option>output").  <command>&dhpackage;</command>
+supports both.
+</para>
+
+    <variablelist>
+
+      <varlistentry>
+        <term><option>-c</option></term>
+        <listitem>
+               <para>
+  If the input file is well-formed and <command>&dhpackage;</command>
+  doesn't encounter any errors, the input file is simply copied to
+  the output directory unchanged.
+  This implies no namespaces (turns off <option>-n</option>) and
+  requires <option>-d</option> to specify an output file.
+               </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-d output-dir</option></term>
+        <listitem>
+               <para>
+  Specifies a directory to contain transformed
+  representations of the input files.
+  By default, <option>-d</option> outputs a canonical representation
+  (described below).
+  You can select different output formats using <option>-c</option>
+  and <option>-m</option>.
+         </para>
+         <para>
+  The output filenames will
+  be exactly the same as the input filenames or "STDIN" if the input is
+  coming from standard input.  Therefore, you must be careful that the
+  output file does not go into the same directory as the input
+  file.  Otherwise, <command>&dhpackage;</command> will delete the
+  input file before it generates the output file (just like running
+  <literal>cat &lt; file &gt; file</literal> in most shells).
+         </para>
+         <para> 
+  Two structurally equivalent XML documents have a byte-for-byte
+  identical canonical XML representation.
+  Note that ignorable white space is considered significant and
+  is treated equivalently to data.
+  More on canonical XML can be found at
+  http://www.jclark.com/xml/canonxml.html .
+         </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-e encoding</option></term>
+        <listitem>
+               <para>
+   Specifies the character encoding for the document, overriding
+   any document encoding declaration.  <command>&dhpackage;</command>
+   supports four built-in encodings:
+       <literal>US-ASCII</literal>,
+       <literal>UTF-8</literal>,
+       <literal>UTF-16</literal>, and
+       <literal>ISO-8859-1</literal>.
+   Also see the <option>-w</option> option.
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-m</option></term>
+        <listitem>
+               <para>
+  Outputs some strange sort of XML file that completely
+  describes the the input file, including character postitions.
+  Requires <option>-d</option> to specify an output file.
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-n</option></term>
+        <listitem>
+               <para>
+  Turns on namespace processing.  (describe namespaces)
+  <option>-c</option> disables namespaces.
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-p</option></term>
+        <listitem>
+               <para>
+    Tells xmlwf to process external DTDs and parameter
+    entities.
+        </para>
+        <para>
+   Normally <command>&dhpackage;</command> never parses parameter
+   entities.  <option>-p</option> tells it to always parse them.
+   <option>-p</option> implies <option>-x</option>.
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-r</option></term>
+        <listitem>
+               <para>
+   Normally <command>&dhpackage;</command> memory-maps the XML file
+   before parsing; this can result in faster parsing on many
+   platforms.
+   <option>-r</option> turns off memory-mapping and uses normal file
+   IO calls instead.
+   Of course, memory-mapping is automatically turned off
+   when reading from standard input.
+          </para>
+               <para>
+   Use of memory-mapping can cause some platforms to report
+   substantially higher memory usage for
+   <command>&dhpackage;</command>, but this appears to be a matter of
+   the operating system reporting memory in a strange way; there is
+   not a leak in <command>&dhpackage;</command>.
+           </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-s</option></term>
+        <listitem>
+               <para>
+  Prints an error if the document is not standalone. 
+  A document is standalone if it has no external subset and no
+  references to parameter entities.
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-t</option></term>
+        <listitem>
+               <para>
+  Turns on timings.  This tells Expat to parse the entire file,
+  but not perform any processing.
+  This gives a fairly accurate idea of the raw speed of Expat itself
+  without client overhead.
+  <option>-t</option> turns off most of the output options
+  (<option>-d</option>, <option>-m</option>, <option>-c</option>,
+  ...).
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-v</option></term>
+        <listitem>
+               <para>
+  Prints the version of the Expat library being used, including some
+  information on the compile-time configuration of the library, and
+  then exits.
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-w</option></term>
+        <listitem>
+               <para>
+  Enables support for Windows code pages.
+  Normally, <command>&dhpackage;</command> will throw an error if it
+  runs across an encoding that it is not equipped to handle itself.  With
+  <option>-w</option>, &dhpackage; will try to use a Windows code
+  page.  See also <option>-e</option>.
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-x</option></term>
+        <listitem>
+               <para>
+  Turns on parsing external entities.
+  </para>
+<para>
+  Non-validating parsers are not required to resolve external
+  entities, or even expand entities at all.
+  Expat always expands internal entities (?),
+  but external entity parsing must be enabled explicitly.
+  </para>
+  <para>
+  External entities are simply entities that obtain their
+  data from outside the XML file currently being parsed.
+  </para>
+  <para>
+  This is an example of an internal entity:
+<literallayout>
+&lt;!ENTITY vers '1.0.2'&gt;
+</literallayout>
+  </para>
+  <para>
+  And here are some examples of external entities:
+
+<literallayout>
+&lt;!ENTITY header SYSTEM "header-&amp;vers;.xml"&gt;  (parsed)
+&lt;!ENTITY logo SYSTEM "logo.png" PNG&gt;         (unparsed)
+</literallayout>
+
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--</option></term>
+        <listitem>
+               <para>
+    (Two hyphens.)
+    Terminates the list of options.  This is only needed if a filename
+    starts with a hyphen.  For example:
+          </para>
+<literallayout>
+&dhpackage; -- -myfile.xml
+</literallayout>
+               <para>
+    will run <command>&dhpackage;</command> on the file
+    <filename>-myfile.xml</filename>.
+          </para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+
+       <para>
+    Older versions of <command>&dhpackage;</command> do not support
+    reading from standard input.
+       </para>
+  </refsect1>
+
+  <refsect1>
+  <title>OUTPUT</title>
+    <para>
+       If an input file is not well-formed,
+       <command>&dhpackage;</command> prints a single line describing
+       the problem to standard output.  If a file is well formed,
+       <command>&dhpackage;</command> outputs nothing.
+       Note that the result code is <emphasis>not</emphasis> set.
+       </para>
+  </refsect1>
+  
+  <refsect1>
+    <title>BUGS</title>
+       <para>
+       According to the W3C standard, an XML file without a
+       declaration at the beginning is not considered well-formed.
+       However, <command>&dhpackage;</command> allows this to pass.
+       </para>
+       <para>
+       <command>&dhpackage;</command> returns a 0 - noerr result,
+       even if the file is not well-formed.  There is no good way for
+       a program to use <command>&dhpackage;</command> to quickly
+       check a file -- it must parse <command>&dhpackage;</command>'s
+       standard output.
+       </para>
+       <para>
+       The errors should go to standard error, not standard output.
+       </para>
+       <para>
+       There should be a way to get <option>-d</option> to send its
+       output to standard output rather than forcing the user to send
+       it to a file.
+       </para>
+       <para>
+       I have no idea why anyone would want to use the
+       <option>-d</option>, <option>-c</option>, and
+       <option>-m</option> options.  If someone could explain it to
+       me, I'd like to add this information to this manpage.
+       </para>
+  </refsect1>
+
+  <refsect1>
+    <title>ALTERNATIVES</title>
+       <para>
+         Here are some XML validators on the web:
+
+<literallayout>
+http://www.hcrc.ed.ac.uk/~richard/xml-check.html
+http://www.stg.brown.edu/service/xmlvalid/
+http://www.scripting.com/frontier5/xml/code/xmlValidator.html
+http://www.xml.com/pub/a/tools/ruwf/check.html
+</literallayout>
+
+                </para>
+  </refsect1>
+
+  <refsect1>
+    <title>SEE ALSO</title>
+       <para>
+
+<literallayout>
+The Expat home page:        http://www.libexpat.org/
+The W3 XML specification:   http://www.w3.org/TR/REC-xml
+</literallayout>
+
+       </para>
+  </refsect1>
+
+  <refsect1>
+    <title>AUTHOR</title>
+    <para>
+         This manual page was written by &dhusername; &dhemail; for
+      the &debian; system (but may be used by others).  Permission is
+      granted to copy, distribute and/or modify this document under
+      the terms of the <acronym>GNU</acronym> Free Documentation
+      License, Version 1.1.
+       </para>
+  </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:2
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->
diff --git a/reactos/lib/3rdparty/expat/examples/elements.c b/reactos/lib/3rdparty/expat/examples/elements.c
new file mode 100644 (file)
index 0000000..421a1ce
--- /dev/null
@@ -0,0 +1,67 @@
+/* This is simple demonstration of how to use expat. This program
+   reads an XML document from standard input and writes a line with
+   the name of each element to standard output indenting child
+   elements by one tab stop more than their parent element.
+   It must be used with Expat compiled for UTF-8 output.
+*/
+
+#include <stdio.h>
+#include "expat.h"
+
+#ifdef XML_LARGE_SIZE
+#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
+#define XML_FMT_INT_MOD "I64"
+#else
+#define XML_FMT_INT_MOD "ll"
+#endif
+#else
+#define XML_FMT_INT_MOD "l"
+#endif
+
+static void XMLCALL
+startElement(void *userData, const char *name, const char **atts)
+{
+  int i;
+  int *depthPtr = (int *)userData;
+  for (i = 0; i < *depthPtr; i++)
+    putchar('\t');
+  puts(name);
+  *depthPtr += 1;
+}
+
+static void XMLCALL
+endElement(void *userData, const char *name)
+{
+  int *depthPtr = (int *)userData;
+  *depthPtr -= 1;
+}
+
+#ifdef AMIGA_SHARED_LIB
+#include <proto/expat.h>
+int
+amiga_main(int argc, char *argv[])
+#else
+int
+main(int argc, char *argv[])
+#endif
+{
+  char buf[BUFSIZ];
+  XML_Parser parser = XML_ParserCreate(NULL);
+  int done;
+  int depth = 0;
+  XML_SetUserData(parser, &depth);
+  XML_SetElementHandler(parser, startElement, endElement);
+  do {
+    size_t len = fread(buf, 1, sizeof(buf), stdin);
+    done = len < sizeof(buf);
+    if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
+      fprintf(stderr,
+              "%s at line %" XML_FMT_INT_MOD "u\n",
+              XML_ErrorString(XML_GetErrorCode(parser)),
+              XML_GetCurrentLineNumber(parser));
+      return 1;
+    }
+  } while (!done);
+  XML_ParserFree(parser);
+  return 0;
+}
diff --git a/reactos/lib/3rdparty/expat/examples/elements.dsp b/reactos/lib/3rdparty/expat/examples/elements.dsp
new file mode 100644 (file)
index 0000000..57ac706
--- /dev/null
@@ -0,0 +1,103 @@
+# Microsoft Developer Studio Project File - Name="elements" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=elements - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "elements.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "elements.mak" CFG="elements - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "elements - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "elements - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "elements - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\lib" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "XML_STATIC" /FD /c\r
+# SUBTRACT CPP /X /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 odbccp32.lib libexpatMT.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib /nologo /subsystem:console /pdb:none /machine:I386 /libpath:"..\lib\Release_static"\r
+\r
+!ELSEIF  "$(CFG)" == "elements - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /I "..\lib" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "XML_STATIC" /FR /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 odbccp32.lib libexpatMT.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib /nologo /subsystem:console /pdb:none /debug /machine:I386 /libpath:"..\lib\Debug_static"\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "elements - Win32 Release"\r
+# Name "elements - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\elements.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/reactos/lib/3rdparty/expat/examples/elements.vcproj b/reactos/lib/3rdparty/expat/examples/elements.vcproj
new file mode 100644 (file)
index 0000000..da6389c
--- /dev/null
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="7.10"\r
+       Name="elements"\r
+       SccProjectName=""\r
+       SccLocalPath="">\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"/>\r
+       </Platforms>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory=".\Debug"\r
+                       IntermediateDirectory=".\Debug"\r
+                       ConfigurationType="1"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\lib"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;XML_STATIC"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               PrecompiledHeaderFile=".\Debug/elements.pch"\r
+                               AssemblerListingLocation=".\Debug/"\r
+                               ObjectFile=".\Debug/"\r
+                               ProgramDataBaseFileName=".\Debug/"\r
+                               BrowseInformation="1"\r
+                               WarningLevel="3"\r
+                               SuppressStartupBanner="TRUE"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="odbccp32.lib libexpatMT.lib odbc32.lib"\r
+                               OutputFile=".\Debug/elements.exe"\r
+                               LinkIncremental="2"\r
+                               SuppressStartupBanner="TRUE"\r
+                               AdditionalLibraryDirectories="..\lib\Debug_static"\r
+                               GenerateDebugInformation="TRUE"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TypeLibraryName=".\Debug/elements.tlb"\r
+                               HeaderFileName=""/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory=".\Release"\r
+                       IntermediateDirectory=".\Release"\r
+                       ConfigurationType="1"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\lib"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;XML_STATIC"\r
+                               StringPooling="TRUE"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="TRUE"\r
+                               PrecompiledHeaderFile=".\Release/elements.pch"\r
+                               AssemblerListingLocation=".\Release/"\r
+                               ObjectFile=".\Release/"\r
+                               ProgramDataBaseFileName=".\Release/"\r
+                               WarningLevel="3"\r
+                               SuppressStartupBanner="TRUE"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="odbccp32.lib libexpatMT.lib odbc32.lib"\r
+                               OutputFile=".\Release/elements.exe"\r
+                               LinkIncremental="1"\r
+                               SuppressStartupBanner="TRUE"\r
+                               AdditionalLibraryDirectories="..\lib\Release_static"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TypeLibraryName=".\Release/elements.tlb"\r
+                               HeaderFileName=""/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">\r
+                       <File\r
+                               RelativePath="elements.c">\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               BrowseInformation="1"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl">\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/reactos/lib/3rdparty/expat/examples/outline.c b/reactos/lib/3rdparty/expat/examples/outline.c
new file mode 100644 (file)
index 0000000..807ddb8
--- /dev/null
@@ -0,0 +1,107 @@
+/*****************************************************************
+ * outline.c
+ *
+ * Copyright 1999, Clark Cooper
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the license contained in the
+ * COPYING file that comes with the expat distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Read an XML document from standard input and print an element
+ * outline on standard output.
+ * Must be used with Expat compiled for UTF-8 output.
+ */
+
+
+#include <stdio.h>
+#include <expat.h>
+
+#ifdef XML_LARGE_SIZE
+#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
+#define XML_FMT_INT_MOD "I64"
+#else
+#define XML_FMT_INT_MOD "ll"
+#endif
+#else
+#define XML_FMT_INT_MOD "l"
+#endif
+
+#define BUFFSIZE        8192
+
+char Buff[BUFFSIZE];
+
+int Depth;
+
+static void XMLCALL
+start(void *data, const char *el, const char **attr)
+{
+  int i;
+
+  for (i = 0; i < Depth; i++)
+    printf("  ");
+
+  printf("%s", el);
+
+  for (i = 0; attr[i]; i += 2) {
+    printf(" %s='%s'", attr[i], attr[i + 1]);
+  }
+
+  printf("\n");
+  Depth++;
+}
+
+static void XMLCALL
+end(void *data, const char *el)
+{
+  Depth--;
+}
+
+#ifdef AMIGA_SHARED_LIB
+#include <proto/expat.h>
+int
+amiga_main(int argc, char *argv[])
+#else
+int
+main(int argc, char *argv[])
+#endif
+{
+  XML_Parser p = XML_ParserCreate(NULL);
+  if (! p) {
+    fprintf(stderr, "Couldn't allocate memory for parser\n");
+    exit(-1);
+  }
+
+  XML_SetElementHandler(p, start, end);
+
+  for (;;) {
+    int done;
+    int len;
+
+    len = fread(Buff, 1, BUFFSIZE, stdin);
+    if (ferror(stdin)) {
+      fprintf(stderr, "Read error\n");
+      exit(-1);
+    }
+    done = feof(stdin);
+
+    if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {
+      fprintf(stderr, "Parse error at line %" XML_FMT_INT_MOD "u:\n%s\n",
+              XML_GetCurrentLineNumber(p),
+              XML_ErrorString(XML_GetErrorCode(p)));
+      exit(-1);
+    }
+
+    if (done)
+      break;
+  }
+  return 0;
+}
diff --git a/reactos/lib/3rdparty/expat/examples/outline.dsp b/reactos/lib/3rdparty/expat/examples/outline.dsp
new file mode 100644 (file)
index 0000000..7075dbf
--- /dev/null
@@ -0,0 +1,103 @@
+# Microsoft Developer Studio Project File - Name="outline" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=outline - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "outline.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "outline.mak" CFG="outline - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "outline - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "outline - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "outline - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\lib" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c\r
+# SUBTRACT CPP /X /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /machine:I386\r
+\r
+!ELSEIF  "$(CFG)" == "outline - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\lib" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /debug /machine:I386\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "outline - Win32 Release"\r
+# Name "outline - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\outline.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/reactos/lib/3rdparty/expat/examples/outline.vcproj b/reactos/lib/3rdparty/expat/examples/outline.vcproj
new file mode 100644 (file)
index 0000000..255d427
--- /dev/null
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="7.10"\r
+       Name="outline"\r
+       SccProjectName=""\r
+       SccLocalPath="">\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"/>\r
+       </Platforms>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory=".\Debug"\r
+                       IntermediateDirectory=".\Debug"\r
+                       ConfigurationType="1"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\lib"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               PrecompiledHeaderFile=".\Debug/outline.pch"\r
+                               AssemblerListingLocation=".\Debug/"\r
+                               ObjectFile=".\Debug/"\r
+                               ProgramDataBaseFileName=".\Debug/"\r
+                               WarningLevel="3"\r
+                               SuppressStartupBanner="TRUE"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               OutputFile=".\Debug/outline.exe"\r
+                               LinkIncremental="2"\r
+                               SuppressStartupBanner="TRUE"\r
+                               GenerateDebugInformation="TRUE"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TypeLibraryName=".\Debug/outline.tlb"\r
+                               HeaderFileName=""/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory=".\Release"\r
+                       IntermediateDirectory=".\Release"\r
+                       ConfigurationType="1"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE"\r
+                       CharacterSet="2">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\lib"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"\r
+                               StringPooling="TRUE"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="TRUE"\r
+                               PrecompiledHeaderFile=".\Release/outline.pch"\r
+                               AssemblerListingLocation=".\Release/"\r
+                               ObjectFile=".\Release/"\r
+                               ProgramDataBaseFileName=".\Release/"\r
+                               WarningLevel="3"\r
+                               SuppressStartupBanner="TRUE"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               OutputFile=".\Release/outline.exe"\r
+                               LinkIncremental="1"\r
+                               SuppressStartupBanner="TRUE"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TypeLibraryName=".\Release/outline.tlb"\r
+                               HeaderFileName=""/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">\r
+                       <File\r
+                               RelativePath="outline.c">\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl">\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/reactos/lib/3rdparty/expat/examples/poem.rbuild b/reactos/lib/3rdparty/expat/examples/poem.rbuild
new file mode 100644 (file)
index 0000000..f632e80
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<poem> 
+  <line>Roses are red,</line> 
+  <line>Violets are blue.</line> 
+  <line>Sugar is sweet,</line> 
+  <line>and I love you with a line much longer than 15 characters long.</line>
+  <line><![CDATA[ And I am CDATA ]]></line>
+</poem>
index a6ebcbd..f432521 100644 (file)
@@ -1,4 +1,4 @@
-<module name="expat" type="staticlibrary" allowwarnings="true">
+<module name="expat" type="staticlibrary">
        <include base="expat">.</include>
        <include base="expat">lib</include>
        <include base="ReactOS">include/reactos/libs/expat</include>
diff --git a/reactos/lib/3rdparty/expat/gennmtab/gennmtab.c b/reactos/lib/3rdparty/expat/gennmtab/gennmtab.c
new file mode 100644 (file)
index 0000000..8a4ff34
--- /dev/null
@@ -0,0 +1,429 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+#include <string.h>
+#include <stdio.h>
+#include <stddef.h>
+
+struct range {
+  int start;
+  int end;
+};
+
+struct range nmstrt[] = {
+  { '_' },
+  { ':' },
+  /* BaseChar */
+  { 0x0041, 0x005a },
+  { 0x0061, 0x007a },
+  { 0x00c0, 0x00d6 },
+  { 0x00d8, 0x00f6 },
+  { 0x00f8, 0x00ff },
+  { 0x0100, 0x0131 },
+  { 0x0134, 0x013e },
+  { 0x0141, 0x0148 },
+  { 0x014a, 0x017e },
+  { 0x0180, 0x01c3 },
+  { 0x01cd, 0x01f0 },
+  { 0x01f4, 0x01f5 },
+  { 0x01fa, 0x0217 },
+  { 0x0250, 0x02a8 },
+  { 0x02bb, 0x02c1 },
+  { 0x0386 },
+  { 0x0388, 0x038a },
+  { 0x038c },
+  { 0x038e, 0x03a1 },
+  { 0x03a3, 0x03ce },
+  { 0x03d0, 0x03d6 },
+  { 0x03da },
+  { 0x03dc },
+  { 0x03de },
+  { 0x03e0 },
+  { 0x03e2, 0x03f3 },
+  { 0x0401, 0x040c },
+  { 0x040e, 0x044f },
+  { 0x0451, 0x045c },
+  { 0x045e, 0x0481 },
+  { 0x0490, 0x04c4 },
+  { 0x04c7, 0x04c8 },
+  { 0x04cb, 0x04cc },
+  { 0x04d0, 0x04eb },
+  { 0x04ee, 0x04f5 },
+  { 0x04f8, 0x04f9 },
+  { 0x0531, 0x0556 },
+  { 0x0559 },
+  { 0x0561, 0x0586 },
+  { 0x05d0, 0x05ea },
+  { 0x05f0, 0x05f2 },
+  { 0x0621, 0x063a },
+  { 0x0641, 0x064a },
+  { 0x0671, 0x06b7 },
+  { 0x06ba, 0x06be },
+  { 0x06c0, 0x06ce },
+  { 0x06d0, 0x06d3 },
+  { 0x06d5 },
+  { 0x06e5, 0x06e6 },
+  { 0x0905, 0x0939 },
+  { 0x093d },
+  { 0x0958, 0x0961 },
+  { 0x0985, 0x098c },
+  { 0x098f, 0x0990 },
+  { 0x0993, 0x09a8 },
+  { 0x09aa, 0x09b0 },
+  { 0x09b2 },
+  { 0x09b6, 0x09b9 },
+  { 0x09dc, 0x09dd },
+  { 0x09df, 0x09e1 },
+  { 0x09f0, 0x09f1 },
+  { 0x0a05, 0x0a0a },
+  { 0x0a0f, 0x0a10 },
+  { 0x0a13, 0x0a28 },
+  { 0x0a2a, 0x0a30 },
+  { 0x0a32, 0x0a33 },
+  { 0x0a35, 0x0a36 },
+  { 0x0a38, 0x0a39 },
+  { 0x0a59, 0x0a5c },
+  { 0x0a5e },
+  { 0x0a72, 0x0a74 },
+  { 0x0a85, 0x0a8b },
+  { 0x0a8d },
+  { 0x0a8f, 0x0a91 },
+  { 0x0a93, 0x0aa8 },
+  { 0x0aaa, 0x0ab0 },
+  { 0x0ab2, 0x0ab3 },
+  { 0x0ab5, 0x0ab9 },
+  { 0x0abd },
+  { 0x0ae0 },
+  { 0x0b05, 0x0b0c },
+  { 0x0b0f, 0x0b10 },
+  { 0x0b13, 0x0b28 },
+  { 0x0b2a, 0x0b30 },
+  { 0x0b32, 0x0b33 },
+  { 0x0b36, 0x0b39 },
+  { 0x0b3d },
+  { 0x0b5c, 0x0b5d },
+  { 0x0b5f, 0x0b61 },
+  { 0x0b85, 0x0b8a },
+  { 0x0b8e, 0x0b90 },
+  { 0x0b92, 0x0b95 },
+  { 0x0b99, 0x0b9a },
+  { 0x0b9c },
+  { 0x0b9e, 0x0b9f },
+  { 0x0ba3, 0x0ba4 },
+  { 0x0ba8, 0x0baa },
+  { 0x0bae, 0x0bb5 },
+  { 0x0bb7, 0x0bb9 },
+  { 0x0c05, 0x0c0c },
+  { 0x0c0e, 0x0c10 },
+  { 0x0c12, 0x0c28 },
+  { 0x0c2a, 0x0c33 },
+  { 0x0c35, 0x0c39 },
+  { 0x0c60, 0x0c61 },
+  { 0x0c85, 0x0c8c },
+  { 0x0c8e, 0x0c90 },
+  { 0x0c92, 0x0ca8 },
+  { 0x0caa, 0x0cb3 },
+  { 0x0cb5, 0x0cb9 },
+  { 0x0cde },
+  { 0x0ce0, 0x0ce1 },
+  { 0x0d05, 0x0d0c },
+  { 0x0d0e, 0x0d10 },
+  { 0x0d12, 0x0d28 },
+  { 0x0d2a, 0x0d39 },
+  { 0x0d60, 0x0d61 },
+  { 0x0e01, 0x0e2e },
+  { 0x0e30 },
+  { 0x0e32, 0x0e33 },
+  { 0x0e40, 0x0e45 },
+  { 0x0e81, 0x0e82 },
+  { 0x0e84 },
+  { 0x0e87, 0x0e88 },
+  { 0x0e8a },
+  { 0x0e8d },
+  { 0x0e94, 0x0e97 },
+  { 0x0e99, 0x0e9f },
+  { 0x0ea1, 0x0ea3 },
+  { 0x0ea5 },
+  { 0x0ea7 },
+  { 0x0eaa, 0x0eab },
+  { 0x0ead, 0x0eae },
+  { 0x0eb0 },
+  { 0x0eb2, 0x0eb3 },
+  { 0x0ebd },
+  { 0x0ec0, 0x0ec4 },
+  { 0x0f40, 0x0f47 },
+  { 0x0f49, 0x0f69 },
+  { 0x10a0, 0x10c5 },
+  { 0x10d0, 0x10f6 },
+  { 0x1100 },
+  { 0x1102, 0x1103 },
+  { 0x1105, 0x1107 },
+  { 0x1109 },
+  { 0x110b, 0x110c },
+  { 0x110e, 0x1112 },
+  { 0x113c },
+  { 0x113e },
+  { 0x1140 },
+  { 0x114c },
+  { 0x114e },
+  { 0x1150 },
+  { 0x1154, 0x1155 },
+  { 0x1159 },
+  { 0x115f, 0x1161 },
+  { 0x1163 },
+  { 0x1165 },
+  { 0x1167 },
+  { 0x1169 },
+  { 0x116d, 0x116e },
+  { 0x1172, 0x1173 },
+  { 0x1175 },
+  { 0x119e },
+  { 0x11a8 },
+  { 0x11ab },
+  { 0x11ae, 0x11af },
+  { 0x11b7, 0x11b8 },
+  { 0x11ba },
+  { 0x11bc, 0x11c2 },
+  { 0x11eb },
+  { 0x11f0 },
+  { 0x11f9 },
+  { 0x1e00, 0x1e9b },
+  { 0x1ea0, 0x1ef9 },
+  { 0x1f00, 0x1f15 },
+  { 0x1f18, 0x1f1d },
+  { 0x1f20, 0x1f45 },
+  { 0x1f48, 0x1f4d },
+  { 0x1f50, 0x1f57 },
+  { 0x1f59 },
+  { 0x1f5b },
+  { 0x1f5d },
+  { 0x1f5f, 0x1f7d },
+  { 0x1f80, 0x1fb4 },
+  { 0x1fb6, 0x1fbc },
+  { 0x1fbe },
+  { 0x1fc2, 0x1fc4 },
+  { 0x1fc6, 0x1fcc },
+  { 0x1fd0, 0x1fd3 },
+  { 0x1fd6, 0x1fdb },
+  { 0x1fe0, 0x1fec },
+  { 0x1ff2, 0x1ff4 },
+  { 0x1ff6, 0x1ffc },
+  { 0x2126 },
+  { 0x212a, 0x212b },
+  { 0x212e },
+  { 0x2180, 0x2182 },
+  { 0x3041, 0x3094 },
+  { 0x30a1, 0x30fa },
+  { 0x3105, 0x312c },
+  { 0xac00, 0xd7a3 },
+  /* Ideographic */
+  { 0x4e00, 0x9fa5 },
+  { 0x3007 },
+  { 0x3021, 0x3029 },
+};
+
+/* name chars that are not name start chars */
+struct range name[] = {
+  { '.' },
+  { '-' },
+  /* CombiningChar */
+  { 0x0300, 0x0345 },
+  { 0x0360, 0x0361 },
+  { 0x0483, 0x0486 },
+  { 0x0591, 0x05a1 },
+  { 0x05a3, 0x05b9 },
+  { 0x05bb, 0x05bd },
+  { 0x05bf },
+  { 0x05c1, 0x05c2 },
+  { 0x05c4 },
+  { 0x064b, 0x0652 },
+  { 0x0670 },
+  { 0x06d6, 0x06dc },
+  { 0x06dd, 0x06df },
+  { 0x06e0, 0x06e4 },
+  { 0x06e7, 0x06e8 },
+  { 0x06ea, 0x06ed },
+  { 0x0901, 0x0903 },
+  { 0x093c },
+  { 0x093e, 0x094c },
+  { 0x094d },
+  { 0x0951, 0x0954 },
+  { 0x0962, 0x0963 },
+  { 0x0981, 0x0983 },
+  { 0x09bc },
+  { 0x09be },
+  { 0x09bf },
+  { 0x09c0, 0x09c4 },
+  { 0x09c7, 0x09c8 },
+  { 0x09cb, 0x09cd },
+  { 0x09d7 },
+  { 0x09e2, 0x09e3 },
+  { 0x0a02 },
+  { 0x0a3c },
+  { 0x0a3e },
+  { 0x0a3f },
+  { 0x0a40, 0x0a42 },
+  { 0x0a47, 0x0a48 },
+  { 0x0a4b, 0x0a4d },
+  { 0x0a70, 0x0a71 },
+  { 0x0a81, 0x0a83 },
+  { 0x0abc },
+  { 0x0abe, 0x0ac5 },
+  { 0x0ac7, 0x0ac9 },
+  { 0x0acb, 0x0acd },
+  { 0x0b01, 0x0b03 },
+  { 0x0b3c },
+  { 0x0b3e, 0x0b43 },
+  { 0x0b47, 0x0b48 },
+  { 0x0b4b, 0x0b4d },
+  { 0x0b56, 0x0b57 },
+  { 0x0b82, 0x0b83 },
+  { 0x0bbe, 0x0bc2 },
+  { 0x0bc6, 0x0bc8 },
+  { 0x0bca, 0x0bcd },
+  { 0x0bd7 },
+  { 0x0c01, 0x0c03 },
+  { 0x0c3e, 0x0c44 },
+  { 0x0c46, 0x0c48 },
+  { 0x0c4a, 0x0c4d },
+  { 0x0c55, 0x0c56 },
+  { 0x0c82, 0x0c83 },
+  { 0x0cbe, 0x0cc4 },
+  { 0x0cc6, 0x0cc8 },
+  { 0x0cca, 0x0ccd },
+  { 0x0cd5, 0x0cd6 },
+  { 0x0d02, 0x0d03 },
+  { 0x0d3e, 0x0d43 },
+  { 0x0d46, 0x0d48 },
+  { 0x0d4a, 0x0d4d },
+  { 0x0d57 },
+  { 0x0e31 },
+  { 0x0e34, 0x0e3a },
+  { 0x0e47, 0x0e4e },
+  { 0x0eb1 },
+  { 0x0eb4, 0x0eb9 },
+  { 0x0ebb, 0x0ebc },
+  { 0x0ec8, 0x0ecd },
+  { 0x0f18, 0x0f19 },
+  { 0x0f35 },
+  { 0x0f37 },
+  { 0x0f39 },
+  { 0x0f3e },
+  { 0x0f3f },
+  { 0x0f71, 0x0f84 },
+  { 0x0f86, 0x0f8b },
+  { 0x0f90, 0x0f95 },
+  { 0x0f97 },
+  { 0x0f99, 0x0fad },
+  { 0x0fb1, 0x0fb7 },
+  { 0x0fb9 },
+  { 0x20d0, 0x20dc },
+  { 0x20e1 },
+  { 0x302a, 0x302f },
+  { 0x3099 },
+  { 0x309a },
+  /* Digit */
+  { 0x0030, 0x0039 },
+  { 0x0660, 0x0669 },
+  { 0x06f0, 0x06f9 },
+  { 0x0966, 0x096f },
+  { 0x09e6, 0x09ef },
+  { 0x0a66, 0x0a6f },
+  { 0x0ae6, 0x0aef },
+  { 0x0b66, 0x0b6f },
+  { 0x0be7, 0x0bef },
+  { 0x0c66, 0x0c6f },
+  { 0x0ce6, 0x0cef },
+  { 0x0d66, 0x0d6f },
+  { 0x0e50, 0x0e59 },
+  { 0x0ed0, 0x0ed9 },
+  { 0x0f20, 0x0f29 },
+  /* Extender */
+  { 0xb7 },
+  { 0x02d0 },
+  { 0x02d1 },
+  { 0x0387 },
+  { 0x0640 },
+  { 0x0e46 },
+  { 0x0ec6 },
+  { 0x3005 },
+  { 0x3031, 0x3035 },
+  { 0x309d, 0x309e },
+  { 0x30fc, 0x30fe },
+};
+
+static void
+setTab(char *tab, struct range *ranges, size_t nRanges)
+{
+  size_t i;
+  int j;
+  for (i = 0; i < nRanges; i++) {
+    if (ranges[i].end) {
+      for (j = ranges[i].start; j <= ranges[i].end; j++)
+        tab[j] = 1;
+    }
+    else
+      tab[ranges[i].start] = 1;
+  }
+}
+
+static void
+printTabs(char *tab)
+{ 
+  int nBitmaps = 2;
+  int i, j, k;
+  unsigned char pageIndex[512];
+
+  printf(
+"static const unsigned namingBitmap[] = {\n\
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\n\
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\n\
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\n\
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\n");
+  for (i = 0; i < 512; i++) {
+    int kind = tab[i*256];
+    for (j = 1; j < 256; j++)
+      if (tab[i*256 +j] != kind) {
+        kind = -1;
+        break;
+      }
+    if (i >= 256 &&  memcmp(tab + (i - 256)*256, tab + i*256, 256) == 0)
+      pageIndex[i] = pageIndex[i - 256];
+    else if (kind == -1) { 
+      pageIndex[i] = nBitmaps++;
+      for (j = 0; j < 8; j++) {
+        unsigned val = 0;
+        for (k = 0; k < 32; k++) {
+          if (tab[i*256 + j*32 +k])
+            val |= (1 << k);
+        }
+        printf("0x%08X,", val);
+        putchar((((j + 1) & 3) == 0) ? '\n' : ' ');
+      }
+    }
+    else
+      pageIndex[i] = kind;
+  }
+  printf("};\n");
+  printf("static const unsigned char nmstrtPages[] = {\n");
+  for (i = 0; i < 512; i++) {
+    if (i == 256)
+      printf("};\nstatic const unsigned char namePages[] = {\n");
+    printf("0x%02X,", pageIndex[i]);
+    putchar((((i + 1) & 7) == 0) ? '\n' : ' ');
+  }
+  printf("};\n");
+}
+
+int
+main()
+{ 
+  char tab[2*65536];
+  memset(tab, 0, 65536);
+  setTab(tab, nmstrt, sizeof(nmstrt)/sizeof(nmstrt[0]));
+  memcpy(tab + 65536, tab, 65536);
+  setTab(tab + 65536, name, sizeof(name)/sizeof(name[0]));
+  printTabs(tab);
+  return 0;
+}
diff --git a/reactos/lib/3rdparty/expat/gennmtab/gennmtab.dsp b/reactos/lib/3rdparty/expat/gennmtab/gennmtab.dsp
new file mode 100644 (file)
index 0000000..97e6e2b
--- /dev/null
@@ -0,0 +1,101 @@
+# Microsoft Developer Studio Project File - Name="gennmtab" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=gennmtab - Win32 Release\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "gennmtab.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "gennmtab.mak" CFG="gennmtab - Win32 Release"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "gennmtab - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "gennmtab - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "gennmtab - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir ".\Release"\r
+# PROP BASE Intermediate_Dir ".\Release"\r
+# PROP BASE Target_Dir "."\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir ".\Release"\r
+# PROP Intermediate_Dir ".\Release"\r
+# PROP Target_Dir "."\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c\r
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c\r
+# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
+# ADD RSC /l 0x809 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+\r
+!ELSEIF  "$(CFG)" == "gennmtab - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir ".\Debug"\r
+# PROP BASE Intermediate_Dir ".\Debug"\r
+# PROP BASE Target_Dir "."\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir ".\Debug"\r
+# PROP Intermediate_Dir ".\Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir "."\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /FD /c\r
+# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
+# ADD RSC /l 0x809 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "gennmtab - Win32 Release"\r
+# Name "gennmtab - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90"\r
+# Begin Source File\r
+\r
+SOURCE=.\gennmtab.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/reactos/lib/3rdparty/expat/make-release.sh b/reactos/lib/3rdparty/expat/make-release.sh
new file mode 100644 (file)
index 0000000..818d41b
--- /dev/null
@@ -0,0 +1,76 @@
+#! /bin/bash
+#
+# make-release.sh: make an Expat release
+#
+# USAGE: make-release.sh tagname
+#
+# Note: tagname may be HEAD to just grab the head revision (e.g. for testing)
+#
+
+#CVSROOT=':ext:cvs.libexpat.org:/cvsroot/expat'
+CVSROOT=':pserver:anonymous@cvs.libexpat.org:/cvsroot/expat'
+
+if test $# != 1; then
+  echo "USAGE: $0 tagname"
+  exit 1
+fi
+
+tmpdir=expat-release.$$
+if test -e $tmpdir; then
+  echo "ERROR: oops. chose the $tmpdir subdir, but it exists."
+  exit 1
+fi
+
+echo "Checking out into temporary area: $tmpdir"
+cvs -fq -d "$CVSROOT" export -r "$1" -d $tmpdir expat || exit 1
+
+echo ""
+echo "----------------------------------------------------------------------"
+echo "Preparing $tmpdir for release (running buildconf.sh)"
+(cd $tmpdir && ./buildconf.sh) || exit 1
+
+# figure out the release version
+vsn="`$tmpdir/conftools/get-version.sh $tmpdir/lib/expat.h`"
+
+echo ""
+echo "Release version: $vsn"
+
+if test "$1" = HEAD ; then
+  distdir=expat-`date '+%Y-%m-%d'`
+else
+  distdir=expat-$vsn
+fi
+if test -e $distdir; then
+  echo "ERROR: for safety, you must manually remove $distdir."
+  rm -rf $tmpdir
+  exit 1
+fi
+mkdir $distdir || exit 1
+
+CPOPTS=-Pp
+if (cp --version 2>/dev/null | grep -q 'Free Software Foundation') ; then
+  # If we're using GNU cp, we can avoid the warnings about forward
+  # compatibility of the options.
+  CPOPTS='--parents --preserve'
+fi
+
+echo ""
+echo "----------------------------------------------------------------------"
+echo "Building $distdir based on the MANIFEST:"
+files="`sed -e 's/[    ]:.*$//' $tmpdir/MANIFEST`"
+for file in $files; do
+  echo "Copying $file..."
+  (cd $tmpdir && cp $CPOPTS $file ../$distdir) || exit 1
+done
+
+echo ""
+echo "----------------------------------------------------------------------"
+echo "Removing (temporary) checkout directory..."
+rm -rf $tmpdir
+
+tarball=$distdir.tar.gz
+echo "Constructing $tarball..."
+tar cf - $distdir | gzip -9 > $tarball || exit $?
+rm -r $distdir
+
+echo "Done."
diff --git a/reactos/lib/3rdparty/expat/tests/README.txt b/reactos/lib/3rdparty/expat/tests/README.txt
new file mode 100644 (file)
index 0000000..33a47c3
--- /dev/null
@@ -0,0 +1,14 @@
+This directory contains the (fledgling) test suite for Expat.  The
+tests provide general unit testing and regression coverage.  The tests
+are not expected to be useful examples of Expat usage; see the
+examples/ directory for that.
+
+The Expat tests use a partial internal implementation of the "Check"
+unit testing framework for C. More information on Check can be found at:
+
+        http://check.sourceforge.net/
+
+Expat must be built and installed before "make check" can be executed.
+
+Since both Check and this test suite are young, it can all change in a
+later version.
diff --git a/reactos/lib/3rdparty/expat/tests/benchmark/README.txt b/reactos/lib/3rdparty/expat/tests/benchmark/README.txt
new file mode 100644 (file)
index 0000000..7f9cca0
--- /dev/null
@@ -0,0 +1,16 @@
+Use this benchmark command line utility as follows:
+
+  benchmark [-n] <file name> <buffer size> <# iterations>
+
+The command line arguments are:
+
+  -n             ... optional; if supplied, namespace processing is turned on
+  <file name>    ... name/path of test xml file
+  <buffer size>  ... size of processing buffer;
+                     the file is parsed in chunks of this size
+  <# iterations> ... how often will the file be parsed
+
+Returns:
+
+  The time (in seconds) it takes to parse the test file,
+  averaged over the number of iterations.
\ No newline at end of file
diff --git a/reactos/lib/3rdparty/expat/tests/benchmark/benchmark.c b/reactos/lib/3rdparty/expat/tests/benchmark/benchmark.c
new file mode 100644 (file)
index 0000000..86266a0
--- /dev/null
@@ -0,0 +1,114 @@
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include "expat.h"
+
+#ifdef XML_LARGE_SIZE
+#define XML_FMT_INT_MOD "ll"
+#else
+#define XML_FMT_INT_MOD "l"
+#endif
+
+static void
+usage(const char *prog, int rc)
+{
+  fprintf(stderr,
+          "usage: %s [-n] filename bufferSize nr_of_loops\n", prog);
+  exit(rc);
+}
+
+#ifdef AMIGA_SHARED_LIB
+#include <proto/expat.h>
+int
+amiga_main(int argc, char *argv[])
+#else
+int main (int argc, char *argv[]) 
+#endif
+{
+  XML_Parser  parser;
+  char        *XMLBuf, *XMLBufEnd, *XMLBufPtr;
+  FILE        *fd;
+  struct stat fileAttr;
+  int         nrOfLoops, bufferSize, fileSize, i, isFinal;
+  int         j = 0, ns = 0;
+  clock_t     tstart, tend;
+  double      cpuTime = 0.0;
+
+  if (argc > 1) {
+    if (argv[1][0] == '-') {
+      if (argv[1][1] == 'n' && argv[1][2] == '\0') {
+        ns = 1;
+        j = 1;
+      }
+      else
+        usage(argv[0], 1);
+    }
+  }
+
+  if (argc != j + 4)
+    usage(argv[0], 1);
+
+  if (stat (argv[j + 1], &fileAttr) != 0) {
+    fprintf (stderr, "could not access file '%s'\n", argv[j + 1]);
+    return 2;
+  }
+  
+  fd = fopen (argv[j + 1], "r");
+  if (!fd) {
+    fprintf (stderr, "could not open file '%s'\n", argv[j + 1]);
+    exit(2);
+  }
+  
+  bufferSize = atoi (argv[j + 2]);
+  nrOfLoops = atoi (argv[j + 3]);
+  if (bufferSize <= 0 || nrOfLoops <= 0) {
+    fprintf (stderr, 
+             "buffer size and nr of loops must be greater than zero.\n");
+    exit(3);
+  }
+
+  XMLBuf = malloc (fileAttr.st_size);
+  fileSize = fread (XMLBuf, sizeof (char), fileAttr.st_size, fd);
+  fclose (fd);
+  
+  i = 0;
+  XMLBufEnd = XMLBuf + fileSize;
+  while (i < nrOfLoops) {
+    XMLBufPtr = XMLBuf;
+    isFinal = 0;
+    if (ns)
+      parser = XML_ParserCreateNS(NULL, '!');
+    else
+      parser = XML_ParserCreate(NULL);
+    tstart = clock();
+    do {
+      int parseBufferSize = XMLBufEnd - XMLBufPtr;
+      if (parseBufferSize <= bufferSize)
+        isFinal = 1;
+      else
+        parseBufferSize = bufferSize;
+      if (!XML_Parse (parser, XMLBufPtr, parseBufferSize, isFinal)) {
+        fprintf (stderr, "error '%s' at line %" XML_FMT_INT_MOD \
+                     "u character %" XML_FMT_INT_MOD "u\n",
+                 XML_ErrorString (XML_GetErrorCode (parser)),
+                 XML_GetCurrentLineNumber (parser),
+                 XML_GetCurrentColumnNumber (parser));
+        free (XMLBuf);
+        XML_ParserFree (parser);
+        exit (4);
+      }
+      XMLBufPtr += bufferSize;
+    } while (!isFinal);
+    tend = clock();
+    cpuTime += ((double) (tend - tstart)) / CLOCKS_PER_SEC;
+    XML_ParserFree (parser);
+    i++;
+  }
+
+  free (XMLBuf);
+      
+  printf ("%d loops, with buffer size %d. Average time per loop: %f\n", 
+          nrOfLoops, bufferSize, cpuTime / (double) nrOfLoops);
+  return 0;
+}
diff --git a/reactos/lib/3rdparty/expat/tests/benchmark/benchmark.dsp b/reactos/lib/3rdparty/expat/tests/benchmark/benchmark.dsp
new file mode 100644 (file)
index 0000000..6f310d0
--- /dev/null
@@ -0,0 +1,88 @@
+# Microsoft Developer Studio Project File - Name="benchmark" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=benchmark - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "benchmark.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "benchmark.mak" CFG="benchmark - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "benchmark - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "benchmark - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "benchmark - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /nologo /W3 /GX /O2 /I "..\..\lib" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD BASE RSC /l 0x1009 /d "NDEBUG"\r
+# ADD RSC /l 0x1009 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+\r
+!ELSEIF  "$(CFG)" == "benchmark - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\lib" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD BASE RSC /l 0x1009 /d "_DEBUG"\r
+# ADD RSC /l 0x1009 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "benchmark - Win32 Release"\r
+# Name "benchmark - Win32 Debug"\r
+# Begin Source File\r
+\r
+SOURCE=.\benchmark.c\r
+# End Source File\r
+# End Target\r
+# End Project\r
diff --git a/reactos/lib/3rdparty/expat/tests/benchmark/benchmark.dsw b/reactos/lib/3rdparty/expat/tests/benchmark/benchmark.dsw
new file mode 100644 (file)
index 0000000..3346a9a
--- /dev/null
@@ -0,0 +1,44 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "benchmark"=.\benchmark.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name expat\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "expat"=..\..\lib\expat.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
diff --git a/reactos/lib/3rdparty/expat/tests/chardata.c b/reactos/lib/3rdparty/expat/tests/chardata.c
new file mode 100644 (file)
index 0000000..5fb0299
--- /dev/null
@@ -0,0 +1,131 @@
+/* Copyright (c) 1998-2003 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+
+   chardata.c
+*/
+
+#ifdef HAVE_EXPAT_CONFIG_H
+#include <expat_config.h>
+#endif
+#ifdef HAVE_CHECK_H
+#include <check.h>
+#else
+#include "minicheck.h"
+#endif
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "chardata.h"
+
+
+static int
+xmlstrlen(const XML_Char *s)
+{
+    int len = 0;
+    assert(s != NULL);
+    while (s[len] != 0)
+        ++len;
+    return len;
+}
+
+
+void
+CharData_Init(CharData *storage)
+{
+    assert(storage != NULL);
+    storage->count = -1;
+}
+
+void
+CharData_AppendString(CharData *storage, const char *s)
+{
+    int maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
+    int len;
+
+    assert(s != NULL);
+    len = strlen(s);
+    if (storage->count < 0)
+        storage->count = 0;
+    if ((len + storage->count) > maxchars) {
+        len = (maxchars - storage->count);
+    }
+    if (len + storage->count < sizeof(storage->data)) {
+        memcpy(storage->data + storage->count, s, len);
+        storage->count += len;
+    }
+}
+
+void
+CharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len)
+{
+    int maxchars;
+
+    assert(storage != NULL);
+    assert(s != NULL);
+    maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
+    if (storage->count < 0)
+        storage->count = 0;
+    if (len < 0)
+        len = xmlstrlen(s);
+    if ((len + storage->count) > maxchars) {
+        len = (maxchars - storage->count);
+    }
+    if (len + storage->count < sizeof(storage->data)) {
+        memcpy(storage->data + storage->count, s,
+               len * sizeof(storage->data[0]));
+        storage->count += len;
+    }
+}
+
+int
+CharData_CheckString(CharData *storage, const char *expected)
+{
+    char buffer[1280];
+    int len;
+    int count;
+
+    assert(storage != NULL);
+    assert(expected != NULL);
+    count = (storage->count < 0) ? 0 : storage->count;
+    len = strlen(expected);
+    if (len != count) {
+        if (sizeof(XML_Char) == 1)
+            sprintf(buffer, "wrong number of data characters:"
+                    " got %d, expected %d:\n%s", count, len, storage->data);
+        else
+            sprintf(buffer,
+                    "wrong number of data characters: got %d, expected %d",
+                    count, len);
+        fail(buffer);
+        return 0;
+    }
+    if (memcmp(expected, storage->data, len) != 0) {
+        fail("got bad data bytes");
+        return 0;
+    }
+    return 1;
+}
+
+int
+CharData_CheckXMLChars(CharData *storage, const XML_Char *expected)
+{
+    char buffer[1024];
+    int len = xmlstrlen(expected);
+    int count;
+
+    assert(storage != NULL);
+    count = (storage->count < 0) ? 0 : storage->count;
+    if (len != count) {
+        sprintf(buffer, "wrong number of data characters: got %d, expected %d",
+                count, len);
+        fail(buffer);
+        return 0;
+    }
+    if (memcmp(expected, storage->data, len * sizeof(storage->data[0])) != 0) {
+        fail("got bad data bytes");
+        return 0;
+    }
+    return 1;
+}
diff --git a/reactos/lib/3rdparty/expat/tests/chardata.h b/reactos/lib/3rdparty/expat/tests/chardata.h
new file mode 100644 (file)
index 0000000..e8dc4ce
--- /dev/null
@@ -0,0 +1,40 @@
+/* chardata.h
+
+   Interface to some helper routines used to accumulate and check text
+   and attribute content.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_CHARDATA_H
+#define XML_CHARDATA_H 1
+
+#ifndef XML_VERSION
+#include "expat.h"                      /* need XML_Char */
+#endif
+
+
+typedef struct {
+    int count;                          /* # of chars, < 0 if not set */
+    XML_Char data[1024];
+} CharData;
+
+
+void CharData_Init(CharData *storage);
+
+void CharData_AppendString(CharData *storage, const char *s);
+
+void CharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len);
+
+int CharData_CheckString(CharData *storage, const char *s);
+
+int CharData_CheckXMLChars(CharData *storage, const XML_Char *s);
+
+
+#endif  /* XML_CHARDATA_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/reactos/lib/3rdparty/expat/tests/minicheck.c b/reactos/lib/3rdparty/expat/tests/minicheck.c
new file mode 100644 (file)
index 0000000..25fbf85
--- /dev/null
@@ -0,0 +1,182 @@
+/* Miniature re-implementation of the "check" library.
+ *
+ * This is intended to support just enough of check to run the Expat
+ * tests.  This interface is based entirely on the portion of the
+ * check library being used.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <setjmp.h>
+#include <assert.h>
+
+#include "minicheck.h"
+
+Suite *
+suite_create(char *name)
+{
+    Suite *suite = (Suite *) calloc(1, sizeof(Suite));
+    if (suite != NULL) {
+        suite->name = name;
+    }
+    return suite;
+}
+
+TCase *
+tcase_create(char *name)
+{
+    TCase *tc = (TCase *) calloc(1, sizeof(TCase));
+    if (tc != NULL) {
+        tc->name = name;
+    }
+    return tc;
+}
+
+void
+suite_add_tcase(Suite *suite, TCase *tc) 
+{
+    assert(suite != NULL);
+    assert(tc != NULL);
+    assert(tc->next_tcase == NULL);
+
+    tc->next_tcase = suite->tests;
+    suite->tests = tc;
+}
+
+void
+tcase_add_checked_fixture(TCase *tc,
+                          tcase_setup_function setup,
+                          tcase_teardown_function teardown)
+{
+    assert(tc != NULL);
+    tc->setup = setup;
+    tc->teardown = teardown;
+}
+
+void
+tcase_add_test(TCase *tc, tcase_test_function test)
+{
+    assert(tc != NULL);
+    if (tc->allocated == tc->ntests) {
+        int nalloc = tc->allocated + 100;
+        size_t new_size = sizeof(tcase_test_function) * nalloc;
+        tcase_test_function *new_tests = realloc(tc->tests, new_size);
+        assert(new_tests != NULL);
+        if (new_tests != tc->tests) {
+            free(tc->tests);
+            tc->tests = new_tests;
+        }
+        tc->allocated = nalloc;
+    }
+    tc->tests[tc->ntests] = test;
+    tc->ntests++;
+}
+
+SRunner *
+srunner_create(Suite *suite)
+{
+    SRunner *runner = calloc(1, sizeof(SRunner));
+    if (runner != NULL) {
+        runner->suite = suite;
+    }
+    return runner;
+}
+
+void
+srunner_set_fork_status(SRunner *runner, int status)
+{
+    /* We ignore this. */
+}
+
+static jmp_buf env;
+
+static char const *_check_current_function = NULL;
+static int _check_current_lineno = -1;
+static char const *_check_current_filename = NULL;
+
+void
+_check_set_test_info(char const *function, char const *filename, int lineno)
+{
+    _check_current_function = function;
+    _check_current_lineno = lineno;
+    _check_current_filename = filename;
+}
+
+
+static void
+add_failure(SRunner *runner, int verbosity)
+{
+    runner->nfailures++;
+    if (verbosity >= CK_VERBOSE) {
+        printf("%s:%d: %s\n", _check_current_filename,
+               _check_current_lineno, _check_current_function);
+    }
+}
+
+void
+srunner_run_all(SRunner *runner, int verbosity)
+{
+    Suite *suite;
+    TCase *tc;
+    assert(runner != NULL);
+    suite = runner->suite;
+    tc = suite->tests;
+    while (tc != NULL) {
+        int i;
+        for (i = 0; i < tc->ntests; ++i) {
+            runner->nchecks++;
+
+            if (tc->setup != NULL) {
+                /* setup */
+                if (setjmp(env)) {
+                    add_failure(runner, verbosity);
+                    continue;
+                }
+                tc->setup();
+            }
+            /* test */
+            if (setjmp(env)) {
+                add_failure(runner, verbosity);
+                continue;
+            }
+            (tc->tests[i])();
+
+            /* teardown */
+            if (tc->teardown != NULL) {
+                if (setjmp(env)) {
+                    add_failure(runner, verbosity);
+                    continue;
+                }
+                tc->teardown();
+            }
+        }
+        tc = tc->next_tcase;
+    }
+    if (verbosity) {
+        int passed = runner->nchecks - runner->nfailures;
+        double percentage = ((double) passed) / runner->nchecks;
+        int display = (int) (percentage * 100);
+        printf("%d%%: Checks: %d, Failed: %d\n",
+               display, runner->nchecks, runner->nfailures);
+    }
+}
+
+void
+_fail_unless(int condition, const char *file, int line, char *msg)
+{
+    longjmp(env, 1);
+}
+
+int
+srunner_ntests_failed(SRunner *runner)
+{
+    assert(runner != NULL);
+    return runner->nfailures;
+}
+
+void
+srunner_free(SRunner *runner)
+{
+    free(runner->suite);
+    free(runner);
+}
diff --git a/reactos/lib/3rdparty/expat/tests/minicheck.h b/reactos/lib/3rdparty/expat/tests/minicheck.h
new file mode 100644 (file)
index 0000000..c8a1d5e
--- /dev/null
@@ -0,0 +1,84 @@
+/* Miniature re-implementation of the "check" library.
+ *
+ * This is intended to support just enough of check to run the Expat
+ * tests.  This interface is based entirely on the portion of the
+ * check library being used.
+ *
+ * This is *source* compatible, but not necessary *link* compatible.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CK_NOFORK 0
+#define CK_FORK   1
+
+#define CK_SILENT  0
+#define CK_NORMAL  1
+#define CK_VERBOSE 2
+
+#define START_TEST(testname) static void testname(void) { \
+    _check_set_test_info(__func__, __FILE__, __LINE__);   \
+    {
+#define END_TEST } }
+
+#define fail(msg)  _fail_unless(0, __FILE__, __LINE__, msg)
+
+typedef void (*tcase_setup_function)(void);
+typedef void (*tcase_teardown_function)(void);
+typedef void (*tcase_test_function)(void);
+
+typedef struct SRunner SRunner;
+typedef struct Suite Suite;
+typedef struct TCase TCase;
+
+struct SRunner {
+    Suite *suite;
+    int forking;
+    int nchecks;
+    int nfailures;
+};
+
+struct Suite {
+    char *name;
+    TCase *tests;
+};
+
+struct TCase {
+    char *name;
+    tcase_setup_function setup;
+    tcase_teardown_function teardown;
+    tcase_test_function *tests;
+    int ntests;
+    int allocated;
+    TCase *next_tcase;
+};
+
+
+/* Internal helper. */
+void _check_set_test_info(char const *function,
+                          char const *filename, int lineno);
+
+
+/*
+ * Prototypes for the actual implementation.
+ */
+
+void _fail_unless(int condition, const char *file, int line, char *msg);
+Suite *suite_create(char *name);
+TCase *tcase_create(char *name);
+void suite_add_tcase(Suite *suite, TCase *tc);
+void tcase_add_checked_fixture(TCase *,
+                               tcase_setup_function,
+                               tcase_teardown_function);
+void tcase_add_test(TCase *tc, tcase_test_function test);
+SRunner *srunner_create(Suite *suite);
+void srunner_set_fork_status(SRunner *runner, int forking);
+void srunner_run_all(SRunner *runner, int verbosity);
+int srunner_ntests_failed(SRunner *runner);
+void srunner_free(SRunner *runner);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/reactos/lib/3rdparty/expat/tests/runtests.c b/reactos/lib/3rdparty/expat/tests/runtests.c
new file mode 100644 (file)
index 0000000..088fe6f
--- /dev/null
@@ -0,0 +1,1450 @@
+/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+
+   runtest.c : run the Expat test suite
+*/
+
+#ifdef HAVE_EXPAT_CONFIG_H
+#include <expat_config.h>
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "expat.h"
+#include "chardata.h"
+#include "minicheck.h"
+
+#ifdef AMIGA_SHARED_LIB
+#include <proto/expat.h>
+#endif
+
+#ifdef XML_LARGE_SIZE
+#define XML_FMT_INT_MOD "ll"
+#else
+#define XML_FMT_INT_MOD "l"
+#endif
+
+static XML_Parser parser;
+
+
+static void
+basic_setup(void)
+{
+    parser = XML_ParserCreate(NULL);
+    if (parser == NULL)
+        fail("Parser not created.");
+}
+
+static void
+basic_teardown(void)
+{
+    if (parser != NULL)
+        XML_ParserFree(parser);
+}
+
+/* Generate a failure using the parser state to create an error message;
+   this should be used when the parser reports an error we weren't
+   expecting.
+*/
+static void
+_xml_failure(XML_Parser parser, const char *file, int line)
+{
+    char buffer[1024];
+    sprintf(buffer,
+            "\n    %s (line %" XML_FMT_INT_MOD "u, offset %"\
+                XML_FMT_INT_MOD "u)\n    reported from %s, line %d",
+            XML_ErrorString(XML_GetErrorCode(parser)),
+            XML_GetCurrentLineNumber(parser),
+            XML_GetCurrentColumnNumber(parser),
+            file, line);
+    _fail_unless(0, file, line, buffer);
+}
+
+#define xml_failure(parser) _xml_failure((parser), __FILE__, __LINE__)
+
+static void
+_expect_failure(char *text, enum XML_Error errorCode, char *errorMessage,
+                char *file, int lineno)
+{
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_OK)
+        /* Hackish use of _fail_unless() macro, but let's us report
+           the right filename and line number. */
+        _fail_unless(0, file, lineno, errorMessage);
+    if (XML_GetErrorCode(parser) != errorCode)
+        _xml_failure(parser, file, lineno);
+}
+
+#define expect_failure(text, errorCode, errorMessage) \
+        _expect_failure((text), (errorCode), (errorMessage), \
+                        __FILE__, __LINE__)
+
+/* Dummy handlers for when we need to set a handler to tickle a bug,
+   but it doesn't need to do anything.
+*/
+
+static void XMLCALL
+dummy_start_doctype_handler(void           *userData,
+                            const XML_Char *doctypeName,
+                            const XML_Char *sysid,
+                            const XML_Char *pubid,
+                            int            has_internal_subset)
+{}
+
+static void XMLCALL
+dummy_end_doctype_handler(void *userData)
+{}
+
+static void XMLCALL
+dummy_entity_decl_handler(void           *userData,
+                          const XML_Char *entityName,
+                          int            is_parameter_entity,
+                          const XML_Char *value,
+                          int            value_length,
+                          const XML_Char *base,
+                          const XML_Char *systemId,
+                          const XML_Char *publicId,
+                          const XML_Char *notationName)
+{}
+
+static void XMLCALL
+dummy_notation_decl_handler(void *userData,
+                            const XML_Char *notationName,
+                            const XML_Char *base,
+                            const XML_Char *systemId,
+                            const XML_Char *publicId)
+{}
+
+static void XMLCALL
+dummy_element_decl_handler(void *userData,
+                           const XML_Char *name,
+                           XML_Content *model)
+{}
+
+static void XMLCALL
+dummy_attlist_decl_handler(void           *userData,
+                           const XML_Char *elname,
+                           const XML_Char *attname,
+                           const XML_Char *att_type,
+                           const XML_Char *dflt,
+                           int            isrequired)
+{}
+
+static void XMLCALL
+dummy_comment_handler(void *userData, const XML_Char *data)
+{}
+
+static void XMLCALL
+dummy_pi_handler(void *userData, const XML_Char *target, const XML_Char *data)
+{}
+
+static void XMLCALL
+dummy_start_element(void *userData,
+                    const XML_Char *name, const XML_Char **atts)
+{}
+
+
+/*
+ * Character & encoding tests.
+ */
+
+START_TEST(test_nul_byte)
+{
+    char text[] = "<doc>\0</doc>";
+
+    /* test that a NUL byte (in US-ASCII data) is an error */
+    if (XML_Parse(parser, text, sizeof(text) - 1, XML_TRUE) == XML_STATUS_OK)
+        fail("Parser did not report error on NUL-byte.");
+    if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)
+        xml_failure(parser);
+}
+END_TEST
+
+
+START_TEST(test_u0000_char)
+{
+    /* test that a NUL byte (in US-ASCII data) is an error */
+    expect_failure("<doc>&#0;</doc>",
+                   XML_ERROR_BAD_CHAR_REF,
+                   "Parser did not report error on NUL-byte.");
+}
+END_TEST
+
+START_TEST(test_bom_utf8)
+{
+    /* This test is really just making sure we don't core on a UTF-8 BOM. */
+    char *text = "\357\273\277<e/>";
+
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+START_TEST(test_bom_utf16_be)
+{
+    char text[] = "\376\377\0<\0e\0/\0>";
+
+    if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+START_TEST(test_bom_utf16_le)
+{
+    char text[] = "\377\376<\0e\0/\0>\0";
+
+    if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+static void XMLCALL
+accumulate_characters(void *userData, const XML_Char *s, int len)
+{
+    CharData_AppendXMLChars((CharData *)userData, s, len);
+}
+
+static void XMLCALL
+accumulate_attribute(void *userData, const XML_Char *name,
+                     const XML_Char **atts)
+{
+    CharData *storage = (CharData *)userData;
+    if (storage->count < 0 && atts != NULL && atts[0] != NULL) {
+        /* "accumulate" the value of the first attribute we see */
+        CharData_AppendXMLChars(storage, atts[1], -1);
+    }
+}
+
+
+static void
+_run_character_check(XML_Char *text, XML_Char *expected,
+                     const char *file, int line)
+{
+    CharData storage;
+
+    CharData_Init(&storage);
+    XML_SetUserData(parser, &storage);
+    XML_SetCharacterDataHandler(parser, accumulate_characters);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        _xml_failure(parser, file, line);
+    CharData_CheckXMLChars(&storage, expected);
+}
+
+#define run_character_check(text, expected) \
+        _run_character_check(text, expected, __FILE__, __LINE__)
+
+static void
+_run_attribute_check(XML_Char *text, XML_Char *expected,
+                     const char *file, int line)
+{
+    CharData storage;
+
+    CharData_Init(&storage);
+    XML_SetUserData(parser, &storage);
+    XML_SetStartElementHandler(parser, accumulate_attribute);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        _xml_failure(parser, file, line);
+    CharData_CheckXMLChars(&storage, expected);
+}
+
+#define run_attribute_check(text, expected) \
+        _run_attribute_check(text, expected, __FILE__, __LINE__)
+
+/* Regression test for SF bug #491986. */
+START_TEST(test_danish_latin1)
+{
+    char *text =
+        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+        "<e>J\xF8rgen \xE6\xF8\xE5\xC6\xD8\xC5</e>";
+    run_character_check(text,
+             "J\xC3\xB8rgen \xC3\xA6\xC3\xB8\xC3\xA5\xC3\x86\xC3\x98\xC3\x85");
+}
+END_TEST
+
+
+/* Regression test for SF bug #514281. */
+START_TEST(test_french_charref_hexidecimal)
+{
+    char *text =
+        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+        "<doc>&#xE9;&#xE8;&#xE0;&#xE7;&#xEA;&#xC8;</doc>";
+    run_character_check(text,
+                        "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
+}
+END_TEST
+
+START_TEST(test_french_charref_decimal)
+{
+    char *text =
+        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+        "<doc>&#233;&#232;&#224;&#231;&#234;&#200;</doc>";
+    run_character_check(text,
+                        "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
+}
+END_TEST
+
+START_TEST(test_french_latin1)
+{
+    char *text =
+        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+        "<doc>\xE9\xE8\xE0\xE7\xEa\xC8</doc>";
+    run_character_check(text,
+                        "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
+}
+END_TEST
+
+START_TEST(test_french_utf8)
+{
+    char *text =
+        "<?xml version='1.0' encoding='utf-8'?>\n"
+        "<doc>\xC3\xA9</doc>";
+    run_character_check(text, "\xC3\xA9");
+}
+END_TEST
+
+/* Regression test for SF bug #600479.
+   XXX There should be a test that exercises all legal XML Unicode
+   characters as PCDATA and attribute value content, and XML Name
+   characters as part of element and attribute names.
+*/
+START_TEST(test_utf8_false_rejection)
+{
+    char *text = "<doc>\xEF\xBA\xBF</doc>";
+    run_character_check(text, "\xEF\xBA\xBF");
+}
+END_TEST
+
+/* Regression test for SF bug #477667.
+   This test assures that any 8-bit character followed by a 7-bit
+   character will not be mistakenly interpreted as a valid UTF-8
+   sequence.
+*/
+START_TEST(test_illegal_utf8)
+{
+    char text[100];
+    int i;
+
+    for (i = 128; i <= 255; ++i) {
+        sprintf(text, "<e>%ccd</e>", i);
+        if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_OK) {
+            sprintf(text,
+                    "expected token error for '%c' (ordinal %d) in UTF-8 text",
+                    i, i);
+            fail(text);
+        }
+        else if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)
+            xml_failure(parser);
+        /* Reset the parser since we use the same parser repeatedly. */
+        XML_ParserReset(parser, NULL);
+    }
+}
+END_TEST
+
+START_TEST(test_utf16)
+{
+    /* <?xml version="1.0" encoding="UTF-16"?>
+       <doc a='123'>some text</doc>
+    */
+    char text[] =
+        "\000<\000?\000x\000m\000\154\000 \000v\000e\000r\000s\000i\000o"
+        "\000n\000=\000'\0001\000.\000\060\000'\000 \000e\000n\000c\000o"
+        "\000d\000i\000n\000g\000=\000'\000U\000T\000F\000-\0001\000\066"
+        "\000'\000?\000>\000\n"
+        "\000<\000d\000o\000c\000 \000a\000=\000'\0001\0002\0003\000'"
+        "\000>\000s\000o\000m\000e\000 \000t\000e\000x\000t\000<\000/"
+        "\000d\000o\000c\000>";
+    if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+START_TEST(test_utf16_le_epilog_newline)
+{
+    int first_chunk_bytes = 17;
+    char text[] = 
+        "\xFF\xFE"                      /* BOM */
+        "<\000e\000/\000>\000"          /* document element */
+        "\r\000\n\000\r\000\n\000";     /* epilog */
+
+    if (first_chunk_bytes >= sizeof(text) - 1)
+        fail("bad value of first_chunk_bytes");
+    if (  XML_Parse(parser, text, first_chunk_bytes, XML_FALSE)
+          == XML_STATUS_ERROR)
+        xml_failure(parser);
+    else {
+        enum XML_Status rc;
+        rc = XML_Parse(parser, text + first_chunk_bytes,
+                       sizeof(text) - first_chunk_bytes - 1, XML_TRUE);
+        if (rc == XML_STATUS_ERROR)
+            xml_failure(parser);
+    }
+}
+END_TEST
+
+/* Regression test for SF bug #481609, #774028. */
+START_TEST(test_latin1_umlauts)
+{
+    char *text =
+        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+        "<e a='\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; >'\n"
+        "  >\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; ></e>";
+    char *utf8 =
+        "\xC3\xA4 \xC3\xB6 \xC3\xBC "
+        "\xC3\xA4 \xC3\xB6 \xC3\xBC "
+        "\xC3\xA4 \xC3\xB6 \xC3\xBC >";
+    run_character_check(text, utf8);
+    XML_ParserReset(parser, NULL);
+    run_attribute_check(text, utf8);
+}
+END_TEST
+
+/* Regression test #1 for SF bug #653180. */
+START_TEST(test_line_number_after_parse)
+{  
+    char *text =
+        "<tag>\n"
+        "\n"
+        "\n</tag>";
+    XML_Size lineno;
+
+    if (XML_Parse(parser, text, strlen(text), XML_FALSE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+    lineno = XML_GetCurrentLineNumber(parser);
+    if (lineno != 4) {
+        char buffer[100];
+        sprintf(buffer, 
+            "expected 4 lines, saw %" XML_FMT_INT_MOD "u", lineno);
+        fail(buffer);
+    }
+}
+END_TEST
+
+/* Regression test #2 for SF bug #653180. */
+START_TEST(test_column_number_after_parse)
+{
+    char *text = "<tag></tag>";
+    XML_Size colno;
+
+    if (XML_Parse(parser, text, strlen(text), XML_FALSE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+    colno = XML_GetCurrentColumnNumber(parser);
+    if (colno != 11) {
+        char buffer[100];
+        sprintf(buffer, 
+            "expected 11 columns, saw %" XML_FMT_INT_MOD "u", colno);
+        fail(buffer);
+    }
+}
+END_TEST
+
+static void XMLCALL
+start_element_event_handler2(void *userData, const XML_Char *name,
+                            const XML_Char **attr)
+{
+    CharData *storage = (CharData *) userData;
+    char buffer[100];
+
+    sprintf(buffer,
+        "<%s> at col:%" XML_FMT_INT_MOD "u line:%"\
+            XML_FMT_INT_MOD "u\n", name,
+           XML_GetCurrentColumnNumber(parser),
+           XML_GetCurrentLineNumber(parser));
+    CharData_AppendString(storage, buffer);
+}
+
+static void XMLCALL
+end_element_event_handler2(void *userData, const XML_Char *name)
+{
+    CharData *storage = (CharData *) userData;
+    char buffer[100];
+
+    sprintf(buffer,
+        "</%s> at col:%" XML_FMT_INT_MOD "u line:%"\
+            XML_FMT_INT_MOD "u\n", name,
+           XML_GetCurrentColumnNumber(parser),
+           XML_GetCurrentLineNumber(parser));
+    CharData_AppendString(storage, buffer);
+}
+
+/* Regression test #3 for SF bug #653180. */
+START_TEST(test_line_and_column_numbers_inside_handlers)
+{
+    char *text =
+        "<a>\n"        /* Unix end-of-line */
+        "  <b>\r\n"    /* Windows end-of-line */
+        "    <c/>\r"   /* Mac OS end-of-line */
+        "  </b>\n"
+        "  <d>\n"
+        "    <f/>\n"
+        "  </d>\n"
+        "</a>";
+    char *expected =
+        "<a> at col:0 line:1\n"
+        "<b> at col:2 line:2\n"
+        "<c> at col:4 line:3\n"
+        "</c> at col:8 line:3\n"
+        "</b> at col:2 line:4\n"
+        "<d> at col:2 line:5\n"
+        "<f> at col:4 line:6\n"
+        "</f> at col:8 line:6\n"
+        "</d> at col:2 line:7\n"
+        "</a> at col:0 line:8\n";
+    CharData storage;
+
+    CharData_Init(&storage);
+    XML_SetUserData(parser, &storage);
+    XML_SetStartElementHandler(parser, start_element_event_handler2);
+    XML_SetEndElementHandler(parser, end_element_event_handler2);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+
+    CharData_CheckString(&storage, expected); 
+}
+END_TEST
+
+/* Regression test #4 for SF bug #653180. */
+START_TEST(test_line_number_after_error)
+{
+    char *text =
+        "<a>\n"
+        "  <b>\n"
+        "  </a>";  /* missing </b> */
+    XML_Size lineno;
+    if (XML_Parse(parser, text, strlen(text), XML_FALSE) != XML_STATUS_ERROR)
+        fail("Expected a parse error");
+
+    lineno = XML_GetCurrentLineNumber(parser);
+    if (lineno != 3) {
+        char buffer[100];
+        sprintf(buffer, "expected 3 lines, saw %" XML_FMT_INT_MOD "u", lineno);
+        fail(buffer);
+    }
+}
+END_TEST
+    
+/* Regression test #5 for SF bug #653180. */
+START_TEST(test_column_number_after_error)
+{
+    char *text =
+        "<a>\n"
+        "  <b>\n"
+        "  </a>";  /* missing </b> */
+    XML_Size colno;
+    if (XML_Parse(parser, text, strlen(text), XML_FALSE) != XML_STATUS_ERROR)
+        fail("Expected a parse error");
+
+    colno = XML_GetCurrentColumnNumber(parser);
+    if (colno != 4) { 
+        char buffer[100];
+        sprintf(buffer, 
+            "expected 4 columns, saw %" XML_FMT_INT_MOD "u", colno);
+        fail(buffer);
+    }
+}
+END_TEST
+
+/* Regression test for SF bug #478332. */
+START_TEST(test_really_long_lines)
+{
+    /* This parses an input line longer than INIT_DATA_BUF_SIZE
+       characters long (defined to be 1024 in xmlparse.c).  We take a
+       really cheesy approach to building the input buffer, because
+       this avoids writing bugs in buffer-filling code.
+    */
+    char *text =
+        "<e>"
+        /* 64 chars */
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        /* until we have at least 1024 characters on the line: */
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+        "</e>";
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+
+/*
+ * Element event tests.
+ */
+
+static void XMLCALL
+end_element_event_handler(void *userData, const XML_Char *name)
+{
+    CharData *storage = (CharData *) userData;
+    CharData_AppendString(storage, "/");
+    CharData_AppendXMLChars(storage, name, -1);
+}
+
+START_TEST(test_end_element_events)
+{
+    char *text = "<a><b><c/></b><d><f/></d></a>";
+    char *expected = "/c/b/f/d/a";
+    CharData storage;
+
+    CharData_Init(&storage);
+    XML_SetUserData(parser, &storage);
+    XML_SetEndElementHandler(parser, end_element_event_handler);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+    CharData_CheckString(&storage, expected);
+}
+END_TEST
+
+
+/*
+ * Attribute tests.
+ */
+
+/* Helpers used by the following test; this checks any "attr" and "refs"
+   attributes to make sure whitespace has been normalized.
+
+   Return true if whitespace has been normalized in a string, using
+   the rules for attribute value normalization.  The 'is_cdata' flag
+   is needed since CDATA attributes don't need to have multiple
+   whitespace characters collapsed to a single space, while other
+   attribute data types do.  (Section 3.3.3 of the recommendation.)
+*/
+static int
+is_whitespace_normalized(const XML_Char *s, int is_cdata)
+{
+    int blanks = 0;
+    int at_start = 1;
+    while (*s) {
+        if (*s == ' ')
+            ++blanks;
+        else if (*s == '\t' || *s == '\n' || *s == '\r')
+            return 0;
+        else {
+            if (at_start) {
+                at_start = 0;
+                if (blanks && !is_cdata)
+                    /* illegal leading blanks */
+                    return 0;
+            }
+            else if (blanks > 1 && !is_cdata)
+                return 0;
+            blanks = 0;
+        }
+        ++s;
+    }
+    if (blanks && !is_cdata)
+        return 0;
+    return 1;
+}
+
+/* Check the attribute whitespace checker: */
+static void
+testhelper_is_whitespace_normalized(void)
+{
+    assert(is_whitespace_normalized("abc", 0));
+    assert(is_whitespace_normalized("abc", 1));
+    assert(is_whitespace_normalized("abc def ghi", 0));
+    assert(is_whitespace_normalized("abc def ghi", 1));
+    assert(!is_whitespace_normalized(" abc def ghi", 0));
+    assert(is_whitespace_normalized(" abc def ghi", 1));
+    assert(!is_whitespace_normalized("abc  def ghi", 0));
+    assert(is_whitespace_normalized("abc  def ghi", 1));
+    assert(!is_whitespace_normalized("abc def ghi ", 0));
+    assert(is_whitespace_normalized("abc def ghi ", 1));
+    assert(!is_whitespace_normalized(" ", 0));
+    assert(is_whitespace_normalized(" ", 1));
+    assert(!is_whitespace_normalized("\t", 0));
+    assert(!is_whitespace_normalized("\t", 1));
+    assert(!is_whitespace_normalized("\n", 0));
+    assert(!is_whitespace_normalized("\n", 1));
+    assert(!is_whitespace_normalized("\r", 0));
+    assert(!is_whitespace_normalized("\r", 1));
+    assert(!is_whitespace_normalized("abc\t def", 1));
+}
+
+static void XMLCALL
+check_attr_contains_normalized_whitespace(void *userData,
+                                          const XML_Char *name,
+                                          const XML_Char **atts)
+{
+    int i;
+    for (i = 0; atts[i] != NULL; i += 2) {
+        const XML_Char *attrname = atts[i];
+        const XML_Char *value = atts[i + 1];
+        if (strcmp("attr", attrname) == 0
+            || strcmp("ents", attrname) == 0
+            || strcmp("refs", attrname) == 0) {
+            if (!is_whitespace_normalized(value, 0)) {
+                char buffer[256];
+                sprintf(buffer, "attribute value not normalized: %s='%s'",
+                        attrname, value);
+                fail(buffer);
+            }
+        }
+    }
+}
+
+START_TEST(test_attr_whitespace_normalization)
+{
+    char *text =
+        "<!DOCTYPE doc [\n"
+        "  <!ATTLIST doc\n"
+        "            attr NMTOKENS #REQUIRED\n"
+        "            ents ENTITIES #REQUIRED\n"
+        "            refs IDREFS   #REQUIRED>\n"
+        "]>\n"
+        "<doc attr='    a  b c\t\td\te\t' refs=' id-1   \t  id-2\t\t'  \n"
+        "     ents=' ent-1   \t\r\n"
+        "            ent-2  ' >\n"
+        "  <e id='id-1'/>\n"
+        "  <e id='id-2'/>\n"
+        "</doc>";
+
+    XML_SetStartElementHandler(parser,
+                               check_attr_contains_normalized_whitespace);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+
+/*
+ * XML declaration tests.
+ */
+
+START_TEST(test_xmldecl_misplaced)
+{
+    expect_failure("\n"
+                   "<?xml version='1.0'?>\n"
+                   "<a/>",
+                   XML_ERROR_MISPLACED_XML_PI,
+                   "failed to report misplaced XML declaration");
+}
+END_TEST
+
+/* Regression test for SF bug #584832. */
+static int XMLCALL
+UnknownEncodingHandler(void *data,const XML_Char *encoding,XML_Encoding *info)
+{
+    if (strcmp(encoding,"unsupported-encoding") == 0) {
+        int i;
+        for (i = 0; i < 256; ++i)
+            info->map[i] = i;
+        info->data = NULL;
+        info->convert = NULL;
+        info->release = NULL;
+        return XML_STATUS_OK;
+    }
+    return XML_STATUS_ERROR;
+}
+
+START_TEST(test_unknown_encoding_internal_entity)
+{
+    char *text =
+        "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
+        "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
+        "<test a='&foo;'/>";
+
+    XML_SetUnknownEncodingHandler(parser, UnknownEncodingHandler, NULL);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+/* Regression test for SF bug #620106. */
+static int XMLCALL
+external_entity_loader_set_encoding(XML_Parser parser,
+                                    const XML_Char *context,
+                                    const XML_Char *base,
+                                    const XML_Char *systemId,
+                                    const XML_Char *publicId)
+{
+    /* This text says it's an unsupported encoding, but it's really
+       UTF-8, which we tell Expat using XML_SetEncoding().
+    */
+    char *text =
+        "<?xml encoding='iso-8859-3'?>"
+        "\xC3\xA9";
+    XML_Parser extparser;
+
+    extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
+    if (extparser == NULL)
+        fail("Could not create external entity parser.");
+    if (!XML_SetEncoding(extparser, "utf-8"))
+        fail("XML_SetEncoding() ignored for external entity");
+    if (  XML_Parse(extparser, text, strlen(text), XML_TRUE)
+          == XML_STATUS_ERROR) {
+        xml_failure(parser);
+        return 0;
+    }
+    return 1;
+}
+
+START_TEST(test_ext_entity_set_encoding)
+{
+    char *text =
+        "<!DOCTYPE doc [\n"
+        "  <!ENTITY en SYSTEM 'http://xml.libexpat.org/dummy.ent'>\n"
+        "]>\n"
+        "<doc>&en;</doc>";
+
+    XML_SetExternalEntityRefHandler(parser,
+                                    external_entity_loader_set_encoding);
+    run_character_check(text, "\xC3\xA9");
+}
+END_TEST
+
+/* Test that no error is reported for unknown entities if we don't
+   read an external subset.  This was fixed in Expat 1.95.5.
+*/
+START_TEST(test_wfc_undeclared_entity_unread_external_subset) {
+    char *text =
+        "<!DOCTYPE doc SYSTEM 'foo'>\n"
+        "<doc>&entity;</doc>";
+
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+/* Test that an error is reported for unknown entities if we don't
+   have an external subset.
+*/
+START_TEST(test_wfc_undeclared_entity_no_external_subset) {
+    expect_failure("<doc>&entity;</doc>",
+                   XML_ERROR_UNDEFINED_ENTITY,
+                   "Parser did not report undefined entity w/out a DTD.");
+}
+END_TEST
+
+/* Test that an error is reported for unknown entities if we don't
+   read an external subset, but have been declared standalone.
+*/
+START_TEST(test_wfc_undeclared_entity_standalone) {
+    char *text =
+        "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
+        "<!DOCTYPE doc SYSTEM 'foo'>\n"
+        "<doc>&entity;</doc>";
+
+    expect_failure(text,
+                   XML_ERROR_UNDEFINED_ENTITY,
+                   "Parser did not report undefined entity (standalone).");
+}
+END_TEST
+
+static int XMLCALL
+external_entity_loader(XML_Parser parser,
+                       const XML_Char *context,
+                       const XML_Char *base,
+                       const XML_Char *systemId,
+                       const XML_Char *publicId)
+{
+    char *text = (char *)XML_GetUserData(parser);
+    XML_Parser extparser;
+
+    extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
+    if (extparser == NULL)
+        fail("Could not create external entity parser.");
+    if (  XML_Parse(extparser, text, strlen(text), XML_TRUE)
+          == XML_STATUS_ERROR) {
+        xml_failure(parser);
+        return XML_STATUS_ERROR;
+    }
+    return XML_STATUS_OK;
+}
+
+/* Test that an error is reported for unknown entities if we have read
+   an external subset, and standalone is true.
+*/
+START_TEST(test_wfc_undeclared_entity_with_external_subset_standalone) {
+    char *text =
+        "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
+        "<!DOCTYPE doc SYSTEM 'foo'>\n"
+        "<doc>&entity;</doc>";
+    char *foo_text =
+        "<!ELEMENT doc (#PCDATA)*>";
+
+    XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+    XML_SetUserData(parser, foo_text);
+    XML_SetExternalEntityRefHandler(parser, external_entity_loader);
+    expect_failure(text,
+                   XML_ERROR_UNDEFINED_ENTITY,
+                   "Parser did not report undefined entity (external DTD).");
+}
+END_TEST
+
+/* Test that no error is reported for unknown entities if we have read
+   an external subset, and standalone is false.
+*/
+START_TEST(test_wfc_undeclared_entity_with_external_subset) {
+    char *text =
+        "<?xml version='1.0' encoding='us-ascii'?>\n"
+        "<!DOCTYPE doc SYSTEM 'foo'>\n"
+        "<doc>&entity;</doc>";
+    char *foo_text =
+        "<!ELEMENT doc (#PCDATA)*>";
+
+    XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+    XML_SetUserData(parser, foo_text);
+    XML_SetExternalEntityRefHandler(parser, external_entity_loader);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+START_TEST(test_wfc_no_recursive_entity_refs)
+{
+    char *text =
+        "<!DOCTYPE doc [\n"
+        "  <!ENTITY entity '&#38;entity;'>\n"
+        "]>\n"
+        "<doc>&entity;</doc>";
+
+    expect_failure(text,
+                   XML_ERROR_RECURSIVE_ENTITY_REF,
+                   "Parser did not report recursive entity reference.");
+}
+END_TEST
+
+/* Regression test for SF bug #483514. */
+START_TEST(test_dtd_default_handling)
+{
+    char *text =
+        "<!DOCTYPE doc [\n"
+        "<!ENTITY e SYSTEM 'http://xml.libexpat.org/e'>\n"
+        "<!NOTATION n SYSTEM 'http://xml.libexpat.org/n'>\n"
+        "<!ELEMENT doc EMPTY>\n"
+        "<!ATTLIST doc a CDATA #IMPLIED>\n"
+        "<?pi in dtd?>\n"
+        "<!--comment in dtd-->\n"
+        "]><doc/>";
+
+    XML_SetDefaultHandler(parser, accumulate_characters);
+    XML_SetDoctypeDeclHandler(parser,
+                              dummy_start_doctype_handler,
+                              dummy_end_doctype_handler);
+    XML_SetEntityDeclHandler(parser, dummy_entity_decl_handler);
+    XML_SetNotationDeclHandler(parser, dummy_notation_decl_handler);
+    XML_SetElementDeclHandler(parser, dummy_element_decl_handler);
+    XML_SetAttlistDeclHandler(parser, dummy_attlist_decl_handler);
+    XML_SetProcessingInstructionHandler(parser, dummy_pi_handler);
+    XML_SetCommentHandler(parser, dummy_comment_handler);
+    run_character_check(text, "\n\n\n\n\n\n\n<doc/>");
+}
+END_TEST
+
+/* See related SF bug #673791.
+   When namespace processing is enabled, setting the namespace URI for
+   a prefix is not allowed; this test ensures that it *is* allowed
+   when namespace processing is not enabled.
+   (See Namespaces in XML, section 2.)
+*/
+START_TEST(test_empty_ns_without_namespaces)
+{
+    char *text =
+        "<doc xmlns:prefix='http://www.example.com/'>\n"
+        "  <e xmlns:prefix=''/>\n"
+        "</doc>";
+
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+/* Regression test for SF bug #824420.
+   Checks that an xmlns:prefix attribute set in an attribute's default
+   value isn't misinterpreted.
+*/
+START_TEST(test_ns_in_attribute_default_without_namespaces)
+{
+    char *text =
+        "<!DOCTYPE e:element [\n"
+        "  <!ATTLIST e:element\n"
+        "    xmlns:e CDATA 'http://example.com/'>\n"
+        "      ]>\n"
+        "<e:element/>";
+
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+
+/*
+ * Namespaces tests.
+ */
+
+static void
+namespace_setup(void)
+{
+    parser = XML_ParserCreateNS(NULL, ' ');
+    if (parser == NULL)
+        fail("Parser not created.");
+}
+
+static void
+namespace_teardown(void)
+{
+    basic_teardown();
+}
+
+/* Check that an element name and attribute name match the expected values.
+   The expected values are passed as an array reference of string pointers
+   provided as the userData argument; the first is the expected
+   element name, and the second is the expected attribute name.
+*/
+static void XMLCALL
+triplet_start_checker(void *userData, const XML_Char *name,
+                      const XML_Char **atts)
+{
+    char **elemstr = (char **)userData;
+    char buffer[1024];
+    if (strcmp(elemstr[0], name) != 0) {
+        sprintf(buffer, "unexpected start string: '%s'", name);
+        fail(buffer);
+    }
+    if (strcmp(elemstr[1], atts[0]) != 0) {
+        sprintf(buffer, "unexpected attribute string: '%s'", atts[0]);
+        fail(buffer);
+    }
+}
+
+/* Check that the element name passed to the end-element handler matches
+   the expected value.  The expected value is passed as the first element
+   in an array of strings passed as the userData argument.
+*/
+static void XMLCALL
+triplet_end_checker(void *userData, const XML_Char *name)
+{
+    char **elemstr = (char **)userData;
+    if (strcmp(elemstr[0], name) != 0) {
+        char buffer[1024];
+        sprintf(buffer, "unexpected end string: '%s'", name);
+        fail(buffer);
+    }
+}
+
+START_TEST(test_return_ns_triplet)
+{
+    char *text =
+        "<foo:e xmlns:foo='http://expat.sf.net/' bar:a='12'\n"
+        "       xmlns:bar='http://expat.sf.net/'></foo:e>";
+    char *elemstr[] = {
+        "http://expat.sf.net/ e foo",
+        "http://expat.sf.net/ a bar"
+    };
+    XML_SetReturnNSTriplet(parser, XML_TRUE);
+    XML_SetUserData(parser, elemstr);
+    XML_SetElementHandler(parser, triplet_start_checker, triplet_end_checker);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+static void XMLCALL
+overwrite_start_checker(void *userData, const XML_Char *name,
+                        const XML_Char **atts)
+{
+    CharData *storage = (CharData *) userData;
+    CharData_AppendString(storage, "start ");
+    CharData_AppendXMLChars(storage, name, -1);
+    while (*atts != NULL) {
+        CharData_AppendString(storage, "\nattribute ");
+        CharData_AppendXMLChars(storage, *atts, -1);
+        atts += 2;
+    }
+    CharData_AppendString(storage, "\n");
+}
+
+static void XMLCALL
+overwrite_end_checker(void *userData, const XML_Char *name)
+{
+    CharData *storage = (CharData *) userData;
+    CharData_AppendString(storage, "end ");
+    CharData_AppendXMLChars(storage, name, -1);
+    CharData_AppendString(storage, "\n");
+}
+
+static void
+run_ns_tagname_overwrite_test(char *text, char *result)
+{
+    CharData storage;
+    CharData_Init(&storage);
+    XML_SetUserData(parser, &storage);
+    XML_SetElementHandler(parser,
+                          overwrite_start_checker, overwrite_end_checker);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+    CharData_CheckString(&storage, result);
+}
+
+/* Regression test for SF bug #566334. */
+START_TEST(test_ns_tagname_overwrite)
+{
+    char *text =
+        "<n:e xmlns:n='http://xml.libexpat.org/'>\n"
+        "  <n:f n:attr='foo'/>\n"
+        "  <n:g n:attr2='bar'/>\n"
+        "</n:e>";
+    char *result =
+        "start http://xml.libexpat.org/ e\n"
+        "start http://xml.libexpat.org/ f\n"
+        "attribute http://xml.libexpat.org/ attr\n"
+        "end http://xml.libexpat.org/ f\n"
+        "start http://xml.libexpat.org/ g\n"
+        "attribute http://xml.libexpat.org/ attr2\n"
+        "end http://xml.libexpat.org/ g\n"
+        "end http://xml.libexpat.org/ e\n";
+    run_ns_tagname_overwrite_test(text, result);
+}
+END_TEST
+
+/* Regression test for SF bug #566334. */
+START_TEST(test_ns_tagname_overwrite_triplet)
+{
+    char *text =
+        "<n:e xmlns:n='http://xml.libexpat.org/'>\n"
+        "  <n:f n:attr='foo'/>\n"
+        "  <n:g n:attr2='bar'/>\n"
+        "</n:e>";
+    char *result =
+        "start http://xml.libexpat.org/ e n\n"
+        "start http://xml.libexpat.org/ f n\n"
+        "attribute http://xml.libexpat.org/ attr n\n"
+        "end http://xml.libexpat.org/ f n\n"
+        "start http://xml.libexpat.org/ g n\n"
+        "attribute http://xml.libexpat.org/ attr2 n\n"
+        "end http://xml.libexpat.org/ g n\n"
+        "end http://xml.libexpat.org/ e n\n";
+    XML_SetReturnNSTriplet(parser, XML_TRUE);
+    run_ns_tagname_overwrite_test(text, result);
+}
+END_TEST
+
+
+/* Regression test for SF bug #620343. */
+static void XMLCALL
+start_element_fail(void *userData,
+                   const XML_Char *name, const XML_Char **atts)
+{
+    /* We should never get here. */
+    fail("should never reach start_element_fail()");
+}
+
+static void XMLCALL
+start_ns_clearing_start_element(void *userData,
+                                const XML_Char *prefix,
+                                const XML_Char *uri)
+{
+    XML_SetStartElementHandler((XML_Parser) userData, NULL);
+}
+
+START_TEST(test_start_ns_clears_start_element)
+{
+    /* This needs to use separate start/end tags; using the empty tag
+       syntax doesn't cause the problematic path through Expat to be
+       taken.
+    */
+    char *text = "<e xmlns='http://xml.libexpat.org/'></e>";
+
+    XML_SetStartElementHandler(parser, start_element_fail);
+    XML_SetStartNamespaceDeclHandler(parser, start_ns_clearing_start_element);
+    XML_UseParserAsHandlerArg(parser);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+/* Regression test for SF bug #616863. */
+static int XMLCALL
+external_entity_handler(XML_Parser parser,
+                        const XML_Char *context,
+                        const XML_Char *base,
+                        const XML_Char *systemId,
+                        const XML_Char *publicId) 
+{
+    int callno = 1 + (int)XML_GetUserData(parser);
+    char *text;
+    XML_Parser p2;
+
+    if (callno == 1)
+        text = ("<!ELEMENT doc (e+)>\n"
+                "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
+                "<!ELEMENT e EMPTY>\n");
+    else
+        text = ("<?xml version='1.0' encoding='us-ascii'?>"
+                "<e/>");
+
+    XML_SetUserData(parser, (void *) callno);
+    p2 = XML_ExternalEntityParserCreate(parser, context, NULL);
+    if (XML_Parse(p2, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) {
+        xml_failure(p2);
+        return 0;
+    }
+    XML_ParserFree(p2);
+    return 1;
+}
+
+START_TEST(test_default_ns_from_ext_subset_and_ext_ge)
+{
+    char *text =
+        "<?xml version='1.0'?>\n"
+        "<!DOCTYPE doc SYSTEM 'http://xml.libexpat.org/doc.dtd' [\n"
+        "  <!ENTITY en SYSTEM 'http://xml.libexpat.org/entity.ent'>\n"
+        "]>\n"
+        "<doc xmlns='http://xml.libexpat.org/ns1'>\n"
+        "&en;\n"
+        "</doc>";
+
+    XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+    XML_SetExternalEntityRefHandler(parser, external_entity_handler);
+    /* We actually need to set this handler to tickle this bug. */
+    XML_SetStartElementHandler(parser, dummy_start_element);
+    XML_SetUserData(parser, NULL);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+/* Regression test #1 for SF bug #673791. */
+START_TEST(test_ns_prefix_with_empty_uri_1)
+{
+    char *text =
+        "<doc xmlns:prefix='http://xml.libexpat.org/'>\n"
+        "  <e xmlns:prefix=''/>\n"
+        "</doc>";
+
+    expect_failure(text,
+                   XML_ERROR_UNDECLARING_PREFIX,
+                   "Did not report re-setting namespace"
+                   " URI with prefix to ''.");
+}
+END_TEST
+
+/* Regression test #2 for SF bug #673791. */
+START_TEST(test_ns_prefix_with_empty_uri_2)
+{
+    char *text =
+        "<?xml version='1.0'?>\n"
+        "<docelem xmlns:pre=''/>";
+
+    expect_failure(text,
+                   XML_ERROR_UNDECLARING_PREFIX,
+                   "Did not report setting namespace URI with prefix to ''.");
+}
+END_TEST
+
+/* Regression test #3 for SF bug #673791. */
+START_TEST(test_ns_prefix_with_empty_uri_3)
+{
+    char *text =
+        "<!DOCTYPE doc [\n"
+        "  <!ELEMENT doc EMPTY>\n"
+        "  <!ATTLIST doc\n"
+        "    xmlns:prefix CDATA ''>\n"
+        "]>\n"
+        "<doc/>";
+
+    expect_failure(text,
+                   XML_ERROR_UNDECLARING_PREFIX,
+                   "Didn't report attr default setting NS w/ prefix to ''.");
+}
+END_TEST
+
+/* Regression test #4 for SF bug #673791. */
+START_TEST(test_ns_prefix_with_empty_uri_4)
+{
+    char *text =
+        "<!DOCTYPE doc [\n"
+        "  <!ELEMENT prefix:doc EMPTY>\n"
+        "  <!ATTLIST prefix:doc\n"
+        "    xmlns:prefix CDATA 'http://xml.libexpat.org/'>\n"
+        "]>\n"
+        "<prefix:doc/>";
+    /* Packaged info expected by the end element handler;
+       the weird structuring lets us re-use the triplet_end_checker()
+       function also used for another test. */
+    char *elemstr[] = {
+        "http://xml.libexpat.org/ doc prefix"
+    };
+    XML_SetReturnNSTriplet(parser, XML_TRUE);
+    XML_SetUserData(parser, elemstr);
+    XML_SetEndElementHandler(parser, triplet_end_checker);
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+START_TEST(test_ns_default_with_empty_uri)
+{
+    char *text =
+        "<doc xmlns='http://xml.libexpat.org/'>\n"
+        "  <e xmlns=''/>\n"
+        "</doc>";
+    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+}
+END_TEST
+
+/* Regression test for SF bug #692964: two prefixes for one namespace. */
+START_TEST(test_ns_duplicate_attrs_diff_prefixes)
+{
+    char *text =
+        "<doc xmlns:a='http://xml.libexpat.org/a'\n"
+        "     xmlns:b='http://xml.libexpat.org/a'\n"
+        "     a:a='v' b:a='v' />";
+    expect_failure(text,
+                   XML_ERROR_DUPLICATE_ATTRIBUTE,
+                   "did not report multiple attributes with same URI+name");
+}
+END_TEST
+
+/* Regression test for SF bug #695401: unbound prefix. */
+START_TEST(test_ns_unbound_prefix_on_attribute)
+{
+    char *text = "<doc a:attr=''/>";
+    expect_failure(text,
+                   XML_ERROR_UNBOUND_PREFIX,
+                   "did not report unbound prefix on attribute");
+}
+END_TEST
+
+/* Regression test for SF bug #695401: unbound prefix. */
+START_TEST(test_ns_unbound_prefix_on_element)
+{
+    char *text = "<a:doc/>";
+    expect_failure(text,
+                   XML_ERROR_UNBOUND_PREFIX,
+                   "did not report unbound prefix on element");
+}
+END_TEST
+
+static Suite *
+make_suite(void)
+{
+    Suite *s = suite_create("basic");
+    TCase *tc_basic = tcase_create("basic tests");
+    TCase *tc_namespace = tcase_create("XML namespaces");
+
+    suite_add_tcase(s, tc_basic);
+    tcase_add_checked_fixture(tc_basic, basic_setup, basic_teardown);
+    tcase_add_test(tc_basic, test_nul_byte);
+    tcase_add_test(tc_basic, test_u0000_char);
+    tcase_add_test(tc_basic, test_bom_utf8);
+    tcase_add_test(tc_basic, test_bom_utf16_be);
+    tcase_add_test(tc_basic, test_bom_utf16_le);
+    tcase_add_test(tc_basic, test_illegal_utf8);
+    tcase_add_test(tc_basic, test_utf16);
+    tcase_add_test(tc_basic, test_utf16_le_epilog_newline);
+    tcase_add_test(tc_basic, test_latin1_umlauts);
+    /* Regression test for SF bug #491986. */
+    tcase_add_test(tc_basic, test_danish_latin1);
+    /* Regression test for SF bug #514281. */
+    tcase_add_test(tc_basic, test_french_charref_hexidecimal);
+    tcase_add_test(tc_basic, test_french_charref_decimal);
+    tcase_add_test(tc_basic, test_french_latin1);
+    tcase_add_test(tc_basic, test_french_utf8);
+    tcase_add_test(tc_basic, test_utf8_false_rejection);
+    tcase_add_test(tc_basic, test_line_number_after_parse);
+    tcase_add_test(tc_basic, test_column_number_after_parse);
+    tcase_add_test(tc_basic, test_line_and_column_numbers_inside_handlers);
+    tcase_add_test(tc_basic, test_line_number_after_error);
+    tcase_add_test(tc_basic, test_column_number_after_error);
+    tcase_add_test(tc_basic, test_really_long_lines);
+    tcase_add_test(tc_basic, test_end_element_events);
+    tcase_add_test(tc_basic, test_attr_whitespace_normalization);
+    tcase_add_test(tc_basic, test_xmldecl_misplaced);
+    tcase_add_test(tc_basic, test_unknown_encoding_internal_entity);
+    tcase_add_test(tc_basic,
+                   test_wfc_undeclared_entity_unread_external_subset);
+    tcase_add_test(tc_basic, test_wfc_undeclared_entity_no_external_subset);
+    tcase_add_test(tc_basic, test_wfc_undeclared_entity_standalone);
+    tcase_add_test(tc_basic, test_wfc_undeclared_entity_with_external_subset);
+    tcase_add_test(tc_basic,
+                   test_wfc_undeclared_entity_with_external_subset_standalone);
+    tcase_add_test(tc_basic, test_wfc_no_recursive_entity_refs);
+    tcase_add_test(tc_basic, test_ext_entity_set_encoding);
+    tcase_add_test(tc_basic, test_dtd_default_handling);
+    tcase_add_test(tc_basic, test_empty_ns_without_namespaces);
+    tcase_add_test(tc_basic, test_ns_in_attribute_default_without_namespaces);
+
+    suite_add_tcase(s, tc_namespace);
+    tcase_add_checked_fixture(tc_namespace,
+                              namespace_setup, namespace_teardown);
+    tcase_add_test(tc_namespace, test_return_ns_triplet);
+    tcase_add_test(tc_namespace, test_ns_tagname_overwrite);
+    tcase_add_test(tc_namespace, test_ns_tagname_overwrite_triplet);
+    tcase_add_test(tc_namespace, test_start_ns_clears_start_element);
+    tcase_add_test(tc_namespace, test_default_ns_from_ext_subset_and_ext_ge);
+    tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_1);
+    tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_2);
+    tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_3);
+    tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_4);
+    tcase_add_test(tc_namespace, test_ns_default_with_empty_uri);
+    tcase_add_test(tc_namespace, test_ns_duplicate_attrs_diff_prefixes);
+    tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_attribute);
+    tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_element);
+
+    return s;
+}
+
+
+#ifdef AMIGA_SHARED_LIB
+int
+amiga_main(int argc, char *argv[])
+#else
+int
+main(int argc, char *argv[])
+#endif
+{
+    int i, nf;
+    int forking = 0, forking_set = 0;
+    int verbosity = CK_NORMAL;
+    Suite *s = make_suite();
+    SRunner *sr = srunner_create(s);
+
+    /* run the tests for internal helper functions */
+    testhelper_is_whitespace_normalized();
+
+    for (i = 1; i < argc; ++i) {
+        char *opt = argv[i];
+        if (strcmp(opt, "-v") == 0 || strcmp(opt, "--verbose") == 0)
+            verbosity = CK_VERBOSE;
+        else if (strcmp(opt, "-q") == 0 || strcmp(opt, "--quiet") == 0)
+            verbosity = CK_SILENT;
+        else if (strcmp(opt, "-f") == 0 || strcmp(opt, "--fork") == 0) {
+            forking = 1;
+            forking_set = 1;
+        }
+        else if (strcmp(opt, "-n") == 0 || strcmp(opt, "--no-fork") == 0) {
+            forking = 0;
+            forking_set = 1;
+        }
+        else {
+            fprintf(stderr, "runtests: unknown option '%s'\n", opt);
+            return 2;
+        }
+    }
+    if (forking_set)
+        srunner_set_fork_status(sr, forking ? CK_FORK : CK_NOFORK);
+    if (verbosity != CK_SILENT)
+        printf("Expat version: %s\n", XML_ExpatVersion());
+    srunner_run_all(sr, verbosity);
+    nf = srunner_ntests_failed(sr);
+    srunner_free(sr);
+
+    return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/reactos/lib/3rdparty/expat/tests/runtestspp.cpp b/reactos/lib/3rdparty/expat/tests/runtestspp.cpp
new file mode 100644 (file)
index 0000000..c35dc58
--- /dev/null
@@ -0,0 +1,6 @@
+// C++ compilation harness for the test suite.
+//
+// This is used to ensure the Expat headers can be included from C++
+// and have everything work as expected.
+//
+#include "runtests.c"
diff --git a/reactos/lib/3rdparty/expat/tests/xmltest.sh b/reactos/lib/3rdparty/expat/tests/xmltest.sh
new file mode 100644 (file)
index 0000000..725441e
--- /dev/null
@@ -0,0 +1,141 @@
+#! /bin/sh
+
+#   EXPAT TEST SCRIPT FOR W3C XML TEST SUITE
+
+# This script can be used to exercise Expat against the
+# w3c.org xml test suite, available from
+# http://www.w3.org/XML/Test/xmlts20020606.zip.
+
+# To run this script, first set XMLWF so that xmlwf can be
+# found, then set the output directory with OUTPUT.
+
+# The script lists all test cases where Expat shows a discrepancy
+# from the expected result. Test cases where only the canonical
+# output differs are prefixed with "Output differs:", and a diff file
+# is generated in the appropriate subdirectory under $OUTPUT.
+
+# If there are output files provided, the script will use
+# output from xmlwf and compare the desired output against it.
+# However, one has to take into account that the canonical output
+# produced by xmlwf conforms to an older definition of canonical XML
+# and does not generate notation declarations.
+
+MYDIR="`dirname \"$0\"`"
+cd "$MYDIR"
+MYDIR="`pwd`"
+XMLWF="`dirname \"$MYDIR\"`/xmlwf/xmlwf"
+# XMLWF=/usr/local/bin/xmlwf
+TS="$MYDIR/XML-Test-Suite"
+# OUTPUT must terminate with the directory separator.
+OUTPUT="$TS/out/"
+# OUTPUT=/home/tmp/xml-testsuite-out/
+
+
+# RunXmlwfNotWF file reldir
+# reldir includes trailing slash
+RunXmlwfNotWF() {
+  file="$1"
+  reldir="$2"
+  $XMLWF -p "$file" > outfile || return $?
+  read outdata < outfile
+  if test "$outdata" = "" ; then
+      echo "Expected well-formed: $reldir$file"
+      return 1
+  else
+      return 0
+  fi 
+}
+
+# RunXmlwfWF file reldir
+# reldir includes trailing slash
+RunXmlwfWF() {
+  file="$1"
+  reldir="$2"
+  $XMLWF -p -d "$OUTPUT$reldir" "$file" > outfile || return $?
+  read outdata < outfile 
+  if test "$outdata" = "" ; then 
+      if [ -f "out/$file" ] ; then 
+          diff "$OUTPUT$reldir$file" "out/$file" > outfile 
+          if [ -s outfile ] ; then 
+              cp outfile "$OUTPUT$reldir$file.diff"
+              echo "Output differs: $reldir$file"
+              return 1
+          fi 
+      fi 
+      return 0
+  else 
+      echo "In $reldir: $outdata"
+      return 1
+  fi 
+}
+
+SUCCESS=0
+ERROR=0
+
+UpdateStatus() {
+  if [ "$1" -eq 0 ] ; then
+    SUCCESS=`expr $SUCCESS + 1`
+  else
+    ERROR=`expr $ERROR + 1`
+  fi
+}
+
+##########################
+# well-formed test cases #
+##########################
+
+cd "$TS/xmlconf"
+for xmldir in ibm/valid/P* \
+              ibm/invalid/P* \
+              xmltest/valid/ext-sa \
+              xmltest/valid/not-sa \
+              xmltest/invalid \
+              xmltest/invalid/not-sa \
+              xmltest/valid/sa \
+              sun/valid \
+              sun/invalid ; do
+  cd "$TS/xmlconf/$xmldir"
+  mkdir -p "$OUTPUT$xmldir"
+  for xmlfile in *.xml ; do
+      RunXmlwfWF "$xmlfile" "$xmldir/"
+      UpdateStatus $?
+  done
+  rm outfile
+done
+
+cd "$TS/xmlconf/oasis"
+mkdir -p "$OUTPUT"oasis
+for xmlfile in *pass*.xml ; do
+    RunXmlwfWF "$xmlfile" "oasis/"
+    UpdateStatus $?
+done
+rm outfile
+
+##############################
+# not well-formed test cases #
+##############################
+
+cd "$TS/xmlconf"
+for xmldir in ibm/not-wf/P* \
+              ibm/not-wf/misc \
+              xmltest/not-wf/ext-sa \
+              xmltest/not-wf/not-sa \
+              xmltest/not-wf/sa \
+              sun/not-wf ; do
+  cd "$TS/xmlconf/$xmldir"
+  for xmlfile in *.xml ; do
+      RunXmlwfNotWF "$xmlfile" "$xmldir/"
+      UpdateStatus $?
+  done
+  rm outfile
+done
+
+cd "$TS/xmlconf/oasis"
+for xmlfile in *fail*.xml ; do
+    RunXmlwfNotWF "$xmlfile" "oasis/"
+    UpdateStatus $?
+done
+rm outfile
+
+echo "Passed: $SUCCESS"
+echo "Failed: $ERROR"
diff --git a/reactos/lib/3rdparty/expat/vms/README.vms b/reactos/lib/3rdparty/expat/vms/README.vms
new file mode 100644 (file)
index 0000000..3dd2ca7
--- /dev/null
@@ -0,0 +1,23 @@
+4-jun-2002     Craig A. Berry
+               Added rudimentary build procedures for 
+               OpenVMS based on work by Martin Vorlaender.
+
+
+You'll need MMS or its freeware equivalent MMK.  Just go to the 
+top-level directory and type
+
+$ MMS/DESCRIPTION=[.vms]
+  or
+
+$ MMK/DESCRIPTION=[.vms]
+
+You'll end up with the object library expat.olb.  For now, installation
+consists merely of copying the object library, include files, and
+documentation to a suitable location.  
+
+To-do list:
+
+       -- create a shareable image
+       -- build and run the tests and build the xmlwf utility
+       -- create an install target
diff --git a/reactos/lib/3rdparty/expat/vms/descrip.mms b/reactos/lib/3rdparty/expat/vms/descrip.mms
new file mode 100644 (file)
index 0000000..d9ee3d9
--- /dev/null
@@ -0,0 +1,70 @@
+# Bare bones description file (Makefile) for OpenVMS
+
+PACKAGE = expat
+VERSION = 1.95.8
+EXPAT_MAJOR_VERSION=1
+EXPAT_MINOR_VERSION=95
+EXPAT_EDIT=8
+
+O = .obj
+OLB = .olb
+LIBRARY = expat$(OLB)
+LIBDIR = [.lib]
+SOURCES = $(LIBDIR)xmlparse.c $(LIBDIR)xmltok.c $(LIBDIR)xmlrole.c
+OBJECTS = xmlparse$(O) xmltok$(O) xmlrole$(O)
+TEMPLATES = xmltok_impl.c xmltok_ns.c
+APIHEADER = $(LIBDIR)expat.h
+HEADERS = $(LIBDIR)ascii.h $(LIBDIR)iasciitab.h $(LIBDIR)utf8tab.h $(LIBDIR)xmltok.h \
+       $(LIBDIR)asciitab.h $(LIBDIR)latin1tab.h \
+       $(LIBDIR)nametab.h $(LIBDIR)xmldef.h $(LIBDIR)xmlrole.h $(LIBDIR)xmltok_impl.h
+CONFIG_HEADER = expat_config.h
+INCLUDES = /INCLUDE=([],[.lib])
+DEFS = /DEFINE=(PACKAGE="""$(PACKAGE)""",VERSION="""$(PACKAGE)_$(VERSION)""",HAVE_EXPAT_CONFIG_H)
+LIBREVISION = 0
+LIBCURRENT  = 1
+LIBAGE      = 0
+# 
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
+# 
+# DISTFILES = $(DIST_COMMON) $(SOURCES) $(TEMPLATES) $(APIHEADER) $(HEADERS) 
+# 
+# TAR = gtar
+# GZIP_ENV = --best
+# 
+.FIRST :
+       IF F$SEARCH("$(LIBRARY)") .EQS. "" THEN $(LIBR) /CREATE /OBJECT $(LIBRARY)
+
+all : $(LIBRARY)
+        @ write sys$output "All made."
+.SUFFIXES : 
+.SUFFIXES : $(OLB) $(O) .C .H  
+.c$(O) :
+       $(COMPILE) $(MMS$SOURCE)
+$(O)$(OLB) :
+        @ IF F$SEARCH("$(MMS$TARGET)") .EQS. "" -
+                THEN LIBRARY/CREATE/LOG $(MMS$TARGET)
+        @ LIBRARY /REPLACE /LOG $(MMS$TARGET) $(MMS$SOURCE)
+clean :
+       DELETE $(LIBRARY);*,*$(O);*
+$(LIBRARY) : $(LIBRARY)( $(OBJECTS) ) 
+       $(LIBR) /COMPRESS $(MMS$TARGET)
+
+$(CONFIG_HEADER) : [.vms]expat_config.h
+        COPY/LOG $(MMS$SOURCE) $(MMS$TARGET)
+
+xmlparse$(O) : $(LIBDIR)xmlparse.c $(LIBDIR)expat.h $(LIBDIR)xmlrole.h $(LIBDIR)xmltok.h $(CONFIG_HEADER)
+xmlrole$(O) : $(LIBDIR)xmlrole.c $(LIBDIR)ascii.h $(LIBDIR)xmlrole.h $(CONFIG_HEADER)
+xmltok$(O) : $(LIBDIR)xmltok.c $(LIBDIR)xmltok_impl.c $(LIBDIR)xmltok_ns.c \
+        $(LIBDIR)ascii.h $(LIBDIR)asciitab.h $(LIBDIR)iasciitab.h $(LIBDIR)latin1tab.h \
+       $(LIBDIR)nametab.h $(LIBDIR)utf8tab.h $(LIBDIR)xmltok.h $(LIBDIR)xmltok_impl.h $(CONFIG_HEADER)
+
diff --git a/reactos/lib/3rdparty/expat/vms/expat_config.h b/reactos/lib/3rdparty/expat/vms/expat_config.h
new file mode 100644 (file)
index 0000000..d5db89e
--- /dev/null
@@ -0,0 +1,52 @@
+/* Copyright 2000, Clark Cooper
+   All rights reserved.
+
+   This is free software. You are permitted to copy, distribute, or modify
+   it under the terms of the MIT/X license (contained in the COPYING file
+   with this distribution.)
+*/
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define if you have a working `mmap' system call.  */
+#undef HAVE_MMAP
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if your processor stores words with the most significant
+   byte first (like Motorola and SPARC, unlike Intel and VAX).  */
+#undef WORDS_BIGENDIAN
+
+/* Define if you have the bcopy function.  */
+#undef HAVE_BCOPY
+
+/* Define if you have the memmove function.  */
+#define HAVE_MEMMOVE 1
+
+/* Define if you have the <unistd.h> header file.  */
+#define HAVE_UNISTD_H 1
+
+#define XML_NS
+#define XML_DTD
+
+#ifdef WORDS_BIGENDIAN
+#define XML_BYTE_ORDER 21
+#else
+#define XML_BYTE_ORDER 12
+#endif
+
+#define XML_CONTEXT_BYTES 1024
+
+#ifndef HAVE_MEMMOVE
+#ifdef HAVE_BCOPY
+#define memmove(d,s,l) bcopy((s),(d),(l))
+#else
+#define memmove(d,s,l) ;punting on memmove;
+#endif
+
+#endif
diff --git a/reactos/lib/3rdparty/expat/win32/MANIFEST.txt b/reactos/lib/3rdparty/expat/win32/MANIFEST.txt
new file mode 100644 (file)
index 0000000..e579c69
--- /dev/null
@@ -0,0 +1,29 @@
+                     Overview of the Expat distribution
+
+The Expat distribution creates several subdirectories on your system.
+Some of these directories contain components of interest to all Expat
+users, and some contain material of interest to developers who wish to
+use Expat in their applications.  In the list below, <top> is the
+directory you specified to the installer.
+
+    Directory           Contents
+    --------------------------------------------------------------------
+    <top>\              The XML well-formedness checker and some general
+                        information files.
+
+    <top>\Doc\          API documentation for developers.
+
+    <top>\Libs\         Pre-compiled dynamic libraries for developers.
+
+    <top>\StaticLibs\   Pre-compiled static libraries for developers.
+
+    <top>\Source\       Source code, which may interest some developers,
+                        including a workspace for Microsft Visual C++.
+                        The source code includes the parser, the well-
+                        formedness checker, and a couple of small sample
+                        applications.
+
+    <top>\Source\bcb5\  Project files for Borland C++ Builder 5 and BCC
+                        5.5.
+
+
diff --git a/reactos/lib/3rdparty/expat/win32/README.txt b/reactos/lib/3rdparty/expat/win32/README.txt
new file mode 100644 (file)
index 0000000..2cad767
--- /dev/null
@@ -0,0 +1,75 @@
+
+Expat can be built on Windows in three ways: 
+  using MS Visual C++ (6.0 or .NET), Borland C++ Builder 5 or Cygwin.
+
+* Cygwin:
+  This follows the Unix build procedures.
+
+* C++ Builder 5:
+  Possible with make files in the BCB5 subdirectory.
+  Details can be found in the ReadMe file located there.
+
+* MS Visual C++ 6:
+  Based on the workspace file expat.dsw. The related project
+  files (.dsp) are located in the lib subdirectory.
+
+* MS Visual Studio .NET 2002, 2003, 2005:
+  The VC++ 6 workspace file (expat.dsw) and project files (.dsp)
+  can be opened and imported in VS.NET without problems.
+  
+* Creating MinGW dynamic libraries from MS VC++ DLLs:
+  
+  On the command line, execute these steps:
+  pexports libexpat.dll > expat.def
+  pexports libexpatw.dll > expatw.def
+  dlltool -d expat.def -l libexpat.a
+  dlltool -d expatw.def -l libexpatw.a
+  
+  The *.a files are mingw libraries.
+
+* Special note about MS VC++ and runtime libraries:
+
+  There are three possible configurations: using the
+  single threaded or multithreaded run-time library,
+  or using the multi-threaded run-time Dll. That is, 
+  one can build three different Expat libraries depending
+  on the needs of the application.
+
+  Dynamic Linking:
+
+  By default the Expat Dlls are built to link statically
+  with the multi-threaded run-time library. 
+  The libraries are named
+  - libexpat(w).dll 
+  - libexpat(w).lib (import library)
+  The "w" indicates the UTF-16 version of the library.
+
+  One rarely uses other versions of the Dll, but they can
+  be built easily by specifying a different RTL linkage in
+  the IDE on the C/C++ tab under the category Code Generation.
+
+  Static Linking:
+
+  The libraries should be named like this:
+  Single-theaded:     libexpat(w)ML.lib
+  Multi-threaded:     libexpat(w)MT.lib
+  Multi-threaded Dll: libexpat(w)MD.lib
+  The suffixes conform to the compiler switch settings
+  /ML, /MT and /MD for MS VC++.
+  
+  Note: In Visual Studio 2005 (Visual C++ 8.0) and later, the
+  single-threaded runtime library is not supported anymore.
+
+  By default, the expat-static and expatw-static projects are set up
+  to link statically against the multithreaded run-time library,
+  so they will build libexpatMT.lib or libexpatwMT.lib files.
+
+  To build the other versions of the static library, 
+  go to Project - Settings:
+  - specify a different RTL linkage on the C/C++ tab
+    under the category Code Generation.
+  - then, on the Library tab, change the output file name
+    accordingly, as described above
+
+  An application linking to the static libraries must
+  have the global macro XML_STATIC defined.
diff --git a/reactos/lib/3rdparty/expat/win32/expat.iss b/reactos/lib/3rdparty/expat/win32/expat.iss
new file mode 100644 (file)
index 0000000..5ff808c
--- /dev/null
@@ -0,0 +1,70 @@
+; Basic setup script for the Inno Setup installer builder.  For more
+; information on the free installer builder, see www.jrsoftware.org.
+;
+; This script was contributed by Tim Peters.
+; The current version is used with Inno Setup 2.0.19.
+
+[Setup]
+AppName=expat
+AppId=expat
+AppVersion=2.0.0
+AppVerName=expat 2.0.0
+AppCopyright=Copyright © 1998-2006 Thai Open Source Software Center, Clark Cooper, and the Expat maintainers
+DefaultDirName={sd}\Expat-2.0.0
+AppPublisher=The Expat Developers
+AppPublisherURL=http://www.libexpat.org/
+AppSupportURL=http://www.libexpat.org/
+AppUpdatesURL=http://www.libexpat.org/
+UninstallDisplayName=Expat XML Parser (version 2.0.0)
+UninstallFilesDir={app}\Uninstall
+
+Compression=bzip/9
+SourceDir=..
+OutputDir=win32
+DisableStartupPrompt=yes
+AllowNoIcons=yes
+DisableProgramGroupPage=yes
+DisableReadyPage=yes
+
+[Files]
+Flags: ignoreversion; Source: xmlwf\Release\*.exe;        DestDir: "{app}"
+Flags: ignoreversion; Source: win32\MANIFEST.txt;         DestDir: "{app}"
+Flags: ignoreversion; Source: Changes;                    DestDir: "{app}"; DestName: Changes.txt
+Flags: ignoreversion; Source: COPYING;                    DestDir: "{app}"; DestName: COPYING.txt
+Flags: ignoreversion; Source: README;                     DestDir: "{app}"; DestName: README.txt
+Flags: ignoreversion; Source: doc\*.html;                 DestDir: "{app}\Doc"
+Flags: ignoreversion; Source: doc\*.css;                  DestDir: "{app}\Doc"
+Flags: ignoreversion; Source: doc\*.png;                  DestDir: "{app}\Doc"
+Flags: ignoreversion; Source: lib\Release\*.dll;          DestDir: "{app}\Libs"
+Flags: ignoreversion; Source: lib\Release\*.lib;          DestDir: "{app}\Libs"
+Flags: ignoreversion; Source: lib\Release-w\*.dll;        DestDir: "{app}\Libs"
+Flags: ignoreversion; Source: lib\Release-w\*.lib;        DestDir: "{app}\Libs"
+Flags: ignoreversion; Source: lib\Release_static\*.lib;   DestDir: "{app}\StaticLibs"
+Flags: ignoreversion; Source: lib\Release-w_static\*.lib; DestDir: "{app}\StaticLibs"
+Flags: ignoreversion; Source: expat.dsw;                  DestDir: "{app}\Source"
+Flags: ignoreversion; Source: win32\README.txt;           DestDir: "{app}\Source"
+Flags: ignoreversion; Source: bcb5\*.bp*;                 DestDir: "{app}\Source\bcb5"
+Flags: ignoreversion; Source: bcb5\*.mak;                 DestDir: "{app}\Source\bcb5"
+Flags: ignoreversion; Source: bcb5\*.def;                 DestDir: "{app}\Source\bcb5"
+Flags: ignoreversion; Source: bcb5\*.txt;                 DestDir: "{app}\Source\bcb5"
+Flags: ignoreversion; Source: bcb5\*.bat;                 DestDir: "{app}\Source\bcb5"
+Flags: ignoreversion; Source: lib\*.c;                    DestDir: "{app}\Source\lib"
+Flags: ignoreversion; Source: lib\*.h;                    DestDir: "{app}\Source\lib"
+Flags: ignoreversion; Source: lib\*.def;                  DestDir: "{app}\Source\lib"
+Flags: ignoreversion; Source: lib\*.dsp;                  DestDir: "{app}\Source\lib"
+Flags: ignoreversion; Source: examples\*.c;               DestDir: "{app}\Source\examples"
+Flags: ignoreversion; Source: examples\*.dsp;             DestDir: "{app}\Source\examples"
+Flags: ignoreversion; Source: tests\*.c;                  DestDir: "{app}\Source\tests"
+Flags: ignoreversion; Source: tests\*.cpp;                DestDir: "{app}\Source\tests"
+Flags: ignoreversion; Source: tests\*.h;                  DestDir: "{app}\Source\tests"
+Flags: ignoreversion; Source: tests\README.txt;           DestDir: "{app}\Source\tests"
+Flags: ignoreversion; Source: tests\benchmark\*.c;        DestDir: "{app}\Source\tests\benchmark"
+Flags: ignoreversion; Source: tests\benchmark\*.ds*;      DestDir: "{app}\Source\tests\benchmark"
+Flags: ignoreversion; Source: tests\benchmark\README.txt; DestDir: "{app}\Source\tests\benchmark"
+Flags: ignoreversion; Source: xmlwf\*.c*;                 DestDir: "{app}\Source\xmlwf"
+Flags: ignoreversion; Source: xmlwf\*.h;                  DestDir: "{app}\Source\xmlwf"
+Flags: ignoreversion; Source: xmlwf\*.dsp;                DestDir: "{app}\Source\xmlwf"
+
+[Messages]
+WelcomeLabel1=Welcome to the Expat XML Parser Setup Wizard
+WelcomeLabel2=This will install [name/ver] on your computer.%n%nExpat is an XML parser with a C-language API, and is primarily made available to allow developers to build applications which use XML using a portable API and fast implementation.%n%nIt is strongly recommended that you close all other applications you have running before continuing. This will help prevent any conflicts during the installation process.
diff --git a/reactos/lib/3rdparty/expat/xmlwf/codepage.c b/reactos/lib/3rdparty/expat/xmlwf/codepage.c
new file mode 100644 (file)
index 0000000..e610c7c
--- /dev/null
@@ -0,0 +1,68 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+#include "codepage.h"
+
+#ifdef WIN32
+#define STRICT 1
+#define WIN32_LEAN_AND_MEAN 1
+
+#include <windows.h>
+
+int
+codepageMap(int cp, int *map)
+{
+  int i;
+  CPINFO info;
+  if (!GetCPInfo(cp, &info) || info.MaxCharSize > 2)
+    return 0;
+  for (i = 0; i < 256; i++)
+    map[i] = -1;
+  if (info.MaxCharSize > 1) {
+    for (i = 0; i < MAX_LEADBYTES; i+=2) {
+      int j, lim;
+      if (info.LeadByte[i] == 0 && info.LeadByte[i + 1] == 0)
+        break;
+      lim = info.LeadByte[i + 1];
+      for (j = info.LeadByte[i]; j <= lim; j++)
+        map[j] = -2;
+    }
+  }
+  for (i = 0; i < 256; i++) {
+   if (map[i] == -1) {
+     char c = (char)i;
+     unsigned short n;
+     if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS,
+                             &c, 1, &n, 1) == 1)
+       map[i] = n;
+   }
+  }
+  return 1;
+}
+
+int
+codepageConvert(int cp, const char *p)
+{
+  unsigned short c;
+  if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS,
+                          p, 2, &c, 1) == 1)
+    return c;
+  return -1;
+}
+
+#else /* not WIN32 */
+
+int
+codepageMap(int cp, int *map)
+{
+  return 0;
+}
+
+int
+codepageConvert(int cp, const char *p)
+{
+  return -1;
+}
+
+#endif /* not WIN32 */
diff --git a/reactos/lib/3rdparty/expat/xmlwf/codepage.h b/reactos/lib/3rdparty/expat/xmlwf/codepage.h
new file mode 100644 (file)
index 0000000..6a4df68
--- /dev/null
@@ -0,0 +1,6 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+int codepageMap(int cp, int *map);
+int codepageConvert(int cp, const char *p);
diff --git a/reactos/lib/3rdparty/expat/xmlwf/ct.c b/reactos/lib/3rdparty/expat/xmlwf/ct.c
new file mode 100644 (file)
index 0000000..95903a3
--- /dev/null
@@ -0,0 +1,147 @@
+#define CHARSET_MAX 41
+
+static const char *
+getTok(const char **pp)
+{
+  enum { inAtom, inString, init, inComment };
+  int state = init;
+  const char *tokStart = 0;
+  for (;;) {
+    switch (**pp) {
+    case '\0':
+      return 0;
+    case ' ':
+    case '\r':
+    case '\t':
+    case '\n':
+      if (state == inAtom)
+        return tokStart;
+      break;
+    case '(':
+      if (state == inAtom)
+        return tokStart;
+      if (state != inString)
+        state++;
+      break;
+    case ')':
+      if (state > init)
+        --state;
+      else if (state != inString)
+        return 0;
+      break;
+    case ';':
+    case '/':
+    case '=':
+      if (state == inAtom)
+        return tokStart;
+      if (state == init)
+        return (*pp)++;
+      break;
+    case '\\':
+      ++*pp;
+      if (**pp == '\0')
+        return 0;
+      break;
+    case '"':
+      switch (state) {
+      case inString:
+        ++*pp;
+        return tokStart;
+      case inAtom:
+        return tokStart;
+      case init:
+        tokStart = *pp;
+        state = inString;
+        break;
+      }
+      break;
+    default:
+      if (state == init) {
+        tokStart = *pp;
+        state = inAtom;
+      }
+      break;
+    }
+    ++*pp;
+  }
+  /* not reached */
+}
+
+/* key must be lowercase ASCII */
+
+static int
+matchkey(const char *start, const char *end, const char *key)
+{
+  if (!start)
+    return 0;
+  for (; start != end; start++, key++)
+    if (*start != *key && *start != 'A' + (*key - 'a'))
+      return 0;
+  return *key == '\0';
+}
+
+void
+getXMLCharset(const char *buf, char *charset)
+{
+  const char *next, *p;
+
+  charset[0] = '\0';
+  next = buf;
+  p = getTok(&next);
+  if (matchkey(p, next, "text"))
+    strcpy(charset, "us-ascii");
+  else if (!matchkey(p, next, "application"))
+    return;
+  p = getTok(&next);
+  if (!p || *p != '/')
+    return;
+  p = getTok(&next);
+  if (matchkey(p, next, "xml"))
+    isXml = 1;
+  p = getTok(&next);
+  while (p) {
+    if (*p == ';') {
+      p = getTok(&next);
+      if (matchkey(p, next, "charset")) {
+        p = getTok(&next);
+        if (p && *p == '=') {
+          p = getTok(&next);
+          if (p) {
+            char *s = charset;
+            if (*p == '"') {
+              while (++p != next - 1) {
+                if (*p == '\\')
+                  ++p;
+                if (s == charset + CHARSET_MAX - 1) {
+                  charset[0] = '\0';
+                  break;
+                }
+                *s++ = *p;
+              }
+              *s++ = '\0';
+            }
+            else {
+              if (next - p > CHARSET_MAX - 1)
+                break;
+              while (p != next)
+                *s++ = *p++;
+              *s = 0;
+              break;
+            }
+          }
+        }
+      }
+    }
+  else
+    p = getTok(&next);
+  }
+}
+
+int
+main(int argc, char **argv)
+{
+  char buf[CHARSET_MAX];
+  getXMLCharset(argv[1], buf);
+  printf("charset = \"%s\"\n", buf);
+  return 0;
+}
diff --git a/reactos/lib/3rdparty/expat/xmlwf/filemap.h b/reactos/lib/3rdparty/expat/xmlwf/filemap.h
new file mode 100644 (file)
index 0000000..814edec
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+#include <stddef.h>
+
+#ifdef XML_UNICODE
+int filemap(const wchar_t *name,
+            void (*processor)(const void *, size_t,
+                              const wchar_t *, void *arg),
+            void *arg);
+#else
+int filemap(const char *name,
+            void (*processor)(const void *, size_t,
+                              const char *, void *arg),
+            void *arg);
+#endif
diff --git a/reactos/lib/3rdparty/expat/xmlwf/readfilemap.c b/reactos/lib/3rdparty/expat/xmlwf/readfilemap.c
new file mode 100644 (file)
index 0000000..42b5e03
--- /dev/null
@@ -0,0 +1,82 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef __BEOS__
+#include <unistd.h>
+#endif
+
+#ifndef S_ISREG
+#ifndef S_IFREG
+#define S_IFREG _S_IFREG
+#endif
+#ifndef S_IFMT
+#define S_IFMT _S_IFMT
+#endif
+#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif /* not S_ISREG */
+
+#ifndef O_BINARY
+#ifdef _O_BINARY
+#define O_BINARY _O_BINARY
+#else
+#define O_BINARY 0
+#endif
+#endif
+
+#include "filemap.h"
+
+int
+filemap(const char *name,
+        void (*processor)(const void *, size_t, const char *, void *arg),
+        void *arg)
+{
+  size_t nbytes;
+  int fd;
+  int n;
+  struct stat sb;
+  void *p;
+
+  fd = open(name, O_RDONLY|O_BINARY);
+  if (fd < 0) {
+    perror(name);
+    return 0;
+  }
+  if (fstat(fd, &sb) < 0) {
+    perror(name);
+    return 0;
+  }
+  if (!S_ISREG(sb.st_mode)) {
+    fprintf(stderr, "%s: not a regular file\n", name);
+    return 0;
+  }
+  nbytes = sb.st_size;
+  p = malloc(nbytes);
+  if (!p) {
+    fprintf(stderr, "%s: out of memory\n", name);
+    return 0;
+  }
+  n = read(fd, p, nbytes);
+  if (n < 0) {
+    perror(name);
+    free(p);
+    close(fd);
+    return 0;
+  }
+  if (n != nbytes) {
+    fprintf(stderr, "%s: read unexpected number of bytes\n", name);
+    free(p);
+    close(fd);
+    return 0;
+  }
+  processor(p, nbytes, name, arg);
+  free(p);
+  close(fd);
+  return 1;
+}
diff --git a/reactos/lib/3rdparty/expat/xmlwf/unixfilemap.c b/reactos/lib/3rdparty/expat/xmlwf/unixfilemap.c
new file mode 100644 (file)
index 0000000..22048c8
--- /dev/null
@@ -0,0 +1,58 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#ifndef MAP_FILE
+#define MAP_FILE 0
+#endif
+
+#include "filemap.h"
+
+int
+filemap(const char *name,
+        void (*processor)(const void *, size_t, const char *, void *arg),
+        void *arg)
+{
+  int fd;
+  size_t nbytes;
+  struct stat sb;
+  void *p;
+
+  fd = open(name, O_RDONLY);
+  if (fd < 0) {
+    perror(name);
+    return 0;
+  }
+  if (fstat(fd, &sb) < 0) {
+    perror(name);
+    close(fd);
+    return 0;
+  }
+  if (!S_ISREG(sb.st_mode)) {
+    close(fd);
+    fprintf(stderr, "%s: not a regular file\n", name);
+    return 0;
+  }
+
+  nbytes = sb.st_size;
+  p = (void *)mmap((caddr_t)0, (size_t)nbytes, PROT_READ,
+                   MAP_FILE|MAP_PRIVATE, fd, (off_t)0);
+  if (p == (void *)-1) {
+    perror(name);
+    close(fd);
+    return 0;
+  }
+  processor(p, nbytes, name, arg);
+  munmap((caddr_t)p, nbytes);
+  close(fd);
+  return 1;
+}
diff --git a/reactos/lib/3rdparty/expat/xmlwf/win32filemap.c b/reactos/lib/3rdparty/expat/xmlwf/win32filemap.c
new file mode 100644 (file)
index 0000000..41dc35b
--- /dev/null
@@ -0,0 +1,96 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+#define STRICT 1
+#define WIN32_LEAN_AND_MEAN 1
+
+#ifdef XML_UNICODE_WCHAR_T
+#ifndef XML_UNICODE
+#define XML_UNICODE
+#endif
+#endif
+
+#ifdef XML_UNICODE
+#define UNICODE
+#define _UNICODE
+#endif /* XML_UNICODE */
+#include <windows.h>
+#include <stdio.h>
+#include <tchar.h>
+#include "filemap.h"
+
+static void win32perror(const TCHAR *);
+
+int
+filemap(const TCHAR *name,
+        void (*processor)(const void *, size_t, const TCHAR *, void *arg),
+        void *arg)
+{
+  HANDLE f;
+  HANDLE m;
+  DWORD size;
+  DWORD sizeHi;
+  void *p;
+
+  f = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
+                          FILE_FLAG_SEQUENTIAL_SCAN, NULL);
+  if (f == INVALID_HANDLE_VALUE) {
+    win32perror(name);
+    return 0;
+  }
+  size = GetFileSize(f, &sizeHi);
+  if (size == (DWORD)-1) {
+    win32perror(name);
+    return 0;
+  }
+  if (sizeHi) {
+    _ftprintf(stderr, _T("%s: bigger than 2Gb\n"), name);
+    return 0;
+  }
+  /* CreateFileMapping barfs on zero length files */
+  if (size == 0) {
+    static const char c = '\0';
+    processor(&c, 0, name, arg);
+    CloseHandle(f);
+    return 1;
+  }
+  m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL);
+  if (m == NULL) {
+    win32perror(name);
+    CloseHandle(f);
+    return 0;
+  }
+  p = MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0);
+  if (p == NULL) {
+    win32perror(name);
+    CloseHandle(m);
+    CloseHandle(f);
+    return 0;
+  }
+  processor(p, size, name, arg); 
+  UnmapViewOfFile(p);
+  CloseHandle(m);
+  CloseHandle(f);
+  return 1;
+}
+
+static void
+win32perror(const TCHAR *s)
+{
+  LPVOID buf;
+  if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
+                    | FORMAT_MESSAGE_FROM_SYSTEM,
+                    NULL,
+                    GetLastError(),
+                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                    (LPTSTR) &buf,
+                    0,
+                    NULL)) {
+    _ftprintf(stderr, _T("%s: %s"), s, buf);
+    fflush(stderr);
+    LocalFree(buf);
+  }
+  else
+    _ftprintf(stderr, _T("%s: unknown Windows error\n"), s);
+}
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmlfile.c b/reactos/lib/3rdparty/expat/xmlwf/xmlfile.c
new file mode 100644 (file)
index 0000000..88bb396
--- /dev/null
@@ -0,0 +1,241 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef COMPILED_FROM_DSP
+#include "winconfig.h"
+#elif defined(MACOS_CLASSIC)
+#include "macconfig.h"
+#elif defined(__amigaos4__)
+#include "amigaconfig.h"
+#elif defined(HAVE_EXPAT_CONFIG_H)
+#include <expat_config.h>
+#endif /* ndef COMPILED_FROM_DSP */
+
+#include "expat.h"
+#include "xmlfile.h"
+#include "xmltchar.h"
+#include "filemap.h"
+
+#ifdef _MSC_VER
+#include <io.h>
+#endif
+
+#ifdef AMIGA_SHARED_LIB
+#include <proto/expat.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifndef O_BINARY
+#ifdef _O_BINARY
+#define O_BINARY _O_BINARY
+#else
+#define O_BINARY 0
+#endif
+#endif
+
+#ifdef _DEBUG
+#define READ_SIZE 16
+#else
+#define READ_SIZE (1024*8)
+#endif
+
+
+typedef struct {
+  XML_Parser parser;
+  int *retPtr;
+} PROCESS_ARGS;
+
+static void
+reportError(XML_Parser parser, const XML_Char *filename)
+{
+  enum XML_Error code = XML_GetErrorCode(parser);
+  const XML_Char *message = XML_ErrorString(code);
+  if (message)
+    ftprintf(stdout, T("%s:%" XML_FMT_INT_MOD "u:%" XML_FMT_INT_MOD "u: %s\n"),
+             filename,
+             XML_GetErrorLineNumber(parser),
+             XML_GetErrorColumnNumber(parser),
+             message);
+  else
+    ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code);
+}
+
+static void
+processFile(const void *data, size_t size,
+            const XML_Char *filename, void *args)
+{
+  XML_Parser parser = ((PROCESS_ARGS *)args)->parser;
+  int *retPtr = ((PROCESS_ARGS *)args)->retPtr;
+  if (XML_Parse(parser, (const char *)data, size, 1) == XML_STATUS_ERROR) {
+    reportError(parser, filename);
+    *retPtr = 0;
+  }
+  else
+    *retPtr = 1;
+}
+
+#ifdef WIN32
+
+static int
+isAsciiLetter(XML_Char c)
+{
+  return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z'));
+}
+
+#endif /* WIN32 */
+
+static const XML_Char *
+resolveSystemId(const XML_Char *base, const XML_Char *systemId,
+                XML_Char **toFree)
+{
+  XML_Char *s;
+  *toFree = 0;
+  if (!base
+      || *systemId == T('/')
+#ifdef WIN32
+      || *systemId == T('\\')
+      || (isAsciiLetter(systemId[0]) && systemId[1] == T(':'))
+#endif
+     )
+    return systemId;
+  *toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2)
+                               * sizeof(XML_Char));
+  if (!*toFree)
+    return systemId;
+  tcscpy(*toFree, base);
+  s = *toFree;
+  if (tcsrchr(s, T('/')))
+    s = tcsrchr(s, T('/')) + 1;
+#ifdef WIN32
+  if (tcsrchr(s, T('\\')))
+    s = tcsrchr(s, T('\\')) + 1;
+#endif
+  tcscpy(s, systemId);
+  return *toFree;
+}
+
+static int
+externalEntityRefFilemap(XML_Parser parser,
+                         const XML_Char *context,
+                         const XML_Char *base,
+                         const XML_Char *systemId,
+                         const XML_Char *publicId)
+{
+  int result;
+  XML_Char *s;
+  const XML_Char *filename;
+  XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
+  PROCESS_ARGS args;
+  args.retPtr = &result;
+  args.parser = entParser;
+  filename = resolveSystemId(base, systemId, &s);
+  XML_SetBase(entParser, filename);
+  if (!filemap(filename, processFile, &args))
+    result = 0;
+  free(s);
+  XML_ParserFree(entParser);
+  return result;
+}
+
+static int
+processStream(const XML_Char *filename, XML_Parser parser)
+{
+  /* passing NULL for filename means read intput from stdin */
+  int fd = 0;   /* 0 is the fileno for stdin */
+
+  if (filename != NULL) {
+    fd = topen(filename, O_BINARY|O_RDONLY);
+    if (fd < 0) {
+      tperror(filename);
+      return 0;
+    }
+  }
+  for (;;) {
+    int nread;
+    char *buf = (char *)XML_GetBuffer(parser, READ_SIZE);
+    if (!buf) {
+      if (filename != NULL)
+        close(fd);
+      ftprintf(stderr, T("%s: out of memory\n"),
+               filename != NULL ? filename : "xmlwf");
+      return 0;
+    }
+    nread = read(fd, buf, READ_SIZE);
+    if (nread < 0) {
+      tperror(filename != NULL ? filename : "STDIN");
+      if (filename != NULL)
+        close(fd);
+      return 0;
+    }
+    if (XML_ParseBuffer(parser, nread, nread == 0) == XML_STATUS_ERROR) {
+      reportError(parser, filename != NULL ? filename : "STDIN");
+      if (filename != NULL)
+        close(fd);
+      return 0;
+    }
+    if (nread == 0) {
+      if (filename != NULL)
+        close(fd);
+      break;;
+    }
+  }
+  return 1;
+}
+
+static int
+externalEntityRefStream(XML_Parser parser,
+                        const XML_Char *context,
+                        const XML_Char *base,
+                        const XML_Char *systemId,
+                        const XML_Char *publicId)
+{
+  XML_Char *s;
+  const XML_Char *filename;
+  int ret;
+  XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
+  filename = resolveSystemId(base, systemId, &s);
+  XML_SetBase(entParser, filename);
+  ret = processStream(filename, entParser);
+  free(s);
+  XML_ParserFree(entParser);
+  return ret;
+}
+
+int
+XML_ProcessFile(XML_Parser parser,
+                const XML_Char *filename,
+                unsigned flags)
+{
+  int result;
+
+  if (!XML_SetBase(parser, filename)) {
+    ftprintf(stderr, T("%s: out of memory"), filename);
+    exit(1);
+  }
+
+  if (flags & XML_EXTERNAL_ENTITIES)
+      XML_SetExternalEntityRefHandler(parser,
+                                      (flags & XML_MAP_FILE)
+                                      ? externalEntityRefFilemap
+                                      : externalEntityRefStream);
+  if (flags & XML_MAP_FILE) {
+    PROCESS_ARGS args;
+    args.retPtr = &result;
+    args.parser = parser;
+    if (!filemap(filename, processFile, &args))
+      result = 0;
+  }
+  else
+    result = processStream(filename, parser);
+  return result;
+}
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmlfile.h b/reactos/lib/3rdparty/expat/xmlwf/xmlfile.h
new file mode 100644 (file)
index 0000000..d093ecc
--- /dev/null
@@ -0,0 +1,20 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+#define XML_MAP_FILE 01
+#define XML_EXTERNAL_ENTITIES 02
+
+#ifdef XML_LARGE_SIZE
+#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
+#define XML_FMT_INT_MOD "I64"
+#else
+#define XML_FMT_INT_MOD "ll"
+#endif
+#else
+#define XML_FMT_INT_MOD "l"
+#endif
+
+extern int XML_ProcessFile(XML_Parser parser,
+                           const XML_Char *filename,
+                           unsigned flags);
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmlmime.c b/reactos/lib/3rdparty/expat/xmlwf/xmlmime.c
new file mode 100644 (file)
index 0000000..56a0e7f
--- /dev/null
@@ -0,0 +1,163 @@
+#include <string.h>
+#include "xmlmime.h"
+
+static const char *
+getTok(const char **pp)
+{
+  /* inComment means one level of nesting; inComment+1 means two levels etc */
+  enum { inAtom, inString, init, inComment };
+  int state = init;
+  const char *tokStart = 0;
+  for (;;) {
+    switch (**pp) {
+    case '\0':
+      if (state == inAtom)
+        return tokStart;
+      return 0;
+    case ' ':
+    case '\r':
+    case '\t':
+    case '\n':
+      if (state == inAtom)
+        return tokStart;
+      break;
+    case '(':
+      if (state == inAtom)
+        return tokStart;
+      if (state != inString)
+        state++;
+      break;
+    case ')':
+      if (state > init)
+        --state;
+      else if (state != inString)
+        return 0;
+      break;
+    case ';':
+    case '/':
+    case '=':
+      if (state == inAtom)
+        return tokStart;
+      if (state == init)
+        return (*pp)++;
+      break;
+    case '\\':
+      ++*pp;
+      if (**pp == '\0')
+        return 0;
+      break;
+    case '"':
+      switch (state) {
+      case inString:
+        ++*pp;
+        return tokStart;
+      case inAtom:
+        return tokStart;
+      case init:
+        tokStart = *pp;
+        state = inString;
+        break;
+      }
+      break;
+    default:
+      if (state == init) {
+        tokStart = *pp;
+        state = inAtom;
+      }
+      break;
+    }
+    ++*pp;
+  }
+  /* not reached */
+}
+
+/* key must be lowercase ASCII */
+
+static int
+matchkey(const char *start, const char *end, const char *key)
+{
+  if (!start)
+    return 0;
+  for (; start != end; start++, key++)
+    if (*start != *key && *start != 'A' + (*key - 'a'))
+      return 0;
+  return *key == '\0';
+}
+
+void
+getXMLCharset(const char *buf, char *charset)
+{
+  const char *next, *p;
+
+  charset[0] = '\0';
+  next = buf;
+  p = getTok(&next);
+  if (matchkey(p, next, "text"))
+    strcpy(charset, "us-ascii");
+  else if (!matchkey(p, next, "application"))
+    return;
+  p = getTok(&next);
+  if (!p || *p != '/')
+    return;
+  p = getTok(&next);
+#if 0
+  if (!matchkey(p, next, "xml") && charset[0] == '\0')
+    return;
+#endif
+  p = getTok(&next);
+  while (p) {
+    if (*p == ';') {
+      p = getTok(&next);
+      if (matchkey(p, next, "charset")) {
+        p = getTok(&next);
+        if (p && *p == '=') {
+          p = getTok(&next);
+          if (p) {
+            char *s = charset;
+            if (*p == '"') {
+              while (++p != next - 1) {
+                if (*p == '\\')
+                  ++p;
+                if (s == charset + CHARSET_MAX - 1) {
+                  charset[0] = '\0';
+                  break;
+                }
+                *s++ = *p;
+              }
+              *s++ = '\0';
+            }
+            else {
+              if (next - p > CHARSET_MAX - 1)
+                break;
+              while (p != next)
+                *s++ = *p++;
+              *s = 0;
+              break;
+            }
+          }
+        }
+        break;
+      }
+    }
+  else
+    p = getTok(&next);
+  }
+}
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main(int argc, char *argv[])
+{
+  char buf[CHARSET_MAX];
+  if (argc <= 1)
+    return 1;
+  printf("%s\n", argv[1]);
+  getXMLCharset(argv[1], buf);
+  printf("charset=\"%s\"\n", buf);
+  return 0;
+}
+
+#endif /* TEST */
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmlmime.h b/reactos/lib/3rdparty/expat/xmlwf/xmlmime.h
new file mode 100644 (file)
index 0000000..bf0356d
--- /dev/null
@@ -0,0 +1,19 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Registered charset names are at most 40 characters long. */
+
+#define CHARSET_MAX 41
+
+/* Figure out the charset to use from the ContentType.
+   buf contains the body of the header field (the part after "Content-Type:").
+   charset gets the charset to use.  It must be at least CHARSET_MAX chars
+   long.  charset will be empty if the default charset should be used.
+*/
+
+void getXMLCharset(const char *buf, char *charset);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmltchar.h b/reactos/lib/3rdparty/expat/xmlwf/xmltchar.h
new file mode 100644 (file)
index 0000000..1088575
--- /dev/null
@@ -0,0 +1,36 @@
+#ifdef XML_UNICODE
+#ifndef XML_UNICODE_WCHAR_T
+#error xmlwf requires a 16-bit Unicode-compatible wchar_t 
+#endif
+#define T(x) L ## x
+#define ftprintf fwprintf
+#define tfopen _wfopen
+#define fputts fputws
+#define puttc putwc
+#define tcscmp wcscmp
+#define tcscpy wcscpy
+#define tcscat wcscat
+#define tcschr wcschr
+#define tcsrchr wcsrchr
+#define tcslen wcslen
+#define tperror _wperror
+#define topen _wopen
+#define tmain wmain
+#define tremove _wremove
+#else /* not XML_UNICODE */
+#define T(x) x
+#define ftprintf fprintf
+#define tfopen fopen
+#define fputts fputs
+#define puttc putc
+#define tcscmp strcmp
+#define tcscpy strcpy
+#define tcscat strcat
+#define tcschr strchr
+#define tcsrchr strrchr
+#define tcslen strlen
+#define tperror perror
+#define topen open
+#define tmain main
+#define tremove remove
+#endif /* not XML_UNICODE */
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmlurl.h b/reactos/lib/3rdparty/expat/xmlwf/xmlurl.h
new file mode 100644 (file)
index 0000000..d329913
--- /dev/null
@@ -0,0 +1,13 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int XML_URLInit();
+void XML_URLUninit();
+int XML_ProcessURL(XML_Parser parser,
+                   const XML_Char *url,
+                   unsigned flags);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmlwf.c b/reactos/lib/3rdparty/expat/xmlwf/xmlwf.c
new file mode 100644 (file)
index 0000000..2de9b92
--- /dev/null
@@ -0,0 +1,853 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+   See the file COPYING for copying permission.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "expat.h"
+#include "codepage.h"
+#include "xmlfile.h"
+#include "xmltchar.h"
+
+#ifdef _MSC_VER
+#include <crtdbg.h>
+#endif
+
+#ifdef AMIGA_SHARED_LIB
+#include <proto/expat.h>
+#endif
+
+/* This ensures proper sorting. */
+
+#define NSSEP T('\001')
+
+static void XMLCALL
+characterData(void *userData, const XML_Char *s, int len)
+{
+  FILE *fp = (FILE *)userData;
+  for (; len > 0; --len, ++s) {
+    switch (*s) {
+    case T('&'):
+      fputts(T("&amp;"), fp);
+      break;
+    case T('<'):
+      fputts(T("&lt;"), fp);
+      break;
+    case T('>'):
+      fputts(T("&gt;"), fp);
+      break;
+#ifdef W3C14N
+    case 13:
+      fputts(T("&#xD;"), fp);
+      break;
+#else
+    case T('"'):
+      fputts(T("&quot;"), fp);
+      break;
+    case 9:
+    case 10:
+    case 13:
+      ftprintf(fp, T("&#%d;"), *s);
+      break;
+#endif
+    default:
+      puttc(*s, fp);
+      break;
+    }
+  }
+}
+
+static void
+attributeValue(FILE *fp, const XML_Char *s)
+{
+  puttc(T('='), fp);
+  puttc(T('"'), fp);
+  for (;;) {
+    switch (*s) {
+    case 0:
+    case NSSEP:
+      puttc(T('"'), fp);
+      return;
+    case T('&'):
+      fputts(T("&amp;"), fp);
+      break;
+    case T('<'):
+      fputts(T("&lt;"), fp);
+      break;
+    case T('"'):
+      fputts(T("&quot;"), fp);
+      break;
+#ifdef W3C14N
+    case 9:
+      fputts(T("&#x9;"), fp);
+      break;
+    case 10:
+      fputts(T("&#xA;"), fp);
+      break;
+    case 13:
+      fputts(T("&#xD;"), fp);
+      break;
+#else
+    case T('>'):
+      fputts(T("&gt;"), fp);
+      break;
+    case 9:
+    case 10:
+    case 13:
+      ftprintf(fp, T("&#%d;"), *s);
+      break;
+#endif
+    default:
+      puttc(*s, fp);
+      break;
+    }
+    s++;
+  }
+}
+
+/* Lexicographically comparing UTF-8 encoded attribute values,
+is equivalent to lexicographically comparing based on the character number. */
+
+static int
+attcmp(const void *att1, const void *att2)
+{
+  return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2);
+}
+
+static void XMLCALL
+startElement(void *userData, const XML_Char *name, const XML_Char **atts)
+{
+  int nAtts;
+  const XML_Char **p;
+  FILE *fp = (FILE *)userData;
+  puttc(T('<'), fp);
+  fputts(name, fp);
+
+  p = atts;
+  while (*p)
+    ++p;
+  nAtts = (p - atts) >> 1;
+  if (nAtts > 1)
+    qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp);
+  while (*atts) {
+    puttc(T(' '), fp);
+    fputts(*atts++, fp);
+    attributeValue(fp, *atts);
+    atts++;
+  }
+  puttc(T('>'), fp);
+}
+
+static void XMLCALL
+endElement(void *userData, const XML_Char *name)
+{
+  FILE *fp = (FILE *)userData;
+  puttc(T('<'), fp);
+  puttc(T('/'), fp);
+  fputts(name, fp);
+  puttc(T('>'), fp);
+}
+
+static int
+nsattcmp(const void *p1, const void *p2)
+{
+  const XML_Char *att1 = *(const XML_Char **)p1;
+  const XML_Char *att2 = *(const XML_Char **)p2;
+  int sep1 = (tcsrchr(att1, NSSEP) != 0);
+  int sep2 = (tcsrchr(att1, NSSEP) != 0);
+  if (sep1 != sep2)
+    return sep1 - sep2;
+  return tcscmp(att1, att2);
+}
+
+static void XMLCALL
+startElementNS(void *userData, const XML_Char *name, const XML_Char **atts)
+{
+  int nAtts;
+  int nsi;
+  const XML_Char **p;
+  FILE *fp = (FILE *)userData;
+  const XML_Char *sep;
+  puttc(T('<'), fp);
+
+  sep = tcsrchr(name, NSSEP);
+  if (sep) {
+    fputts(T("n1:"), fp);
+    fputts(sep + 1, fp);
+    fputts(T(" xmlns:n1"), fp);
+    attributeValue(fp, name);
+    nsi = 2;
+  }
+  else {
+    fputts(name, fp);
+    nsi = 1;
+  }
+
+  p = atts;
+  while (*p)
+    ++p;
+  nAtts = (p - atts) >> 1;
+  if (nAtts > 1)
+    qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp);
+  while (*atts) {
+    name = *atts++;
+    sep = tcsrchr(name, NSSEP);
+    puttc(T(' '), fp);
+    if (sep) {
+      ftprintf(fp, T("n%d:"), nsi);
+      fputts(sep + 1, fp);
+    }
+    else
+      fputts(name, fp);
+    attributeValue(fp, *atts);
+    if (sep) {
+      ftprintf(fp, T(" xmlns:n%d"), nsi++);
+      attributeValue(fp, name);
+    }
+    atts++;
+  }
+  puttc(T('>'), fp);
+}
+
+static void XMLCALL
+endElementNS(void *userData, const XML_Char *name)
+{
+  FILE *fp = (FILE *)userData;
+  const XML_Char *sep;
+  puttc(T('<'), fp);
+  puttc(T('/'), fp);
+  sep = tcsrchr(name, NSSEP);
+  if (sep) {
+    fputts(T("n1:"), fp);
+    fputts(sep + 1, fp);
+  }
+  else
+    fputts(name, fp);
+  puttc(T('>'), fp);
+}
+
+#ifndef W3C14N
+
+static void XMLCALL
+processingInstruction(void *userData, const XML_Char *target,
+                      const XML_Char *data)
+{
+  FILE *fp = (FILE *)userData;
+  puttc(T('<'), fp);
+  puttc(T('?'), fp);
+  fputts(target, fp);
+  puttc(T(' '), fp);
+  fputts(data, fp);
+  puttc(T('?'), fp);
+  puttc(T('>'), fp);
+}
+
+#endif /* not W3C14N */
+
+static void XMLCALL
+defaultCharacterData(void *userData, const XML_Char *s, int len)
+{
+  XML_DefaultCurrent((XML_Parser) userData);
+}
+
+static void XMLCALL
+defaultStartElement(void *userData, const XML_Char *name,
+                    const XML_Char **atts)
+{
+  XML_DefaultCurrent((XML_Parser) userData);
+}
+
+static void XMLCALL
+defaultEndElement(void *userData, const XML_Char *name)
+{
+  XML_DefaultCurrent((XML_Parser) userData);
+}
+
+static void XMLCALL
+defaultProcessingInstruction(void *userData, const XML_Char *target,
+                             const XML_Char *data)
+{
+  XML_DefaultCurrent((XML_Parser) userData);
+}
+
+static void XMLCALL
+nopCharacterData(void *userData, const XML_Char *s, int len)
+{
+}
+
+static void XMLCALL
+nopStartElement(void *userData, const XML_Char *name, const XML_Char **atts)
+{
+}
+
+static void XMLCALL
+nopEndElement(void *userData, const XML_Char *name)
+{
+}
+
+static void XMLCALL
+nopProcessingInstruction(void *userData, const XML_Char *target,
+                         const XML_Char *data)
+{
+}
+
+static void XMLCALL
+markup(void *userData, const XML_Char *s, int len)
+{
+  FILE *fp = (FILE *)XML_GetUserData((XML_Parser) userData);
+  for (; len > 0; --len, ++s)
+    puttc(*s, fp);
+}
+
+static void
+metaLocation(XML_Parser parser)
+{
+  const XML_Char *uri = XML_GetBase(parser);
+  if (uri)
+    ftprintf((FILE *)XML_GetUserData(parser), T(" uri=\"%s\""), uri);
+  ftprintf((FILE *)XML_GetUserData(parser),
+           T(" byte=\"%" XML_FMT_INT_MOD "d\" nbytes=\"%d\" \
+                        line=\"%" XML_FMT_INT_MOD "u\" col=\"%" XML_FMT_INT_MOD "u\""),
+           XML_GetCurrentByteIndex(parser),
+           XML_GetCurrentByteCount(parser),
+           XML_GetCurrentLineNumber(parser),
+           XML_GetCurrentColumnNumber(parser));
+}
+
+static void
+metaStartDocument(void *userData)
+{
+  fputts(T("<document>\n"), (FILE *)XML_GetUserData((XML_Parser) userData));
+}
+
+static void
+metaEndDocument(void *userData)
+{
+  fputts(T("</document>\n"), (FILE *)XML_GetUserData((XML_Parser) userData));
+}
+
+static void XMLCALL
+metaStartElement(void *userData, const XML_Char *name,
+                 const XML_Char **atts)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  const XML_Char **specifiedAttsEnd
+    = atts + XML_GetSpecifiedAttributeCount(parser);
+  const XML_Char **idAttPtr;
+  int idAttIndex = XML_GetIdAttributeIndex(parser);
+  if (idAttIndex < 0)
+    idAttPtr = 0;
+  else
+    idAttPtr = atts + idAttIndex;
+    
+  ftprintf(fp, T("<starttag name=\"%s\""), name);
+  metaLocation(parser);
+  if (*atts) {
+    fputts(T(">\n"), fp);
+    do {
+      ftprintf(fp, T("<attribute name=\"%s\" value=\""), atts[0]);
+      characterData(fp, atts[1], tcslen(atts[1]));
+      if (atts >= specifiedAttsEnd)
+        fputts(T("\" defaulted=\"yes\"/>\n"), fp);
+      else if (atts == idAttPtr)
+        fputts(T("\" id=\"yes\"/>\n"), fp);
+      else
+        fputts(T("\"/>\n"), fp);
+    } while (*(atts += 2));
+    fputts(T("</starttag>\n"), fp);
+  }
+  else
+    fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaEndElement(void *userData, const XML_Char *name)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  ftprintf(fp, T("<endtag name=\"%s\""), name);
+  metaLocation(parser);
+  fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaProcessingInstruction(void *userData, const XML_Char *target,
+                          const XML_Char *data)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  ftprintf(fp, T("<pi target=\"%s\" data=\""), target);
+  characterData(fp, data, tcslen(data));
+  puttc(T('"'), fp);
+  metaLocation(parser);
+  fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaComment(void *userData, const XML_Char *data)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  fputts(T("<comment data=\""), fp);
+  characterData(fp, data, tcslen(data));
+  puttc(T('"'), fp);
+  metaLocation(parser);
+  fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaStartCdataSection(void *userData)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  fputts(T("<startcdata"), fp);
+  metaLocation(parser);
+  fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaEndCdataSection(void *userData)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  fputts(T("<endcdata"), fp);
+  metaLocation(parser);
+  fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaCharacterData(void *userData, const XML_Char *s, int len)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  fputts(T("<chars str=\""), fp);
+  characterData(fp, s, len);
+  puttc(T('"'), fp);
+  metaLocation(parser);
+  fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaStartDoctypeDecl(void *userData,
+                     const XML_Char *doctypeName,
+                     const XML_Char *sysid,
+                     const XML_Char *pubid,
+                     int has_internal_subset)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  ftprintf(fp, T("<startdoctype name=\"%s\""), doctypeName);
+  metaLocation(parser);
+  fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaEndDoctypeDecl(void *userData)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  fputts(T("<enddoctype"), fp);
+  metaLocation(parser);
+  fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaNotationDecl(void *userData,
+                 const XML_Char *notationName,
+                 const XML_Char *base,
+                 const XML_Char *systemId,
+                 const XML_Char *publicId)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  ftprintf(fp, T("<notation name=\"%s\""), notationName);
+  if (publicId)
+    ftprintf(fp, T(" public=\"%s\""), publicId);
+  if (systemId) {
+    fputts(T(" system=\""), fp);
+    characterData(fp, systemId, tcslen(systemId));
+    puttc(T('"'), fp);
+  }
+  metaLocation(parser);
+  fputts(T("/>\n"), fp);
+}
+
+
+static void XMLCALL
+metaEntityDecl(void *userData,
+               const XML_Char *entityName,
+               int  is_param,
+               const XML_Char *value,
+               int  value_length,
+               const XML_Char *base,
+               const XML_Char *systemId,
+               const XML_Char *publicId,
+               const XML_Char *notationName)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+
+  if (value) {
+    ftprintf(fp, T("<entity name=\"%s\""), entityName);
+    metaLocation(parser);
+    puttc(T('>'), fp);
+    characterData(fp, value, value_length);
+    fputts(T("</entity/>\n"), fp);
+  }
+  else if (notationName) {
+    ftprintf(fp, T("<entity name=\"%s\""), entityName);
+    if (publicId)
+      ftprintf(fp, T(" public=\"%s\""), publicId);
+    fputts(T(" system=\""), fp);
+    characterData(fp, systemId, tcslen(systemId));
+    puttc(T('"'), fp);
+    ftprintf(fp, T(" notation=\"%s\""), notationName);
+    metaLocation(parser);
+    fputts(T("/>\n"), fp);
+  }
+  else {
+    ftprintf(fp, T("<entity name=\"%s\""), entityName);
+    if (publicId)
+      ftprintf(fp, T(" public=\"%s\""), publicId);
+    fputts(T(" system=\""), fp);
+    characterData(fp, systemId, tcslen(systemId));
+    puttc(T('"'), fp);
+    metaLocation(parser);
+    fputts(T("/>\n"), fp);
+  }
+}
+
+static void XMLCALL
+metaStartNamespaceDecl(void *userData,
+                       const XML_Char *prefix,
+                       const XML_Char *uri)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  fputts(T("<startns"), fp);
+  if (prefix)
+    ftprintf(fp, T(" prefix=\"%s\""), prefix);
+  if (uri) {
+    fputts(T(" ns=\""), fp);
+    characterData(fp, uri, tcslen(uri));
+    fputts(T("\"/>\n"), fp);
+  }
+  else
+    fputts(T("/>\n"), fp);
+}
+
+static void XMLCALL
+metaEndNamespaceDecl(void *userData, const XML_Char *prefix)
+{
+  XML_Parser parser = (XML_Parser) userData;
+  FILE *fp = (FILE *)XML_GetUserData(parser);
+  if (!prefix)
+    fputts(T("<endns/>\n"), fp);
+  else
+    ftprintf(fp, T("<endns prefix=\"%s\"/>\n"), prefix);
+}
+
+static int XMLCALL
+unknownEncodingConvert(void *data, const char *p)
+{
+  return codepageConvert(*(int *)data, p);
+}
+
+static int XMLCALL
+unknownEncoding(void *userData, const XML_Char *name, XML_Encoding *info)
+{
+  int cp;
+  static const XML_Char prefixL[] = T("windows-");
+  static const XML_Char prefixU[] = T("WINDOWS-");
+  int i;
+
+  for (i = 0; prefixU[i]; i++)
+    if (name[i] != prefixU[i] && name[i] != prefixL[i])
+      return 0;
+  
+  cp = 0;
+  for (; name[i]; i++) {
+    static const XML_Char digits[] = T("0123456789");
+    const XML_Char *s = tcschr(digits, name[i]);
+    if (!s)
+      return 0;
+    cp *= 10;
+    cp += s - digits;
+    if (cp >= 0x10000)
+      return 0;
+  }
+  if (!codepageMap(cp, info->map))
+    return 0;
+  info->convert = unknownEncodingConvert;
+  /* We could just cast the code page integer to a void *,
+  and avoid the use of release. */
+  info->release = free;
+  info->data = malloc(sizeof(int));
+  if (!info->data)
+    return 0;
+  *(int *)info->data = cp;
+  return 1;
+}
+
+static int XMLCALL
+notStandalone(void *userData)
+{
+  return 0;
+}
+
+static void
+showVersion(XML_Char *prog)
+{
+  XML_Char *s = prog;
+  XML_Char ch;
+  const XML_Feature *features = XML_GetFeatureList();
+  while ((ch = *s) != 0) {
+    if (ch == '/'
+#ifdef WIN32
+        || ch == '\\'
+#endif
+        )
+      prog = s + 1;
+    ++s;
+  }
+  ftprintf(stdout, T("%s using %s\n"), prog, XML_ExpatVersion());
+  if (features != NULL && features[0].feature != XML_FEATURE_END) {
+    int i = 1;
+    ftprintf(stdout, T("%s"), features[0].name);
+    if (features[0].value)
+      ftprintf(stdout, T("=%ld"), features[0].value);
+    while (features[i].feature != XML_FEATURE_END) {
+      ftprintf(stdout, T(", %s"), features[i].name);
+      if (features[i].value)
+        ftprintf(stdout, T("=%ld"), features[i].value);
+      ++i;
+    }
+    ftprintf(stdout, T("\n"));
+  }
+}
+
+static void
+usage(const XML_Char *prog, int rc)
+{
+  ftprintf(stderr,
+           T("usage: %s [-n] [-p] [-r] [-s] [-w] [-x] [-d output-dir] "
+             "[-e encoding] file ...\n"), prog);
+  exit(rc);
+}
+
+#ifdef AMIGA_SHARED_LIB
+int
+amiga_main(int argc, char *argv[])
+#else
+int
+tmain(int argc, XML_Char **argv)
+#endif
+{
+  int i, j;
+  const XML_Char *outputDir = NULL;
+  const XML_Char *encoding = NULL;
+  unsigned processFlags = XML_MAP_FILE;
+  int windowsCodePages = 0;
+  int outputType = 0;
+  int useNamespaces = 0;
+  int requireStandalone = 0;
+  enum XML_ParamEntityParsing paramEntityParsing = 
+    XML_PARAM_ENTITY_PARSING_NEVER;
+  int useStdin = 0;
+
+#ifdef _MSC_VER
+  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
+#endif
+
+  i = 1;
+  j = 0;
+  while (i < argc) {
+    if (j == 0) {
+      if (argv[i][0] != T('-'))
+        break;
+      if (argv[i][1] == T('-') && argv[i][2] == T('\0')) {
+        i++;
+        break;
+      }
+      j++;
+    }
+    switch (argv[i][j]) {
+    case T('r'):
+      processFlags &= ~XML_MAP_FILE;
+      j++;
+      break;
+    case T('s'):
+      requireStandalone = 1;
+      j++;
+      break;
+    case T('n'):
+      useNamespaces = 1;
+      j++;
+      break;
+    case T('p'):
+      paramEntityParsing = XML_PARAM_ENTITY_PARSING_ALWAYS;
+      /* fall through */
+    case T('x'):
+      processFlags |= XML_EXTERNAL_ENTITIES;
+      j++;
+      break;
+    case T('w'):
+      windowsCodePages = 1;
+      j++;
+      break;
+    case T('m'):
+      outputType = 'm';
+      j++;
+      break;
+    case T('c'):
+      outputType = 'c';
+      useNamespaces = 0;
+      j++;
+      break;
+    case T('t'):
+      outputType = 't';
+      j++;
+      break;
+    case T('d'):
+      if (argv[i][j + 1] == T('\0')) {
+        if (++i == argc)
+          usage(argv[0], 2);
+        outputDir = argv[i];
+      }
+      else
+        outputDir = argv[i] + j + 1;
+      i++;
+      j = 0;
+      break;
+    case T('e'):
+      if (argv[i][j + 1] == T('\0')) {
+        if (++i == argc)
+          usage(argv[0], 2);
+        encoding = argv[i];
+      }
+      else
+        encoding = argv[i] + j + 1;
+      i++;
+      j = 0;
+      break;
+    case T('h'):
+      usage(argv[0], 0);
+      return 0;
+    case T('v'):
+      showVersion(argv[0]);
+      return 0;
+    case T('\0'):
+      if (j > 1) {
+        i++;
+        j = 0;
+        break;
+      }
+      /* fall through */
+    default:
+      usage(argv[0], 2);
+    }
+  }
+  if (i == argc) {
+    useStdin = 1;
+    processFlags &= ~XML_MAP_FILE;
+    i--;
+  }
+  for (; i < argc; i++) {
+    FILE *fp = 0;
+    XML_Char *outName = 0;
+    int result;
+    XML_Parser parser;
+    if (useNamespaces)
+      parser = XML_ParserCreateNS(encoding, NSSEP);
+    else
+      parser = XML_ParserCreate(encoding);
+    if (requireStandalone)
+      XML_SetNotStandaloneHandler(parser, notStandalone);
+    XML_SetParamEntityParsing(parser, paramEntityParsing);
+    if (outputType == 't') {
+      /* This is for doing timings; this gives a more realistic estimate of
+         the parsing time. */
+      outputDir = 0;
+      XML_SetElementHandler(parser, nopStartElement, nopEndElement);
+      XML_SetCharacterDataHandler(parser, nopCharacterData);
+      XML_SetProcessingInstructionHandler(parser, nopProcessingInstruction);
+    }
+    else if (outputDir) {
+      const XML_Char *file = useStdin ? T("STDIN") : argv[i];
+      if (tcsrchr(file, T('/')))
+        file = tcsrchr(file, T('/')) + 1;
+#ifdef WIN32
+      if (tcsrchr(file, T('\\')))
+        file = tcsrchr(file, T('\\')) + 1;
+#endif
+      outName = (XML_Char *)malloc((tcslen(outputDir) + tcslen(file) + 2)
+                       * sizeof(XML_Char));
+      tcscpy(outName, outputDir);
+      tcscat(outName, T("/"));
+      tcscat(outName, file);
+      fp = tfopen(outName, T("wb"));
+      if (!fp) {
+        tperror(outName);
+        exit(1);
+      }
+      setvbuf(fp, NULL, _IOFBF, 16384);
+#ifdef XML_UNICODE
+      puttc(0xFEFF, fp);
+#endif
+      XML_SetUserData(parser, fp);
+      switch (outputType) {
+      case 'm':
+        XML_UseParserAsHandlerArg(parser);
+        XML_SetElementHandler(parser, metaStartElement, metaEndElement);
+        XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction);
+        XML_SetCommentHandler(parser, metaComment);
+        XML_SetCdataSectionHandler(parser, metaStartCdataSection,
+                                   metaEndCdataSection);
+        XML_SetCharacterDataHandler(parser, metaCharacterData);
+        XML_SetDoctypeDeclHandler(parser, metaStartDoctypeDecl,
+                                  metaEndDoctypeDecl);
+        XML_SetEntityDeclHandler(parser, metaEntityDecl);
+        XML_SetNotationDeclHandler(parser, metaNotationDecl);
+        XML_SetNamespaceDeclHandler(parser, metaStartNamespaceDecl,
+                                    metaEndNamespaceDecl);
+        metaStartDocument(parser);
+        break;
+      case 'c':
+        XML_UseParserAsHandlerArg(parser);
+        XML_SetDefaultHandler(parser, markup);
+        XML_SetElementHandler(parser, defaultStartElement, defaultEndElement);
+        XML_SetCharacterDataHandler(parser, defaultCharacterData);
+        XML_SetProcessingInstructionHandler(parser,
+                                            defaultProcessingInstruction);
+        break;
+      default:
+        if (useNamespaces)
+          XML_SetElementHandler(parser, startElementNS, endElementNS);
+        else
+          XML_SetElementHandler(parser, startElement, endElement);
+        XML_SetCharacterDataHandler(parser, characterData);
+#ifndef W3C14N
+        XML_SetProcessingInstructionHandler(parser, processingInstruction);
+#endif /* not W3C14N */
+        break;
+      }
+    }
+    if (windowsCodePages)
+      XML_SetUnknownEncodingHandler(parser, unknownEncoding, 0);
+    result = XML_ProcessFile(parser, useStdin ? NULL : argv[i], processFlags);
+    if (outputDir) {
+      if (outputType == 'm')
+        metaEndDocument(parser);
+      fclose(fp);
+      if (!result)
+        tremove(outName);
+      free(outName);
+    }
+    XML_ParserFree(parser);
+  }
+  return 0;
+}
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmlwf.dsp b/reactos/lib/3rdparty/expat/xmlwf/xmlwf.dsp
new file mode 100644 (file)
index 0000000..f9e7f54
--- /dev/null
@@ -0,0 +1,139 @@
+# Microsoft Developer Studio Project File - Name="xmlwf" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=xmlwf - Win32 Release\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "xmlwf.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "xmlwf.mak" CFG="xmlwf - Win32 Release"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "xmlwf - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "xmlwf - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "xmlwf - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir ".\Release"\r
+# PROP BASE Intermediate_Dir ".\Release"\r
+# PROP BASE Target_Dir "."\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir ".\Release"\r
+# PROP Intermediate_Dir ".\Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir "."\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c\r
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\lib" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "COMPILED_FROM_DSP" /FD /c\r
+# SUBTRACT CPP /YX /Yc /Yu\r
+# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 setargv.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"Release\xmlwf.exe"\r
+# SUBTRACT LINK32 /nodefaultlib\r
+\r
+!ELSEIF  "$(CFG)" == "xmlwf - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir ".\Debug"\r
+# PROP BASE Intermediate_Dir ".\Debug"\r
+# PROP BASE Target_Dir "."\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir ".\Debug"\r
+# PROP Intermediate_Dir ".\Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir "."\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c\r
+# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /I "..\lib" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "COMPILED_FROM_DSP" /FD /c\r
+# SUBTRACT CPP /Fr /YX\r
+# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386\r
+# ADD LINK32 setargv.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /debug /machine:I386 /out:"Debug\xmlwf.exe"\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "xmlwf - Win32 Release"\r
+# Name "xmlwf - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90"\r
+# Begin Source File\r
+\r
+SOURCE=.\codepage.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\readfilemap.c\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\unixfilemap.c\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\win32filemap.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xmlfile.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xmlwf.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"\r
+# Begin Source File\r
+\r
+SOURCE=.\codepage.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xmlfile.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xmltchar.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmlwf.vcproj b/reactos/lib/3rdparty/expat/xmlwf/xmlwf.vcproj
new file mode 100644 (file)
index 0000000..98a5cf2
--- /dev/null
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="7.10"\r
+       Name="xmlwf"\r
+       SccProjectName=""\r
+       SccLocalPath="">\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"/>\r
+       </Platforms>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory=".\Release"\r
+                       IntermediateDirectory=".\Release"\r
+                       ConfigurationType="1"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\lib"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP"\r
+                               StringPooling="TRUE"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="TRUE"\r
+                               PrecompiledHeaderFile=".\Release/xmlwf.pch"\r
+                               AssemblerListingLocation=".\Release/"\r
+                               ObjectFile=".\Release/"\r
+                               ProgramDataBaseFileName=".\Release/"\r
+                               WarningLevel="3"\r
+                               SuppressStartupBanner="TRUE"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="setargv.obj odbc32.lib odbccp32.lib"\r
+                               OutputFile="Release\xmlwf.exe"\r
+                               LinkIncremental="1"\r
+                               SuppressStartupBanner="TRUE"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TypeLibraryName=".\Release/xmlwf.tlb"\r
+                               HeaderFileName=""/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory=".\Debug"\r
+                       IntermediateDirectory=".\Debug"\r
+                       ConfigurationType="1"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE">\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\lib"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP"\r
+                               RuntimeLibrary="1"\r
+                               PrecompiledHeaderFile=".\Debug/xmlwf.pch"\r
+                               AssemblerListingLocation=".\Debug/"\r
+                               ObjectFile=".\Debug/"\r
+                               ProgramDataBaseFileName=".\Debug/"\r
+                               WarningLevel="3"\r
+                               SuppressStartupBanner="TRUE"\r
+                               DebugInformationFormat="4"\r
+                               CompileAs="0"/>\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"/>\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="setargv.obj odbc32.lib odbccp32.lib"\r
+                               OutputFile="Debug\xmlwf.exe"\r
+                               LinkIncremental="2"\r
+                               SuppressStartupBanner="TRUE"\r
+                               GenerateDebugInformation="TRUE"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"/>\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TypeLibraryName=".\Debug/xmlwf.tlb"\r
+                               HeaderFileName=""/>\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"/>\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"/>\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"/>\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCWebDeploymentTool"/>\r
+                       <Tool\r
+                               Name="VCManagedWrapperGeneratorTool"/>\r
+                       <Tool\r
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90">\r
+                       <File\r
+                               RelativePath="codepage.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="readfilemap.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       ExcludedFromBuild="TRUE">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       ExcludedFromBuild="TRUE">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="unixfilemap.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       ExcludedFromBuild="TRUE">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       ExcludedFromBuild="TRUE">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="win32filemap.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="xmlfile.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="xmlwf.c">\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32">\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""/>\r
+                               </FileConfiguration>\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;fi;fd">\r
+                       <File\r
+                               RelativePath="codepage.h">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="xmlfile.h">\r
+                       </File>\r
+                       <File\r
+                               RelativePath="xmltchar.h">\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe">\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/reactos/lib/3rdparty/expat/xmlwf/xmlwin32url.cxx b/reactos/lib/3rdparty/expat/xmlwf/xmlwin32url.cxx
new file mode 100644 (file)
index 0000000..bbfcce2
--- /dev/null
@@ -0,0 +1,395 @@
+#include "expat.h"
+#ifdef XML_UNICODE
+#define UNICODE
+#endif
+#include <windows.h>
+#include <urlmon.h>
+#include <wininet.h>
+#include <stdio.h>
+#include <tchar.h>
+#include "xmlurl.h"
+#include "xmlmime.h"
+
+static int
+processURL(XML_Parser parser, IMoniker *baseMoniker, const XML_Char *url);
+
+typedef void (*StopHandler)(void *, HRESULT);
+
+class Callback : public IBindStatusCallback {
+public:
+  // IUnknown methods
+  STDMETHODIMP QueryInterface(REFIID,void **);
+  STDMETHODIMP_(ULONG) AddRef();
+  STDMETHODIMP_(ULONG) Release();
+  // IBindStatusCallback methods
+  STDMETHODIMP OnStartBinding(DWORD, IBinding *);
+  STDMETHODIMP GetPriority(LONG *);
+  STDMETHODIMP OnLowResource(DWORD);
+  STDMETHODIMP OnProgress(ULONG, ULONG, ULONG, LPCWSTR);
+  STDMETHODIMP OnStopBinding(HRESULT, LPCWSTR);
+  STDMETHODIMP GetBindInfo(DWORD *, BINDINFO *);
+  STDMETHODIMP OnDataAvailable(DWORD, DWORD, FORMATETC *, STGMEDIUM *);
+  STDMETHODIMP OnObjectAvailable(REFIID, IUnknown *);
+  Callback(XML_Parser, IMoniker *, StopHandler, void *);
+  ~Callback();
+  int externalEntityRef(const XML_Char *context,
+                        const XML_Char *systemId, const XML_Char *publicId);
+private:
+  XML_Parser parser_;
+  IMoniker *baseMoniker_;
+  DWORD totalRead_;
+  ULONG ref_;
+  IBinding *pBinding_;
+  StopHandler stopHandler_;
+  void *stopArg_;
+};
+
+STDMETHODIMP_(ULONG)
+Callback::AddRef()
+{ 
+  return ref_++;
+}
+
+STDMETHODIMP_(ULONG)
+Callback::Release()
+{ 
+  if (--ref_ == 0) {
+    delete this;
+    return 0;
+  }
+  return ref_;
+}
+
+STDMETHODIMP
+Callback::QueryInterface(REFIID riid, void** ppv)
+{ 
+  if (IsEqualGUID(riid, IID_IUnknown))
+    *ppv = (IUnknown *)this;
+  else if (IsEqualGUID(riid, IID_IBindStatusCallback))
+    *ppv = (IBindStatusCallback *)this;
+  else
+    return E_NOINTERFACE;
+  ((LPUNKNOWN)*ppv)->AddRef();
+  return S_OK;
+}
+
+STDMETHODIMP
+Callback::OnStartBinding(DWORD, IBinding* pBinding)
+{
+  pBinding_ = pBinding;
+  pBinding->AddRef();
+  return S_OK;
+}
+
+STDMETHODIMP
+Callback::GetPriority(LONG *)
+{
+  return E_NOTIMPL;
+}
+
+STDMETHODIMP
+Callback::OnLowResource(DWORD)
+{
+  return E_NOTIMPL;
+}
+
+STDMETHODIMP
+Callback::OnProgress(ULONG, ULONG, ULONG, LPCWSTR)
+{
+  return S_OK;
+}
+
+STDMETHODIMP
+Callback::OnStopBinding(HRESULT hr, LPCWSTR szError)
+{
+  if (pBinding_) {
+    pBinding_->Release();
+    pBinding_ = 0;
+  }
+  if (baseMoniker_) {
+    baseMoniker_->Release();
+    baseMoniker_ = 0;
+  }
+  stopHandler_(stopArg_, hr);
+  return S_OK;
+}
+
+STDMETHODIMP
+Callback::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo)
+{
+  *pgrfBINDF = BINDF_ASYNCHRONOUS;
+  return S_OK;
+}
+
+static void
+reportError(XML_Parser parser)
+{
+  int code = XML_GetErrorCode(parser);
+  const XML_Char *message = XML_ErrorString(code);
+  if (message)
+    _ftprintf(stderr, _T("%s:%d:%ld: %s\n"),
+            XML_GetBase(parser),
+            XML_GetErrorLineNumber(parser),
+            XML_GetErrorColumnNumber(parser),
+            message);
+  else
+    _ftprintf(stderr, _T("%s: (unknown message %d)\n"),
+              XML_GetBase(parser), code);
+}
+
+STDMETHODIMP
+Callback::OnDataAvailable(DWORD grfBSCF,
+                          DWORD dwSize,
+                          FORMATETC *pfmtetc,
+                          STGMEDIUM* pstgmed)
+{
+  if (grfBSCF & BSCF_FIRSTDATANOTIFICATION) {
+    IWinInetHttpInfo *hp;
+    HRESULT hr = pBinding_->QueryInterface(IID_IWinInetHttpInfo,
+                                           (void **)&hp);
+    if (SUCCEEDED(hr)) {
+      char contentType[1024];
+      DWORD bufSize = sizeof(contentType);
+      DWORD flags = 0;
+      contentType[0] = 0;
+      hr = hp->QueryInfo(HTTP_QUERY_CONTENT_TYPE, contentType,
+                         &bufSize, 0, NULL);
+      if (SUCCEEDED(hr)) {
+       char charset[CHARSET_MAX];
+       getXMLCharset(contentType, charset);
+       if (charset[0]) {
+#ifdef XML_UNICODE
+         XML_Char wcharset[CHARSET_MAX];
+         XML_Char *p1 = wcharset;
+         const char *p2 = charset;
+         while ((*p1++ = (unsigned char)*p2++) != 0)
+           ;
+         XML_SetEncoding(parser_, wcharset);
+#else
+         XML_SetEncoding(parser_, charset);
+#endif
+       }
+      }
+      hp->Release();
+    }
+  }
+  if (!parser_)
+    return E_ABORT;
+  if (pstgmed->tymed == TYMED_ISTREAM) {
+    while (totalRead_ < dwSize) {
+#define READ_MAX (64*1024)
+      DWORD nToRead = dwSize - totalRead_;
+      if (nToRead > READ_MAX)
+       nToRead = READ_MAX;
+      void *buf = XML_GetBuffer(parser_, nToRead);
+      if (!buf) {
+       _ftprintf(stderr, _T("out of memory\n"));
+       return E_ABORT;
+      }
+      DWORD nRead;
+      HRESULT hr = pstgmed->pstm->Read(buf, nToRead, &nRead);
+      if (SUCCEEDED(hr)) {
+       totalRead_ += nRead;
+       if (!XML_ParseBuffer(parser_,
+                            nRead,
+                            (grfBSCF & BSCF_LASTDATANOTIFICATION) != 0
+                            && totalRead_ == dwSize)) {
+         reportError(parser_);
+         return E_ABORT;
+       }
+      }
+    }
+  }
+  return S_OK;
+}
+
+STDMETHODIMP
+Callback::OnObjectAvailable(REFIID, IUnknown *)
+{
+  return S_OK;
+}
+
+int
+Callback::externalEntityRef(const XML_Char *context,
+                            const XML_Char *systemId,
+                            const XML_Char *publicId)
+{
+  XML_Parser entParser = XML_ExternalEntityParserCreate(parser_, context, 0);
+  XML_SetBase(entParser, systemId);
+  int ret = processURL(entParser, baseMoniker_, systemId);
+  XML_ParserFree(entParser);
+  return ret;
+}
+
+Callback::Callback(XML_Parser parser, IMoniker *baseMoniker,
+                   StopHandler stopHandler, void *stopArg)
+: parser_(parser),
+  baseMoniker_(baseMoniker),
+  ref_(0),
+  pBinding_(0),
+  totalRead_(0),
+  stopHandler_(stopHandler),
+  stopArg_(stopArg)
+{
+  if (baseMoniker_)
+    baseMoniker_->AddRef();
+}
+
+Callback::~Callback()
+{
+  if (pBinding_)
+    pBinding_->Release();
+  if (baseMoniker_)
+    baseMoniker_->Release();
+}
+
+static int
+externalEntityRef(void *arg,
+                  const XML_Char *context,
+                  const XML_Char *base,
+                  const XML_Char *systemId,
+                  const XML_Char *publicId)
+{
+  return ((Callback *)arg)->externalEntityRef(context, systemId, publicId);
+}
+
+
+static HRESULT
+openStream(XML_Parser parser,
+           IMoniker *baseMoniker,
+           const XML_Char *uri,
+           StopHandler stopHandler, void *stopArg)
+{
+  if (!XML_SetBase(parser, uri))
+    return E_OUTOFMEMORY;
+  HRESULT hr;
+  IMoniker *m;
+#ifdef XML_UNICODE
+  hr = CreateURLMoniker(0, uri, &m);
+#else
+  LPWSTR uriw = new wchar_t[strlen(uri) + 1];
+  for (int i = 0;; i++) {
+    uriw[i] = uri[i];
+    if (uriw[i] == 0)
+      break;
+  }
+  hr = CreateURLMoniker(baseMoniker, uriw, &m);
+  delete [] uriw;
+#endif
+  if (FAILED(hr))
+    return hr;
+  IBindStatusCallback *cb = new Callback(parser, m, stopHandler, stopArg);
+  XML_SetExternalEntityRefHandler(parser, externalEntityRef);
+  XML_SetExternalEntityRefHandlerArg(parser, cb);
+  cb->AddRef();
+  IBindCtx *b;
+  if (FAILED(hr = CreateAsyncBindCtx(0, cb, 0, &b))) {
+    cb->Release();
+    m->Release();
+    return hr;
+  }
+  cb->Release();
+  IStream *pStream;
+  hr = m->BindToStorage(b, 0, IID_IStream, (void **)&pStream);
+  if (SUCCEEDED(hr)) {
+    if (pStream)
+      pStream->Release();
+  }
+  if (hr == MK_S_ASYNCHRONOUS)
+    hr = S_OK;
+  m->Release();
+  b->Release();
+  return hr;
+}
+
+struct QuitInfo {
+  const XML_Char *url;
+  HRESULT hr;
+  int stop;
+};
+
+static void
+winPerror(const XML_Char *url, HRESULT hr)
+{
+  LPVOID buf;
+  if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
+                   | FORMAT_MESSAGE_FROM_HMODULE,
+                   GetModuleHandleA("urlmon.dll"),
+                   hr,
+                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                   (LPTSTR) &buf,
+                   0,
+                   NULL)
+      || FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
+                     | FORMAT_MESSAGE_FROM_SYSTEM,
+                     0,
+                     hr,
+                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                     (LPTSTR) &buf,
+                     0,
+                     NULL)) {
+    /* The system error messages seem to end with a newline. */
+    _ftprintf(stderr, _T("%s: %s"), url, buf);
+    fflush(stderr);
+    LocalFree(buf);
+  }
+  else
+    _ftprintf(stderr, _T("%s: error %x\n"), url, hr);
+}
+
+static void
+threadQuit(void *p, HRESULT hr)
+{
+  QuitInfo *qi = (QuitInfo *)p;
+  qi->hr = hr;
+  qi->stop = 1;
+}
+
+extern "C"
+int
+XML_URLInit(void)
+{
+  return SUCCEEDED(CoInitialize(0));
+}
+
+extern "C"
+void
+XML_URLUninit(void)
+{
+  CoUninitialize();
+}
+
+static int
+processURL(XML_Parser parser, IMoniker *baseMoniker,
+           const XML_Char *url)
+{
+  QuitInfo qi;
+  qi.stop = 0;
+  qi.url = url;
+
+  XML_SetBase(parser, url);
+  HRESULT hr = openStream(parser, baseMoniker, url, threadQuit, &qi);
+  if (FAILED(hr)) {
+    winPerror(url, hr);
+    return 0;
+  }
+  else if (FAILED(qi.hr)) {
+    winPerror(url, qi.hr);
+    return 0;
+  }
+  MSG msg;
+  while (!qi.stop && GetMessage (&msg, NULL, 0, 0)) {
+    TranslateMessage (&msg);
+    DispatchMessage (&msg);
+  }
+  return 1;
+}
+
+extern "C"
+int
+XML_ProcessURL(XML_Parser parser,
+               const XML_Char *url,
+               unsigned flags)
+{
+  return processURL(parser, 0, url);
+}
index 253fcfc..27e675a 100644 (file)
@@ -16,7 +16,7 @@ unsigned int __unguarded_readlc_active;
 int _current_category; /* used by setlocale */
 const char *_current_locale;
 
-int parse_locale(const char *locale, char *lang, char *country, char *code_page);
+int parse_locale(char *locale, char *lang, char *country, char *code_page);
 
 /*
  * @unimplemented
@@ -27,7 +27,7 @@ char *setlocale(int category, const char *locale)
        char country[100];
        char code_page[100];
        if (NULL != locale) {
-               parse_locale(locale,lang,country,code_page);
+               parse_locale((char *)locale,lang,country,code_page);
        }
 
        //printf("%s %s %s %s\n",locale,lang,country,code_page);
@@ -63,7 +63,7 @@ locale  "lang[_country[.code_page]]"
             | NULL
 
 */
-int parse_locale(const char *locale, char *lang, char *country, char *code_page)
+int parse_locale(char *locale, char *lang, char *country, char *code_page)
 {
        while ( *locale != 0 && *locale != '.' && *locale != '_' )
        {
index 98eeb80..757eeb9 100644 (file)
@@ -25,7 +25,7 @@
 LONG
 NTAPI
 InterlockedCompareExchange(
-       IN OUT LONG volatile *Destination,
+       LPLONG Destination,
        LONG Exchange,
        LONG Comperand)
 {
index 78f9c74..516ba7c 100644 (file)
@@ -22,7 +22,7 @@
 #include <windows.h>
 LONG
 NTAPI
-InterlockedDecrement(IN OUT LONG volatile *lpAddend)
+InterlockedDecrement(LPLONG lpAddend)
 {
        LONG ret;
        __asm__
index 56af2ef..2acde0d 100644 (file)
@@ -23,7 +23,7 @@
 #include <windows.h>
 LONG
 NTAPI
-InterlockedExchange(IN OUT LONG volatile *target, LONG value)
+InterlockedExchange(LPLONG target, LONG value)
 {
        LONG ret;
        __asm__ (
index b48bfda..e32bedc 100644 (file)
@@ -25,7 +25,7 @@
 LONG
 NTAPI
 InterlockedExchangeAdd(
-       IN OUT LONG volatile *Addend,
+       PLONG Addend,
        LONG Increment)
 {
        LONG ret;
index d077518..647e58f 100644 (file)
@@ -22,7 +22,7 @@
 #include <windows.h>
 LONG
 NTAPI
-InterlockedIncrement(IN OUT LONG volatile *lpAddend)
+InterlockedIncrement(PLONG lpAddend)
 {
        LONG ret;
        __asm__
index 0662377..475212d 100644 (file)
@@ -22,7 +22,7 @@
        <file>wcscmpi.c</file>
        <file>_wgetopt.c</file>
 </module>
-<module name="mingw_main" type="staticlibrary" isstartuplib="true" allowwarnings="true">
+<module name="mingw_main" type="staticlibrary" isstartuplib="true">
        <include base="ReactOS">include/crt</include>
        <include base="ReactOS">include/psdk</include>
        <include base="mingw_common">include</include>
@@ -30,7 +30,7 @@
        <file>crt1.c</file>
        <file>main.c</file>
 </module>
-<module name="mingw_wmain" type="staticlibrary" isstartuplib="true" allowwarnings="true">
+<module name="mingw_wmain" type="staticlibrary" isstartuplib="true">
        <include base="ReactOS">include/crt</include>
        <include base="ReactOS">include/psdk</include>
        <include base="mingw_common">include</include>
index 033413e..f5b9620 100644 (file)
@@ -57,8 +57,8 @@ typedef enum {
 
 typedef enum {
     udict_balanced = 0,
-    udict_leftheavy = 1,
-    udict_rightheavy = 2
+    udict_leftheavy = -1,
+    udict_rightheavy = 1
 } udict_avl_balance_t;
 
 typedef union {
index a8554e4..10376b6 100644 (file)
@@ -315,37 +315,15 @@ DbgSetDebugFilterState(IN ULONG ComponentId,
 }
 
 /*
- * @implemented
+ * @unimplemented
  */
 NTSTATUS
 NTAPI
-DbgLoadImageSymbols(IN PANSI_STRING Name,
-                    IN PVOID Base,
-                    IN ULONG ProcessId)
+DbgLoadImageSymbols(IN PUNICODE_STRING Name,
+                    IN ULONG Base,
+                    IN ULONG Unknown3)
 {
-    PIMAGE_NT_HEADERS NtHeader;
-    KD_SYMBOLS_INFO SymbolInfo;
-
-    /* Setup the symbol data */
-    SymbolInfo.BaseOfDll = Base;
-    SymbolInfo.ProcessId = UlongToPtr(ProcessId);
-
-    /* Get NT Headers */
-    NtHeader = NULL; //RtlImageNtHeader(Base);
-    if (NtHeader)
-    {
-        /* Get the rest of the data */
-        SymbolInfo.CheckSum = NtHeader->OptionalHeader.CheckSum;
-        SymbolInfo.SizeOfImage = NtHeader->OptionalHeader.SizeOfImage;
-    }
-    else
-    {
-        /* No data available */
-        SymbolInfo.CheckSum = SymbolInfo.SizeOfImage = 0;
-    }
-
-    /* Load the symbols */
-    DebugService2(Name, &SymbolInfo, BREAKPOINT_LOAD_SYMBOLS);
-    return STATUS_SUCCESS;
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
 }
 /* EOF */
index 9511de5..175d9c1 100644 (file)
@@ -204,7 +204,7 @@ static RTL_CRITICAL_SECTION_DEBUG process_heap_critsect_debug =
 {
     0, 0, NULL,  /* will be set later */
     { &process_heap_critsect_debug.ProcessLocksList, &process_heap_critsect_debug.ProcessLocksList },
-      0, 0, 0, 0, 0
+      0, 0, { (DWORD_PTR)(__FILE__ ": main process heap section") }
 };
 
 /***********************************************************************
index 832502d..4a858df 100644 (file)
@@ -14,7 +14,6 @@
 .globl _DbgBreakPointWithStatus@4
 .globl _DbgUserBreakPoint@0
 .globl _DebugService@20
-.globl _DebugService2@12
 .globl _DbgBreakPointNoBugCheck@0
 
 /* FUNCTIONS ***************************************************************/
@@ -39,25 +38,6 @@ _DbgBreakPointWithStatus@4:
     ret 4
 .endfunc
 
-.func DebugService2@12
-_DebugService2@12:
-
-    /* Setup the stack */
-    push ebp
-    mov ebp, esp
-
-    /* Call the interrupt */
-    mov eax, [ebp+16]
-    mov ecx, [ebp+8]
-    mov edx, [ebp+12]
-    int 0x2D
-    //int 3
-
-    /* Restore stack */
-    pop ebp
-    ret 12
-.endfunc
-
 .func DebugService@20
 _DebugService@20:
 
diff --git a/reactos/lib/rtl/i386/thread.c b/reactos/lib/rtl/i386/thread.c
deleted file mode 100644 (file)
index 5f223fc..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * COPYRIGHT:         See COPYING in the top level directory
- * PROJECT:           ReactOS system libraries
- * PURPOSE:           Rtl user thread functions
- * FILE:              lib/rtl/thread.c
- * PROGRAMERS:
- *                    Alex Ionescu (alex@relsoft.net)
- *                    Eric Kohl
- *                    KJK::Hyperion
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <rtl.h>
-#include "i386/ketypes.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* PRIVATE FUNCTIONS *******************************************************/
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-RtlInitializeContext(IN HANDLE ProcessHandle,
-                     OUT PCONTEXT ThreadContext,
-                     IN PVOID ThreadStartParam  OPTIONAL,
-                     IN PTHREAD_START_ROUTINE ThreadStartAddress,
-                     IN PINITIAL_TEB InitialTeb)
-{
-    DPRINT("RtlInitializeContext: (hProcess: %p, ThreadContext: %p, Teb: %p\n",
-            ProcessHandle, ThreadContext, InitialTeb);
-
-    /*
-     * Set the Initial Registers
-     * This is based on NT's default values -- crazy apps might expect this...
-     */
-    ThreadContext->Ebp = 0;
-    ThreadContext->Eax = 0;
-    ThreadContext->Ebx = 1;
-    ThreadContext->Ecx = 2;
-    ThreadContext->Edx = 3;
-    ThreadContext->Esi = 4;
-    ThreadContext->Edi = 5;
-
-    /* Set the Selectors */
-    ThreadContext->SegGs = 0;
-    ThreadContext->SegFs = KGDT_R3_TEB;
-    ThreadContext->SegEs = KGDT_R3_DATA;
-    ThreadContext->SegDs = KGDT_R3_DATA;
-    ThreadContext->SegSs = KGDT_R3_DATA;
-    ThreadContext->SegCs = KGDT_R3_CODE;
-
-    /* Enable Interrupts */
-    ThreadContext->EFlags = EFLAGS_INTERRUPT_MASK;
-
-    /* Settings passed */
-    ThreadContext->Eip = (ULONG)ThreadStartAddress;
-    ThreadContext->Esp = (ULONG)InitialTeb;
-
-    /* Only the basic Context is initialized */
-    ThreadContext->ContextFlags = CONTEXT_CONTROL |
-                                  CONTEXT_INTEGER |
-                                  CONTEXT_SEGMENTS;
-
-    /* Set up ESP to the right value */
-    ThreadContext->Esp -= sizeof(PVOID);
-    ZwWriteVirtualMemory(ProcessHandle,
-                         (PVOID)ThreadContext->Esp,
-                         (PVOID)&ThreadStartParam,
-                         sizeof(PVOID),
-                         NULL);
-
-    /* Push it down one more notch for RETEIP */
-    ThreadContext->Esp -= sizeof(PVOID);
-}
-
-/* EOF */
index 4fd59e7..4bfa0c9 100644 (file)
@@ -359,7 +359,7 @@ RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable)
    DPRINT("RtlResetRtlTranslations() called\n");
 
    /* Set ANSI data */
-   NlsAnsiToUnicodeTable = (PWCHAR)NlsTable->AnsiTableInfo.MultiByteTable; /* Real type is PUSHORT */
+   NlsAnsiToUnicodeTable = NlsTable->AnsiTableInfo.MultiByteTable;
    NlsUnicodeToAnsiTable = NlsTable->AnsiTableInfo.WideCharTable;
    NlsDbcsUnicodeToAnsiTable = (PWCHAR)NlsTable->AnsiTableInfo.WideCharTable;
    NlsMbCodePageTag = (NlsTable->AnsiTableInfo.DBCSCodePage != 0);
@@ -368,7 +368,7 @@ RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable)
    DPRINT("Ansi codepage %hu\n", NlsAnsiCodePage);
 
    /* Set OEM data */
-   NlsOemToUnicodeTable = (PWCHAR)NlsTable->OemTableInfo.MultiByteTable; /* Real type is PUSHORT */
+   NlsOemToUnicodeTable = NlsTable->OemTableInfo.MultiByteTable;
    NlsUnicodeToOemTable = NlsTable->OemTableInfo.WideCharTable;
    NlsDbcsUnicodeToOemTable = (PWCHAR)NlsTable->OemTableInfo.WideCharTable;
    NlsMbOemCodePageTag = (NlsTable->OemTableInfo.DBCSCodePage != 0);
index 674cdfd..4ddf39a 100644 (file)
@@ -39,7 +39,6 @@
                        <file>sin_asm.s</file>
                        <file>sqrt_asm.s</file>
                        <file>tan_asm.s</file>
-                       <file>thread.c</file>
                </directory>
        </if>
        <directory name="austin">
index cf55f7b..17b3597 100644 (file)
@@ -135,12 +135,6 @@ DebugService(IN ULONG Service,
              IN PVOID Argument1,
              IN PVOID Argument2);
 
-NTSTATUS
-NTAPI
-DebugService2(IN PVOID Argument1,
-              IN PVOID Argument2,
-              IN ULONG Service);
-
 /* Tags for the String Allocators */
 #define TAG_USTR        TAG('U', 'S', 'T', 'R')
 #define TAG_ASTR        TAG('A', 'S', 'T', 'R')
index 88c660d..28fce40 100644 (file)
@@ -303,22 +303,14 @@ BOOLEAN NTAPI
 RtlEqualPrefixSid(IN PSID Sid1_,
                   IN PSID Sid2_)
 {
-   PISID Sid1 =  Sid1_;
-   PISID Sid2 =  Sid2_;
-   SIZE_T SidLen;
-
-   PAGED_CODE_RTL();
+  PISID Sid1 =  Sid1_;
+  PISID Sid2 =  Sid2_;
 
-   if (Sid1->SubAuthorityCount == Sid2->SubAuthorityCount)
-   {
-      SidLen = FIELD_OFFSET(SID,
-                            SubAuthority[Sid1->SubAuthorityCount]);
-      return RtlCompareMemory(Sid1,
-                              Sid2,
-                              SidLen) == SidLen;
-   }
+  PAGED_CODE_RTL();
 
-   return FALSE;
+   return(Sid1->SubAuthorityCount == Sid2->SubAuthorityCount &&
+          !RtlCompareMemory(Sid1, Sid2,
+                            (Sid1->SubAuthorityCount - 1) * sizeof(DWORD) + 8));
 }
 
 
index 0b87c7b..55dae05 100644 (file)
@@ -12,6 +12,7 @@
 /* INCLUDES *****************************************************************/
 
 #include <rtl.h>
+#include "i386/ketypes.h"
 
 #define NDEBUG
 #include <debug.h>
@@ -217,6 +218,62 @@ RtlCreateUserThread(IN HANDLE ProcessHandle,
     return Status;
 }
 
+/*
+ * FIXME: Should go in /i386
+ @implemented
+*/
+VOID
+NTAPI
+RtlInitializeContext(IN HANDLE ProcessHandle,
+                     OUT PCONTEXT ThreadContext,
+                     IN PVOID ThreadStartParam  OPTIONAL,
+                     IN PTHREAD_START_ROUTINE ThreadStartAddress,
+                     IN PINITIAL_TEB InitialTeb)
+{
+    /*
+     * Set the Initial Registers
+     * This is based on NT's default values -- crazy apps might expect this...
+     */
+    ThreadContext->Ebp = 0;
+    ThreadContext->Eax = 0;
+    ThreadContext->Ebx = 1;
+    ThreadContext->Ecx = 2;
+    ThreadContext->Edx = 3;
+    ThreadContext->Esi = 4;
+    ThreadContext->Edi = 5;
+
+    /* Set the Selectors */
+    ThreadContext->SegGs = 0;
+    ThreadContext->SegFs = KGDT_R3_TEB;
+    ThreadContext->SegEs = KGDT_R3_DATA;
+    ThreadContext->SegDs = KGDT_R3_DATA;
+    ThreadContext->SegSs = KGDT_R3_DATA;
+    ThreadContext->SegCs = KGDT_R3_CODE;
+
+    /* Enable Interrupts */
+    ThreadContext->EFlags = EFLAGS_INTERRUPT_MASK;
+
+    /* Settings passed */
+    ThreadContext->Eip = (ULONG)ThreadStartAddress;
+    ThreadContext->Esp = (ULONG)InitialTeb;
+
+    /* Only the basic Context is initialized */
+    ThreadContext->ContextFlags = CONTEXT_CONTROL |
+                                  CONTEXT_INTEGER |
+                                  CONTEXT_SEGMENTS;
+
+    /* Set up ESP to the right value */
+    ThreadContext->Esp -= sizeof(PVOID);
+    ZwWriteVirtualMemory(ProcessHandle,
+                         (PVOID)ThreadContext->Esp,
+                         (PVOID)&ThreadStartParam,
+                         sizeof(PVOID),
+                         NULL);
+
+    /* Push it down one more notch for RETEIP */
+    ThreadContext->Esp -= sizeof(PVOID);
+}
+
 /*
  * @implemented
  */
index fdb2bc7..39b28f2 100644 (file)
@@ -5,8 +5,7 @@
 #include <ndk/rtlfuncs.h>
 #include <stdlib.h>
 #include <stdarg.h>
-
-#define EOF            (-1)
+#include <stdio.h>
 
 /* helper function for *scanf.  Returns the value of character c in the
  * given base, or -1 if the given character is not a digit of the base.
index fba564c..67fbe1a 100644 (file)
@@ -1,6 +1,5 @@
 #include <string.h>
 #include <stdlib.h>
-#include <ctype.h>
 
 /*
  * @implemented
index 536d8ef..08bfad2 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSans-Bold.ttf and b/reactos/media/fonts/DejaVuSans-Bold.ttf differ
index 92eb9c4..fa37772 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSans-BoldOblique.ttf and b/reactos/media/fonts/DejaVuSans-BoldOblique.ttf differ
index 0a82771..af39f4c 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSans-ExtraLight.ttf and b/reactos/media/fonts/DejaVuSans-ExtraLight.ttf differ
index c66546d..c65241a 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSans-Oblique.ttf and b/reactos/media/fonts/DejaVuSans-Oblique.ttf differ
index e12bc57..734351d 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSans.ttf and b/reactos/media/fonts/DejaVuSans.ttf differ
index c972265..fe1cee2 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSansCondensed-Bold.ttf and b/reactos/media/fonts/DejaVuSansCondensed-Bold.ttf differ
index 1bca537..dc39650 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSansCondensed-BoldOblique.ttf and b/reactos/media/fonts/DejaVuSansCondensed-BoldOblique.ttf differ
index d842b39..713af7e 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSansCondensed-Oblique.ttf and b/reactos/media/fonts/DejaVuSansCondensed-Oblique.ttf differ
index 803b234..2ad709e 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSansCondensed.ttf and b/reactos/media/fonts/DejaVuSansCondensed.ttf differ
index 8b5e4b3..783e9f2 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSansMono-Bold.ttf and b/reactos/media/fonts/DejaVuSansMono-Bold.ttf differ
index 9e224ba..73550c1 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSansMono-BoldOblique.ttf and b/reactos/media/fonts/DejaVuSansMono-BoldOblique.ttf differ
index 02ad095..4f2e095 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSansMono-Oblique.ttf and b/reactos/media/fonts/DejaVuSansMono-Oblique.ttf differ
index 2cc0e2c..2745c20 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSansMono.ttf and b/reactos/media/fonts/DejaVuSansMono.ttf differ
index 1f7be1c..4b5affc 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSerif-Bold.ttf and b/reactos/media/fonts/DejaVuSerif-Bold.ttf differ
index 72b1567..f9d36be 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSerif-BoldOblique.ttf and b/reactos/media/fonts/DejaVuSerif-BoldOblique.ttf differ
index 780373a..29098c1 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSerif-Oblique.ttf and b/reactos/media/fonts/DejaVuSerif-Oblique.ttf differ
index 633216c..8f47a76 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSerif.ttf and b/reactos/media/fonts/DejaVuSerif.ttf differ
index 907e706..900723b 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSerifCondensed-Bold.ttf and b/reactos/media/fonts/DejaVuSerifCondensed-Bold.ttf differ
index 46b3541..7d2995a 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSerifCondensed-BoldOblique.ttf and b/reactos/media/fonts/DejaVuSerifCondensed-BoldOblique.ttf differ
index 82b3c09..872e1bc 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSerifCondensed-Oblique.ttf and b/reactos/media/fonts/DejaVuSerifCondensed-Oblique.ttf differ
index 2b71656..2efcb68 100644 (file)
Binary files a/reactos/media/fonts/DejaVuSerifCondensed.ttf and b/reactos/media/fonts/DejaVuSerifCondensed.ttf differ
index 3c84aa2..9009506 100644 (file)
@@ -2,10 +2,8 @@ Adrian Schroeter
 Andrey Valentinovich Panov
 Ben Laenen
 Bhikkhu Pesala
-Clayborne Arevalo
 Dafydd Harries
 Danilo Segan
-Davide Viti
 David Jez
 David Lawrence Ramsey
 Denis Jacquerye
@@ -15,14 +13,12 @@ Gee Fung Sit
 Heikki Lindroos
 James Cloos
 James Crippen
-John Karp
 Keenan Pepper
 Lars Naesbye Christensen
 Mashrab Kuvatov
 Mederic Boquien
 Michael Everson
 Misu Moldovan
-Nguyen Thai Ngoc Duy
 Ognyan Kulev
 Ondrej Koala Vacha
 Peter Cernak
@@ -35,4 +31,4 @@ Tim May
 Valentin Stoykov
 Vasek Stodulka
 
-$Id: AUTHORS 1491 2007-01-12 20:40:12Z ben_laenen $
+$Id: AUTHORS 1318 2006-11-22 16:11:55Z roozbeh $
index dc00303..955c797 100644 (file)
@@ -1,58 +1,3 @@
-Changes from 2.13 to 2.14
-- added Philippine peso glyph U+20B1 (by Clayborne Arevalo)
-- made U+2012 have the same width as digits, according to Unicode 5.0, 
-  page 206 (by Roozbeh Pournader)
-- made all of the "above" combining characters remove the dot of "i", 
-  "j", etc (Soft_Dotted characters), according to Unicode 5.0, 
-  page 228 (by Roozbeh Pournader)
-- made U+012F, U+03F3, U+0456, U+0458, U+1E2D, and U+1ECB (all fonts 
-  except Mono), U+0249, U+2148, and U+2149 (Sans and Sans Condensed), 
-  U+0268 (Sans ExtraLight, Serif and Serif Condensed), and U+029D (Serif 
-  and Serif Condensed) respect the Soft_Dotted property (by Roozbeh 
-  Pournader)
-- added U+223E, U+223F, U+2240, U+22C2, U+22C3 to Sans (by Rémy Oudompheng)
-- added U+203D to Serif (by Gee Fung Sit)
-- added zero-width glyphs for U+2061-U+2063 to Sans and Serif (by Gee 
-  Fung Sit)
-- changed isolated forms of Arabic waw (U+0648, U+0624 and U+06C6) (bug #9432) 
-  (by Ben Laenen)
-- added Lao consonants U+0E81, U+0E82, U+0E84, U+0E87, U+0E88, U+0E8A, 
-  U+0E8D, U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA, 
-  U+0EAB, U+0EAD-0EAF to Sans Mono (by Rémy Oudompheng)
-- added U+0200-U+0217, U+0226-U+0229, U+02F3, U+1E00-U+1E07, 
-  U+1E0A-U+1E0B, U+1E18-U+1E1F, U+1E22-U+1E23, U+1E28-U+1E2D, 
-  U+1E3A-U+1E3B, U+1E40, U+1E48-U+1E49, U+1E56, U+1E58-U+1E59, 
-  U+1E5E-U+1E5F, U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, U+1E72-U+1E77, 
-  U+1E86-U+1E8B, U+1E92-U+1E96, U+1EA0-U+1EA1, U+1EF4-U+1EF5 to Mono 
-  (by Ben Laenen)
-- renamed uppercase variants of diacritics (macron, breve, double grave, 
-  double acute, inverted breve, dot above) to "uni03XX.case" in Mono 
-  (by Ben Laenen)
-- moved uppercase variants of diacritics up in Mono so they properly 
-  vertically align on capitals (by Ben Laenen)
-- precomposed glyphs with macron, breve, double grave, double acute, 
-  inverted breve, dot above, macron below, breve below, inverted breve 
-  below, dot below, cedilla, caron below, circumflex below, diaeresis 
-  below, tilde below now reference to combining diacritics instead of 
-  space modifiers in Mono (by Ben Laenen)
-- made ring below (U+0325), and half rings below (U+031C and U+0339) 
-  smaller in Mono (by Ben Laenen)
-- added U+205F to all fonts (by Roozbeh Pournader)
-- added U+035E-U+035F to Sans (by Roozbeh Pournader)
-- added empty glyphs for U+034F, U+202A-U+202E, U+2060, U+206A-206F, 
-  U+FE00-U+FE0F to non-Mono fonts (by Roozbeh Pournader)
-- added U+2101, U+2107-U+2108, U+210B, U+210C, U+2110, U+2112, U+211B, 
-  U+211F, U+2123, U+2125, U+2128-U+2129, U+212C-U+212D, U+212F, 
-  U+2130-U+2131, U+2133, U+2136-U+213A, U+2141-U+2144, U+2B00-U+2B11, 
-  U+2B20-U+2B23 to Sans (by John Karp)
-- reshaped omega (U+03C9) in Mono (by Ben Laenen)
-- added U+2205, U+22C6, U+2300-U+2301, U+2303-U+2306, U+230C-U+230F, 
-  U+2312-U+2315, U+231C-U+231F, U+2335, U+2337-U+233E, U+2341-U+2344, 
-  U+2347-U+2348, U+234B-U+234D, U+2349-U+2350, U+2352-U+2354, 
-  U+2357-U+2359, U+235A-U+235C, U+235E-U+2360, U+2363-U+2365, 
-  U+2368-U+2369, U+236B-U+2370, U+2373-U+237A, U+2380-U+2383, 
-  U+2388-U+238B, U+2395 in Mono (by Ben Laenen)
-
 Changes from 2.12 to 2.13
 - adjusted U+0198B, U+01B3-U+01B4 in Sans, hinted U+01B4 in Sans Book 
   (by Denis Jacquerye)
@@ -763,4 +708,4 @@ Changes from 0.9 to 0.9.1:
 - proper caron shape for dcaron and tcaron
 - minor visual changes
 
-$Id: NEWS 1507 2007-01-21 16:47:57Z moyogo $
+$Id: NEWS 1388 2006-12-17 11:20:45Z moyogo $
index 8ae6e62..ba6ff20 100644 (file)
@@ -1,4 +1,4 @@
-DejaVu fonts 2.14 (c)2004-2007 DejaVu fonts team
+DejaVu fonts 2.13 (c)2004-2006 DejaVu fonts team
 -----------------------------------------------
 
 The DejaVu fonts are a font family based on the Bitstream Vera Fonts
@@ -56,4 +56,4 @@ U+213C-U+2140, U+2295-2298, U+2308-230b, U+26A2-U+26B1, U+2701-2704,
 U+2706-2709, U+270c-274b, U+2758-275a, U+2761-2775, U+2780-2794,
 U+2798-27af, U+27b1-27be, U+fb05-fb06
 
-$Id: README 1507 2007-01-21 16:47:57Z moyogo $
+$Id: README 1388 2006-12-17 11:20:45Z moyogo $
index e87b4be..03faae5 100644 (file)
@@ -1,5 +1,5 @@
 This is the language coverage file for DejaVu fonts
-($Id: langcover.txt 1505 2007-01-19 20:42:16Z ben_laenen $)
+($Id: langcover.txt 1390 2006-12-17 12:48:14Z ben_laenen $)
 
                                                 Sans               Serif              Sans Mono          
 aa     Afar                                     100% (62/62)       100% (62/62)       100% (62/62)      
@@ -52,7 +52,7 @@ fr     French                                   100% (84/84)       100% (84/84)
 ful    Fulah (Fula)                             100% (62/62)       100% (62/62)       100% (62/62)      
 fur    Friulian                                 100% (66/66)       100% (66/66)       100% (66/66)      
 fy     Frisian                                  100% (75/75)       100% (75/75)       100% (75/75)      
-ga     Irish                                    100% (80/80)       100% (80/80)       100% (80/80)      
+ga     Irish                                    100% (80/80)       100% (80/80)        86% (69/80)      
 gd     Scots Gaelic                             100% (70/70)       100% (70/70)       100% (70/70)      
 gez    Ethiopic (Geez)                               (0/218)            (0/218)            (0/218)      
 gl     Galician                                 100% (66/66)       100% (66/66)       100% (66/66)      
@@ -96,7 +96,7 @@ ky     Kirgiz                                   100% (70/70)       100% (70/70)
 la     Latin                                    100% (68/68)       100% (68/68)       100% (68/68)      
 lb     Luxembourgish (Letzeburgesch)            100% (75/75)       100% (75/75)       100% (75/75)      
 lez    Lezghian (Lezgian)                       100% (67/67)       100% (67/67)       100% (67/67)      
-lo     Lao                                       84% (55/65)            (0/65)         43% (28/65)      
+lo     Lao                                       84% (55/65)            (0/65)             (0/65)       
 lt     Lithuanian                               100% (70/70)       100% (70/70)       100% (70/70)      
 lv     Latvian                                  100% (78/78)       100% (78/78)       100% (78/78)      
 mg     Malagasy                                 100% (56/56)       100% (56/56)       100% (56/56)      
@@ -169,7 +169,7 @@ uk     Ukrainian                                100% (72/72)       100% (72/72)
 ur     Urdu                                      94% (137/145)          (0/145)            (0/145)      
 uz     Uzbek                                    100% (68/68)       100% (68/68)       100% (68/68)      
 ven    Venda                                    100% (62/62)       100% (62/62)       100% (62/62)      
-vi     Vietnamese                               100% (194/194)      77% (150/194)      62% (122/194)    
+vi     Vietnamese                               100% (194/194)      77% (150/194)      60% (118/194)    
 vo     Volapuk                                  100% (54/54)       100% (54/54)       100% (54/54)      
 vot    Votic                                    100% (62/62)       100% (62/62)       100% (62/62)      
 wa     Walloon                                  100% (70/70)       100% (70/70)       100% (70/70)      
index 8532be9..c41c95e 100644 (file)
@@ -1,5 +1,5 @@
 This is the status file for DejaVu fonts
-($Id: status.txt 1505 2007-01-19 20:42:16Z ben_laenen $)
+($Id: status.txt 1390 2006-12-17 12:48:14Z ben_laenen $)
 
 original = present in original Bitstream Vera 1.10
 <version> = added in DejaVu fonts <version>
@@ -451,30 +451,30 @@ U+01fc AEacute              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+01fd aeacute              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+01fe Oslashacute          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+01ff oslashacute          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0200 uni0200              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0201 uni0201              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0202 uni0202              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0203 uni0203              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0204 uni0204              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0205 uni0205              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0206 uni0206              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0207 uni0207              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0208 uni0208              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0209 uni0209              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+020a uni020A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+020b uni020B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+020c uni020C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+020d uni020D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+020e uni020E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+020f uni020F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0210 uni0210              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0211 uni0211              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0212 uni0212              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0213 uni0213              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0214 uni0214              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0215 uni0215              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0216 uni0216              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0217 uni0217              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0200 uni0200              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0201 uni0201              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0202 uni0202              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0203 uni0203              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0204 uni0204              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0205 uni0205              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0206 uni0206              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0207 uni0207              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0208 uni0208              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0209 uni0209              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+020a uni020A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+020b uni020B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+020c uni020C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+020d uni020D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+020e uni020E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+020f uni020F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0210 uni0210              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0211 uni0211              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0212 uni0212              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0213 uni0213              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0214 uni0214              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0215 uni0215              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0216 uni0216              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0217 uni0217              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+0218 Scommaaccent         1.5
 U+0219 scommaaccent         1.5
 U+021a uni021A              1.5
@@ -489,10 +489,10 @@ U+0222 uni0222              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+0223 uni0223              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+0224 uni0224              2.3
 U+0225 uni0225              2.3
-U+0226 uni0226              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0227 uni0227              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0228 uni0228              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0229 uni0229              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0226 uni0226              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0227 uni0227              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0228 uni0228              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+0229 uni0229              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+022a uni022A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+022b uni022B              1.13
 U+022c uni022C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
@@ -688,7 +688,7 @@ U+02e9 uni02E9              2.0
 U+02ec uni02EC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+02ed uni02ED              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+02ee uni02EE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+02f3 uni02F3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+02f3 uni02F3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
 U+02f7 uni02F7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
 U+0300 gravecomb            1.15
 U+0301 acutecomb            1.15
@@ -769,7 +769,6 @@ U+034b uni034B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+034c uni034C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+034d uni034D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+034e uni034E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+034f uni034F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+0351 uni0351              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+0352 uni0352              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique)
 U+0353 uni0353              2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
@@ -777,8 +776,6 @@ U+0357 uni0357              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+0358 uni0358              2.3
 U+035c uni035C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
 U+035d uni035D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+035e uni035E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+035f uni035F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+0360 uni0360              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+0361 uni0361              2.0
 U+0362 uni0362              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
@@ -1434,34 +1431,34 @@ U+06f7 uni06F7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed
 U+06f8 uni06F8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
 U+06f9 uni06F9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
 U+0e3f uni0E3F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0e81 uni0E81              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e82 uni0E82              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e84 uni0E84              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e87 uni0E87              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e88 uni0E88              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e8a uni0E8A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e8d uni0E8D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e94 uni0E94              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e95 uni0E95              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e96 uni0E96              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e97 uni0E97              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e99 uni0E99              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9a uni0E9A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9b uni0E9B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9c uni0E9C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9d uni0E9D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9e uni0E9E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9f uni0E9F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea1 uni0EA1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea2 uni0EA2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea3 uni0EA3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea5 uni0EA5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea7 uni0EA7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eaa uni0EAA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eab uni0EAB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ead uni0EAD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eae uni0EAE              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eaf uni0EAF              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e81 uni0E81              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e82 uni0E82              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e84 uni0E84              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e87 uni0E87              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e88 uni0E88              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e8a uni0E8A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e8d uni0E8D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e94 uni0E94              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e95 uni0E95              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e96 uni0E96              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e97 uni0E97              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e99 uni0E99              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e9a uni0E9A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e9b uni0E9B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e9c uni0E9C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e9d uni0E9D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e9e uni0E9E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e9f uni0E9F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ea1 uni0EA1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ea2 uni0EA2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ea3 uni0EA3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ea5 uni0EA5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ea7 uni0EA7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0eaa uni0EAA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0eab uni0EAB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ead uni0EAD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0eae uni0EAE              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0eaf uni0EAF              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+0eb0 uni0EB0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+0eb1 uni0EB1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+0eb2 uni0EB2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
@@ -1798,24 +1795,18 @@ U+1dbc uni1DBC              2.3
 U+1dbd uni1DBD              2.3
 U+1dbe uni1DBE              2.3
 U+1dbf uni1DBF              2.3
-U+1dc4 uni1DC4              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1dc5 uni1DC5              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1dc6 uni1DC6              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1dc7 uni1DC7              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1dc8 uni1DC8              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1dc9 uni1DC9              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1e00 uni1E00              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e01 uni1E01              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e02 uni1E02              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e03 uni1E03              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e04 uni1E04              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e05 uni1E05              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e06 uni1E06              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e07 uni1E07              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e00 uni1E00              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e01 uni1E01              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e02 uni1E02              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e03 uni1E03              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e04 uni1E04              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e05 uni1E05              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e06 uni1E06              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e07 uni1E07              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e08 uni1E08              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e09 uni1E09              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+1e0a uni1E0A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e0b uni1E0B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e0a uni1E0A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e0b uni1E0B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e0c uni1E0C              2.1
 U+1e0d uni1E0D              2.1
 U+1e0e uni1E0E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
@@ -1828,28 +1819,28 @@ U+1e14 uni1E14              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+1e15 uni1E15              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
 U+1e16 uni1E16              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
 U+1e17 uni1E17              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
-U+1e18 uni1E18              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e19 uni1E19              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e1a uni1E1A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e1b uni1E1B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e1c uni1E1C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e1d uni1E1D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e1e uni1E1E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e1f uni1E1F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e20 uni1E20              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e21 uni1E21              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e22 uni1E22              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e23 uni1E23              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e18 uni1E18              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e19 uni1E19              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e1a uni1E1A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e1b uni1E1B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e1c uni1E1C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+1e1d uni1E1D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+1e1e uni1E1E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e1f uni1E1F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e20 uni1E20              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e21 uni1E21              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e22 uni1E22              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e23 uni1E23              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e24 uni1E24              2.1
 U+1e25 uni1E25              2.1
 U+1e26 uni1E26              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e27 uni1E27              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+1e28 uni1E28              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e29 uni1E29              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e2a uni1E2A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e2b uni1E2B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e2c uni1E2C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e2d uni1E2D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e28 uni1E28              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e29 uni1E29              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e2a uni1E2A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e2b uni1E2B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e2c uni1E2C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e2d uni1E2D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e2e uni1E2E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
 U+1e2f uni1E2F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
 U+1e30 uni1E30              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
@@ -1862,13 +1853,13 @@ U+1e36 uni1E36              2.1
 U+1e37 uni1E37              2.1
 U+1e38 uni1E38              2.1
 U+1e39 uni1E39              2.1
-U+1e3a uni1E3A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e3b uni1E3B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e3a uni1E3A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e3b uni1E3B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e3c uni1E3C              1.13
 U+1e3d uni1E3D              1.13
 U+1e3e uni1E3E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+1e3f uni1E3F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e40 uni1E40              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e40 uni1E40              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e41 uni1E41              2.1
 U+1e42 uni1E42              2.1
 U+1e43 uni1E43              2.1
@@ -1876,8 +1867,8 @@ U+1e44 uni1E44              1.13
 U+1e45 uni1E45              1.13
 U+1e46 uni1E46              2.1
 U+1e47 uni1E47              2.1
-U+1e48 uni1E48              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e49 uni1E49              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e48 uni1E48              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e49 uni1E49              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e4a uni1E4A              1.13
 U+1e4b uni1E4B              1.13
 U+1e4c uni1E4C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
@@ -1890,17 +1881,17 @@ U+1e52 uni1E52              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+1e53 uni1E53              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
 U+1e54 uni1E54              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e55 uni1E55              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+1e56 uni1E56              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e56 uni1E56              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e57 uni1E57              2.1
-U+1e58 uni1E58              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e59 uni1E59              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e58 uni1E58              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e59 uni1E59              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e5a uni1E5A              2.1
 U+1e5b uni1E5B              2.1
 U+1e5c uni1E5C              2.1
 U+1e5d uni1E5D              2.1
-U+1e5e uni1E5E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e5f uni1E5F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e60 uni1E60              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e5e uni1E5E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e5f uni1E5F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e60 uni1E60              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e61 uni1E61              2.1
 U+1e62 uni1E62              2.1
 U+1e63 uni1E63              2.1
@@ -1908,22 +1899,22 @@ U+1e64 uni1E64              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+1e65 uni1E65              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
 U+1e66 uni1E66              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
 U+1e67 uni1E67              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1e68 uni1E68              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e69 uni1E69              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e6a uni1E6A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e6b uni1E6B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e68 uni1E68              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e69 uni1E69              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e6a uni1E6A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e6b uni1E6B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e6c uni1E6C              2.1
 U+1e6d uni1E6D              2.1
-U+1e6e uni1E6E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e6f uni1E6F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e6e uni1E6E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e6f uni1E6F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e70 uni1E70              1.13
 U+1e71 uni1E71              1.13
-U+1e72 uni1E72              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e73 uni1E73              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e74 uni1E74              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e75 uni1E75              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e76 uni1E76              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e77 uni1E77              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e72 uni1E72              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e73 uni1E73              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e74 uni1E74              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e75 uni1E75              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e76 uni1E76              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e77 uni1E77              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e78 uni1E78              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
 U+1e79 uni1E79              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
 U+1e7a uni1E7A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
@@ -1938,30 +1929,30 @@ U+1e82 Wacute               1.2
 U+1e83 wacute               1.2
 U+1e84 Wdieresis            1.2
 U+1e85 wdieresis            1.2
-U+1e86 uni1E86              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e87 uni1E87              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e88 uni1E88              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e89 uni1E89              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e8a uni1E8A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e8b uni1E8B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e86 uni1E86              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e87 uni1E87              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e88 uni1E88              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e89 uni1E89              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e8a uni1E8A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e8b uni1E8B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e8c uni1E8C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e8d uni1E8D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e8e uni1E8E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+1e8f uni1E8F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+1e90 uni1E90              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e91 uni1E91              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+1e92 uni1E92              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e93 uni1E93              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e94 uni1E94              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e95 uni1E95              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e96 uni1E96              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e92 uni1E92              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e93 uni1E93              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e94 uni1E94              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e95 uni1E95              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1e96 uni1E96              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e97 uni1E97              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e98 uni1E98              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e99 uni1E99              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1e9a uni1E9A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans ExtraLight)
 U+1e9b uni1E9B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ea0 uni1EA0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ea1 uni1EA1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ea0 uni1EA0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1ea1 uni1EA1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1ea2 uni1EA2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
 U+1ea3 uni1EA3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
 U+1ea4 uni1EA4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
@@ -2044,8 +2035,8 @@ U+1ef0 uni1EF0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+1ef1 uni1EF1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
 U+1ef2 Ygrave               1.2
 U+1ef3 ygrave               1.2
-U+1ef4 uni1EF4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ef5 uni1EF5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ef4 uni1EF4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+1ef5 uni1EF5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+1ef6 uni1EF6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
 U+1ef7 uni1EF7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight)
 U+1ef8 uni1EF8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
@@ -2323,11 +2314,6 @@ U+2024 onedotenleader       2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+2025 twodotenleader       2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+2026 ellipsis             original
 U+2027 uni2027              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+202a uni202A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+202b uni202B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+202c afii61573            2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+202d afii61574            2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+202e afii61575            2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+202f uni202F              2.11 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
 U+2030 perthousand          original
 U+2031 uni2031              2.1
@@ -2342,7 +2328,7 @@ U+2039 guilsinglleft        original
 U+203a guilsinglright       original
 U+203b uni203B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
 U+203c exclamdbl            2.0
-U+203d uni203D              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+203d uni203D              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+203e uni203E              2.3
 U+203f uni203F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
 U+2040 uni2040              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
@@ -2376,17 +2362,6 @@ U+205b uni205B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+205c uni205C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+205d uni205D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+205e uni205E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+205f uni205F              2.14
-U+2060 uni2060              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+2061 uni2061              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+2062 uni2062              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+2063 uni2063              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+206a uni206A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+206b uni206B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+206c uni206C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+206d uni206D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+206e uni206E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+206f uni206F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+2070 uni2070              2.2
 U+2071 uni2071              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
 U+2074 uni2074              2.2
@@ -2438,7 +2413,7 @@ U+20ad uni20AD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+20ae uni20AE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+20af uni20AF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+20b0 uni20B0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+20b1 uni20B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
+U+20b1 uni20B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+20b2 uni20B2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+20b3 uni20B3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+20b4 uni20B4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
@@ -2448,23 +2423,16 @@ U+20d1 uni20D1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Obliq
 U+20d6 uni20D6              2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+20d7 uni20D7              2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2100 uni2100              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2101 uni2101              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2102 uni2102              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+2103 uni2103              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
 U+2104 uni2104              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2105 afii61248            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2106 uni2106              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2107 uni2107              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2108 uni2108              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2109 uni2109              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+210b uni210B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+210c uni210C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+210d uni210D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+210e uni210E              2.5 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
 U+210f uni210F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2110 uni2110              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2111 Ifraktur             2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2112 uni2112              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2113 afii61289            2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2114 uni2114              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2115 uni2115              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
@@ -2473,48 +2441,27 @@ U+2117 uni2117              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+2118 weierstrass          2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2119 uni2119              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+211a uni211A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+211b uni211B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+211c Rfraktur             2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+211d uni211D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+211e prescription         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+211f uni211F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2120 uni2120              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2121 uni2121              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2122 trademark            original
-U+2123 uni2123              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2124 uni2124              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2125 uni2125              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2126 uni2126              2.2
 U+2127 uni2127              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+2128 uni2128              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2129 uni2129              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+212a uni212A              2.2
 U+212b uni212B              2.2
-U+212c uni212C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+212d uni212D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+212e estimated            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+212f uni212F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2130 uni2130              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2131 uni2131              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2132 uni2132              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+2133 uni2133              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2134 uni2134              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
 U+2135 aleph                2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2136 uni2136              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2137 uni2137              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2138 uni2138              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2139 uni2139              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+213a uni213A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+213b uni213B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+213c uni213C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+213d uni213D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+213e uni213E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+213f uni213F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+2140 uni2140              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2141 uni2141              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2142 uni2142              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2143 uni2143              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2144 uni2144              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2145 uni2145              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+2146 uni2146              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+2147 uni2147              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
@@ -2689,7 +2636,7 @@ U+2201 uni2201              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+2202 partialdiff          original
 U+2203 existential          2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
 U+2204 uni2204              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2205 emptyset             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2205 emptyset             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2206 Delta                original
 U+2207 gradient             2.1
 U+2208 element              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
@@ -2746,9 +2693,6 @@ U+223a uni223A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+223b uni223B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+223c similar              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+223d uni223D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+223e uni223E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+223f uni223F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2240 uni2240              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2241 uni2241              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
 U+2242 uni2242              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+2243 uni2243              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
@@ -2874,11 +2818,9 @@ U+22bc uni22BC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+22bd uni22BD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+22c0 uni22C0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+22c1 uni22C1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22c2 uni22C2              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22c3 uni22C3              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+22c4 uni22C4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+22c5 dotmath              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+22c6 uni22C6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22c6 uni22C6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+22c8 uni22C8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+22c9 uni22C9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+22ca uni22CA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
@@ -2924,103 +2866,23 @@ U+22fc uni22FC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+22fd uni22FD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+22fe uni22FE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+22ff uni22FF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2300 uni2300              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2301 uni2301              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+2302 house                1.14
-U+2303 uni2303              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2304 uni2304              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2305 uni2305              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2306 uni2306              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2306 uni2306              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2308 uni2308              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
 U+2309 uni2309              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
 U+230a uni230A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
 U+230b uni230B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
-U+230c uni230C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+230d uni230D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+230e uni230E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+230f uni230F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+2310 revlogicalnot        1.14
 U+2311 uni2311              1.15
-U+2312 uni2312              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2313 uni2313              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2314 uni2314              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2315 uni2315              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+2318 uni2318              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+2319 uni2319              1.14
-U+231c uni231C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+231d uni231D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+231e uni231E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+231f uni231F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+2320 integraltp           2.3
 U+2321 integralbt           2.3
 U+2325 uni2325              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2326 uni2326              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2327 uni2327              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+2328 uni2328              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+2329 angleleft            2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
 U+232a angleright           2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
-U+232b uni232B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2335 uni2335              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2337 uni2337              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2338 uni2338              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2339 uni2339              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233a uni233A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233b uni233B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233c uni233C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233d uni233D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233e uni233E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2341 uni2341              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2342 uni2342              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2343 uni2343              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2344 uni2344              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2347 uni2347              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2348 uni2348              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2349 uni2349              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+234b uni234B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+234c uni234C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+234d uni234D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2350 uni2350              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2352 uni2352              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2353 uni2353              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2354 uni2354              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2357 uni2357              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2358 uni2358              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2359 uni2359              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235a uni235A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235b uni235B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235c uni235C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235e uni235E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235f uni235F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2360 uni2360              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2363 uni2363              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2364 uni2364              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2365 uni2365              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2368 uni2368              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2369 uni2369              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236b uni236B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236c uni236C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236d uni236D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236e uni236E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236f uni236F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2370 uni2370              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2373 uni2373              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2374 uni2374              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2375 uni2375              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2376 uni2376              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2377 uni2377              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2378 uni2378              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2379 uni2379              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+237a uni237A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+237d uni237D              1.15
-U+2380 uni2380              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2381 uni2381              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2382 uni2382              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2383 uni2383              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2388 uni2388              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2389 uni2389              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+238a uni238A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+238b uni238B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2395 uni2395              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
 U+239b uni239B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
 U+239c uni239C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
 U+239d uni239D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
@@ -4024,24 +3886,6 @@ U+2ab9 uni2AB9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden
 U+2aba uni2ABA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2af9 uni2AF9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2afa uni2AFA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b00 uni2B00              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b01 uni2B01              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b02 uni2B02              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b03 uni2B03              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b04 uni2B04              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b05 uni2B05              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b06 uni2B06              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b07 uni2B07              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b08 uni2B08              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b09 uni2B09              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b0a uni2B0A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b0b uni2B0B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b0c uni2B0C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b0d uni2B0D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b0e uni2B0E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b0f uni2B0F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b10 uni2B10              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b11 uni2B11              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2b12 uni2B12              2.3
 U+2b13 uni2B13              2.3
 U+2b14 uni2B14              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
@@ -4051,10 +3895,6 @@ U+2b17 uni2B17              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono,
 U+2b18 uni2B18              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
 U+2b19 uni2B19              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
 U+2b1a uni2B1A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique)
-U+2b20 uni2B20              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b21 uni2B21              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b22 uni2B22              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b23 uni2B23              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
 U+2c60 uni2C60              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+2c61 uni2C61              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
 U+2c62 uni2C62              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
@@ -4239,22 +4079,6 @@ U+fbfc uniFBFC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed
 U+fbfd uniFBFD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
 U+fbfe uniFBFE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
 U+fbff uniFBFF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+fe00 uniFE00              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe01 uniFE01              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe02 uniFE02              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe03 uniFE03              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe04 uniFE04              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe05 uniFE05              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe06 uniFE06              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe07 uniFE07              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe08 uniFE08              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe09 uniFE09              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe0a uniFE0A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe0b uniFE0B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe0c uniFE0C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe0d uniFE0D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe0e uniFE0E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
-U+fe0f uniFE0F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique)
 U+fe70 uniFE70              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
 U+fe71 uniFE71              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
 U+fe72 uniFE72              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
index 3263e63..c5f8ea1 100644 (file)
@@ -1,5 +1,5 @@
 This is the Unicode coverage file for DejaVu fonts
-($Id: unicover.txt 1505 2007-01-19 20:42:16Z ben_laenen $)
+($Id: unicover.txt 1388 2006-12-17 11:20:45Z moyogo $)
 
 Control and similar characters are discounted from totals.
 
@@ -7,10 +7,10 @@ Control and similar characters are discounted from totals.
 U+0000 Basic Latin                              100% (95/95)       100% (95/95)       100% (95/95)      
 U+0080 Latin-1 Supplement                       100% (96/96)       100% (96/96)       100% (96/96)      
 U+0100 Latin Extended-A                         100% (128/128)     100% (128/128)     100% (128/128)    
-U+0180 Latin Extended-B                         100% (208/208)      90% (188/208)      78% (163/208)    
+U+0180 Latin Extended-B                         100% (208/208)      90% (188/208)      64% (135/208)    
 U+0250 IPA Extensions                           100% (96/96)       100% (96/96)       100% (96/96)      
-U+02b0 Spacing Modifier Letters                  78% (63/80)        56% (45/80)        57% (46/80)      
-U+0300 Combining Diacritical Marks               82% (92/112)       60% (68/112)       59% (67/112)     
+U+02b0 Spacing Modifier Letters                  78% (63/80)        56% (45/80)        56% (45/80)      
+U+0300 Combining Diacritical Marks               79% (89/112)       59% (67/112)       59% (67/112)     
 U+0370 Greek and Coptic                         100% (127/127)      86% (110/127)      86% (110/127)    
 U+0400 Cyrillic                                 100% (255/255)      74% (190/255)      66% (170/255)    
 U+0500 Cyrillic Supplement                      100% (20/20)            (0/20)             (0/20)       
@@ -32,7 +32,7 @@ U+0c80 Kannada                                       (0/86)             (0/86)
 U+0d00 Malayalam                                     (0/78)             (0/78)             (0/78)       
 U+0d80 Sinhala                                       (0/80)             (0/80)             (0/80)       
 U+0e00 Thai                                       1% (1/87)             (0/87)             (0/87)       
-U+0e80 Lao                                       84% (55/65)            (0/65)         43% (28/65)      
+U+0e80 Lao                                       84% (55/65)            (0/65)             (0/65)       
 U+0f00 Tibetan                                       (0/195)            (0/195)            (0/195)      
 U+1000 Myanmar                                       (0/78)             (0/78)             (0/78)       
 U+10a0 Georgian                                      (0/83)             (0/83)             (0/83)       
@@ -57,18 +57,18 @@ U+1a00 Buginese                                      (0/30)             (0/30)
 U+1b00 Balinese                                      (0/121)            (0/121)            (0/121)      
 U+1d00 Phonetic Extensions                       82% (105/128)      28% (36/128)       28% (36/128)     
 U+1d80 Phonetic Extensions Supplement            59% (38/64)        57% (37/64)        57% (37/64)      
-U+1dc0 Combining Diacritical Marks Supplement    46% (6/13)             (0/13)             (0/13)       
-U+1e00 Latin Extended Additional                100% (246/246)      77% (190/246)      54% (134/246)    
+U+1dc0 Combining Diacritical Marks Supplement        (0/13)             (0/13)             (0/13)       
+U+1e00 Latin Extended Additional                100% (246/246)      77% (190/246)      27% (68/246)     
 U+1f00 Greek Extended                           100% (233/233)     100% (233/233)     100% (233/233)    
-U+2000 General Punctuation                       98% (104/106)      61% (65/106)       42% (45/106)     
+U+2000 General Punctuation                       83% (88/106)       45% (48/106)       41% (44/106)     
 U+2070 Superscripts and Subscripts              100% (34/34)        52% (18/34)        52% (18/34)      
-U+20a0 Currency Symbols                         100% (22/22)        27% (6/22)         22% (5/22)       
+U+20a0 Currency Symbols                         100% (22/22)        22% (5/22)         18% (4/22)       
 U+20d0 Combining Diacritical Marks for Symbols   12% (4/32)             (0/32)             (0/32)       
-U+2100 Letterlike Symbols                        94% (75/79)         7% (6/79)          7% (6/79)       
+U+2100 Letterlike Symbols                        59% (47/79)         7% (6/79)          7% (6/79)       
 U+2150 Number Forms                             100% (50/50)        26% (13/50)        26% (13/50)      
 U+2190 Arrows                                   100% (112/112)       3% (4/112)       100% (112/112)    
-U+2200 Mathematical Operators                    93% (239/256)      10% (27/256)       56% (145/256)    
-U+2300 Miscellaneous Technical                   15% (36/232)        6% (16/232)       50% (116/232)    
+U+2200 Mathematical Operators                    91% (234/256)      10% (27/256)       55% (143/256)    
+U+2300 Miscellaneous Technical                   15% (36/232)        6% (16/232)       15% (35/232)     
 U+2400 Control Pictures                           5% (2/39)          2% (1/39)          2% (1/39)       
 U+2440 Optical Character Recognition                 (0/11)             (0/11)             (0/11)       
 U+2460 Enclosed Alphanumerics                     6% (10/160)           (0/160)            (0/160)      
@@ -83,7 +83,7 @@ U+2800 Braille Patterns                         100% (256/256)          (0/256)
 U+2900 Supplemental Arrows-B                      4% (6/128)            (0/128)            (0/128)      
 U+2980 Miscellaneous Mathematical Symbols-B       7% (9/128)         0% (1/128)         0% (1/128)      
 U+2a00 Supplemental Mathematical Operators       27% (71/256)        1% (3/256)            (0/256)      
-U+2b00 Miscellaneous Symbols and Arrows         100% (31/31)        29% (9/31)         29% (9/31)       
+U+2b00 Miscellaneous Symbols and Arrows          29% (9/31)         29% (9/31)         29% (9/31)       
 U+2c00 Glagolitic                                    (0/94)             (0/94)             (0/94)       
 U+2c60 Latin Extended-C                         100% (17/17)            (0/17)             (0/17)       
 U+2c80 Coptic                                        (0/114)            (0/114)            (0/114)      
@@ -122,7 +122,7 @@ U+e000 Private Use Area                              (0/0)              (0/0)
 U+f900 CJK Compatibility Ideographs                  (0/467)            (0/467)            (0/467)      
 U+fb00 Alphabetic Presentation Forms             82% (48/58)        12% (7/58)          3% (2/58)       
 U+fb50 Arabic Presentation Forms-A               11% (70/595)           (0/595)            (0/595)      
-U+fe00 Variation Selectors                      100% (16/16)       100% (16/16)            (0/16)       
+U+fe00 Variation Selectors                           (0/16)             (0/16)             (0/16)       
 U+fe10 Vertical Forms                                (0/10)             (0/10)             (0/10)       
 U+fe20 Combining Half Marks                          (0/4)              (0/4)              (0/4)        
 U+fe30 CJK Compatibility Forms                       (0/32)             (0/32)             (0/32)       
index d270e3e..e7d4a5d 100644 (file)
@@ -8,39 +8,62 @@
 //                     Do NOT ask when it will be fixed.
 //              Failure to respect this will *ACHIEVE NOTHING*.
 //
+//
+// Ob:
+//  - Add Directory Lock.
+//  - Strengthen code with debug checks and assertions.
+//  - Fix FIXMEs/commented out code.
+//
+// Ex:
+//  - Fixup existing code that talks to Ke.
+//  - Implement Generic Callback mechanism.
+//  - Use pushlocks for handle implementation.
+//
+// Lpc:
+//  - Figure out why NTLPC-processes won't die anymore.
+//
+// Ke1:
+//  - Implement KiInitMachineDependent.
+//
+// Fstub:
+//  - Implement IoAssignDriveLetters using mount manager support.
+//
 // Hal:
 //  - Use APC and DPC Interrupt Dispatchers.
 //  - CMOS Initialization and CMOS Spinlock.
 //
-// Global:
-//  - TODO: Complete the list of bufxies
-//  - Fix hang/slowdown during boot -> New scheduler
-//      - Fix freelist.c errors with new scheduler enabled.
-//  - Fix process reference count leak.
-//  - Fix atapi.sys or serial.sys loading one more time at each boot.
-//  - Fix LiveCD.
+// Ke2:
+//  - New optimized table-based tick-hashed timer implementation.
+//  - New Thread Scheduler based on 2003.
+//
+// Kd:
+//  - Implement KD Kernel Debugging and WinDBG support.
+//
+// Native:
+//  - Rewrite loader.
+//  - Make smss NT-compatible.
 //
 ///////////////////////////////////////////////////////////////////////////////
 
 // REACTOS GUIDANCE PLAN
 //  ________________________________________________________________________________________________________
 // /                                                                                                        \
-// | OB, PS, LPC, DBGK, EX, INIT => "Code complete". No expected changes until 0.5.0                      | |
+// | OB, PS, LPC, DBGK, IO => Almost entirely fixed interaction with Ke/Ex.                               | |
 // | SE => Not looked at. Interaction with Ps/Io is minimal and currently hacked away. Preserve.          |J|
-// | HAL => Needs APC/DPC/IRQL implementation fixed ASAP in terms of interaction with Ke.                 |A|
-// | ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||           |N|
-// | \/      \/      \/      \/      \/      \/      \/      \/      \/      \/      \/      \/           | |
-// | BUGFIXES BUGFIXES BUGFIXES BUGFIXES BUGFIXES BUGFIXES BUGFIXES BUGFIXES BUGFIXES BUGFIXES BUGFIXES   |F|
-// | KE => Enable new thread scheduler and ensure it works.                                               |E|
-// | KD/KDBG => Laptop has special version of ROS without these components. Commit in branch.             |B|
-// | KD => Implement KD64 6.0, compatible with WinDBG                                                     | |
+// | EX => Needs re-visiting (in trunk). Do callbacks/push locks for interaction with Ps.                 |A|
+// | KD/KDBG => Laptop has special version of ROS without these components. Commit in branch.             |N|
+// | INIT => Boot sequence still needs work in terms of interaction with Ke and CPU features.             | |
+// | ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||           |F|
+// | \/      \/      \/      \/      \/      \/      \/      \/      \/      \/      \/      \/           |E|
+// | HAL => Needs APC/DPC/IRQL implementation fixed ASAP in terms of interaction with Ke.                 |B|
+// | FSTUB => Needs IoAssignDriveLetters fixed ASAP but not critical to Ke/Ex. Interacts with Io.         | |
 // | ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||           |M|
 // | \/      \/      \/      \/      \/      \/      \/      \/      \/      \/      \/      \/           |A|
 // | CM => TOTAL REWRITE.                                                                                 |R|
 // | ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||           | |
 // | ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||           |A|
 // | \/      \/      \/      \/      \/      \/      \/      \/      \/      \/      \/      \/           |P|
-// | PNPMGR => TBD                                                                                        |R|
+// | KE => Timer Rewrite + Thread Scheduler Rewrite.                                                      |R|
 // | ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||           |I|
 // | ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||           |L|
 // | ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||      ||           | |
index 195027b..1be5569 100644 (file)
 
 /* FUNCTIONS *****************************************************************/
 
-BOOLEAN
+VOID
 NTAPI
 CcInitializeCacheManager(VOID)
 {
-    CcInitView();
-    return TRUE;
+  CcInitView();
 }
 
 /*
index 20319ed..1faec95 100644 (file)
@@ -30,12 +30,12 @@ void* _alloca(size_t size);
 #endif
 
 ULONG CcFastMdlReadWait;
-ULONG CcFastMdlReadNotPossible;
 ULONG CcFastReadNotPossible;
 ULONG CcFastReadWait;
 ULONG CcFastReadNoWait;
 ULONG CcFastReadResourceMiss;
 
+
 /* FUNCTIONS *****************************************************************/
 
 VOID
index 8d38001..7e91d70 100644 (file)
@@ -34,7 +34,7 @@ CcMdlRead(
 
 /*
  * NAME                                                        INTERNAL
- * CcMdlReadComplete2@8
+ * CcMdlReadCompleteDev@8
  *
  * DESCRIPTION
  *
@@ -51,15 +51,15 @@ CcMdlRead(
  */
 VOID
 STDCALL
-CcMdlReadComplete2(IN PMDL MemoryDescriptorList,
+CcMdlReadCompleteDev(IN PMDL MdlChain,
                      IN PFILE_OBJECT FileObject)
 {
     PMDL Mdl;
 
     /* Free MDLs */
-    while ((Mdl = MemoryDescriptorList))
+    while ((Mdl = MdlChain))
     {
-        MemoryDescriptorList = Mdl->Next;
+        MdlChain = Mdl->Next;
         MmUnlockPages(Mdl);
         IoFreeMdl(Mdl);
     }
@@ -103,7 +103,7 @@ CcMdlReadComplete(IN PFILE_OBJECT FileObject,
     }
 
     /* Use slow path */
-    CcMdlReadComplete2(MdlChain, FileObject);
+    CcMdlReadCompleteDev(MdlChain, FileObject);
 }
 
 /*
index 115eeb5..2e42400 100644 (file)
@@ -49,8 +49,7 @@ CmpCreateHandle(PVOID ObjectBody,
                 */
 {
     HANDLE_TABLE_ENTRY NewEntry;
-    PEPROCESS CurrentProcess;
-    PVOID HandleTable;
+    PEPROCESS Process, CurrentProcess;
     POBJECT_HEADER ObjectHeader;
     HANDLE Handle;
     KAPC_STATE ApcState;
@@ -67,7 +66,7 @@ CmpCreateHandle(PVOID ObjectBody,
     ObjectHeader = OBJECT_TO_OBJECT_HEADER(ObjectBody);
 
     /* check that this is a valid kernel pointer */
-    //ASSERT((ULONG_PTR)ObjectHeader & EX_HANDLE_ENTRY_LOCKED);
+    ASSERT((ULONG_PTR)ObjectHeader & EX_HANDLE_ENTRY_LOCKED);
 
     if (GrantedAccess & MAXIMUM_ALLOWED)
     {
@@ -83,28 +82,30 @@ CmpCreateHandle(PVOID ObjectBody,
 
     NewEntry.Object = ObjectHeader;
     if(HandleAttributes & OBJ_INHERIT)
-        NewEntry.ObAttributes |= OBJ_INHERIT;
+        NewEntry.ObAttributes |= EX_HANDLE_ENTRY_INHERITABLE;
     else
-        NewEntry.ObAttributes &= ~OBJ_INHERIT;
+        NewEntry.ObAttributes &= ~EX_HANDLE_ENTRY_INHERITABLE;
     NewEntry.GrantedAccess = GrantedAccess;
 
     if ((HandleAttributes & OBJ_KERNEL_HANDLE) &&
-        ExGetPreviousMode() == KernelMode)
+        ExGetPreviousMode == KernelMode)
     {
-        HandleTable = ObpKernelHandleTable;
-        if (PsGetCurrentProcess() != PsInitialSystemProcess)
+        Process = PsInitialSystemProcess;
+        if (Process != CurrentProcess)
         {
-            KeStackAttachProcess(&PsInitialSystemProcess->Pcb,
+            KeStackAttachProcess(&Process->Pcb,
                 &ApcState);
             AttachedToProcess = TRUE;
         }
     }
     else
     {
-        HandleTable = PsGetCurrentProcess()->ObjectTable;
+        Process = CurrentProcess;
+        /* mask out the OBJ_KERNEL_HANDLE attribute */
+        HandleAttributes &= ~OBJ_KERNEL_HANDLE;
     }
 
-    Handle = ExCreateHandle(HandleTable,
+    Handle = ExCreateHandle(Process->ObjectTable,
         &NewEntry);
 
     if (AttachedToProcess)
@@ -576,7 +577,7 @@ Cleanup:
     ReleaseCapturedUnicodeString(&CapturedClass,
                                  PreviousMode);
   }
-  if (ObjectName.Buffer) ObpFreeObjectNameBuffer(&ObjectName);
+  if (ObjectName.Buffer) ObpReleaseCapturedName(&ObjectName);
   if (FreeRemainingPath) RtlFreeUnicodeString(&RemainingPath);
   //if (Object != NULL) ObDereferenceObject(Object);
 
@@ -1383,7 +1384,7 @@ NtOpenKey(OUT PHANDLE KeyHandle,
       PostOpenKeyInfo.Status = Status;
       CmiCallRegisteredCallbacks (RegNtPostOpenKey, &PostOpenKeyInfo);
       ObpReleaseCapturedAttributes(&ObjectCreateInfo);
-      if (ObjectName.Buffer) ObpFreeObjectNameBuffer(&ObjectName);
+      if (ObjectName.Buffer) ObpReleaseCapturedName(&ObjectName);
       return Status;
     }
 
@@ -1435,7 +1436,7 @@ openkey_cleanup:
   PostOpenKeyInfo.Object = NT_SUCCESS(Status) ? (PVOID)Object : NULL;
   PostOpenKeyInfo.Status = Status;
   CmiCallRegisteredCallbacks (RegNtPostOpenKey, &PostOpenKeyInfo);
-  if (ObjectName.Buffer) ObpFreeObjectNameBuffer(&ObjectName);
+  if (ObjectName.Buffer) ObpReleaseCapturedName(&ObjectName);
 
   if (Object)
     {
index a8eb362..c2b14f2 100644 (file)
@@ -548,7 +548,7 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
     /* Yields a new reference */
     ObpReleaseCapturedAttributes(&ObjectCreateInfo);
 
-    if (ObjectName.Buffer) ObpFreeObjectNameBuffer(&ObjectName);
+    if (ObjectName.Buffer) ObpReleaseCapturedName(&ObjectName);
     if (!NT_SUCCESS(Status))
       {
        return Status;
@@ -597,7 +597,6 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
        RtlFreeUnicodeString(&RemainingPath);
        return Status;
       }
-#if 0
     DPRINT("Inserting Key into Object Tree\n");
     Status =  ObInsertObject((PVOID)NewKey,
                              NULL,
@@ -606,11 +605,6 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
                              NULL,
                              NULL);
   DPRINT("Status %x\n", Status);
-#else
-    /* Free the create information */
-    ObpFreeAndReleaseCapturedAttributes(OBJECT_TO_OBJECT_HEADER(NewKey)->ObjectCreateInfo);
-    OBJECT_TO_OBJECT_HEADER(NewKey)->ObjectCreateInfo = NULL;
-#endif
   NewKey->Flags = 0;
   NewKey->SubKeyCounts = 0;
   NewKey->SubKeys = NULL;
index 2dc92f9..10c1e4b 100644 (file)
@@ -27,121 +27,6 @@ CmiGetLinkTarget(PEREGISTRY_HIVE RegistryHive,
                 PUNICODE_STRING TargetPath);
 
 /* FUNCTONS *****************************************************************/
-
-PVOID
-NTAPI
-CmpLookupEntryDirectory(IN POBJECT_DIRECTORY Directory,
-                        IN PUNICODE_STRING Name,
-                        IN ULONG Attributes,
-                        IN UCHAR SearchShadow,
-                        IN POBP_LOOKUP_CONTEXT Context)
-{
-    BOOLEAN CaseInsensitive = FALSE;
-    POBJECT_HEADER_NAME_INFO HeaderNameInfo;
-    ULONG HashValue;
-    ULONG HashIndex;
-    LONG TotalChars;
-    WCHAR CurrentChar;
-    POBJECT_DIRECTORY_ENTRY *AllocatedEntry;
-    POBJECT_DIRECTORY_ENTRY *LookupBucket;
-    POBJECT_DIRECTORY_ENTRY CurrentEntry;
-    PVOID FoundObject = NULL;
-    PWSTR Buffer;
-    PAGED_CODE();
-
-    /* Always disable this until we have DOS Device Maps */
-    SearchShadow = FALSE;
-
-    /* Fail if we don't have a directory or name */
-    if (!(Directory) || !(Name)) goto Quickie;
-
-    /* Get name information */
-    TotalChars = Name->Length / sizeof(WCHAR);
-    Buffer = Name->Buffer;
-
-    /* Fail if the name is empty */
-    if (!(Buffer) || !(TotalChars)) goto Quickie;
-
-    /* Set up case-sensitivity */
-    if (Attributes & OBJ_CASE_INSENSITIVE) CaseInsensitive = TRUE;
-
-    /* Create the Hash */
-    for (HashValue = 0; TotalChars; TotalChars--)
-    {
-        /* Go to the next Character */
-        CurrentChar = *Buffer++;
-
-        /* Prepare the Hash */
-        HashValue += (HashValue << 1) + (HashValue >> 1);
-
-        /* Create the rest based on the name */
-        if (CurrentChar < 'a') HashValue += CurrentChar;
-        else if (CurrentChar > 'z') HashValue += RtlUpcaseUnicodeChar(CurrentChar);
-        else HashValue += (CurrentChar - ('a'-'A'));
-    }
-
-    /* Merge it with our number of hash buckets */
-    HashIndex = HashValue % 37;
-
-    /* Save the result */
-    Context->HashValue = HashValue;
-    Context->HashIndex = (USHORT)HashIndex;
-
-    /* Get the root entry and set it as our lookup bucket */
-    AllocatedEntry = &Directory->HashBuckets[HashIndex];
-    LookupBucket = AllocatedEntry;
-
-    /* Start looping */
-    while ((CurrentEntry = *AllocatedEntry))
-    {
-        /* Do the hashes match? */
-        if (CurrentEntry->HashValue == HashValue)
-        {
-            /* Make sure that it has a name */
-            ASSERT(OBJECT_TO_OBJECT_HEADER(CurrentEntry->Object)->NameInfoOffset != 0);
-
-            /* Get the name information */
-            HeaderNameInfo = OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(CurrentEntry->Object));
-
-            /* Do the names match? */
-            if ((Name->Length == HeaderNameInfo->Name.Length) &&
-                (RtlEqualUnicodeString(Name, &HeaderNameInfo->Name, CaseInsensitive)))
-            {
-                break;
-            }
-        }
-
-        /* Move to the next entry */
-        AllocatedEntry = &CurrentEntry->ChainLink;
-    }
-
-    /* Check if we still have an entry */
-    if (CurrentEntry)
-    {
-        /* Set this entry as the first, to speed up incoming insertion */
-        if (AllocatedEntry != LookupBucket)
-        {
-            /* Set the Current Entry */
-            *AllocatedEntry = CurrentEntry->ChainLink;
-
-            /* Link to the old Hash Entry */
-            CurrentEntry->ChainLink = *LookupBucket;
-
-            /* Set the new Hash Entry */
-            *LookupBucket = CurrentEntry;
-        }
-
-        /* Save the found object */
-        FoundObject = CurrentEntry->Object;
-        if (!FoundObject) goto Quickie;
-    }
-
-Quickie:
-    /* Return the object we found */
-    Context->Object = FoundObject;
-    return FoundObject;
-}
-
 NTSTATUS
 NTAPI
 CmFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo,
@@ -252,10 +137,9 @@ CmFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo,
             if (End != NULL) *End = 0;
 
             RtlInitUnicodeString(&StartUs, Start);
-            ObpInitializeDirectoryLookup(&Context);
             Context.DirectoryLocked = TRUE;
             Context.Directory = CurrentObject;
-            FoundObject = CmpLookupEntryDirectory(CurrentObject, &StartUs, Attributes, FALSE, &Context);
+            FoundObject = ObpLookupEntryDirectory(CurrentObject, &StartUs, Attributes, FALSE, &Context);
             if (FoundObject == NULL)
             {
                 if (End != NULL)
@@ -498,7 +382,6 @@ CmiObjectParse(IN PVOID ParsedObject,
           RtlFreeUnicodeString(&KeyName);
           return(Status);
         }
-#if 0
       DPRINT("Inserting Key into Object Tree\n");
       Status = ObInsertObject((PVOID)FoundObject,
                               NULL,
@@ -507,11 +390,6 @@ CmiObjectParse(IN PVOID ParsedObject,
                               NULL,
                               NULL);
       DPRINT("Status %x\n", Status);
-#else
-/* Free the create information */
-ObpFreeAndReleaseCapturedAttributes(OBJECT_TO_OBJECT_HEADER(FoundObject)->ObjectCreateInfo);
-OBJECT_TO_OBJECT_HEADER(FoundObject)->ObjectCreateInfo = NULL;
-#endif
 
       /* Add the keep-alive reference */
       ObReferenceObject(FoundObject);
@@ -972,7 +850,7 @@ CmiScanKeyList(PKEY_OBJECT Parent,
               ULONG Attributes,
               PKEY_OBJECT* ReturnedObject)
 {
-  PKEY_OBJECT CurKey = NULL;
+  PKEY_OBJECT CurKey;
   ULONG Index;
 
   DPRINT("Scanning key list for: %wZ (Parent: %wZ)\n",
index e5c2120..35b9a44 100644 (file)
@@ -3,30 +3,54 @@
  * LICENSE:         GPL - See COPYING in the top level directory
  * FILE:            ntoskrnl/ex/callback.c
  * PURPOSE:         Executive callbacks
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PROGRAMMERS:     Filip Navara
+ *                  Alex Ionescu (alex@relsoft.net)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
-/* TYPES *********************************************************************/
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, ExpInitializeCallbacks)
+#endif
+
+
+/* TYPES ********************************************************************/
 
 /* Mapping for Callback Object */
 GENERIC_MAPPING ExpCallbackMapping =
 {
-    CALLBACK_READ,
-    CALLBACK_WRITE,
-    CALLBACK_EXECUTE,
-    CALLBACK_ALL_ACCESS
+   CALLBACK_READ,
+   CALLBACK_WRITE,
+   CALLBACK_EXECUTE,
+   CALLBACK_ALL_ACCESS
 };
 
+/* Structure used to hold Callbacks */
+typedef struct _CALLBACK_REGISTRATION
+{
+   LIST_ENTRY RegisteredCallbacks;
+   PCALLBACK_OBJECT CallbackObject;
+   PCALLBACK_FUNCTION CallbackFunction;
+   PVOID CallbackContext;
+   ULONG InUse;
+   BOOLEAN PendingDeletion;
+} CALLBACK_REGISTRATION, *PCALLBACK_REGISTRATION;
+
+typedef struct
+{
+    PCALLBACK_OBJECT *CallbackObject;
+    PWSTR Name;
+} SYSTEM_CALLBACKS;
+
 /* Kernel Default Callbacks */
 PCALLBACK_OBJECT SetSystemTimeCallback;
 PCALLBACK_OBJECT SetSystemStateCallback;
 PCALLBACK_OBJECT PowerStateCallback;
+
 SYSTEM_CALLBACKS ExpInitializeCallback[] =
 {
    {&SetSystemTimeCallback, L"\\Callback\\SetSystemTime"},
@@ -37,298 +61,8 @@ SYSTEM_CALLBACKS ExpInitializeCallback[] =
 
 POBJECT_TYPE ExCallbackObjectType;
 KEVENT ExpCallbackEvent;
-EX_PUSH_LOCK ExpCallBackFlush;
-
-/* PRIVATE FUNCTIONS *********************************************************/
-
-VOID
-NTAPI
-ExInitializeCallBack(IN OUT PEX_CALLBACK Callback)
-{
-    /* Initialize the fast references */
-    Callback->RoutineBlock.Object = NULL;
-}
-
-PEX_CALLBACK_ROUTINE_BLOCK
-NTAPI
-ExAllocateCallBack(IN PEX_CALLBACK_FUNCTION Function,
-                   IN PVOID Context)
-{
-    PEX_CALLBACK_ROUTINE_BLOCK Callback;
-
-    /* Allocate a callback */
-    Callback = ExAllocatePoolWithTag(PagedPool,
-                                     sizeof(*Callback),
-                                     TAG('C', 'b', 'r', 'b'));
-    if (Callback)
-    {
-        /* Initialize it */
-        Callback->Function = Function;
-        Callback->Context = Context;
-        ExInitializeRundownProtection(&Callback->RundownProtect);
-    }
-
-    /* Return it */
-    return Callback;
-}
-
-VOID
-NTAPI
-ExFreeCallBack(IN PEX_CALLBACK_ROUTINE_BLOCK Callback)
-{
-    /* Just free it from memory */
-    ExFreePool(Callback);
-}
 
-VOID
-NTAPI
-ExWaitForCallBacks(IN PEX_CALLBACK_ROUTINE_BLOCK Callback)
-{
-    /* Wait on the rundown */
-    ExWaitForRundownProtectionRelease(&Callback->RundownProtect);
-}
-
-PEX_CALLBACK_FUNCTION
-NTAPI
-ExGetCallBackBlockRoutine(IN PEX_CALLBACK_ROUTINE_BLOCK Callback)
-{
-    /* Return the function */
-    return Callback->Function;
-}
-
-PVOID
-NTAPI
-ExGetCallBackBlockContext(IN PEX_CALLBACK_ROUTINE_BLOCK Callback)
-{
-    /* Return the context */
-    return Callback->Context;
-}
-
-VOID
-NTAPI
-ExDereferenceCallBackBlock(IN OUT PEX_CALLBACK CallBack,
-                           IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock)
-{
-    PEX_FAST_REF FastRef = &CallBack->RoutineBlock;
-    EX_FAST_REF Value, NewValue;
-
-    /* Sanity checks */
-    ASSERT(CallbackRoutineBlock);
-    ASSERT(!(((ULONG_PTR)CallbackRoutineBlock) & MAX_FAST_REFS));
-
-    /* Start dereference loop */
-    for (;;)
-    {
-        /* Get the current count */
-        Value = *FastRef;
-        if ((Value.Value ^ (ULONG_PTR)CallbackRoutineBlock) < MAX_FAST_REFS)
-        {
-            /* Decrease the reference count */
-            NewValue.Value = Value.Value + 1;
-            NewValue.Object = InterlockedCompareExchangePointer(&FastRef->Object,
-                                                                NewValue.Object,
-                                                                Value.Object);
-            if (NewValue.Object != Value.Object) continue;
-
-            /* We're all done */
-            break;
-        }
-        else
-        {
-            /* Release rundown protection */
-            ExReleaseRundownProtection(&CallbackRoutineBlock->RundownProtect);
-        }
-    }
-}
-
-PEX_CALLBACK_ROUTINE_BLOCK
-NTAPI
-ExReferenceCallBackBlock(IN OUT PEX_CALLBACK CallBack)
-{
-    PEX_FAST_REF FastRef = &CallBack->RoutineBlock;
-    EX_FAST_REF Value, NewValue;
-    PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock;
-
-    /* Start reference loop */
-    for (;;)
-    {
-        /* Get the current count */
-        Value = *FastRef;
-        if (Value.RefCnt != 0)
-        {
-            /* Increase the reference count */
-            NewValue.Value = Value.Value - 1;
-            NewValue.Object = InterlockedCompareExchangePointer(&FastRef->Object,
-                                                                NewValue.Object,
-                                                                Value.Object);
-            if (NewValue.Object != Value.Object) continue;
-        }
-
-        /* All done */
-        break;
-    }
-
-    /* Fail if there isn't any object */
-    if (!Value.Value) return NULL;
-
-    /* Check if we don't have a reference */
-    if (!Value.RefCnt)
-    {
-        /* FIXME: Race */
-        CallbackRoutineBlock = NULL;
-        DPRINT1("Unhandled callback race condition\n");
-        KEBUGCHECK(0);
-    }
-    else
-    {
-        /* Get the callback block */
-        CallbackRoutineBlock = (PVOID)(Value.Value &~ MAX_FAST_REFS);
-
-        /* Check if this is the last reference */
-        if (Value.RefCnt == 1)
-        {
-            /* Acquire rundown protection */
-            if (ExfAcquireRundownProtectionEx(&CallbackRoutineBlock->
-                                              RundownProtect,
-                                              MAX_FAST_REFS))
-            {
-                /* Sanity check */
-                ASSERT(!(((ULONG_PTR)CallbackRoutineBlock) & MAX_FAST_REFS));
-
-                /* Start reference loop */
-                for (;;)
-                {
-                    /* Check if the current count is too high */
-                    Value = *FastRef;
-                    if (((Value.RefCnt + MAX_FAST_REFS) > MAX_FAST_REFS) ||
-                        ((Value.Value &~ MAX_FAST_REFS) !=
-                         (ULONG_PTR)CallbackRoutineBlock))
-                    {
-                        /* Backdown the rundown acquire */
-                        ExfReleaseRundownProtectionEx(&CallbackRoutineBlock->
-                                                      RundownProtect,
-                                                      MAX_FAST_REFS);
-                        break;
-                    }
-
-                    /* Increase the reference count */
-                    NewValue.Value = Value.Value + MAX_FAST_REFS;
-                    NewValue.Object =
-                        InterlockedCompareExchangePointer(&FastRef->Object,
-                                                          NewValue.Object,
-                                                          Value.Object);
-                    if (NewValue.Object != Value.Object) continue;
-
-                    /* Break out if the change was OK */
-                    break;
-                }
-            }
-        }
-    }
-
-    /* Return the callback block */
-    return CallbackRoutineBlock;
-}
-
-BOOLEAN
-NTAPI
-ExCompareExchangeCallBack(IN OUT PEX_CALLBACK CallBack,
-                          IN PEX_CALLBACK_ROUTINE_BLOCK NewBlock,
-                          IN PEX_CALLBACK_ROUTINE_BLOCK OldBlock)
-{
-    EX_FAST_REF Value, NewValue;
-    PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock;
-    PEX_FAST_REF FastRef = &CallBack->RoutineBlock;
-
-    /* Check that we have a new block */
-    if (NewBlock)
-    {
-        /* Acquire rundown */
-        if (!ExfAcquireRundownProtectionEx(&NewBlock->RundownProtect,
-                                           MAX_FAST_REFS + 1))
-        {
-            /* This should never happen */
-            ASSERTMSG("Callback block is already undergoing rundown", FALSE);
-            return FALSE;
-        }
-    }
-
-    /* Sanity check and start swap loop */
-    ASSERT(!(((ULONG_PTR)NewBlock) & MAX_FAST_REFS));
-    for (;;)
-    {
-        /* Get the current value */
-        Value = *FastRef;
-
-        /* Make sure there's enough references to swap */
-        if (!((Value.Value ^ (ULONG_PTR)OldBlock) <= MAX_FAST_REFS)) break;
-
-        /* Check if we have an object to swap */
-        if (NewBlock)
-        {
-            /* Set up the value with maximum fast references */
-            NewValue.Value = (ULONG_PTR)NewBlock | MAX_FAST_REFS;
-        }
-        else
-        {
-            /* Write the object address itself (which is empty) */
-            NewValue.Value = (ULONG_PTR)NewBlock;
-        }
-
-        /* Do the actual compare exchange */
-        NewValue.Object = InterlockedCompareExchangePointer(&FastRef->Object,
-                                                            NewValue.Object,
-                                                            Value.Object);
-        if (NewValue.Object != Value.Object) continue;
-
-        /* All done */
-        break;
-    }
-
-    /* Get the routine block */
-    CallbackRoutineBlock = (PVOID)(Value.Value & ~MAX_FAST_REFS);
-
-    /* Make sure the swap worked */
-    if (CallbackRoutineBlock == OldBlock)
-    {
-        /* Make sure we replaced a valid pointer */
-        if (CallbackRoutineBlock)
-        {
-            /* Acquire the flush lock and immediately release it */
-            KeEnterCriticalRegion();
-            ExWaitOnPushLock(&ExpCallBackFlush);
-
-            /* Release rundown protection */
-            KeLeaveCriticalRegion();
-            ExfReleaseRundownProtectionEx(&CallbackRoutineBlock->RundownProtect,
-                                          Value.RefCnt + 1);
-        }
-
-        /* Compare worked */
-        return TRUE;
-    }
-    else
-    {
-        /* It failed, check if we had a block */
-        if (NewBlock)
-        {
-            /* We did, remove the refernces that we had added */
-            ExfReleaseRundownProtectionEx(&NewBlock->RundownProtect,
-                                          MAX_FAST_REFS + 1);
-        }
-
-        /* Return failure */
-        return FALSE;
-    }
-}
-
-VOID
-NTAPI
-ExpDeleteCallback(IN PVOID Object)
-{
-    /* Sanity check */
-    ASSERT(IsListEmpty(&((PCALLBACK_OBJECT)Object)->RegisteredCallbacks));
-}
+/* FUNCTIONS *****************************************************************/
 
 /*++
  * @name ExpInitializeCallbacks
@@ -341,7 +75,7 @@ ExpDeleteCallback(IN PVOID Object)
  * @remarks None
  *
  *--*/
-BOOLEAN
+VOID
 INIT_FUNCTION
 NTAPI
 ExpInitializeCallbacks(VOID)
@@ -355,36 +89,43 @@ ExpInitializeCallbacks(VOID)
     HANDLE DirectoryHandle;
     ULONG i;
 
-    /* Setup lightweight callback lock */
-    ExpCallBackFlush.Value = 0;
-
-    /* Initialize the Callback Object type  */
+    /*  Initialize the Callback Object type  */
     RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
     RtlInitUnicodeString(&Name, L"Callback");
     ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
-    ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK;
+    ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(CALLBACK_OBJECT);
     ObjectTypeInitializer.GenericMapping = ExpCallbackMapping;
     ObjectTypeInitializer.PoolType = NonPagedPool;
-    ObjectTypeInitializer.DeleteProcedure = ExpDeleteCallback;
-    ObjectTypeInitializer.ValidAccessMask = CALLBACK_ALL_ACCESS;
-    Status = ObCreateObjectType(&Name,
-                                &ObjectTypeInitializer,
-                                NULL,
-                                &ExCallbackObjectType);
-    if (!NT_SUCCESS(Status)) return FALSE;
+
+    Status = ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ExCallbackObjectType);
+
+    /* Fail if it wasn't created successfully */
+    if (!NT_SUCCESS(Status))
+    {
+        return;
+    }
 
     /* Initialize the Object */
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &DirName,
-                               OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
-                               NULL,
-                               SePublicDefaultSd);
+    InitializeObjectAttributes(
+        &ObjectAttributes,
+        &DirName,
+        OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
+        NULL,
+        NULL
+        );
 
     /* Create the Object Directory */
-    Status = NtCreateDirectoryObject(&DirectoryHandle,
-                                     DIRECTORY_ALL_ACCESS,
-                                     &ObjectAttributes);
-    if (!NT_SUCCESS(Status)) return FALSE;
+    Status = NtCreateDirectoryObject(
+        &DirectoryHandle,
+        DIRECTORY_ALL_ACCESS,
+        &ObjectAttributes
+        );
+
+    /* Fail if couldn't create */
+    if (!NT_SUCCESS(Status))
+    {
+        return;
+    }
 
     /* Close Handle... */
     NtClose(DirectoryHandle);
@@ -393,32 +134,37 @@ ExpInitializeCallbacks(VOID)
     KeInitializeEvent(&ExpCallbackEvent, NotificationEvent, 0);
 
     /* Default NT Kernel Callbacks. */
-    for (i = 0; ExpInitializeCallback[i].CallbackObject; i++)
+    for (i=0; ExpInitializeCallback[i].CallbackObject; i++)
     {
         /* Create the name from the structure */
         RtlInitUnicodeString(&CallbackName, ExpInitializeCallback[i].Name);
 
         /* Initialize the Object Attributes Structure */
-        InitializeObjectAttributes(&ObjectAttributes,
-                                   &CallbackName,
-                                   OBJ_PERMANENT | OBJ_CASE_INSENSITIVE,
-                                   NULL,
-                                   NULL);
+        InitializeObjectAttributes(
+            &ObjectAttributes,
+            &CallbackName,
+            OBJ_PERMANENT | OBJ_CASE_INSENSITIVE,
+            NULL,
+            NULL
+            );
 
         /* Create the Callback Object */
-        Status = ExCreateCallback(ExpInitializeCallback[i].CallbackObject,
-                                  &ObjectAttributes,
-                                  TRUE,
-                                  TRUE);
-        if (!NT_SUCCESS(Status)) return FALSE;
+        Status = ExCreateCallback(
+            (PCALLBACK_OBJECT*)&(ExpInitializeCallback[i].CallbackObject),
+            &ObjectAttributes,
+            TRUE,
+            TRUE
+            );
+
+        /* Make sure Global Callbacks have been created */
+        if (!NT_SUCCESS(Status))
+        {
+            return;
+        }
     }
-
     /* Everything successful */
-    return TRUE;
 }
 
-/* PUBLIC FUNCTIONS **********************************************************/
-
 /*++
  * @name ExCreateCallback
  * @implemented
@@ -454,15 +200,15 @@ ExCreateCallback(OUT PCALLBACK_OBJECT *CallbackObject,
                  IN BOOLEAN Create,
                  IN BOOLEAN AllowMultipleCallbacks)
 {
-    PCALLBACK_OBJECT Callback = NULL;
-    NTSTATUS Status;
-    HANDLE Handle = NULL;
+    PCALLBACK_OBJECT Callback;
+    NTSTATUS    Status;
+    HANDLE     Handle;
+
     PAGED_CODE();
 
     /* Open a handle to the callback if it exists */
     if (ObjectAttributes->ObjectName)
     {
-        /* Open the handle */
         Status = ObOpenObjectByName(ObjectAttributes,
                                     ExCallbackObjectType,
                                     KernelMode,
@@ -473,14 +219,12 @@ ExCreateCallback(OUT PCALLBACK_OBJECT *CallbackObject,
     }
     else
     {
-        /* Otherwise, fail */
         Status = STATUS_UNSUCCESSFUL;
     }
 
     /* We weren't able to open it...should we create it? */
-    if (!(NT_SUCCESS(Status)) && (Create))
+    if(!NT_SUCCESS(Status) && Create )
     {
-        /* Create the object */
         Status = ObCreateObject(KernelMode,
                                 ExCallbackObjectType,
                                 ObjectAttributes,
@@ -489,27 +233,25 @@ ExCreateCallback(OUT PCALLBACK_OBJECT *CallbackObject,
                                 sizeof(CALLBACK_OBJECT),
                                 0,
                                 0,
-                                (PVOID *)&Callback);
-        if (NT_SUCCESS(Status))
-        {
-            /* Set it up */
-            Callback->Signature = TAG('C', 'a', 'l', 'l');
-            KeInitializeSpinLock(&Callback->Lock);
-            InitializeListHead(&Callback->RegisteredCallbacks);
-            Callback->AllowMultipleCallbacks = AllowMultipleCallbacks;
+                                (PVOID *)&Callback );
 
-            /* Insert the object into the object namespace */
+        /* We Created it...let's initialize the structure now */
+        if(NT_SUCCESS(Status))
+        {
+            KeInitializeSpinLock(&Callback->Lock);      /*  SpinLock   */
+            InitializeListHead(&Callback->RegisteredCallbacks);   /*  Callback Entries */
+            Callback->AllowMultipleCallbacks = AllowMultipleCallbacks; /*  Multiple Callbacks */
+            /*  Create the object */
             Status = ObInsertObject(Callback,
                                     NULL,
                                     FILE_READ_DATA,
                                     0,
                                     NULL,
-                                    &Handle);
+                                    &Handle );
         }
     }
 
-    /* Check if we have success until here */
-    if (NT_SUCCESS(Status))
+    if(NT_SUCCESS(Status))
     {
         /* Get a pointer to the new object from the handle we just got */
         Status = ObReferenceObjectByHandle(Handle,
@@ -518,13 +260,15 @@ ExCreateCallback(OUT PCALLBACK_OBJECT *CallbackObject,
                                            KernelMode,
                                            (PVOID)&Callback,
                                            NULL);
-
         /* Close the Handle, since we now have the pointer */
         ZwClose(Handle);
     }
 
     /* Everything went fine, so return a pointer to the Object */
-    if (NT_SUCCESS(Status)) *CallbackObject = Callback;
+    if (NT_SUCCESS(Status))
+    {
+        *CallbackObject = (PCALLBACK_OBJECT)Callback;
+    }
     return Status;
 }
 
@@ -534,6 +278,7 @@ ExCreateCallback(OUT PCALLBACK_OBJECT *CallbackObject,
  *
  * Calls a function pointer (a registered callback)
  * See: http://www.osronline.com/ddkx/kmarch/k102_2f5e.htm
+ *      http://msdn.microsoft.com/library/en-us/Kernel_d/hh/Kernel_d/Synchro_e954f515-e536-4e12-8419-e7e54c4a963b.xml.asp?frame=true
  *      http://vmsone.com/~decuslib/vmssig/vmslt99b/nt/wdm-callback.txt
  *
  * @param CallbackObject
@@ -552,24 +297,17 @@ ExCreateCallback(OUT PCALLBACK_OBJECT *CallbackObject,
  *--*/
 VOID
 NTAPI
-ExNotifyCallback(IN PCALLBACK_OBJECT CallbackObject,
+ExNotifyCallback(IN PCALLBACK_OBJECT OpaqueCallbackObject,
                  IN PVOID Argument1,
                  IN PVOID Argument2)
 {
-    PLIST_ENTRY RegisteredCallbacks;
-    PCALLBACK_REGISTRATION CallbackRegistration;
-    KIRQL OldIrql;
-
-    /* Check if we don't have an object or registrations */
-    if (!(CallbackObject) ||
-        (IsListEmpty(&CallbackObject->RegisteredCallbacks)))
-    {
-        /* Don't notify */
-        return;
-    }
+    PCALLBACK_OBJECT   CallbackObject = (PCALLBACK_OBJECT)OpaqueCallbackObject;
+    PLIST_ENTRY             RegisteredCallbacks;
+    PCALLBACK_REGISTRATION  CallbackRegistration;
+    KIRQL                   OldIrql;
 
     /* Acquire the Lock */
-    KeAcquireSpinLock(&CallbackObject->Lock, &OldIrql);
+    OldIrql = KfAcquireSpinLock(&CallbackObject->Lock);
 
     /* Enumerate through all the registered functions */
     for (RegisteredCallbacks = CallbackObject->RegisteredCallbacks.Flink;
@@ -579,41 +317,39 @@ ExNotifyCallback(IN PCALLBACK_OBJECT CallbackObject,
         /* Get a pointer to a Callback Registration from the List Entries */
         CallbackRegistration = CONTAINING_RECORD(RegisteredCallbacks,
                                                  CALLBACK_REGISTRATION,
-                                                 Link);
+                                                 RegisteredCallbacks);
 
-        /* Don't bother doing notification if it's pending to be deleted */
-        if (!CallbackRegistration->UnregisterWaiting)
+        /* Don't bother doing Callback Notification if it's pending to be deleted */
+        if (!CallbackRegistration->PendingDeletion)
         {
-            /* Mark the Callback in use, so it won't get deleted */
-            CallbackRegistration->Busy += 1;
+            /* Mark the Callback in use, so it won't get deleted while we are calling it */
+            CallbackRegistration->InUse += 1;
 
             /* Release the Spinlock before making the call */
-            KeReleaseSpinLock(&CallbackObject->Lock, OldIrql);
+            KfReleaseSpinLock(&CallbackObject->Lock, OldIrql);
 
             /* Call the Registered Function */
-            CallbackRegistration->CallbackFunction(CallbackRegistration->
-                                                   CallbackContext,
-                                                   Argument1,
-                                                   Argument2);
+            CallbackRegistration->CallbackFunction(
+                CallbackRegistration->CallbackContext,
+                Argument1,
+                Argument2
+                );
 
             /* Get SpinLock back */
-            KeAcquireSpinLock(&CallbackObject->Lock, &OldIrql);
+            OldIrql = KfAcquireSpinLock(&CallbackObject->Lock);
 
             /* We are not in use anymore */
-            CallbackRegistration->Busy -= 1;
+            CallbackRegistration->InUse -= 1;
 
-            /* Check if removal is pending and we're not active */
-            if ((CallbackRegistration->UnregisterWaiting) &&
-                !(CallbackRegistration->Busy))
+            /* If another instance of this function isn't running and deletion is pending, signal the event */
+            if (CallbackRegistration->PendingDeletion  && CallbackRegistration->InUse == 0)
             {
-                /* Signal the callback event */
                 KeSetEvent(&ExpCallbackEvent, 0, FALSE);
             }
         }
     }
-
-    /* Release the Callback Object */
-    KeReleaseSpinLock(&CallbackObject->Lock, OldIrql);
+    /* Unsynchronize and release the Callback Object */
+    KfReleaseSpinLock(&CallbackObject->Lock, OldIrql);
 }
 
 /*++
@@ -641,65 +377,54 @@ ExNotifyCallback(IN PCALLBACK_OBJECT CallbackObject,
  *--*/
 PVOID
 NTAPI
-ExRegisterCallback(IN PCALLBACK_OBJECT CallbackObject,
+ExRegisterCallback(IN PCALLBACK_OBJECT OpaqueCallbackObject,
                    IN PCALLBACK_FUNCTION CallbackFunction,
                    IN PVOID CallbackContext)
 {
-    PCALLBACK_REGISTRATION CallbackRegistration = NULL;
-    KIRQL OldIrql;
+    PCALLBACK_OBJECT CallbackObject = (PCALLBACK_OBJECT)OpaqueCallbackObject;
+    PCALLBACK_REGISTRATION  CallbackRegistration = NULL;
+    KIRQL     OldIrql;
 
-    /* Sanity checks */
-    ASSERT(CallbackFunction);
-    ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
+    PAGED_CODE();
 
     /* Create reference to Callback Object */
-    ObReferenceObject(CallbackObject);
+    ObReferenceObject (CallbackObject);
 
     /* Allocate memory for the structure */
-    CallbackRegistration = ExAllocatePoolWithTag(NonPagedPool,
-                                                 sizeof(CALLBACK_REGISTRATION),
-                                                 CALLBACK_TAG);
-    if (!CallbackRegistration)
+    CallbackRegistration = ExAllocatePoolWithTag(
+                               NonPagedPool,
+                               sizeof(CallbackRegistration),
+                               CALLBACK_TAG
+                               );
+    /* Fail if memory allocation failed */
+    if(!CallbackRegistration)
     {
-        /* Dereference and fail */
         ObDereferenceObject (CallbackObject);
         return NULL;
     }
 
     /* Create Callback Registration */
-    CallbackRegistration->CallbackObject = CallbackObject;
-    CallbackRegistration->CallbackFunction = CallbackFunction;
-    CallbackRegistration->CallbackContext = CallbackContext;
-    CallbackRegistration->Busy = 0;
-    CallbackRegistration->UnregisterWaiting = FALSE;
+    CallbackRegistration->CallbackObject = CallbackObject; /* When unregistering, drivers send a handle to the Registration, not the object... */
+    CallbackRegistration->CallbackFunction = CallbackFunction; /* NotifyCallback uses Objects, so this needs to be here in order to call the registered functions */
+    CallbackRegistration->CallbackContext = CallbackContext; /* The documented NotifyCallback returns the Context, so we must save this somewhere */
 
     /* Acquire SpinLock */
-    KeAcquireSpinLock(&CallbackObject->Lock, &OldIrql);
+    OldIrql = KfAcquireSpinLock (&CallbackObject->Lock);
 
-    /* Check if 1) No Callbacks registered or 2) Multiple Callbacks allowed */
-    if ((CallbackObject->AllowMultipleCallbacks) ||
-        (IsListEmpty(&CallbackObject->RegisteredCallbacks)))
+    /* Add Callback if 1) No Callbacks registered or 2) Multiple Callbacks allowed */
+    if(CallbackObject->AllowMultipleCallbacks || IsListEmpty(&CallbackObject->RegisteredCallbacks))
     {
-        /* Register the callback */
-        InsertTailList(&CallbackObject->RegisteredCallbacks,
-                       &CallbackRegistration->Link);
-
-        /* Release SpinLock */
-        KeReleaseSpinLock(&CallbackObject->Lock, OldIrql);
+        InsertTailList(&CallbackObject->RegisteredCallbacks,&CallbackRegistration->RegisteredCallbacks);
     }
     else
     {
-        /* Release SpinLock */
-        KeReleaseSpinLock(&CallbackObject->Lock, OldIrql);
-
-        /* Free the registration */
         ExFreePool(CallbackRegistration);
         CallbackRegistration = NULL;
-
-        /* Dereference the object */
-        ObDereferenceObject(CallbackObject);
     }
 
+    /* Release SpinLock */
+    KfReleaseSpinLock(&CallbackObject->Lock, OldIrql);
+
     /* Return handle to Registration Object */
     return (PVOID)CallbackRegistration;
 }
@@ -723,48 +448,51 @@ VOID
 NTAPI
 ExUnregisterCallback(IN PVOID CallbackRegistrationHandle)
 {
-    PCALLBACK_REGISTRATION CallbackRegistration;
-    PCALLBACK_OBJECT CallbackObject;
-    KIRQL OldIrql;
-    ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
+    PCALLBACK_REGISTRATION  CallbackRegistration;
+    PCALLBACK_OBJECT    CallbackObject;
+    KIRQL                   OldIrql;
+
+    PAGED_CODE();
 
     /* Convert Handle to valid Structure Pointer */
-    CallbackRegistration = (PCALLBACK_REGISTRATION)CallbackRegistrationHandle;
+    CallbackRegistration = (PCALLBACK_REGISTRATION) CallbackRegistrationHandle;
 
     /* Get the Callback Object */
     CallbackObject = CallbackRegistration->CallbackObject;
 
     /* Lock the Object */
-    KeAcquireSpinLock (&CallbackObject->Lock, &OldIrql);
+    OldIrql = KfAcquireSpinLock (&CallbackObject->Lock);
 
-    /* We can't Delete the Callback if it's in use */
-    while (CallbackRegistration->Busy)
+    /* We can't Delete the Callback if it's in use, because this would create a call towards a null pointer => crash */
+    while (CallbackRegistration->InUse)
     {
-        /* Let everyone else know we're unregistering */
-        CallbackRegistration->UnregisterWaiting = TRUE;
+        /* Similarly, we also don't want to wait ages for all pending callbacks to be called */
+        CallbackRegistration->PendingDeletion = TRUE;
 
         /* We are going to wait for the event, so the Lock isn't necessary */
-        KeReleaseSpinLock(&CallbackObject->Lock, OldIrql);
+        KfReleaseSpinLock (&CallbackObject->Lock, OldIrql);
 
         /* Make sure the event is cleared */
-        KeClearEvent(&ExpCallbackEvent);
+        KeClearEvent (&ExpCallbackEvent);
 
         /* Wait for the Event */
-        KeWaitForSingleObject(&ExpCallbackEvent,
-                              Executive,
-                              KernelMode,
-                              FALSE,
-                              NULL);
+        KeWaitForSingleObject (
+            &ExpCallbackEvent,
+            Executive,
+            KernelMode,
+            FALSE,
+            NULL
+            );
 
         /* We need the Lock again */
-        KeAcquireSpinLock(&CallbackObject->Lock, &OldIrql);
+        OldIrql = KfAcquireSpinLock(&CallbackObject->Lock);
     }
 
     /* Remove the Callback */
-    RemoveEntryList(&CallbackRegistration->Link);
+    RemoveEntryList(&CallbackRegistration->RegisteredCallbacks);
 
     /* It's now safe to release the lock */
-    KeReleaseSpinLock(&CallbackObject->Lock, OldIrql);
+    KfReleaseSpinLock(&CallbackObject->Lock, OldIrql);
 
     /* Delete this registration */
     ExFreePool(CallbackRegistration);
index 5c6b2f2..a595242 100644 (file)
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            ntoskrnl/ex/init.c
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/ex/handle.c
  * PURPOSE:         Generic Executive Handle Tables
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
- *                  Thomas Weidenmueller <w3seek@reactos.com>
+ *
+ * PROGRAMMERS:     Thomas Weidenmueller <w3seek@reactos.com>
+ *
+ *  TODO:
+ *
+ *  - the last entry of a subhandle list should be reserved for auditing
+ *
+ *  ExReferenceHandleDebugInfo
+ *  ExSnapShotHandleTables
+ *  ExpMoveFreeHandles (???)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
+
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
+
+static LIST_ENTRY ExpHandleTableHead;
+static FAST_MUTEX ExpHandleTableListLock;
+static LARGE_INTEGER ExpHandleShortWait;
+
+#define ExAcquireHandleTableListLock()                                         \
+  ExAcquireFastMutexUnsafe(&ExpHandleTableListLock)
+
+#define ExReleaseHandleTableListLock()                                         \
+  ExReleaseFastMutexUnsafe(&ExpHandleTableListLock)
 
-/* GLOBALS *******************************************************************/
+#define ExAcquireHandleLockExclusive(HandleTable)                         \
+  ExAcquireResourceExclusiveLite(&(HandleTable)->HandleLock, TRUE)
 
-LIST_ENTRY HandleTableListHead;
-EX_PUSH_LOCK HandleTableListLock;
-#define SizeOfHandle(x) sizeof(HANDLE) * x
+#define ExAcquireHandleLockShared(HandleTable)                            \
+  ExAcquireResourceSharedLite(&(HandleTable)->HandleLock, TRUE)
 
-/* PRIVATE FUNCTIONS *********************************************************/
+#define ExReleaseHandleLock(HandleTable)                                  \
+  ExReleaseResourceLite(&(HandleTable)->HandleLock)
+
+/*
+   5 bits: reserved
+   8 bits: top level index
+   10 bits: middle level index
+   9 bits: sub handle index
+*/
+#define N_TLI_BITS 8 /* top level index */
+#define N_MLI_BITS 10 /* middle level index */
+#define N_EI_BITS 9 /* sub handle index */
+#define TLI_OFFSET (N_MLI_BITS + N_EI_BITS)
+#define MLI_OFFSET N_EI_BITS
+#define EI_OFFSET 0
+
+#define N_TOPLEVEL_POINTERS (1 << N_TLI_BITS)
+#define N_MIDDLELEVEL_POINTERS (1 << N_MLI_BITS)
+#define N_SUBHANDLE_ENTRIES (1 << N_EI_BITS)
+#define EX_MAX_HANDLES (N_TOPLEVEL_POINTERS * N_MIDDLELEVEL_POINTERS * N_SUBHANDLE_ENTRIES)
+
+#define VALID_HANDLE_MASK (((N_TOPLEVEL_POINTERS - 1) << TLI_OFFSET) |         \
+  ((N_MIDDLELEVEL_POINTERS - 1) << MLI_OFFSET) | ((N_SUBHANDLE_ENTRIES - 1) << EI_OFFSET))
+#define TLI_FROM_HANDLE(index) (ULONG)(((index) >> TLI_OFFSET) & (N_TOPLEVEL_POINTERS - 1))
+#define MLI_FROM_HANDLE(index) (ULONG)(((index) >> MLI_OFFSET) & (N_MIDDLELEVEL_POINTERS - 1))
+#define ELI_FROM_HANDLE(index) (ULONG)(((index) >> EI_OFFSET) & (N_SUBHANDLE_ENTRIES - 1))
+
+#define N_MAX_HANDLE (N_TOPLEVEL_POINTERS * N_MIDDLELEVEL_POINTERS * N_SUBHANDLE_ENTRIES)
+
+#define BUILD_HANDLE(tli, mli, eli) ((((tli) & (N_TOPLEVEL_POINTERS - 1)) << TLI_OFFSET) | \
+  (((mli) & (N_MIDDLELEVEL_POINTERS - 1)) << MLI_OFFSET) | (((eli) & (N_SUBHANDLE_ENTRIES - 1)) << EI_OFFSET))
+
+#define IS_INVALID_EX_HANDLE(index)                                            \
+  (((index) & ~VALID_HANDLE_MASK) != 0)
+#define IS_VALID_EX_HANDLE(index)                                              \
+  (((index) & ~VALID_HANDLE_MASK) == 0)
+
+#define HANDLE_TO_EX_HANDLE(handle)                                            \
+  (LONG)(((LONG)(handle) >> 2) - 1)
+#define EX_HANDLE_TO_HANDLE(exhandle)                                          \
+  (HANDLE)(((exhandle) + 1) << 2)
+
+static BOOLEAN ExpInitialized = FALSE;
+
+/******************************************************************************/
 
 VOID
-NTAPI
 ExpInitializeHandleTables(VOID)
 {
-    /* Initialize the list of handle tables and the lock */
-    InitializeListHead(&HandleTableListHead);
-    ExInitializePushLock((PULONG_PTR)&HandleTableListLock);
-}
+  ExpHandleShortWait.QuadPart = -50000;
+  InitializeListHead(&ExpHandleTableHead);
+  ExInitializeFastMutex(&ExpHandleTableListLock);
 
-PHANDLE_TABLE_ENTRY
-NTAPI
-ExpLookupHandleTableEntry(IN PHANDLE_TABLE HandleTable,
-                          IN EXHANDLE LookupHandle)
-{
-    ULONG i, j, k, TableLevel, NextHandle;
-    ULONG_PTR TableBase;
-    PHANDLE_TABLE_ENTRY Entry = NULL;
-    EXHANDLE Handle = LookupHandle;
-    PUCHAR Level1, Level2, Level3;
-
-    /* Clear the tag bits and check what the next handle is */
-    Handle.TagBits = 0;
-    NextHandle = HandleTable->NextHandleNeedingPool;
-    if (Handle.Value >= NextHandle) return NULL;
-
-    /* Get the table code */
-    TableBase = (ULONG_PTR)HandleTable->TableCode;
-
-    /* Extract the table level and actual table base */
-    TableLevel = (ULONG)(TableBase & 3);
-    TableBase = TableBase - TableLevel;
-
-    /* Check what level we're running at */
-    switch (TableLevel)
-    {
-        /* Direct index */
-        case 0:
-
-            /* Use level 1 and just get the entry directlry */
-            Level1 = (PUCHAR)TableBase;
-            Entry = (PVOID)&Level1[Handle.Value *
-                                   (sizeof(HANDLE_TABLE_ENTRY) /
-                                    SizeOfHandle(1))];
-            break;
-
-        /* Nested index into mid level */
-        case 1:
-
-            /* Get the second table and index into it */
-            Level2 = (PUCHAR)TableBase;
-            i = Handle.Value % SizeOfHandle(LOW_LEVEL_ENTRIES);
-
-            /* Substract this index, and get the next one */
-            Handle.Value -= i;
-            j = Handle.Value /
-                (SizeOfHandle(LOW_LEVEL_ENTRIES) / sizeof(PHANDLE_TABLE_ENTRY));
-
-            /* Now get the next table and get the entry from it */
-            Level1 = (PUCHAR)*(PHANDLE_TABLE_ENTRY*)&Level2[j];
-            Entry = (PVOID)&Level1[i *
-                                   (sizeof(HANDLE_TABLE_ENTRY) /
-                                    SizeOfHandle(1))];
-            break;
-
-        /* Nested index into high level */
-        case 2:
-
-            /* Start with the 3rd level table */
-            Level3 = (PUCHAR)TableBase;
-            i = Handle.Value % SizeOfHandle(LOW_LEVEL_ENTRIES);
-
-            /* Subtract this index and get the index for the next lower table */
-            Handle.Value -= i;
-            k = Handle.Value /
-                (SizeOfHandle(LOW_LEVEL_ENTRIES) / sizeof(PHANDLE_TABLE_ENTRY));
-
-            /* Get the remaining index in the 2nd level table */
-            j = k % (MID_LEVEL_ENTRIES * sizeof(PHANDLE_TABLE_ENTRY));
-
-            /* Get the remaining index, which is in the third table */
-            k -= j;
-            k /= MID_LEVEL_ENTRIES;
-
-            /* Extract the table level for the handle in each table */
-            Level2 = (PUCHAR)*(PHANDLE_TABLE_ENTRY*)&Level3[k];
-            Level1 = (PUCHAR)*(PHANDLE_TABLE_ENTRY*)&Level2[j];
-
-            /* Get the handle table entry */
-            Entry = (PVOID)&Level1[i *
-                                   (sizeof(HANDLE_TABLE_ENTRY) /
-                                    SizeOfHandle(1))];
-
-        default:
-
-            /* All done */
-            break;
-    }
-
-    /* Return the handle entry */
-    return Entry;
+  ExpInitialized = TRUE;
 }
 
-PVOID
-NTAPI
-ExpAllocateTablePagedPool(IN PEPROCESS Process OPTIONAL,
-                          IN SIZE_T Size)
+PHANDLE_TABLE
+ExCreateHandleTable(IN PEPROCESS QuotaProcess  OPTIONAL)
 {
-    PVOID Buffer;
+  PHANDLE_TABLE HandleTable;
 
-    /* Do the allocation */
-    Buffer = ExAllocatePoolWithTag(PagedPool, Size, TAG('O', 'b', 't', 'b'));
-    if (Buffer)
-    {
-        /* Clear the memory */
-        RtlZeroMemory(Buffer, Size);
+  PAGED_CODE();
 
-        /* Check if we have a process to charge quota */
-        if (Process)
-        {
-            /* FIXME: Charge quota */
-        }
-    }
+  if(!ExpInitialized)
+  {
+    KEBUGCHECK(0);
+  }
+
+  if(QuotaProcess != NULL)
+  {
+    /* FIXME - Charge process quota before allocating the handle table! */
+  }
+
+  /* allocate enough memory for the handle table and the lowest level */
+  HandleTable = ExAllocatePoolWithTag(NonPagedPool,
+                                      sizeof(HANDLE_TABLE) + (N_TOPLEVEL_POINTERS * sizeof(PHANDLE_TABLE_ENTRY*)),
+                                      TAG('E', 'x', 'H', 't'));
+  if(HandleTable != NULL)
+  {
+    /* initialize the handle table */
+    HandleTable->Flags = 0;
+    HandleTable->HandleCount = 0;
+    HandleTable->Table = (PHANDLE_TABLE_ENTRY**)(HandleTable + 1);
+    HandleTable->QuotaProcess = QuotaProcess;
+    HandleTable->FirstFree = -1; /* no entries freed so far */
+    HandleTable->NextHandleNeedingPool = 0; /* no entries freed so far, so we have to allocate already for the first handle */
+    HandleTable->UniqueProcessId = (QuotaProcess ? QuotaProcess->UniqueProcessId : NULL);
 
-    /* Return the allocated memory */
-    return Buffer;
-}
+    ExInitializeResource(&HandleTable->HandleLock);
 
-PVOID
-NTAPI
-ExpAllocateTablePagedPoolNoZero(IN PEPROCESS Process OPTIONAL,
-                                IN SIZE_T Size)
-{
-    PVOID Buffer;
+    KeInitializeEvent(&HandleTable->HandleContentionEvent,
+                      NotificationEvent,
+                      FALSE);
+
+    RtlZeroMemory(HandleTable->Table, N_TOPLEVEL_POINTERS * sizeof(PHANDLE_TABLE_ENTRY*));
 
-    /* Do the allocation */
-    Buffer = ExAllocatePoolWithTag(PagedPool, Size, TAG('O', 'b', 't', 'b'));
-    if (Buffer)
+    /* during bootup KeGetCurrentThread() might be NULL, needs to be fixed... */
+    if(KeGetCurrentThread() != NULL)
     {
-        /* Check if we have a process to charge quota */
-        if (Process)
-        {
-            /* FIXME: Charge quota */
-        }
-    }
+      /* insert it into the global handle table list */
+      KeEnterCriticalRegion();
 
-    /* Return the allocated memory */
-    return Buffer;
-}
+      ExAcquireHandleTableListLock();
+      InsertTailList(&ExpHandleTableHead,
+                     &HandleTable->HandleTableList);
+      ExReleaseHandleTableListLock();
 
-VOID
-NTAPI
-ExpFreeTablePagedPool(IN PEPROCESS Process OPTIONAL,
-                      IN PVOID Buffer,
-                      IN SIZE_T Size)
-{
-    /* Free the buffer */
-    ExFreePool(Buffer);
-    if (Process)
-    {
-        /* FIXME: Release quota */
+      KeLeaveCriticalRegion();
     }
-}
-
-VOID
-NTAPI
-ExpFreeLowLevelTable(IN PEPROCESS Process,
-                     IN PHANDLE_TABLE_ENTRY TableEntry)
-{
-    /* Check if we have an entry */
-    if (TableEntry[0].Object)
+    else
     {
-        /* Free the entry */
-        ExpFreeTablePagedPool(Process,
-                              TableEntry[0].Object,
-                              LOW_LEVEL_ENTRIES *
-                              sizeof(HANDLE_TABLE_ENTRY_INFO));
+      InsertTailList(&ExpHandleTableHead,
+                     &HandleTable->HandleTableList);
     }
+  }
+  else
+  {
+    /* FIXME - return the quota to the process */
+  }
 
-    /* Free the table */
-    ExpFreeTablePagedPool(Process, TableEntry, PAGE_SIZE);
+  return HandleTable;
 }
 
 VOID
-NTAPI
-ExpFreeHandleTable(IN PHANDLE_TABLE HandleTable)
+ExSweepHandleTable(IN PHANDLE_TABLE HandleTable,
+                   IN PEX_SWEEP_HANDLE_CALLBACK SweepHandleCallback  OPTIONAL,
+                   IN PVOID Context  OPTIONAL)
 {
-    PEPROCESS Process = HandleTable->QuotaProcess;
-    ULONG i, j;
-    ULONG TableLevel = (ULONG)(HandleTable->TableCode & 3);
-    ULONG_PTR TableBase = HandleTable->TableCode & ~3;
-    PHANDLE_TABLE_ENTRY Level1, *Level2, **Level3;
-    PAGED_CODE();
-
-    /* Check which level we're at */
-    if (!TableLevel)
-    {
-        /* Select the first level table base and just free it */
-        Level1 = (PVOID)TableBase;
-        ExpFreeLowLevelTable(Process, Level1);
-    }
-    else if (TableLevel == 1)
-    {
-        /* Select the second level table base */
-        Level2 = (PVOID)TableBase;
+  PHANDLE_TABLE_ENTRY **tlp, **lasttlp, *mlp, *lastmlp;
+  LONG ExHandle = 0;
 
-        /* Loop each mid level entry */
-        for (i = 0; i < MID_LEVEL_ENTRIES; i++)
-        {
-            /* Leave if we've reached the last entry */
-            if (!Level2[i]) break;
+  PAGED_CODE();
 
-            /* Free the second level table */
-            ExpFreeLowLevelTable(Process, Level2[i]);
-        }
+  ASSERT(HandleTable);
 
-        /* Free the second level table */
-        ExpFreeTablePagedPool(Process, Level2, PAGE_SIZE);
-    }
-    else
-    {
-        /* Select the third level table base */
-        Level3 = (PVOID)TableBase;
+  KeEnterCriticalRegion();
+
+  /* ensure there's no other operations going by acquiring an exclusive lock */
+  ExAcquireHandleLockExclusive(HandleTable);
+
+  ASSERT(!(HandleTable->Flags & EX_HANDLE_TABLE_CLOSING));
+
+  HandleTable->Flags |= EX_HANDLE_TABLE_CLOSING;
 
-        /* Loop each high level entry */
-        for (i = 0; i < HIGH_LEVEL_ENTRIES; i++)
+  KePulseEvent(&HandleTable->HandleContentionEvent,
+               EVENT_INCREMENT,
+               FALSE);
+
+  /* call the callback function to cleanup the objects associated with the
+     handle table */
+  for(tlp = HandleTable->Table, lasttlp = HandleTable->Table + N_TOPLEVEL_POINTERS;
+      tlp != lasttlp;
+      tlp++)
+  {
+    if((*tlp) != NULL)
+    {
+      for(mlp = *tlp, lastmlp = (*tlp) + N_MIDDLELEVEL_POINTERS;
+          mlp != lastmlp;
+          mlp++)
+      {
+        if((*mlp) != NULL)
         {
-            /* Leave if we've reached the last entry */
-            if (!Level3[i]) break;
+          PHANDLE_TABLE_ENTRY curee, laste;
 
-            /* Loop each mid level entry */
-            for (j = 0; j < MID_LEVEL_ENTRIES; j++)
+          for(curee = *mlp, laste = *mlp + N_SUBHANDLE_ENTRIES;
+              curee != laste;
+              curee++)
+          {
+            if(curee->Object != NULL && SweepHandleCallback != NULL)
             {
-                /* Leave if we've reached the last entry */
-                if (!Level3[i][j]) break;
-
-                /* Free the second level table */
-                ExpFreeLowLevelTable(Process, Level3[i][j]);
+              curee->ObAttributes |= EX_HANDLE_ENTRY_LOCKED;
+              SweepHandleCallback(curee, EX_HANDLE_TO_HANDLE(ExHandle), Context);
             }
 
-            /* Free the third level table entry */
-            ExpFreeTablePagedPool(Process, Level3[i], PAGE_SIZE);
+            ExHandle++;
+          }
         }
-
-        /* Free the third level table */
-        ExpFreeTablePagedPool(Process,
-                              Level3,
-                              HIGH_LEVEL_ENTRIES *
-                              sizeof(PHANDLE_TABLE_ENTRY));
+        else
+          break;
+      }
     }
+    else
+      break;
+  }
 
-    /* Free the actual table and check if we need to release quota */
-    ExFreePool(HandleTable);
-    if (Process)
-    {
-        /* FIXME: TODO */
-    }
+  ExReleaseHandleLock(HandleTable);
+
+  KeLeaveCriticalRegion();
 }
 
 VOID
-NTAPI
-ExpFreeHandleTableEntry(IN PHANDLE_TABLE HandleTable,
-                        IN EXHANDLE Handle,
-                        IN PHANDLE_TABLE_ENTRY HandleTableEntry)
+ExDestroyHandleTable(IN PHANDLE_TABLE HandleTable)
 {
-    ULONG OldValue, NewValue, *Free;
-    ULONG i;
-    PAGED_CODE();
-
-    /* Sanity checks */
-    ASSERT(HandleTableEntry->Object == NULL);
-    ASSERT(HandleTableEntry == ExpLookupHandleTableEntry(HandleTable, Handle));
-
-    /* Decrement the handle count */
-    InterlockedDecrement(&HandleTable->HandleCount);
+  PHANDLE_TABLE_ENTRY **tlp, **lasttlp, *mlp, *lastmlp;
+  PEPROCESS QuotaProcess;
 
-    /* Mark the handle as free */
-    NewValue = (ULONG)Handle.Value & ~(SizeOfHandle(1) - 1);
-
-    /* Check if we're FIFO */
-    if (!HandleTable->StrictFIFO)
-    {
-        /* Select a lock index */
-        i = (NewValue >> 2) % 4;
+  PAGED_CODE();
 
-        /* Select which entry to use */
-        Free = (HandleTable->HandleTableLock[i].Locked) ?
-                &HandleTable->FirstFree : &HandleTable->LastFree;
-    }
-    else
-    {
-        /* No need to worry about locking, take the last entry */
-        Free = &HandleTable->LastFree;
-    }
+  ASSERT(HandleTable);
+  ASSERT(HandleTable->Flags & EX_HANDLE_TABLE_CLOSING);
 
-    /* Start value change loop */
-    for (;;)
-    {
-        /* Get the current value and write */
-        OldValue = *Free;
-        HandleTableEntry->NextFreeTableEntry = (ULONG)OldValue;
-        if (InterlockedCompareExchange((PLONG) Free, NewValue, OldValue) == OldValue)
-        {
-            /* Break out, we're done. Make sure the handle value makes sense */
-            ASSERT((OldValue & FREE_HANDLE_MASK) <
-                   HandleTable->NextHandleNeedingPool);
-            break;
-        }
-    }
-}
-
-PHANDLE_TABLE
-NTAPI
-ExpAllocateHandleTable(IN PEPROCESS Process OPTIONAL,
-                       IN BOOLEAN NewTable)
-{
-    PHANDLE_TABLE HandleTable;
-    PHANDLE_TABLE_ENTRY HandleTableTable, HandleEntry;
-    ULONG i;
-    PAGED_CODE();
-
-    /* Allocate the table */
-    HandleTable = ExAllocatePoolWithTag(PagedPool,
-                                        sizeof(HANDLE_TABLE),
-                                        TAG('O', 'b', 't', 'b'));
-    if (!HandleTable) return NULL;
-
-    /* Check if we have a process */
-    if (Process)
-    {
-        /* FIXME: Charge quota */
-    }
+  KeEnterCriticalRegion();
 
-    /* Clear the table */
-    RtlZeroMemory(HandleTable, sizeof(HANDLE_TABLE));
+  /* at this point the table should not be queried or altered anymore,
+     no locks should be necessary */
 
-    /* Now allocate the first level structures */
-    HandleTableTable = ExpAllocateTablePagedPoolNoZero(Process, PAGE_SIZE);
-    if (!HandleTableTable)
-    {
-        /* Failed, free the table */
-        ExFreePool(HandleTable);
-        return NULL;
-    }
+  ASSERT(HandleTable->Flags & EX_HANDLE_TABLE_CLOSING);
 
-    /* Write the pointer to our first level structures */
-    HandleTable->TableCode = (ULONG_PTR)HandleTableTable;
+  /* remove the handle table from the global handle table list */
+  ExAcquireHandleTableListLock();
+  RemoveEntryList(&HandleTable->HandleTableList);
+  ExReleaseHandleTableListLock();
 
-    /* Initialize the first entry */
-    HandleEntry = &HandleTableTable[0];
-    HandleEntry->NextFreeTableEntry = -2;
-    HandleEntry->Value = 0;
+  QuotaProcess = HandleTable->QuotaProcess;
 
-    /* Check if this is a new table */
-    if (NewTable)
+  /* free the tables */
+  for(tlp = HandleTable->Table, lasttlp = HandleTable->Table + N_TOPLEVEL_POINTERS;
+      tlp != lasttlp;
+      tlp++)
+  {
+    if((*tlp) != NULL)
     {
-        /* Go past the root entry */
-        HandleEntry++;
-
-        /* Loop every low level entry */
-        for (i = 1; i < (LOW_LEVEL_ENTRIES - 1); i++)
+      for(mlp = *tlp, lastmlp = (*tlp) + N_MIDDLELEVEL_POINTERS;
+          mlp != lastmlp;
+          mlp++)
+      {
+        if((*mlp) != NULL)
         {
-            /* Set up the free data */
-            HandleEntry->Value = 0;
-            HandleEntry->NextFreeTableEntry = (i + 1) * SizeOfHandle(1);
+          ExFreePool(*mlp);
 
-            /* Move to the next entry */
-            HandleEntry++;
+          if(QuotaProcess != NULL)
+          {
+            /* FIXME - return the quota to the process */
+          }
         }
+      }
 
-        /* Terminate the last entry */
-        HandleEntry->Value = 0;
-        HandleEntry->NextFreeTableEntry = 0;
-        HandleTable->FirstFree = SizeOfHandle(1);
-    }
-
-    /* Set the next handle needing pool after our allocated page from above */
-    HandleTable->NextHandleNeedingPool = LOW_LEVEL_ENTRIES * SizeOfHandle(1);
-
-    /* Setup the rest of the handle table data */
-    HandleTable->QuotaProcess = Process;
-    HandleTable->UniqueProcessId = PsGetCurrentProcess()->UniqueProcessId;
-    HandleTable->Flags = 0;
+      ExFreePool(*tlp);
 
-    /* Loop all the handle table locks */
-    for (i = 0; i < 4; i++) HandleTable->HandleTableLock[i].Value = 0;
-
-    /* Initialize the contention event lock and return the lock */
-    HandleTable->HandleContentionEvent.Value = 0;
-    return HandleTable;
-}
-
-PHANDLE_TABLE_ENTRY
-NTAPI
-ExpAllocateLowLevelTable(IN PHANDLE_TABLE HandleTable,
-                         IN BOOLEAN DoInit)
-{
-    ULONG i, Base;
-    PHANDLE_TABLE_ENTRY Low, HandleEntry;
-
-    /* Allocate the low level table */
-    Low = ExpAllocateTablePagedPoolNoZero(HandleTable->QuotaProcess,
-                                          PAGE_SIZE);
-    if (!Low) return NULL;
-
-    /* Setup the initial entry */
-    HandleEntry = &Low[0];
-    HandleEntry->NextFreeTableEntry = -2;
-    HandleEntry->Value = 0;
+      if(QuotaProcess != NULL)
+      {
+        /* FIXME - return the quota to the process */
+      }
+    }
+  }
 
-    /* Check if we're initializing */
-    if (DoInit)
-    {
-        /* Go to the next entry and the base entry */
-        HandleEntry++;
-        Base = HandleTable->NextHandleNeedingPool + SizeOfHandle(2);
-
-        /* Loop each entry */
-        for (i = Base;
-             i < Base + SizeOfHandle(LOW_LEVEL_ENTRIES - 2);
-             i += SizeOfHandle(1))
-        {
-            /* Free this entry and move on to the next one */
-            HandleEntry->NextFreeTableEntry = i;
-            HandleEntry->Value = 0;
-            HandleEntry++;
-        }
+  KeLeaveCriticalRegion();
 
-        /* Terminate the last entry */
-        HandleEntry->NextFreeTableEntry = 0;
-        HandleEntry->Value = 0;
-    }
+  /* free the handle table */
+  ExDeleteResource(&HandleTable->HandleLock);
+  ExFreePool(HandleTable);
 
-    /* Return the low level table */
-    return Low;
+  if(QuotaProcess != NULL)
+  {
+    /* FIXME - return the quota to the process */
+  }
 }
 
-PHANDLE_TABLE_ENTRY*
-NTAPI
-ExpAllocateMidLevelTable(IN PHANDLE_TABLE HandleTable,
-                         IN BOOLEAN DoInit,
-                         OUT PHANDLE_TABLE_ENTRY *LowTableEntry)
+PHANDLE_TABLE
+ExDupHandleTable(IN PEPROCESS QuotaProcess  OPTIONAL,
+                 IN PEX_DUPLICATE_HANDLE_CALLBACK DuplicateHandleCallback  OPTIONAL,
+                 IN PVOID Context  OPTIONAL,
+                 IN PHANDLE_TABLE SourceHandleTable)
 {
-    PHANDLE_TABLE_ENTRY *Mid, Low;
+  PHANDLE_TABLE HandleTable;
 
-    /* Allocate the mid level table */
-    Mid = ExpAllocateTablePagedPool(HandleTable->QuotaProcess, PAGE_SIZE);
-    if (!Mid) return NULL;
+  PAGED_CODE();
 
-    /* Allocate a new low level for it */
-    Low = ExpAllocateLowLevelTable(HandleTable, DoInit);
-    if (!Low)
-    {
-        /* We failed, free the mid table */
-        ExpFreeTablePagedPool(HandleTable->QuotaProcess, Mid, PAGE_SIZE);
-        return NULL;
-    }
+  ASSERT(SourceHandleTable);
 
-    /* Link the tables and return the pointer */
-    Mid[0] = Low;
-    *LowTableEntry = Low;
-    return Mid;
-}
+  HandleTable = ExCreateHandleTable(QuotaProcess);
+  if(HandleTable != NULL)
+  {
+    PHANDLE_TABLE_ENTRY **tlp, **srctlp, **etlp, *mlp, *srcmlp, *emlp, stbl, srcstbl, estbl;
+    LONG tli, mli, eli;
 
-BOOLEAN
-NTAPI
-ExpAllocateHandleTableEntrySlow(IN PHANDLE_TABLE HandleTable,
-                                IN BOOLEAN DoInit)
-{
-    ULONG i, j, Index;
-    PHANDLE_TABLE_ENTRY Low = NULL, *Mid, **High, *SecondLevel, **ThirdLevel;
-    ULONG NewFree, FirstFree;
-    PVOID Value;
-    ULONG_PTR TableBase = HandleTable->TableCode & ~3;
-    ULONG TableLevel = (ULONG)(TableBase & 3);
-    PAGED_CODE();
-
-    /* Check how many levels we already have */
-    if (!TableLevel)
-    {
-        /* Allocate a mid level, since we only have a low level */
-        Mid = ExpAllocateMidLevelTable(HandleTable, DoInit, &Low);
-        if (!Mid) return FALSE;
+    tli = mli = eli = 0;
 
-        /* Link up the tables */
-        Mid[1] = Mid[0];
-        Mid[0] = (PVOID)TableBase;
+    /* make sure the other handle table isn't being changed during the duplication */
+    ExAcquireHandleLockShared(SourceHandleTable);
 
-        /* Write the new level and attempt to change the table code */
-        TableBase = ((ULONG_PTR)Mid) | 1;
-        Value = InterlockedExchangePointer(&HandleTable->TableCode, TableBase);
-    }
-    else if (TableLevel == 1)
+    /* allocate enough tables */
+    etlp = SourceHandleTable->Table + N_TOPLEVEL_POINTERS;
+    for(srctlp = SourceHandleTable->Table, tlp = HandleTable->Table;
+        srctlp != etlp;
+        srctlp++, tlp++)
     {
-        /* Setup the 2nd level table */
-        SecondLevel = (PVOID)TableBase;
+      if(*srctlp != NULL)
+      {
+        /* allocate middle level entry tables */
+        if(QuotaProcess != NULL)
+        {
+          /* FIXME - Charge process quota before allocating the handle table! */
+        }
 
-        /* Get if the next index can fit in the table */
-        i = HandleTable->NextHandleNeedingPool /
-            SizeOfHandle(LOW_LEVEL_ENTRIES);
-        if (i < MID_LEVEL_ENTRIES)
+        *tlp = ExAllocatePoolWithTag(PagedPool,
+                                     N_MIDDLELEVEL_POINTERS * sizeof(PHANDLE_TABLE_ENTRY),
+                                     TAG('E', 'x', 'H', 't'));
+        if(*tlp != NULL)
         {
-            /* We need to allocate a new table */
-            Low = ExpAllocateLowLevelTable(HandleTable, DoInit);
-            if (!Low) return FALSE;
+          RtlZeroMemory(*tlp, N_MIDDLELEVEL_POINTERS * sizeof(PHANDLE_TABLE_ENTRY));
+
+          KeMemoryBarrier();
 
-            /* Update the table */
-            Value = InterlockedExchangePointer(&SecondLevel[i], Low);
-            ASSERT(Value == NULL);
+          emlp = *srctlp + N_MIDDLELEVEL_POINTERS;
+          for(srcmlp = *srctlp, mlp = *tlp;
+              srcmlp != emlp;
+              srcmlp++, mlp++)
+          {
+            if(*srcmlp != NULL)
+            {
+              /* allocate subhandle tables */
+              if(QuotaProcess != NULL)
+              {
+                /* FIXME - Charge process quota before allocating the handle table! */
+              }
+
+              *mlp = ExAllocatePoolWithTag(PagedPool,
+                                           N_SUBHANDLE_ENTRIES * sizeof(HANDLE_TABLE_ENTRY),
+                                           TAG('E', 'x', 'H', 't'));
+              if(*mlp != NULL)
+              {
+                RtlZeroMemory(*mlp, N_SUBHANDLE_ENTRIES * sizeof(HANDLE_TABLE_ENTRY));
+              }
+              else
+              {
+                goto freehandletable;
+              }
+            }
+            else
+            {
+              *mlp = NULL;
+            }
+          }
         }
         else
         {
-            /* We need a new high level table */
-            High = ExpAllocateTablePagedPool(HandleTable->QuotaProcess,
-                                             HIGH_LEVEL_ENTRIES);
-            if (!High) return FALSE;
-
-            /* Allocate a new mid level table as well */
-            Mid = ExpAllocateMidLevelTable(HandleTable, DoInit, &Low);
-            if (!Mid)
-            {
-                /* We failed, free the high level table as welll */
-                ExpFreeTablePagedPool(HandleTable->QuotaProcess,
-                                      High,
-                                      HIGH_LEVEL_ENTRIES);
-                return FALSE;
-            }
+freehandletable:
+          DPRINT1("Failed to duplicate handle table 0x%p\n", SourceHandleTable);
 
-            /* Link up the tables */
-            High[0] = (PVOID)TableBase;
-            High[1] = Mid;
+          ExReleaseHandleLock(SourceHandleTable);
 
-            /* Write the new table and change the table code */
-            TableBase = ((ULONG_PTR)High) | 2;
-            Value = InterlockedExchangePointer(&HandleTable->TableCode,
-                                               (PVOID)TableBase);
+          ExDestroyHandleTable(HandleTable);
+          /* allocate an empty handle table */
+          return ExCreateHandleTable(QuotaProcess);
         }
+      }
     }
-    else if (TableLevel == 2)
-    {
-        /* Setup the 3rd level table */
-        ThirdLevel = (PVOID)TableBase;
-
-        /* Get the index and check if it can fit */
-        i = HandleTable->NextHandleNeedingPool / SizeOfHandle(MAX_MID_INDEX);
-        if (i >= HIGH_LEVEL_ENTRIES) return FALSE;
-
-        /* Check if there's no mid-level table */
-        if (!ThirdLevel[i])
-        {
-            /* Allocate a new mid level table */
-            Mid = ExpAllocateMidLevelTable(HandleTable, DoInit, &Low);
-            if (!Mid) return FALSE;
 
-            /* Update the table pointer */
-            Value = InterlockedExchangePointer(&ThirdLevel[i], Mid);
-            ASSERT(Value == NULL);
-        }
-        else
-        {
-            /* We have one, check at which index we should insert our entry */
-            Index  = (HandleTable->NextHandleNeedingPool / SizeOfHandle(1)) -
-                      i * MAX_MID_INDEX;
-            j = Index / LOW_LEVEL_ENTRIES;
-
-            /* Allocate a new low level */
-            Low = ExpAllocateLowLevelTable(HandleTable, DoInit);
-            if (!Low) return FALSE;
-
-            /* Update the table pointer */
-            Value = InterlockedExchangePointer(&ThirdLevel[i][j], Low);
-            ASSERT(Value == NULL);
-        }
-    }
+    /* duplicate the handles */
+    HandleTable->HandleCount = SourceHandleTable->HandleCount;
+    HandleTable->FirstFree = SourceHandleTable->FirstFree;
+    HandleTable->NextHandleNeedingPool = SourceHandleTable->NextHandleNeedingPool;
 
-    /* Update the index of the next handle */
-    Index = InterlockedExchangeAdd((PLONG) &HandleTable->NextHandleNeedingPool,
-                                   SizeOfHandle(LOW_LEVEL_ENTRIES));
+    /* make sure all tables are zeroed */
+    KeMemoryBarrier();
 
-    /* Check if need to initialize the table */
-    if (DoInit)
+    etlp = SourceHandleTable->Table + N_TOPLEVEL_POINTERS;
+    for(srctlp = SourceHandleTable->Table, tlp = HandleTable->Table;
+        srctlp != etlp;
+        srctlp++, tlp++, tli++)
     {
-        /* Create a new index number */
-        Index += SizeOfHandle(1);
+      if(*srctlp != NULL)
+      {
+        ASSERT(*tlp != NULL);
 
-        /* Start free index change loop */
-        for (;;)
+        emlp = *srctlp + N_MIDDLELEVEL_POINTERS;
+        for(srcmlp = *srctlp, mlp = *tlp;
+            srcmlp != emlp;
+            srcmlp++, mlp++, mli++)
         {
-            /* Setup the first free index */
-            FirstFree = HandleTable->FirstFree;
-            Low[LOW_LEVEL_ENTRIES - 1].NextFreeTableEntry = FirstFree;
-
-            /* Change the index */
-            NewFree = InterlockedCompareExchange((PLONG) &HandleTable->FirstFree,
-                                                 Index,
-                                                 FirstFree);
-            if (NewFree == FirstFree) break;
+          if(*srcmlp != NULL)
+          {
+            ASSERT(*mlp != NULL);
+
+            /* walk all handle entries and duplicate them if wanted */
+            estbl = *srcmlp + N_SUBHANDLE_ENTRIES;
+            for(srcstbl = *srcmlp, stbl = *mlp;
+                srcstbl != estbl;
+                srcstbl++, stbl++, eli++)
+            {
+              /* try to duplicate the source handle */
+              if(srcstbl->Object != NULL &&
+                 ExLockHandleTableEntry(SourceHandleTable,
+                                        srcstbl))
+              {
+                /* ask the caller if this handle should be duplicated */
+                if(DuplicateHandleCallback != NULL &&
+                   !DuplicateHandleCallback(HandleTable,
+                                            srcstbl,
+                                            Context))
+                {
+                  /* free the entry and chain it into the free list */
+                  HandleTable->HandleCount--;
+                  stbl->Object = NULL;
+                  stbl->NextFreeTableEntry = HandleTable->FirstFree;
+                  HandleTable->FirstFree = BUILD_HANDLE(tli, mli, eli);
+                }
+                else
+                {
+                  /* duplicate the handle and unlock it */
+                  stbl->GrantedAccess = srcstbl->GrantedAccess;
+                  stbl->ObAttributes = srcstbl->ObAttributes & ~EX_HANDLE_ENTRY_LOCKED;
+                }
+                ExUnlockHandleTableEntry(SourceHandleTable,
+                                         srcstbl);
+              }
+              else
+              {
+                /* this is a free handle table entry, copy over the entire
+                   structure as-is */
+                *stbl = *srcstbl;
+              }
+            }
+          }
         }
+      }
     }
 
-    /* All done */
-    return TRUE;
+    /* release the source handle table */
+    ExReleaseHandleLock(SourceHandleTable);
+  }
+
+  return HandleTable;
 }
 
-ULONG
-NTAPI
-ExpMoveFreeHandles(IN PHANDLE_TABLE HandleTable)
+static PHANDLE_TABLE_ENTRY
+ExpAllocateHandleTableEntry(IN PHANDLE_TABLE HandleTable,
+                            OUT PHANDLE Handle)
 {
-    ULONG LastFree, i;
+  PHANDLE_TABLE_ENTRY Entry = NULL;
 
-    /* Clear the last free index */
-    LastFree = InterlockedExchange((PLONG) &HandleTable->LastFree, 0);
+  PAGED_CODE();
 
-    /* Check if we had no index */
-    if (!LastFree) return LastFree;
+  ASSERT(HandleTable);
+  ASSERT(Handle);
+  ASSERT(KeGetCurrentThread() != NULL);
 
-    /* Acquire the locks we need */
-    for (i = 1; i < 4; i++)
-    {
-        /* Acquire this lock exclusively */
-        ExWaitOnPushLock(&HandleTable->HandleTableLock[i]);
-    }
-
-    /* Check if we're not strict FIFO */
-    if (!HandleTable->StrictFIFO)
-    {
-        /* Update the first free index */
-        if (!InterlockedCompareExchange((PLONG) &HandleTable->FirstFree, LastFree, 0))
-        {
-            /* We're done, exit */
-            return LastFree;
-        }
-    }
+  DPRINT("HT[0x%p]: HandleCount: %d\n", HandleTable, HandleTable->HandleCount);
 
-    /* We are strict FIFO, we need to reverse the entries */
-    KEBUGCHECK(0);
-    return LastFree;
-}
+  if(HandleTable->HandleCount < EX_MAX_HANDLES)
+  {
+    ULONG tli, mli, eli;
 
-PHANDLE_TABLE_ENTRY
-NTAPI
-ExpAllocateHandleTableEntry(IN PHANDLE_TABLE HandleTable,
-                            OUT PEXHANDLE NewHandle)
-{
-    ULONG OldValue, NewValue, NewValue1;
-    PHANDLE_TABLE_ENTRY Entry;
-    EXHANDLE Handle;
-    BOOLEAN Result;
-    ULONG i;
-
-    /* Start allocation loop */
-    for (;;)
+    if(HandleTable->FirstFree != -1)
     {
-        /* Get the current link */
-        OldValue = HandleTable->FirstFree;
-        while (!OldValue)
-        {
-            /* No free entries remain, lock the handle table */
-            KeEnterCriticalRegion();
-            ExAcquirePushLockExclusive(&HandleTable->HandleTableLock[0]);
+      /* there's a free handle entry we can just grab and use */
+      tli = TLI_FROM_HANDLE(HandleTable->FirstFree);
+      mli = MLI_FROM_HANDLE(HandleTable->FirstFree);
+      eli = ELI_FROM_HANDLE(HandleTable->FirstFree);
 
-            /* Check the value again */
-            OldValue = HandleTable->FirstFree;
-            if (OldValue)
-            {
-                /* Another thread has already created a new level, bail out */
-                ExReleasePushLockExclusive(&HandleTable->HandleTableLock[0]);
-                KeLeaveCriticalRegion();
-                break;
-            }
+      /* the pointer should be valid in any way!!! */
+      ASSERT(HandleTable->Table[tli]);
+      ASSERT(HandleTable->Table[tli][mli]);
 
-            /* Now move any free handles */
-            OldValue = ExpMoveFreeHandles(HandleTable);
-            if (OldValue)
-            {
-                /* Another thread has already moved them, bail out */
-                ExReleasePushLockExclusive(&HandleTable->HandleTableLock[0]);
-                KeLeaveCriticalRegion();
-                break;
-            }
+      Entry = &HandleTable->Table[tli][mli][eli];
 
-            /* We're the first one through, so do the actual allocation */
-            Result = ExpAllocateHandleTableEntrySlow(HandleTable, TRUE);
+      *Handle = EX_HANDLE_TO_HANDLE(HandleTable->FirstFree);
 
-            /* Unlock the table and get the value now */
-            ExReleasePushLockExclusive(&HandleTable->HandleTableLock[0]);
-            KeLeaveCriticalRegion();
-            OldValue = HandleTable->FirstFree;
+      /* save the index to the next free handle (if available) */
+      HandleTable->FirstFree = Entry->NextFreeTableEntry;
+      Entry->NextFreeTableEntry = 0;
+      Entry->Object = NULL;
 
-            /* Check if allocation failed */
-            if (!Result)
-            {
-                /* Check if nobody else went through here */
-                if (!OldValue)
-                {
-                    /* We're still the only thread around, so fail */
-                    NewHandle->GenericHandleOverlay = NULL;
-                    return NULL;
-                }
-            }
-        }
+      HandleTable->HandleCount++;
+    }
+    else
+    {
+      /* we need to allocate a new subhandle table first */
+      PHANDLE_TABLE_ENTRY cure, laste, ntbl, *nmtbl;
+      ULONG i;
+      BOOLEAN AllocatedMtbl;
+
+      ASSERT(HandleTable->NextHandleNeedingPool <= N_MAX_HANDLE);
 
-        /* We made it, write the current value */
-        Handle.Value = (OldValue & FREE_HANDLE_MASK);
+      /* the index of the next table to be allocated was saved in
+         NextHandleNeedingPool the last time a handle entry was allocated and
+         the subhandle entry list was full. the subhandle entry index of
+         NextHandleNeedingPool should be 0 here! */
+      tli = TLI_FROM_HANDLE(HandleTable->NextHandleNeedingPool);
+      mli = MLI_FROM_HANDLE(HandleTable->NextHandleNeedingPool);
+      DPRINT("HandleTable->NextHandleNeedingPool: 0x%x\n", HandleTable->NextHandleNeedingPool);
+      DPRINT("tli: 0x%x mli: 0x%x eli: 0x%x\n", tli, mli, ELI_FROM_HANDLE(HandleTable->NextHandleNeedingPool));
 
-        /* Lookup the entry for this handle */
-        Entry = ExpLookupHandleTableEntry(HandleTable, Handle);
+      ASSERT(ELI_FROM_HANDLE(HandleTable->NextHandleNeedingPool) == 0);
 
-        /* Get an available lock and acquire it */
-        i = ((OldValue & FREE_HANDLE_MASK) >> 2) % 4;
-        KeEnterCriticalRegion();
-        ExAcquirePushLockShared(&HandleTable->HandleTableLock[i]);
+      DPRINT("HandleTable->Table[%d] == 0x%p\n", tli, HandleTable->Table[tli]);
 
-        /* Check if the value changed after acquiring the lock */
-        if (OldValue != HandleTable->FirstFree)
+      /* allocate a middle level entry list if required */
+      nmtbl = HandleTable->Table[tli];
+      if(nmtbl == NULL)
+      {
+        if(HandleTable->QuotaProcess != NULL)
         {
-            /* It did, so try again */
-            ExReleasePushLockShared(&HandleTable->HandleTableLock[i]);
-            KeLeaveCriticalRegion();
-            continue;
+          /* FIXME - Charge process quota before allocating the handle table! */
         }
 
-        /* Now get the next value and do the compare */
-        NewValue = Entry->NextFreeTableEntry;
-        NewValue1 = InterlockedCompareExchange((PLONG) &HandleTable->FirstFree,
-                                               NewValue,
-                                               OldValue);
+        nmtbl = ExAllocatePoolWithTag(PagedPool,
+                                      N_MIDDLELEVEL_POINTERS * sizeof(PHANDLE_TABLE_ENTRY),
+                                      TAG('E', 'x', 'H', 't'));
+        if(nmtbl == NULL)
+        {
+          if(HandleTable->QuotaProcess != NULL)
+          {
+            /* FIXME - return the quota to the process */
+          }
 
-        /* The change was done, so release the lock */
-        ExReleasePushLockShared(&HandleTable->HandleTableLock[i]);
-        KeLeaveCriticalRegion();
+          return NULL;
+        }
 
-        /* Check if the compare was successful */
-        if (NewValue1 == OldValue)
+        /* clear the middle level entry list */
+        RtlZeroMemory(nmtbl, N_MIDDLELEVEL_POINTERS * sizeof(PHANDLE_TABLE_ENTRY));
+
+        /* make sure the table was zeroed before we set one item */
+        KeMemoryBarrier();
+
+        /* note, don't set the the pointer in the top level list yet because we
+           might screw up lookups if allocating a subhandle entry table failed
+           and this newly allocated table might get freed again */
+        AllocatedMtbl = TRUE;
+      }
+      else
+      {
+        AllocatedMtbl = FALSE;
+
+        /* allocate a subhandle entry table in any case! */
+        ASSERT(nmtbl[mli] == NULL);
+      }
+
+      DPRINT("HandleTable->Table[%d][%d] == 0x%p\n", tli, mli, nmtbl[mli]);
+
+      if(HandleTable->QuotaProcess != NULL)
+      {
+        /* FIXME - Charge process quota before allocating the handle table! */
+      }
+
+      ntbl = ExAllocatePoolWithTag(PagedPool,
+                                   N_SUBHANDLE_ENTRIES * sizeof(HANDLE_TABLE_ENTRY),
+                                   TAG('E', 'x', 'H', 't'));
+      if(ntbl == NULL)
+      {
+        if(HandleTable->QuotaProcess != NULL)
         {
-            /* Make sure that the new handle is in range, and break out */
-            ASSERT((NewValue & FREE_HANDLE_MASK) <
-                   HandleTable->NextHandleNeedingPool);
-            break;
+          /* FIXME - Return process quota charged  */
         }
-        else
+
+        /* free the middle level entry list, if allocated, because it's empty and
+           unused */
+        if(AllocatedMtbl)
         {
-            /* The compare failed, make sure we expected it */
-            ASSERT((NewValue1 & FREE_HANDLE_MASK) !=
-                   (OldValue & FREE_HANDLE_MASK));
-        }
-    }
+          ExFreePool(nmtbl);
 
-    /* Increase the number of handles */
-    InterlockedIncrement(&HandleTable->HandleCount);
+          if(HandleTable->QuotaProcess != NULL)
+          {
+            /* FIXME - Return process quota charged  */
+          }
+        }
 
-    /* Return the handle and the entry */
-    *NewHandle = Handle;
-    return Entry;
+        return NULL;
+      }
+
+      /* let's just use the very first entry */
+      Entry = ntbl;
+      Entry->ObAttributes = EX_HANDLE_ENTRY_LOCKED;
+      Entry->NextFreeTableEntry = 0;
+
+      *Handle = EX_HANDLE_TO_HANDLE(HandleTable->NextHandleNeedingPool);
+
+      HandleTable->HandleCount++;
+
+      /* set the FirstFree member to the second entry and chain the
+         free entries */
+      HandleTable->FirstFree = HandleTable->NextHandleNeedingPool + 1;
+      for(cure = Entry + 1, laste = Entry + N_SUBHANDLE_ENTRIES, i = HandleTable->FirstFree + 1;
+          cure != laste;
+          cure++, i++)
+      {
+        cure->Object = NULL;
+        cure->NextFreeTableEntry = i;
+      }
+      /* truncate the free entry list */
+      (cure - 1)->NextFreeTableEntry = -1;
+
+      /* save the pointers to the allocated list(s) */
+      (void)InterlockedExchangePointer(&nmtbl[mli], ntbl);
+      if(AllocatedMtbl)
+      {
+        (void)InterlockedExchangePointer(&HandleTable->Table[tli], nmtbl);
+      }
+
+      /* increment the NextHandleNeedingPool to the next index where we need to
+         allocate new memory */
+      HandleTable->NextHandleNeedingPool += N_SUBHANDLE_ENTRIES;
+    }
+  }
+  else
+  {
+    DPRINT1("Can't allocate any more handles in handle table 0x%p!\n", HandleTable);
+  }
+
+  return Entry;
 }
 
-PHANDLE_TABLE
-NTAPI
-ExCreateHandleTable(IN PEPROCESS Process OPTIONAL)
+static VOID
+ExpFreeHandleTableEntry(IN PHANDLE_TABLE HandleTable,
+                        IN PHANDLE_TABLE_ENTRY Entry,
+                        IN LONG Handle)
 {
-    PHANDLE_TABLE HandleTable;
-    PAGED_CODE();
+  PAGED_CODE();
 
-    /* Allocate the handle table */
-    HandleTable = ExpAllocateHandleTable(Process, TRUE);
-    if (!HandleTable) return NULL;
-
-    /* Acquire the handle table lock */
-    KeEnterCriticalRegion();
-    ExAcquirePushLockExclusive(&HandleTableListLock);
+  ASSERT(HandleTable);
+  ASSERT(Entry);
+  ASSERT(IS_VALID_EX_HANDLE(Handle));
 
-    /* Insert it into the list */
-    InsertTailList(&HandleTableListHead, &HandleTable->HandleTableList);
+  DPRINT("ExpFreeHandleTableEntry HT:0x%p Entry:0x%p\n", HandleTable, Entry);
 
-    /* Release the lock */
-    ExReleasePushLockExclusive(&HandleTableListLock);
-    KeLeaveCriticalRegion();
+  /* automatically unlock the entry if currently locked. We however don't notify
+     anyone who waited on the handle because we're holding an exclusive lock after
+     all and these locks will fail then */
+  (void)InterlockedExchangePointer(&Entry->Object, NULL);
+  Entry->NextFreeTableEntry = HandleTable->FirstFree;
+  HandleTable->FirstFree = Handle;
 
-    /* Return the handle table */
-    return HandleTable;
+  HandleTable->HandleCount--;
 }
 
-HANDLE
-NTAPI
-ExCreateHandle(IN PHANDLE_TABLE HandleTable,
-               IN PHANDLE_TABLE_ENTRY HandleTableEntry)
+static PHANDLE_TABLE_ENTRY
+ExpLookupHandleTableEntry(IN PHANDLE_TABLE HandleTable,
+                          IN LONG Handle)
 {
-    EXHANDLE Handle;
-    PHANDLE_TABLE_ENTRY NewEntry;
-    PAGED_CODE();
+  PHANDLE_TABLE_ENTRY Entry = NULL;
 
-    /* Start with a clean handle */
-    Handle.GenericHandleOverlay = NULL;
+  PAGED_CODE();
 
-    /* Allocate a new entry */
-    NewEntry = ExpAllocateHandleTableEntry(HandleTable, &Handle);
-    if (NewEntry)
-    {
-        /* Enter a critical region */
-        KeEnterCriticalRegion();
+  ASSERT(HandleTable);
 
-        /* Write the entry */
-        *NewEntry = *HandleTableEntry;
+  if(IS_VALID_EX_HANDLE(Handle))
+  {
+    ULONG tli, mli, eli;
+    PHANDLE_TABLE_ENTRY *mlp;
 
-        /* Unlock it and leave the critical region */
-        ExUnlockHandleTableEntry(HandleTable, NewEntry);
-        KeLeaveCriticalRegion();
+    tli = TLI_FROM_HANDLE(Handle);
+    mli = MLI_FROM_HANDLE(Handle);
+    eli = ELI_FROM_HANDLE(Handle);
+
+    mlp = HandleTable->Table[tli];
+    if(Handle < HandleTable->NextHandleNeedingPool &&
+       mlp != NULL && mlp[mli] != NULL && mlp[mli][eli].Object != NULL)
+    {
+      Entry = &mlp[mli][eli];
+      DPRINT("handle lookup 0x%x -> entry 0x%p [HT:0x%p] ptr: 0x%p\n", Handle, Entry, HandleTable, mlp[mli][eli].Object);
     }
+  }
+  else
+  {
+    DPRINT("Looking up invalid handle 0x%x\n", Handle);
+  }
 
-    /* Return the handle value */
-    return Handle.GenericHandleOverlay;
+  return Entry;
 }
 
-VOID
-NTAPI
-ExpBlockOnLockedHandleEntry(IN PHANDLE_TABLE HandleTable,
-                            IN PHANDLE_TABLE_ENTRY HandleTableEntry)
+BOOLEAN
+ExLockHandleTableEntry(IN PHANDLE_TABLE HandleTable,
+                       IN PHANDLE_TABLE_ENTRY Entry)
 {
-    LONG_PTR OldValue;
-    DEFINE_WAIT_BLOCK(WaitBlock);
+  ULONG_PTR Current, New;
 
-    /* Block on the pushlock */
-    ExBlockPushLock(&HandleTable->HandleContentionEvent, WaitBlock);
+  PAGED_CODE();
 
-    /* Get the current value and check if it's been unlocked */
-    OldValue = HandleTableEntry->Value;
-    if (!(OldValue) || (OldValue & EXHANDLE_TABLE_ENTRY_LOCK_BIT))
-    {
-        /* Unblock the pushlock and return */
-        ExfUnblockPushLock(&HandleTable->HandleContentionEvent, WaitBlock);
-    }
-    else
-    {
-        /* Wait for it to be unblocked */
-        ExWaitForUnblockPushLock(&HandleTable->HandleContentionEvent,
-                                 WaitBlock);
-    }
-}
+  DPRINT("Entering handle table entry 0x%p lock...\n", Entry);
 
-BOOLEAN
-NTAPI
-ExpLockHandleTableEntry(IN PHANDLE_TABLE HandleTable,
-                        IN PHANDLE_TABLE_ENTRY HandleTableEntry)
-{
-    LONG_PTR NewValue, OldValue;
+  ASSERT(HandleTable);
+  ASSERT(Entry);
 
-    /* Sanity check */
-    ASSERT((KeGetCurrentThread()->CombinedApcDisable != 0) ||
-           (KeGetCurrentIrql() == APC_LEVEL));
+  for(;;)
+  {
+    Current = (volatile ULONG_PTR)Entry->Object;
 
-    /* Start lock loop */
-    for (;;)
+    if(!Current || (HandleTable->Flags & EX_HANDLE_TABLE_CLOSING))
     {
-        /* Get the current value and check if it's locked */
-        OldValue = (LONG_PTR)HandleTableEntry->Object;
-        if (OldValue & EXHANDLE_TABLE_ENTRY_LOCK_BIT)
-        {
-            /* It's not locked, remove the lock bit to lock it */
-            NewValue = OldValue & ~EXHANDLE_TABLE_ENTRY_LOCK_BIT;
-            if (InterlockedCompareExchangePointer(&HandleTableEntry->Object,
-                                                  NewValue,
-                                                  OldValue) == (PVOID)OldValue)
-            {
-                /* We locked it, get out */
-                return TRUE;
-            }
-        }
-        else
-        {
-            /* We couldn't lock it, bail out if it's been freed */
-            if (!OldValue) return FALSE;
-        }
-
-        /* It's locked, wait for it to be unlocked */
-        ExpBlockOnLockedHandleEntry(HandleTable, HandleTableEntry);
+      DPRINT("Attempted to lock empty handle table entry 0x%p or handle table shut down\n", Entry);
+      break;
     }
-}
 
-VOID
-NTAPI
-ExUnlockHandleTableEntry(IN PHANDLE_TABLE HandleTable,
-                         IN PHANDLE_TABLE_ENTRY HandleTableEntry)
-{
-    LONG_PTR OldValue;
-    PAGED_CODE();
-
-    /* Sanity check */
-    ASSERT((KeGetCurrentThread()->CombinedApcDisable != 0) ||
-           (KeGetCurrentIrql() == APC_LEVEL));
+    if(!(Current & EX_HANDLE_ENTRY_LOCKED))
+    {
+      New = Current | EX_HANDLE_ENTRY_LOCKED;
+      if(InterlockedCompareExchangePointer(&Entry->Object,
+                                           (PVOID)New,
+                                           (PVOID)Current) == (PVOID)Current)
+      {
+        DPRINT("SUCCESS handle table 0x%p entry 0x%p lock\n", HandleTable, Entry);
+        /* we acquired the lock */
+        return TRUE;
+      }
+    }
 
-    /* Set the lock bit and make sure it wasn't earlier */
-    OldValue = InterlockedOr((PLONG) &HandleTableEntry->Value,
-                             EXHANDLE_TABLE_ENTRY_LOCK_BIT);
-    ASSERT((OldValue & EXHANDLE_TABLE_ENTRY_LOCK_BIT) == 0);
+    /* wait about 5ms at maximum so we don't wait forever in unfortunate
+       co-incidences where releasing the lock in another thread happens right
+       before we're waiting on the contention event to get pulsed, which might
+       never happen again... */
+    KeWaitForSingleObject(&HandleTable->HandleContentionEvent,
+                          Executive,
+                          KernelMode,
+                          FALSE,
+                          &ExpHandleShortWait);
+  }
 
-    /* Unblock any waiters */
-    ExfUnblockPushLock(&HandleTable->HandleContentionEvent, NULL);
+  return FALSE;
 }
 
 VOID
-NTAPI
-ExRemoveHandleTable(IN PHANDLE_TABLE HandleTable)
+ExUnlockHandleTableEntry(IN PHANDLE_TABLE HandleTable,
+                         IN PHANDLE_TABLE_ENTRY Entry)
 {
-    PAGED_CODE();
+  ULONG_PTR Current, New;
 
-    /* Acquire the table lock */
-    KeEnterCriticalRegion();
-    ExAcquirePushLockExclusive(&HandleTableListLock);
+  PAGED_CODE();
 
-    /* Remove the table and reset the list */
-    RemoveEntryList(&HandleTable->HandleTableList);
-    InitializeListHead(&HandleTable->HandleTableList);
+  ASSERT(HandleTable);
+  ASSERT(Entry);
 
-    /* Release the lock */
-    ExReleasePushLockExclusive(&HandleTableListLock);
-    KeLeaveCriticalRegion();
-}
+  DPRINT("ExUnlockHandleTableEntry HT:0x%p Entry:0x%p\n", HandleTable, Entry);
 
-VOID
-NTAPI
-ExDestroyHandleTable(IN PHANDLE_TABLE HandleTable,
-                     IN PVOID DestroyHandleProcedure OPTIONAL)
-{
-    PAGED_CODE();
+  Current = (volatile ULONG_PTR)Entry->Object;
 
-    /* Remove the handle from the list */
-    ExRemoveHandleTable(HandleTable);
+  ASSERT(Current & EX_HANDLE_ENTRY_LOCKED);
 
-    /* Check if we have a desotry callback */
-    if (DestroyHandleProcedure)
-    {
-        /* FIXME: */
-        KEBUGCHECK(0);
-    }
+  New = Current & ~EX_HANDLE_ENTRY_LOCKED;
+
+  (void)InterlockedExchangePointer(&Entry->Object,
+                                   (PVOID)New);
 
-    /* Free the handle table */
-    ExpFreeHandleTable(HandleTable);
+  /* we unlocked the entry, pulse the contention event so threads who're waiting
+     on the release can continue */
+  KePulseEvent(&HandleTable->HandleContentionEvent,
+               EVENT_INCREMENT,
+               FALSE);
 }
 
-BOOLEAN
-NTAPI
-ExDestroyHandle(IN PHANDLE_TABLE HandleTable,
-                IN HANDLE Handle,
-                IN PHANDLE_TABLE_ENTRY HandleTableEntry OPTIONAL)
+HANDLE
+ExCreateHandle(IN PHANDLE_TABLE HandleTable,
+               IN PHANDLE_TABLE_ENTRY Entry)
 {
-    EXHANDLE ExHandle;
-    PVOID Object;
-    PAGED_CODE();
+  PHANDLE_TABLE_ENTRY NewHandleTableEntry;
+  HANDLE Handle = NULL;
 
-    /* Setup the actual handle value */
-    ExHandle.GenericHandleOverlay = Handle;
+  PAGED_CODE();
 
-    /* Enter a critical region and check if we have to lookup the handle */
-    KeEnterCriticalRegion();
-    if (!HandleTableEntry)
-    {
-        /* Lookup the entry */
-        HandleTableEntry = ExpLookupHandleTableEntry(HandleTable, ExHandle);
+  ASSERT(HandleTable);
+  ASSERT(Entry);
 
-        /* Make sure that we found an entry, and that it's valid */
-        if (!(HandleTableEntry) ||
-            !(HandleTableEntry->Object) ||
-            (HandleTableEntry->NextFreeTableEntry == -2))
-        {
-            /* Invalid handle, fail */
-            KeLeaveCriticalRegion();
-            return FALSE;
-        }
+  /* The highest bit in Entry->Object has to be 1 so we make sure it's a
+     pointer to kmode memory. It will cleared though because it also indicates
+     the lock */
+  ASSERT((ULONG_PTR)Entry->Object & EX_HANDLE_ENTRY_LOCKED);
 
-        /* Lock the entry */
-        if (!ExpLockHandleTableEntry(HandleTable, HandleTableEntry))
-        {
-            /* Couldn't lock, fail */
-            KeLeaveCriticalRegion();
-            return FALSE;
-        }
-    }
-    else
-    {
-        /* Make sure the handle is locked */
-        ASSERT((HandleTableEntry->Value & EXHANDLE_TABLE_ENTRY_LOCK_BIT) == 0);
-    }
+  KeEnterCriticalRegion();
+  ExAcquireHandleLockExclusive(HandleTable);
 
-    /* Clear the handle */
-    Object = InterlockedExchangePointer(&HandleTableEntry->Object, NULL);
+  NewHandleTableEntry = ExpAllocateHandleTableEntry(HandleTable,
+                                                    &Handle);
+  if(NewHandleTableEntry != NULL)
+  {
+    *NewHandleTableEntry = *Entry;
 
-    /* Sanity checks */
-    ASSERT(Object != NULL);
-    ASSERT((((ULONG_PTR)Object) & EXHANDLE_TABLE_ENTRY_LOCK_BIT) == 0);
+    ExUnlockHandleTableEntry(HandleTable,
+                             NewHandleTableEntry);
+  }
 
-    /* Unblock the pushlock */
-    ExfUnblockPushLock(&HandleTable->HandleContentionEvent, NULL);
+  ExReleaseHandleLock(HandleTable);
+  KeLeaveCriticalRegion();
 
-    /* Free the actual entry */
-    ExpFreeHandleTableEntry(HandleTable, ExHandle, HandleTableEntry);
-
-    /* If we got here, return success */
-    KeLeaveCriticalRegion();
-    return TRUE;
+  return Handle;
 }
 
-PHANDLE_TABLE_ENTRY
-NTAPI
-ExMapHandleToPointer(IN PHANDLE_TABLE HandleTable,
-                     IN HANDLE Handle)
-{
-    EXHANDLE ExHandle;
-    PHANDLE_TABLE_ENTRY HandleTableEntry;
-    PAGED_CODE();
-
-    /* Set the handle value */
-    ExHandle.GenericHandleOverlay = Handle;
-
-    /* Fail if we got an invalid index */
-    if (!(ExHandle.Index & (LOW_LEVEL_ENTRIES - 1))) return NULL;
-
-    /* Do the lookup */
-    HandleTableEntry = ExpLookupHandleTableEntry(HandleTable, ExHandle);
-    if (!HandleTableEntry) return NULL;
-
-    /* Lock it */
-    if (!ExpLockHandleTableEntry(HandleTable, HandleTableEntry)) return NULL;
-
-    /* Return the entry */
-    return HandleTableEntry;
-}
-
-PHANDLE_TABLE
-NTAPI
-ExDupHandleTable(IN PEPROCESS Process,
-                 IN PHANDLE_TABLE HandleTable,
-                 IN PEX_DUPLICATE_HANDLE_CALLBACK DupHandleProcedure,
-                 IN ULONG_PTR Mask)
+BOOLEAN
+ExDestroyHandle(IN PHANDLE_TABLE HandleTable,
+                IN HANDLE Handle)
 {
-    PHANDLE_TABLE NewTable;
-    EXHANDLE Handle;
-    PHANDLE_TABLE_ENTRY HandleTableEntry, NewEntry;
-    BOOLEAN Failed = FALSE;
-    PAGED_CODE();
-
-    /* Allocate the duplicated copy */
-    NewTable = ExpAllocateHandleTable(Process, FALSE);
-    if (!NewTable) return NULL;
-
-    /* Loop each entry */
-    while (NewTable->NextHandleNeedingPool <
-           HandleTable->NextHandleNeedingPool)
-    {
-        /* Insert it into the duplicated copy */
-        if (!ExpAllocateHandleTableEntrySlow(NewTable, FALSE))
-        {
-            /* Insert failed, free the new copy and return */
-            ExpFreeHandleTable(NewTable);
-            return NULL;
-        }
-    }
+  PHANDLE_TABLE_ENTRY HandleTableEntry;
+  LONG ExHandle;
+  BOOLEAN Ret = FALSE;
 
-    /* Setup the initial handle table data */
-    NewTable->HandleCount = 0;
-    NewTable->ExtraInfoPages = 0;
-    NewTable->FirstFree = 0;
+  PAGED_CODE();
 
-    /* Setup the first handle value  */
-    Handle.Value = SizeOfHandle(1);
+  ASSERT(HandleTable);
+  
+  ExHandle = HANDLE_TO_EX_HANDLE(Handle);
 
-    /* Enter a critical region and lookup the new entry */
-    KeEnterCriticalRegion();
-    while ((NewEntry = ExpLookupHandleTableEntry(NewTable, Handle)))
-    {
-        /* Lookup the old entry */
-        HandleTableEntry = ExpLookupHandleTableEntry(HandleTable, Handle);
+  KeEnterCriticalRegion();
+  ExAcquireHandleLockExclusive(HandleTable);
 
-        /* Loop each entry */
-        do
-        {
-            /* Check if it doesn't match the audit mask */
-            if (!(HandleTableEntry->Value & Mask))
-            {
-                /* Free it since we won't use it */
-                Failed = TRUE;
-            }
-            else
-            {
-                /* Lock the entry */
-                if (!ExpLockHandleTableEntry(HandleTable, HandleTableEntry))
-                {
-                    /* Free it since we can't lock it, so we won't use it */
-                    Failed = TRUE;
-                }
-                else
-                {
-                    /* Copy the handle value */
-                    *NewEntry = *HandleTableEntry;
-
-                    /* Call the duplicate callback */
-                    if (DupHandleProcedure(Process,
-                                           HandleTable,
-                                           HandleTableEntry,
-                                           NewEntry))
-                    {
-                        /* Lock the entry, increase the handle count */
-                        NewEntry->Value |= EXHANDLE_TABLE_ENTRY_LOCK_BIT;
-                        NewTable->HandleCount++;
-                    }
-                    else
-                    {
-                        /* Duplication callback refused, fail */
-                        Failed = TRUE;
-                    }
-                }
-            }
+  HandleTableEntry = ExpLookupHandleTableEntry(HandleTable,
+                                               ExHandle);
 
-            /* Check if we failed earlier and need to free */
-            if (Failed)
-            {
-                /* Free this entry */
-                NewEntry->Object = NULL;
-                NewEntry->NextFreeTableEntry = NewTable->FirstFree;
-                NewTable->FirstFree = Handle.Value;
-            }
+  if(HandleTableEntry != NULL && ExLockHandleTableEntry(HandleTable, HandleTableEntry))
+  {
+    /* free and automatically unlock the handle. However we don't need to pulse
+       the contention event since other locks on this entry will fail */
+    ExpFreeHandleTableEntry(HandleTable,
+                            HandleTableEntry,
+                            ExHandle);
+    Ret = TRUE;
+  }
 
-            /* Increase the handle value and move to the next entry */
-            Handle.Value += SizeOfHandle(1);
-            NewEntry++;
-            HandleTableEntry++;
-        } while (Handle.Value % SizeOfHandle(LOW_LEVEL_ENTRIES));
+  ExReleaseHandleLock(HandleTable);
+  KeLeaveCriticalRegion();
 
-        /* We're done, skip the last entry */
-        Handle.Value += SizeOfHandle(1);
-    }
-
-    /* Acquire the table lock and insert this new table into the list */
-    ExAcquirePushLockExclusive(&HandleTableListLock);
-    InsertTailList(&HandleTableListHead, &NewTable->HandleTableList);
-    ExReleasePushLockExclusive(&HandleTableListLock);
-
-    /* Leave the critical region we entered previously and return the table */
-    KeLeaveCriticalRegion();
-    return NewTable;
+  return Ret;
 }
 
-BOOLEAN
-NTAPI
-ExChangeHandle(IN PHANDLE_TABLE HandleTable,
-               IN HANDLE Handle,
-               IN PEX_CHANGE_HANDLE_CALLBACK ChangeRoutine,
-               IN ULONG_PTR Context)
+VOID
+ExDestroyHandleByEntry(IN PHANDLE_TABLE HandleTable,
+                       IN PHANDLE_TABLE_ENTRY Entry,
+                       IN HANDLE Handle)
 {
-    EXHANDLE ExHandle;
-    PHANDLE_TABLE_ENTRY HandleTableEntry;
-    BOOLEAN Result = FALSE;
-    PAGED_CODE();
+  PAGED_CODE();
 
-    /* Set the handle value */
-    ExHandle.GenericHandleOverlay = Handle;
+  ASSERT(HandleTable);
+  ASSERT(Entry);
 
-    /* Find the entry for this handle */
-    HandleTableEntry = ExpLookupHandleTableEntry(HandleTable, ExHandle);
+  /* This routine requires the entry to be locked */
+  ASSERT((ULONG_PTR)Entry->Object & EX_HANDLE_ENTRY_LOCKED);
 
-    /* Make sure that we found an entry, and that it's valid */
-    if (!(HandleTableEntry) ||
-        !(HandleTableEntry->Object) ||
-        (HandleTableEntry->NextFreeTableEntry == -2))
-    {
-        /* It isn't, fail */
-        return FALSE;
-    }
+  DPRINT("DestroyHandleByEntry HT:0x%p Entry:0x%p\n", HandleTable, Entry);
 
-    /* Enter a critical region */
     KeEnterCriticalRegion();
+    ExAcquireHandleLockExclusive(HandleTable);
 
-    /* Try locking the handle entry */
-    if (ExpLockHandleTableEntry(HandleTable, HandleTableEntry))
-    {
-        /* Call the change routine and unlock the entry */
-        Result = ChangeRoutine(HandleTableEntry, Context);
-        ExUnlockHandleTableEntry(HandleTable, HandleTableEntry);
-    }
+    /* free and automatically unlock the handle. However we don't need to pulse
+       the contention event since other locks on this entry will fail */
+    ExpFreeHandleTableEntry(HandleTable,
+                            Entry,
+                            HANDLE_TO_EX_HANDLE(Handle));
 
-    /* Leave the critical region and return the callback result */
+    ExReleaseHandleLock(HandleTable);
     KeLeaveCriticalRegion();
-    return Result;
 }
 
-VOID
-NTAPI
-ExSweepHandleTable(IN PHANDLE_TABLE HandleTable,
-                   IN PEX_SWEEP_HANDLE_CALLBACK EnumHandleProcedure,
-                   IN PVOID Context)
+PHANDLE_TABLE_ENTRY
+ExMapHandleToPointer(IN PHANDLE_TABLE HandleTable,
+                     IN HANDLE Handle)
 {
-    EXHANDLE Handle;
-    PHANDLE_TABLE_ENTRY HandleTableEntry;
-    PAGED_CODE();
+  PHANDLE_TABLE_ENTRY HandleTableEntry;
 
-    /* Set the initial value and loop the entries */
-    Handle.Value = SizeOfHandle(1);
-    while ((HandleTableEntry = ExpLookupHandleTableEntry(HandleTable, Handle)))
-    {
-        /* Loop each handle */
-        do
-        {
-            /* Lock the entry */
-            if (ExpLockHandleTableEntry(HandleTable, HandleTableEntry))
-            {
-                /* Notify the callback routine */
-                EnumHandleProcedure(HandleTableEntry,
-                                    Handle.GenericHandleOverlay,
-                                    Context);
-            }
+  PAGED_CODE();
 
-            /* Go to the next handle and entry */
-            Handle.Value += SizeOfHandle(1);
-            HandleTableEntry++;
-        } while (Handle.Value % SizeOfHandle(LOW_LEVEL_ENTRIES));
+  ASSERT(HandleTable);
 
-        /* Skip past the last entry */
-        Handle.Value += SizeOfHandle(1);
-    }
+  HandleTableEntry = ExpLookupHandleTableEntry(HandleTable,
+                                               HANDLE_TO_EX_HANDLE(Handle));
+  if (HandleTableEntry != NULL && ExLockHandleTableEntry(HandleTable, HandleTableEntry))
+  {
+    DPRINT("ExMapHandleToPointer HT:0x%p Entry:0x%p locked\n", HandleTable, HandleTableEntry);
+    return HandleTableEntry;
+  }
+
+  return NULL;
 }
 
-/*
- * @implemented
- */
 BOOLEAN
-NTAPI
-ExEnumHandleTable(IN PHANDLE_TABLE HandleTable,
-                  IN PEX_ENUM_HANDLE_CALLBACK EnumHandleProcedure,
-                  IN OUT PVOID Context,
-                  OUT PHANDLE EnumHandle OPTIONAL)
+ExChangeHandle(IN PHANDLE_TABLE HandleTable,
+               IN HANDLE Handle,
+               IN PEX_CHANGE_HANDLE_CALLBACK ChangeHandleCallback,
+               IN PVOID Context)
 {
-    EXHANDLE Handle;
-    PHANDLE_TABLE_ENTRY HandleTableEntry;
-    BOOLEAN Result = FALSE;
-    PAGED_CODE();
+  PHANDLE_TABLE_ENTRY HandleTableEntry;
+  BOOLEAN Ret = FALSE;
 
-    /* Enter a critical region */
-    KeEnterCriticalRegion();
+  PAGED_CODE();
 
-    /* Set the initial value and loop the entries */
-    Handle.Value = 0;
-    while ((HandleTableEntry = ExpLookupHandleTableEntry(HandleTable, Handle)))
-    {
-        /* Validate the entry */
-        if ((HandleTableEntry) &&
-            (HandleTableEntry->Object) &&
-            (HandleTableEntry->NextFreeTableEntry != -2) &&
-            (HandleTableEntry->Object != (PVOID)0xCDCDCDCD)) // HACK OF ETERNAL LAPDANCE
-        {
-            /* Lock the entry */
-            if (ExpLockHandleTableEntry(HandleTable, HandleTableEntry))
-            {
-                /* Notify the callback routine */
-                Result = EnumHandleProcedure(HandleTableEntry,
-                                             Handle.GenericHandleOverlay,
-                                             Context);
+  ASSERT(HandleTable);
+  ASSERT(ChangeHandleCallback);
 
-                /* Unlock it */
-                ExUnlockHandleTableEntry(HandleTable, HandleTableEntry);
+  KeEnterCriticalRegion();
 
-                /* Was this the one looked for? */
-                if (Result)
-                {
-                    /* If so, return it if requested */
-                    if (EnumHandle) *EnumHandle = Handle.GenericHandleOverlay;
-                    break;
-                }
-            }
-        }
+  HandleTableEntry = ExpLookupHandleTableEntry(HandleTable,
+                                               HANDLE_TO_EX_HANDLE(Handle));
 
-        /* Go to the next entry */
-        Handle.Value += SizeOfHandle(1);
-    }
+  if(HandleTableEntry != NULL && ExLockHandleTableEntry(HandleTable, HandleTableEntry))
+  {
+    Ret = ChangeHandleCallback(HandleTable,
+                               HandleTableEntry,
+                               Context);
 
-    /* Leave the critical region and return callback result */
-    KeLeaveCriticalRegion();
-    return Result;
+    ExUnlockHandleTableEntry(HandleTable,
+                             HandleTableEntry);
+  }
+
+  KeLeaveCriticalRegion();
+
+  return Ret;
 }
+
+/* EOF */
index ac0d8c4..068d5d9 100644 (file)
@@ -1,11 +1,11 @@
 /*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            ntoskrnl/ex/init.c
- * PURPOSE:         Executive Initialization Code
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
- *                  Eric Kohl (ekohl@rz-online.de)
- */
+* PROJECT:         ReactOS Kernel
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            ntoskrnl/ex/init.c
+* PURPOSE:         Executive Initialization Code
+* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+*                  Eric Kohl (ekohl@rz-online.de)
+*/
 
 /* INCLUDES ******************************************************************/
 
@@ -15,6 +15,9 @@
 
 /* DATA **********************************************************************/
 
+/* HACK */
+extern BOOLEAN KiClockSetupComplete;
+
 #define BUILD_OSCSDVERSION(major, minor) (((major & 0xFF) << 8) | (minor & 0xFF))
 
 /* NT Version Info */
@@ -30,17 +33,12 @@ ULONG ExpInitializationPhase;
 BOOLEAN ExpInTextModeSetup;
 BOOLEAN IoRemoteBootClient;
 ULONG InitSafeBootMode;
-BOOLEAN InitIsWinPEMode, InitWinPEModeType;
+
+BOOLEAN NoGuiBoot = FALSE;
 
 /* NT Boot Path */
 UNICODE_STRING NtSystemRoot;
 
-/* NT Initial User Application */
-WCHAR NtInitialUserProcessBuffer[128] = L"\\SystemRoot\\System32\\smss.exe";
-ULONG NtInitialUserProcessBufferLength = sizeof(NtInitialUserProcessBuffer) -
-                                         sizeof(WCHAR);
-ULONG NtInitialUserProcessBufferType = REG_SZ;
-
 /* Boot NLS information */
 PVOID ExpNlsTableBase;
 ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset;
@@ -49,9 +47,6 @@ NLSTABLEINFO ExpNlsTableInfo;
 ULONG ExpNlsTableSize;
 PVOID ExpNlsSectionPointer;
 
-/* CMOS Timer Sanity */
-BOOLEAN ExCmosClockIsSane = TRUE;
-
 /* FUNCTIONS ****************************************************************/
 
 NTSTATUS
@@ -73,7 +68,7 @@ ExpCreateSystemRootLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
                                &LinkName,
                                OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
                                NULL,
-                               SePublicDefaultUnrestrictedSd);
+                               SePublicDefaultSd);
 
     /* Create it */
     Status = NtCreateDirectoryObject(&LinkHandle,
@@ -81,7 +76,6 @@ ExpCreateSystemRootLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
                                      &ObjectAttributes);
     if (!NT_SUCCESS(Status))
     {
-        /* Failed */
         KeBugCheckEx(SYMBOLIC_INITIALIZATION_FAILED, Status, 1, 0, 0);
     }
 
@@ -94,7 +88,7 @@ ExpCreateSystemRootLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
                                &LinkName,
                                OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
                                NULL,
-                               SePublicDefaultUnrestrictedSd);
+                               SePublicDefaultSd);
 
     /* Create it */
     Status = NtCreateDirectoryObject(&LinkHandle,
@@ -102,7 +96,6 @@ ExpCreateSystemRootLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
                                      &ObjectAttributes);
     if (!NT_SUCCESS(Status))
     {
-        /* Failed */
         KeBugCheckEx(SYMBOLIC_INITIALIZATION_FAILED, Status, 2, 0, 0);
     }
 
@@ -114,7 +107,6 @@ ExpCreateSystemRootLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     Status = RtlAnsiStringToUnicodeString(&LinkName, &AnsiName, TRUE);
     if (!NT_SUCCESS(Status))
     {
-        /* Failed */
         KeBugCheckEx(SYMBOLIC_INITIALIZATION_FAILED, Status, 3, 0, 0);
     }
 
@@ -123,7 +115,7 @@ ExpCreateSystemRootLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
                                &LinkName,
                                OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
                                NULL,
-                               SePublicDefaultUnrestrictedSd);
+                               SePublicDefaultSd);
 
     /* Build the ARC name */
     sprintf(Buffer,
@@ -156,7 +148,6 @@ ExpCreateSystemRootLink(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     /* Check if creating the link failed */
     if (!NT_SUCCESS(Status))
     {
-        /* Failed */
         KeBugCheckEx(SYMBOLIC_INITIALIZATION_FAILED, Status, 5, 0, 0);
     }
 
@@ -314,21 +305,58 @@ ExpInitNls(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     ExpNlsTableBase = SectionBase;
 }
 
+VOID
+INIT_FUNCTION
+ExpDisplayNotice(VOID)
+{
+    CHAR str[50];
+   
+    if (ExpInTextModeSetup)
+    {
+        HalDisplayString(
+        "\n\n\n     ReactOS " KERNEL_VERSION_STR " Setup \n");
+        HalDisplayString(
+        "    \xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD");
+        HalDisplayString(
+        "\xCD\xCD\n");
+        return;
+    }
+    
+    HalDisplayString("Starting ReactOS "KERNEL_VERSION_STR" (Build "
+                     KERNEL_VERSION_BUILD_STR")\n");
+    HalDisplayString(RES_STR_LEGAL_COPYRIGHT);
+    HalDisplayString("\n\nReactOS is free software, covered by the GNU General "
+                     "Public License, and you\n");
+    HalDisplayString("are welcome to change it and/or distribute copies of it "
+                     "under certain\n");
+    HalDisplayString("conditions. There is absolutely no warranty for "
+                      "ReactOS.\n\n");
+
+    /* Display number of Processors */
+    sprintf(str,
+            "Found %x system processor(s). [%lu MB Memory]\n",
+            (int)KeNumberProcessors,
+            (MmFreeLdrMemHigher + 1088)/ 1024);
+    HalDisplayString(str);
+    
+}
+
 NTSTATUS
 NTAPI
-ExpLoadInitialProcess(IN OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation)
+ExpLoadInitialProcess(IN PHANDLE ProcessHandle,
+                      IN PHANDLE ThreadHandle)
 {
     PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL;
     NTSTATUS Status;
     ULONG Size;
+    RTL_USER_PROCESS_INFORMATION ProcessInformation;
     PWSTR p;
     UNICODE_STRING NullString = RTL_CONSTANT_STRING(L"");
     UNICODE_STRING SmssName, Environment, SystemDriveString;
-    PVOID EnvironmentPtr = NULL;
 
     /* Allocate memory for the process parameters */
     Size = sizeof(RTL_USER_PROCESS_PARAMETERS) +
-           ((MAX_PATH * 6) * sizeof(WCHAR));
+           ((MAX_PATH * 4) * sizeof(WCHAR));
     Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
                                      (PVOID)&ProcessParameters,
                                      0,
@@ -350,7 +378,7 @@ ExpLoadInitialProcess(IN OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation)
     /* Allocate a page for the environment */
     Size = PAGE_SIZE;
     Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
-                                     &EnvironmentPtr,
+                                     (PVOID)&ProcessParameters->Environment,
                                      0,
                                      &Size,
                                      MEM_COMMIT,
@@ -361,9 +389,6 @@ ExpLoadInitialProcess(IN OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation)
         KeBugCheckEx(SESSION2_INITIALIZATION_FAILED, Status, 0, 0, 0);
     }
 
-    /* Write the pointer */
-    ProcessParameters->Environment = EnvironmentPtr;
-
     /* Make a buffer for the DOS path */
     p = (PWSTR)(ProcessParameters + 1);
     ProcessParameters->CurrentDirectory.DosPath.Buffer = p;
@@ -391,48 +416,11 @@ ExpLoadInitialProcess(IN OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation)
     ProcessParameters->ImagePathName.Buffer = p;
     ProcessParameters->ImagePathName.MaximumLength = MAX_PATH * sizeof(WCHAR);
 
-    /* Make sure the buffer is a valid string which within the given length */
-    if ((NtInitialUserProcessBufferType != REG_SZ) ||
-        ((NtInitialUserProcessBufferLength != -1) &&
-         ((NtInitialUserProcessBufferLength < sizeof(WCHAR)) ||
-          (NtInitialUserProcessBufferLength >
-           sizeof(NtInitialUserProcessBuffer) - sizeof(WCHAR)))))
-    {
-        /* Invalid initial process string, bugcheck */
-        KeBugCheckEx(SESSION2_INITIALIZATION_FAILED,
-                     (ULONG_PTR)STATUS_INVALID_PARAMETER,
-                     NtInitialUserProcessBufferType,
-                     NtInitialUserProcessBufferLength,
-                     sizeof(NtInitialUserProcessBuffer));
-    }
-
-    /* Cut out anything after a space */
-    p = NtInitialUserProcessBuffer;
-    while (*p && *p != L' ') p++;
-
-    /* Set the image path length */
-    ProcessParameters->ImagePathName.Length =
-        (USHORT)((PCHAR)p - (PCHAR)NtInitialUserProcessBuffer);
-
-    /* Copy the actual buffer */
-    RtlCopyMemory(ProcessParameters->ImagePathName.Buffer,
-                  NtInitialUserProcessBuffer,
-                  ProcessParameters->ImagePathName.Length);
-
-    /* Null-terminate it */
-    ProcessParameters->
-        ImagePathName.Buffer[ProcessParameters->ImagePathName.Length /
-                             sizeof(WCHAR)] = UNICODE_NULL;
-
-    /* Make a buffer for the command line */
-    p = (PWSTR)((PCHAR)ProcessParameters->ImagePathName.Buffer +
-                ProcessParameters->ImagePathName.MaximumLength);
-    ProcessParameters->CommandLine.Buffer = p;
-    ProcessParameters->CommandLine.MaximumLength = MAX_PATH * sizeof(WCHAR);
-
-    /* Add the image name to the command line */
-    RtlAppendUnicodeToString(&ProcessParameters->CommandLine,
-                             NtInitialUserProcessBuffer);
+    /* Append the system path and session manager name */
+    RtlAppendUnicodeToString(&ProcessParameters->ImagePathName,
+                             L"\\SystemRoot\\System32");
+    RtlAppendUnicodeToString(&ProcessParameters->ImagePathName,
+                             L"\\smss.exe");
 
     /* Create the environment string */
     RtlInitEmptyUnicodeString(&Environment,
@@ -458,8 +446,11 @@ ExpLoadInitialProcess(IN OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation)
     RtlAppendUnicodeStringToString(&Environment, &NtSystemRoot);
     RtlAppendUnicodeStringToString(&Environment, &NullString);
 
-    /* Create SMSS process */
+    /* Get and set the command line equal to the image path */
+    ProcessParameters->CommandLine = ProcessParameters->ImagePathName;
     SmssName = ProcessParameters->ImagePathName;
+
+    /* Create SMSS process */
     Status = RtlCreateUserProcess(&SmssName,
                                   OBJ_CASE_INSENSITIVE,
                                   RtlDeNormalizeProcessParams(
@@ -470,7 +461,7 @@ ExpLoadInitialProcess(IN OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation)
                                   FALSE,
                                   NULL,
                                   NULL,
-                                  ProcessInformation);
+                                  &ProcessInformation);
     if (!NT_SUCCESS(Status))
     {
         /* Failed */
@@ -478,14 +469,16 @@ ExpLoadInitialProcess(IN OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation)
     }
 
     /* Resume the thread */
-    Status = ZwResumeThread(ProcessInformation->ThreadHandle, NULL);
+    Status = ZwResumeThread(ProcessInformation.ThreadHandle, NULL);
     if (!NT_SUCCESS(Status))
     {
         /* Failed */
         KeBugCheckEx(SESSION4_INITIALIZATION_FAILED, Status, 0, 0, 0);
     }
 
-    /* Return success */
+    /* Return Handles */
+    *ProcessHandle = ProcessInformation.ProcessHandle;
+    *ThreadHandle = ProcessInformation.ThreadHandle;
     return STATUS_SUCCESS;
 }
 
@@ -630,99 +623,6 @@ ExpIsLoaderValid(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     return TRUE;
 }
 
-VOID
-NTAPI
-ExpLoadBootSymbols(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
-{
-    ULONG i = 0;
-    PLIST_ENTRY NextEntry;
-    ULONG Count, Length;
-    PWCHAR Name;
-    PLDR_DATA_TABLE_ENTRY LdrEntry;
-    BOOLEAN OverFlow = FALSE;
-    CHAR NameBuffer[256];
-    ANSI_STRING SymbolString;
-
-    /* Loop the driver list */
-    NextEntry = LoaderBlock->LoadOrderListHead.Flink;
-    while (NextEntry != &LoaderBlock->LoadOrderListHead)
-    {
-        /* Skip the first two images */
-        if (i >= 2)
-        {
-            /* Get the entry */
-            LdrEntry = CONTAINING_RECORD(NextEntry,
-                                         LDR_DATA_TABLE_ENTRY,
-                                         InLoadOrderLinks);
-            if (LdrEntry->FullDllName.Buffer[0] == L'\\')
-            {
-                /* We have a name, read its data */
-                Name = LdrEntry->FullDllName.Buffer;
-                Length = LdrEntry->FullDllName.Length / sizeof(WCHAR);
-
-                /* Check if our buffer can hold it */
-                if (sizeof(NameBuffer) < Length + sizeof(ANSI_NULL))
-                {
-                    /* It's too long */
-                    OverFlow = TRUE;
-                }
-                else
-                {
-                    /* Copy the name */
-                    for (Count = 0; Count < Length; Count++, Name++)
-                    {
-                        /* Copy the character */
-                        NameBuffer[Count] = (CHAR)*Name;
-                    }
-
-                    /* Null-terminate */
-                    NameBuffer[Count] = ANSI_NULL;
-                }
-            }
-            else
-            {
-                /* This should be a driver, check if it fits */
-                if (sizeof(NameBuffer) <
-                    (sizeof("\\System32\\Drivers\\") +
-                     NtSystemRoot.Length / sizeof(WCHAR) - sizeof(UNICODE_NULL) +
-                     LdrEntry->BaseDllName.Length / sizeof(WCHAR) +
-                     sizeof(ANSI_NULL)))
-                {
-                    /* Buffer too small */
-                    OverFlow = TRUE;
-                }
-                else
-                {
-                    /* Otherwise build the name. HACKED for GCC :( */
-                    sprintf(NameBuffer,
-                            "%c\\System32\\Drivers\\%S",
-                            SharedUserData->NtSystemRoot[2],
-                            LdrEntry->BaseDllName.Buffer);
-                }
-            }
-
-            /* Check if the buffer was ok */
-            if (!OverFlow)
-            {
-                /* Initialize the ANSI_STRING for the debugger */
-                RtlInitString(&SymbolString, NameBuffer);
-
-                /* Load the symbols */
-                DbgLoadImageSymbols(&SymbolString,
-                                    LdrEntry->DllBase,
-                                    0xFFFFFFFF);
-            }
-        }
-
-        /* Go to the next entry */
-        i++;
-        NextEntry = NextEntry->Flink;
-    }
-
-    /* Check if we should break after symbol load */
-    if (KdBreakAfterSymbolLoad) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
-}
-
 VOID
 NTAPI
 ExpInitializeExecutive(IN ULONG Cpu,
@@ -732,8 +632,6 @@ ExpInitializeExecutive(IN ULONG Cpu,
     CHAR Buffer[256];
     ANSI_STRING AnsiPath;
     NTSTATUS Status;
-    PCHAR CommandLine, PerfMem;
-    ULONG PerfMemUsed;
 
     /* Validate Loader */
     if (!ExpIsLoaderValid(LoaderBlock))
@@ -787,50 +685,6 @@ ExpInitializeExecutive(IN ULONG Cpu,
     /* Set phase to 0 */
     ExpInitializationPhase = 0;
 
-    /* Get boot command line */
-    CommandLine = LoaderBlock->LoadOptions;
-    if (CommandLine)
-    {
-        /* Upcase it for comparison and check if we're in performance mode */
-        _strupr(CommandLine);
-        PerfMem = strstr(CommandLine, "PERFMEM");
-        if (PerfMem)
-        {
-            /* Check if the user gave a number of bytes to use */
-            PerfMem = strstr(PerfMem, "=");
-            if (PerfMem)
-            {
-                /* Read the number of pages we'll use */
-                PerfMemUsed = atol(PerfMem + 1) * (1024 * 1024 / PAGE_SIZE);
-                if (PerfMem)
-                {
-                    /* FIXME: TODO */
-                    DPRINT1("BBT performance mode not yet supported."
-                            "/PERFMEM option ignored.\n");
-                }
-            }
-        }
-
-        /* Check if we're burning memory */
-        PerfMem = strstr(CommandLine, "BURNMEMORY");
-        if (PerfMem)
-        {
-            /* Check if the user gave a number of bytes to use */
-            PerfMem = strstr(PerfMem, "=");
-            if (PerfMem)
-            {
-                /* Read the number of pages we'll use */
-                PerfMemUsed = atol(PerfMem + 1) * (1024 * 1024 / PAGE_SIZE);
-                if (PerfMem)
-                {
-                    /* FIXME: TODO */
-                    DPRINT1("Burnable memory support not yet present."
-                            "/BURNMEM option ignored.\n");
-                }
-            }
-        }
-    }
-
     /* Setup NLS Base and offsets */
     NlsData = LoaderBlock->NlsData;
     ExpNlsTableBase = NlsData->AnsiCodePageData;
@@ -877,9 +731,9 @@ ExpInitializeExecutive(IN ULONG Cpu,
     Buffer[--AnsiPath.Length] = ANSI_NULL;
 
     /* Get the string from KUSER_SHARED_DATA's buffer */
-    RtlInitEmptyUnicodeString(&NtSystemRoot,
-                              SharedUserData->NtSystemRoot,
-                              sizeof(SharedUserData->NtSystemRoot));
+    NtSystemRoot.Buffer = SharedUserData->NtSystemRoot;
+    NtSystemRoot.MaximumLength = sizeof(SharedUserData->NtSystemRoot) / sizeof(WCHAR);
+    NtSystemRoot.Length = 0;
 
     /* Now fill it in */
     Status = RtlAnsiStringToUnicodeString(&NtSystemRoot, &AnsiPath, FALSE);
@@ -888,14 +742,11 @@ ExpInitializeExecutive(IN ULONG Cpu,
     /* Setup bugcheck messages */
     KiInitializeBugCheck();
 
-    /* Setup initial system settings (FIXME: Needs Cm Rewrite) */
-    //CmGetSystemControlValues(CommandLine, &CmControlVector);
-
     /* Initialize the executive at phase 0 */
     if (!ExInitSystem()) KEBUGCHECK(PHASE0_INITIALIZATION_FAILED);
 
-    /* Load boot symbols */
-    ExpLoadBootSymbols(LoaderBlock);
+    /* Break into the Debugger if requested */
+    if (KdPollBreakIn()) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
 
     /* Set system ranges */
     SharedUserData->Reserved1 = (ULONG_PTR)MmHighestUserAddress;
@@ -904,22 +755,6 @@ ExpInitializeExecutive(IN ULONG Cpu,
     /* Make a copy of the NLS Tables */
     ExpInitNls(LoaderBlock);
 
-    /* Check if the user wants a kernel stack trace database */
-    if (NtGlobalFlag & FLG_KERNEL_STACK_TRACE_DB)
-    {
-        /* FIXME: TODO */
-        DPRINT1("Kernel-mode stack trace support not yet present."
-                "FLG_KERNEL_STACK_TRACE_DB flag ignored.\n");
-    }
-
-    /* Check if he wanted exception logging */
-    if (NtGlobalFlag & FLG_ENABLE_EXCEPTION_LOGGING)
-    {
-        /* FIXME: TODO */
-        DPRINT1("Kernel-mode exception logging support not yet present."
-                "FLG_ENABLE_EXCEPTION_LOGGING flag ignored.\n");
-    }
-
     /* Initialize the Handle Table */
     ExpInitializeHandleTables();
 
@@ -948,11 +783,14 @@ ExpInitializeExecutive(IN ULONG Cpu,
     /* Load basic Security for other Managers */
     if (!SeInit()) KEBUGCHECK(SECURITY_INITIALIZATION_FAILED);
 
-    /* Initialize the Process Manager */
-    if (!PsInitSystem(LoaderBlock)) KEBUGCHECK(PROCESS_INITIALIZATION_FAILED);
+    /* Set up Region Maps, Sections and the Paging File */
+    MmInit2();
 
-    /* Initialize the PnP Manager */
-    if (!PpInitSystem()) KEBUGCHECK(PP0_INITIALIZATION_FAILED);
+    /* Initialize the boot video. */
+    InbvDisplayInitialize();
+
+    /* Initialize the Process Manager */
+    if (!PsInitSystem()) KEBUGCHECK(PROCESS_INITIALIZATION_FAILED);
 
     /* Initialize the User-Mode Debugging Subsystem */
     DbgkInitialize();
@@ -979,27 +817,14 @@ ExpInitializeExecutive(IN ULONG Cpu,
 
 VOID
 NTAPI
-Phase1InitializationDiscard(PVOID Context)
+ExPhase2Init(PVOID Context)
 {
-    PLOADER_PARAMETER_BLOCK LoaderBlock = Context;
-    PCHAR CommandLine, Y2KHackRequired;
     LARGE_INTEGER Timeout;
+    HANDLE ProcessHandle;
+    HANDLE ThreadHandle;
     NTSTATUS Status;
     TIME_FIELDS TimeFields;
-    LARGE_INTEGER SystemBootTime, UniversalBootTime, OldTime;
-    PRTL_USER_PROCESS_INFORMATION ProcessInfo;
-    BOOLEAN SosEnabled, NoGuiBoot;
-    ULONG YearHack = 0;
-
-    /* Allocate initial process information */
-    ProcessInfo = ExAllocatePoolWithTag(NonPagedPool,
-                                        sizeof(RTL_USER_PROCESS_INFORMATION),
-                                        TAG('I', 'n', 'i', 't'));
-    if (!ProcessInfo)
-    {
-        /* Bugcheck */
-        KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, STATUS_NO_MEMORY, 8, 0, 0);
-    }
+    LARGE_INTEGER SystemBootTime, UniversalBootTime;
 
     /* Set to phase 1 */
     ExpInitializationPhase = 1;
@@ -1008,61 +833,25 @@ Phase1InitializationDiscard(PVOID Context)
     KeSetPriorityThread(KeGetCurrentThread(), HIGH_PRIORITY);
 
     /* Do Phase 1 HAL Initialization */
-    if (!HalInitSystem(1, LoaderBlock)) KeBugCheck(HAL1_INITIALIZATION_FAILED);
-
-    /* Get the command line and upcase it */
-    CommandLine = _strupr(LoaderBlock->LoadOptions);
+    HalInitSystem(1, KeLoaderBlock);
 
     /* Check if GUI Boot is enabled */
-    NoGuiBoot = (strstr(CommandLine, "NOGUIBOOT")) ? TRUE: FALSE;
-
-    /* Get the SOS setting */
-    SosEnabled = strstr(CommandLine, "SOS") ? TRUE: FALSE;
+    if (strstr(KeLoaderBlock->LoadOptions, "NOGUIBOOT")) NoGuiBoot = TRUE;
 
-    /* Setup the boot driver */
-    InbvDisplayInitialize();
+    /* Display the boot screen image if not disabled */
     if (!ExpInTextModeSetup) InbvDisplayInitialize2(NoGuiBoot);
+    if (!NoGuiBoot) InbvDisplayBootLogo();
 
-    /* Check if GUI boot is enabled */
-    if (!NoGuiBoot)
-    {
-        /* It is, display the boot logo and enable printing strings */
-        InbvEnableDisplayString(SosEnabled);
-        InbvDisplayBootLogo(SosEnabled);
-    }
-    else
-    {
-        /* Release display ownership if not using GUI boot */
-        if (!SosEnabled) InbvNotifyDisplayOwnershipLost(NULL);
-
-        /* Don't allow boot-time strings */
-        InbvEnableDisplayString(FALSE);
-    }
-
-    /* Check if this is LiveCD (WinPE) mode */
-    if (strstr(CommandLine, "MININT"))
-    {
-        /* Setup WinPE Settings */
-        InitIsWinPEMode = TRUE;
-        InitWinPEModeType |= (strstr(CommandLine, "INRAM")) ? 0x80000000 : 1;
-    }
-
-    /* FIXME: Print product name, version, and build */
+    /* Clear the screen to blue and display the boot notice and debug status */
+    if (NoGuiBoot) ExpDisplayNotice();
+    KdInitSystem(2, KeLoaderBlock);
 
     /* Initialize Power Subsystem in Phase 0 */
-    if (!PoInitSystem(0, AcpiTableDetected)) KeBugCheck(INTERNAL_POWER_ERROR);
-
-    /* Check for Y2K hack */
-    Y2KHackRequired = strstr(CommandLine, "YEAR");
-    if (Y2KHackRequired) Y2KHackRequired = strstr(Y2KHackRequired, "=");
-    if (Y2KHackRequired) YearHack = atol(Y2KHackRequired + 1);
+    PoInit(0, AcpiTableDetected);
 
     /* Query the clock */
-    if ((ExCmosClockIsSane) && (HalQueryRealTimeClock(&TimeFields)))
+    if (HalQueryRealTimeClock(&TimeFields))
     {
-        /* Check if we're using the Y2K hack */
-        if (Y2KHackRequired) TimeFields.Year = (CSHORT)YearHack;
-
         /* Convert to time fields */
         RtlTimeFieldsToTime(&TimeFields, &SystemBootTime);
         UniversalBootTime = SystemBootTime;
@@ -1081,157 +870,109 @@ Phase1InitializationDiscard(PVOID Context)
         UniversalBootTime.QuadPart = SystemBootTime.QuadPart +
                                      ExpTimeZoneBias.QuadPart;
 #endif
-
-        /* Update the system time */
-        KeSetSystemTime(&UniversalBootTime, &OldTime, FALSE, NULL);
+        KiSetSystemTime(&UniversalBootTime);
 
         /* Remember this as the boot time */
         KeBootTime = UniversalBootTime;
-        KeBootTimeBias = 0;
     }
 
-    /* Initialize all processors */
-    if (!HalAllProcessorsStarted()) KeBugCheck(HAL1_INITIALIZATION_FAILED);
-
-    /* FIXME: Print CPU and Memory */
+    /* The clock is ready now (FIXME: HACK FOR OLD HAL) */
+    KiClockSetupComplete = TRUE;
 
-    /* Update the progress bar */
-    InbvUpdateProgressBar(5);
+    /* Initialize all processors */
+    HalAllProcessorsStarted();
 
     /* Call OB initialization again */
     if (!ObInit()) KeBugCheck(OBJECT1_INITIALIZATION_FAILED);
 
     /* Initialize Basic System Objects and Worker Threads */
-    if (!ExInitSystem()) KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, 0, 0, 1, 0);
+    if (!ExInitSystem()) KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, 1, 0, 0, 0);
 
     /* Initialize the later stages of the kernel */
-    if (!KeInitSystem()) KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, 0, 0, 2, 0);
+    if (!KeInitSystem()) KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, 2, 0, 0, 0);
 
     /* Call KD Providers at Phase 1 */
     if (!KdInitSystem(ExpInitializationPhase, KeLoaderBlock))
     {
         /* Failed, bugcheck */
-        KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, 0, 0, 3, 0);
+        KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, 3, 0, 0, 0);
     }
 
-    /* Initialize the SRM in Phase 1 */
-    if (!SeInit()) KEBUGCHECK(SECURITY1_INITIALIZATION_FAILED);
-
-    /* Update the progress bar */
-    InbvUpdateProgressBar(10);
-
     /* Create SystemRoot Link */
-    Status = ExpCreateSystemRootLink(LoaderBlock);
+    Status = ExpCreateSystemRootLink(KeLoaderBlock);
     if (!NT_SUCCESS(Status))
     {
-        /* Failed to create the system root link */
         KeBugCheckEx(SYMBOLIC_INITIALIZATION_FAILED, Status, 0, 0, 0);
     }
 
-    /* Set up Region Maps, Sections and the Paging File */
-    if (!MmInitSystem(1, LoaderBlock)) KeBugCheck(MEMORY1_INITIALIZATION_FAILED);
-
     /* Create NLS section */
     ExpInitNls(KeLoaderBlock);
 
     /* Initialize Cache Views */
-    if (!CcInitializeCacheManager()) KeBugCheck(CACHE_INITIALIZATION_FAILED);
+    CcInitializeCacheManager();
 
     /* Initialize the Registry */
     if (!CmInitSystem1()) KeBugCheck(CONFIG_INITIALIZATION_FAILED);
 
-    /* Update progress bar */
-    InbvUpdateProgressBar(15);
-
     /* Update timezone information */
     ExRefreshTimeZoneInformation(&SystemBootTime);
 
     /* Initialize the File System Runtime Library */
-    if (!FsRtlInitSystem()) KeBugCheck(FILE_INITIALIZATION_FAILED);
+    FsRtlInitSystem();
 
     /* Report all resources used by HAL */
     HalReportResourceUsage();
 
-    /* Call the debugger DLL once we have KD64 6.0 support */
-    //KdDebuggerInitialize1(LoaderBlock);
-
-    /* Setup PnP Manager in phase 1 */
-    if (!PpInitSystem()) KeBugCheck(PP1_INITIALIZATION_FAILED);
-
-    /* Update progress bar */
-    InbvUpdateProgressBar(20);
-
     /* Initialize LPC */
-    if (!LpcInitSystem()) KeBugCheck(LPC_INITIALIZATION_FAILED);
+    LpcpInitSystem();
+
+    /* Enter the kernel debugger before starting up the boot drivers */
+    if (KdDebuggerEnabled && KdpEarlyBreak) DbgBreakPoint();
 
     /* Initialize the I/O Subsystem */
     if (!IoInitSystem(KeLoaderBlock)) KeBugCheck(IO1_INITIALIZATION_FAILED);
 
     /* Unmap Low memory, and initialize the MPW and Balancer Thread */
-    MmInitSystem(2, LoaderBlock);
-
-    /* Update progress bar */
-    InbvUpdateProgressBar(80);
+    MmInit3();
+#if DBG
+    extern ULONG Guard;
+#endif
+    ASSERT(Guard == 0xCACA1234);
 
     /* Initialize VDM support */
     KeI386VdmInitialize();
 
     /* Initialize Power Subsystem in Phase 1*/
-    if (!PoInitSystem(1, AcpiTableDetected)) KeBugCheck(INTERNAL_POWER_ERROR);
+    PoInit(1, AcpiTableDetected);
 
     /* Initialize the Process Manager at Phase 1 */
-    if (!PsInitSystem(LoaderBlock)) KeBugCheck(PROCESS1_INITIALIZATION_FAILED);
-
-    /* Update progress bar */
-    InbvUpdateProgressBar(85);
-
-    /* Make sure nobody touches the loader block again */
-    if (LoaderBlock == KeLoaderBlock) KeLoaderBlock = NULL;
-    LoaderBlock = Context = NULL;
-
-    /* Update progress bar */
-    InbvUpdateProgressBar(90);
+    if (!PsInitSystem()) KeBugCheck(PROCESS1_INITIALIZATION_FAILED);
 
     /* Launch initial process */
-    Status = ExpLoadInitialProcess(ProcessInfo);
-
-    /* Update progress bar */
-    InbvUpdateProgressBar(100);
-
-    /* Allow strings to be displayed */
-    InbvEnableDisplayString(TRUE);
+    Status = ExpLoadInitialProcess(&ProcessHandle, &ThreadHandle);
 
     /* Wait 5 seconds for it to initialize */
     Timeout.QuadPart = Int32x32To64(5, -10000000);
-    Status = ZwWaitForSingleObject(ProcessInfo->ProcessHandle, FALSE, &Timeout);
+    Status = ZwWaitForSingleObject(ProcessHandle, FALSE, &Timeout);
     if (!NoGuiBoot) InbvFinalizeBootLogo();
     if (Status == STATUS_SUCCESS)
     {
         /* Bugcheck the system if SMSS couldn't initialize */
         KeBugCheck(SESSION5_INITIALIZATION_FAILED);
     }
+    else
+    {
+        /* Close process handles */
+        ZwClose(ThreadHandle);
+        ZwClose(ProcessHandle);
 
-    /* Close process handles */
-    ZwClose(ProcessInfo->ThreadHandle);
-    ZwClose(ProcessInfo->ProcessHandle);
-
-    /* FIXME: We should free the initial process' memory!*/
-
-    /* Increase init phase */
-    ExpInitializationPhase += 1;
-
-    /* Free the process information */
-    ExFreePool(ProcessInfo);
-}
+        /* FIXME: We should free the initial process' memory!*/
 
-VOID
-NTAPI
-Phase1Initialization(IN PVOID Context)
-{
-    /* Do the .INIT part of Phase 1 which we can free later */
-    Phase1InitializationDiscard(Context);
+        /* Increase init phase */
+        ExpInitializationPhase += 1;
 
-    /* Jump into zero page thread */
-    MmZeroPageThreadMain(NULL);
+        /* Jump into zero page thread */
+        MmZeroPageThreadMain(NULL);
+    }
 }
-
+/* EOF */
index 9fbd88b..4619ce5 100644 (file)
@@ -24,8 +24,8 @@ LIST_ENTRY ExpPagedLookasideListHead;
 KSPIN_LOCK ExpPagedLookasideListLock;
 LIST_ENTRY ExSystemLookasideListHead;
 LIST_ENTRY ExPoolLookasideListHead;
-GENERAL_LOOKASIDE ExpSmallNPagedPoolLookasideLists[MAXIMUM_PROCESSORS];
-GENERAL_LOOKASIDE ExpSmallPagedPoolLookasideLists[MAXIMUM_PROCESSORS];
+NPAGED_LOOKASIDE_LIST ExpSmallNPagedPoolLookasideLists[MAXIMUM_PROCESSORS];
+PAGED_LOOKASIDE_LIST ExpSmallPagedPoolLookasideLists[MAXIMUM_PROCESSORS];
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
@@ -63,27 +63,30 @@ NTAPI
 ExInitPoolLookasidePointers(VOID)
 {
     ULONG i;
-    PKPRCB Prcb = KeGetCurrentPrcb();
-    PGENERAL_LOOKASIDE Entry;
+    PPP_LOOKASIDE_LIST Entry;
+    PNPAGED_LOOKASIDE_LIST ListEntry;
+    PPAGED_LOOKASIDE_LIST PagedListEntry;
 
-    /* Loop for all pool lists */
+    /* Loop for all CPUs */
     for (i = 0; i < MAXIMUM_PROCESSORS; i++)
     {
         /* Initialize the non-paged list */
-        Entry = &ExpSmallNPagedPoolLookasideLists[i];
-        InitializeSListHead(&Entry->ListHead);
+        ListEntry = &ExpSmallNPagedPoolLookasideLists[i];
+        InitializeSListHead(&ListEntry->L.ListHead);
 
         /* Bind to PRCB */
-        Prcb->PPNPagedLookasideList[i].P = Entry;
-        Prcb->PPNPagedLookasideList[i].L = Entry;
+        Entry = &KeGetCurrentPrcb()->PPPagedLookasideList[i];
+        Entry->L = &ListEntry->L;
+        Entry->P = &ListEntry->L;
 
         /* Initialize the paged list */
-        Entry = &ExpSmallPagedPoolLookasideLists[i];
-        InitializeSListHead(&Entry->ListHead);
+        PagedListEntry = &ExpSmallPagedPoolLookasideLists[i];
+        InitializeSListHead(&PagedListEntry->L.ListHead);
 
         /* Bind to PRCB */
-        Prcb->PPPagedLookasideList[i].P = Entry;
-        Prcb->PPPagedLookasideList[i].L = Entry;
+        Entry = &KeGetCurrentPrcb()->PPNPagedLookasideList[i];
+        Entry->L = &PagedListEntry->L;
+        Entry->P = &PagedListEntry->L;
     }
 }
 
@@ -91,7 +94,7 @@ VOID
 NTAPI
 ExpInitLookasideLists()
 {
-    ULONG i;
+    ULONG i, j;
 
     /* Initialize locks and lists */
     InitializeListHead(&ExpNonPagedLookasideListHead);
@@ -102,20 +105,20 @@ ExpInitLookasideLists()
     KeInitializeSpinLock(&ExpPagedLookasideListLock);
 
     /* Initialize the system lookaside lists */
-    for (i = 0; i < MAXIMUM_PROCESSORS; i++)
+    for (i = 0, j = 1; i < (MAXIMUM_PROCESSORS - 1); j++, i++)
     {
         /* Initialize the non-paged list */
-        ExInitializeSystemLookasideList(&ExpSmallNPagedPoolLookasideLists[i],
+        ExInitializeSystemLookasideList(&ExpSmallNPagedPoolLookasideLists[i].L,
                                         NonPagedPool,
-                                        (i + 1) * 8,
+                                        j * 8,
                                         TAG('P', 'o', 'o', 'l'),
                                         256,
                                         &ExPoolLookasideListHead);
 
         /* Initialize the paged list */
-        ExInitializeSystemLookasideList(&ExpSmallPagedPoolLookasideLists[i],
+        ExInitializeSystemLookasideList(&ExpSmallPagedPoolLookasideLists[i].L,
                                         PagedPool,
-                                        (i + 1) * 8,
+                                        j * 8,
                                         TAG('P', 'o', 'o', 'l'),
                                         256,
                                         &ExPoolLookasideListHead);
index 18aa4bb..80103ea 100644 (file)
@@ -341,33 +341,6 @@ ExTimedWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock,
     return Status;
 }
 
-/*++
- * @name ExWaitForUnblockPushLock
- *
- *     The ExWaitForUnblockPushLock routine waits for a pushlock
- *     to be unblocked, for a specified internal.
- *
- * @param PushLock
- *        Pointer to a pushlock whose waiter list needs to be optimized.
- *
- * @param WaitBlock
- *        Pointer to the pushlock's wait block.
- *
- * @return STATUS_SUCCESS is the pushlock is now unblocked, otherwise the error
- *         code returned by KeWaitForSingleObject.
- *
- * @remarks If the wait fails, then a manual unblock is attempted.
- *
- *--*/
-VOID
-FASTCALL
-ExWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock,
-                         IN PVOID WaitBlock)
-{
-    /* Call the timed function with no timeout */
-    ExTimedWaitForUnblockPushLock(PushLock, WaitBlock, NULL);
-}
-
 /*++
  * @name ExBlockPushLock
  *
@@ -387,33 +360,25 @@ ExWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock,
 VOID
 FASTCALL
 ExBlockPushLock(PEX_PUSH_LOCK PushLock,
-                PVOID pWaitBlock)
+                PVOID WaitBlock)
 {
-    PEX_PUSH_LOCK_WAIT_BLOCK WaitBlock = pWaitBlock;
-    EX_PUSH_LOCK NewValue, OldValue;
-    
-    /* Detect invalid wait block alignment */
-    ASSERT((ULONG_PTR)pWaitBlock & 0x10);
+    PVOID NewValue, OldValue;
 
     /* Set the waiting bit */
-    WaitBlock->Flags = EX_PUSH_LOCK_FLAGS_WAIT;
-    
-    /* Get the old value */
-    OldValue = *PushLock;
+    ((PEX_PUSH_LOCK_WAIT_BLOCK)WaitBlock)->Flags |= EX_PUSH_LOCK_FLAGS_WAIT;
+
+    /* Link the wait blocks */
+    ((PEX_PUSH_LOCK_WAIT_BLOCK)WaitBlock)->Next = PushLock->Ptr;
 
-    /* Start block loop */
+    /* Try to set this one as the wait block now */
+    NewValue = PushLock->Ptr;
     for (;;)
     {
-        /* Link the wait blocks */
-        WaitBlock->Next = OldValue.Ptr;
-
         /* Set the new wait block value */
-        NewValue.Ptr = InterlockedCompareExchangePointer(&PushLock->Ptr,
-                                                         WaitBlock,
-                                                         OldValue.Ptr);
-        if (OldValue.Ptr == NewValue.Ptr) break;
-        
-        /* Try again with the new value */
+        OldValue = InterlockedCompareExchangePointer(&PushLock->Ptr,
+                                                     WaitBlock,
+                                                     NewValue);
+        if (OldValue == NewValue) break;
         NewValue = OldValue;
     }
 }
@@ -439,7 +404,7 @@ VOID
 FASTCALL
 ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
 {
-    DEFINE_WAIT_BLOCK(WaitBlock);
+    EX_PUSH_LOCK_WAIT_BLOCK WaitBlock;
     EX_PUSH_LOCK OldValue = *PushLock, NewValue, TempValue;
     BOOLEAN NeedWake;
     ULONG i;
@@ -470,23 +435,23 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
         else
         {
             /* We'll have to create a Waitblock */
-            WaitBlock->Flags = EX_PUSH_LOCK_FLAGS_EXCLUSIVE |
-                               EX_PUSH_LOCK_FLAGS_WAIT;
-            WaitBlock->Previous = NULL;
+            WaitBlock.Flags = EX_PUSH_LOCK_FLAGS_EXCLUSIVE |
+                              EX_PUSH_LOCK_FLAGS_WAIT;
+            WaitBlock.Previous = NULL;
             NeedWake = FALSE;
 
             /* Check if there is already a waiter */
             if (OldValue.Waiting)
             {
                 /* Nobody is the last waiter yet */
-                WaitBlock->Last = NULL;
+                WaitBlock.Last = NULL;
 
                 /* We are an exclusive waiter */
-                WaitBlock->ShareCount = 0;
+                WaitBlock.ShareCount = 0;
 
                 /* Set the current Wait Block pointer */
-                WaitBlock->Next = (PEX_PUSH_LOCK_WAIT_BLOCK)((ULONG_PTR)
-                                   OldValue.Ptr &~ EX_PUSH_LOCK_PTR_BITS);
+                WaitBlock.Next = (PEX_PUSH_LOCK_WAIT_BLOCK)((ULONG_PTR)
+                                  OldValue.Ptr &~ EX_PUSH_LOCK_PTR_BITS);
 
                 /* Point to ours */
                 NewValue.Value = (OldValue.Value & EX_PUSH_LOCK_MULTIPLE_SHARED) |
@@ -501,10 +466,10 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
             else
             {
                 /* We are the first waiter, so loop the wait block */
-                WaitBlock->Last = WaitBlock;
+                WaitBlock.Last = &WaitBlock;
 
                 /* Set the share count */
-                WaitBlock->ShareCount = OldValue.Shared;
+                WaitBlock.ShareCount = OldValue.Shared;
 
                 /* Check if someone is sharing this pushlock */
                 if (OldValue.Shared > 1)
@@ -518,7 +483,7 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
                 else
                 {
                     /* No shared count */
-                    WaitBlock->ShareCount = 0;
+                    WaitBlock.ShareCount = 0;
 
                     /* Point to our wait block */
                     NewValue.Value = EX_PUSH_LOCK_LOCK |
@@ -529,10 +494,10 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
 
 #if DBG
             /* Setup the Debug Wait Block */
-            WaitBlock->Signaled = 0;
-            WaitBlock->OldValue = OldValue;
-            WaitBlock->NewValue = NewValue;
-            WaitBlock->PushLock = PushLock;
+            WaitBlock.Signaled = 0;
+            WaitBlock.OldValue = OldValue;
+            WaitBlock.NewValue = NewValue;
+            WaitBlock.PushLock = PushLock;
 #endif
 
             /* Sanity check */
@@ -559,26 +524,26 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
             }
 
             /* Set up the Wait Gate */
-            KeInitializeGate(&WaitBlock->WakeGate);
+            KeInitializeGate(&WaitBlock.WakeGate);
 
             /* Now spin on the push lock if necessary */
             i = ExPushLockSpinCount;
-            if ((i) && (WaitBlock->Flags & EX_PUSH_LOCK_WAITING))
+            if ((i) && (WaitBlock.Flags & EX_PUSH_LOCK_WAITING))
             {
                 /* Spin */
                 while (--i) YieldProcessor();
             }
 
             /* Now try to remove the wait bit */
-            if (InterlockedBitTestAndReset(&WaitBlock->Flags, 1))
+            if (InterlockedBitTestAndReset(&WaitBlock.Flags, 1))
             {
                 /* Nobody removed it already, let's do a full wait */
-                KeWaitForGate(&WaitBlock->WakeGate, WrPushLock, KernelMode);
-                ASSERT(WaitBlock->Signaled);
+                KeWaitForGate(&WaitBlock.WakeGate, WrPushLock, KernelMode);
+                ASSERT(WaitBlock.Signaled);
             }
 
             /* We shouldn't be shared anymore */
-            ASSERT((WaitBlock->ShareCount == 0));
+            ASSERT((WaitBlock.ShareCount == 0));
 
             /* Loop again */
             OldValue = NewValue;
@@ -605,7 +570,7 @@ VOID
 FASTCALL
 ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
 {
-    DEFINE_WAIT_BLOCK(WaitBlock);
+    EX_PUSH_LOCK_WAIT_BLOCK WaitBlock;
     EX_PUSH_LOCK OldValue = *PushLock, NewValue;
     BOOLEAN NeedWake;
     ULONG i;
@@ -649,20 +614,20 @@ ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
         else
         {
             /* We'll have to create a Waitblock */
-            WaitBlock->Flags = EX_PUSH_LOCK_FLAGS_WAIT;
-            WaitBlock->ShareCount = 0;
+            WaitBlock.Flags = EX_PUSH_LOCK_FLAGS_WAIT;
+            WaitBlock.ShareCount = 0;
             NeedWake = FALSE;
-            WaitBlock->Previous = NULL;
+            WaitBlock.Previous = NULL;
 
             /* Check if there is already a waiter */
             if (OldValue.Waiting)
             {
                 /* Set the current Wait Block pointer */
-                WaitBlock->Next = (PEX_PUSH_LOCK_WAIT_BLOCK)((ULONG_PTR)
-                                   OldValue.Ptr &~ EX_PUSH_LOCK_PTR_BITS);
+                WaitBlock.Next = (PEX_PUSH_LOCK_WAIT_BLOCK)((ULONG_PTR)
+                                 OldValue.Ptr &~ EX_PUSH_LOCK_PTR_BITS);
 
                 /* Nobody is the last waiter yet */
-                WaitBlock->Last = NULL;
+                WaitBlock.Last = NULL;
 
                 /* Point to ours */
                 NewValue.Value = (OldValue.Value & (EX_PUSH_LOCK_MULTIPLE_SHARED |
@@ -677,7 +642,7 @@ ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
             else
             {
                 /* We are the first waiter, so loop the wait block */
-                WaitBlock->Last = WaitBlock;
+                WaitBlock.Last = &WaitBlock;
 
                 /* Point to our wait block */
                 NewValue.Value = (OldValue.Value & (EX_PUSH_LOCK_MULTIPLE_SHARED |
@@ -691,10 +656,10 @@ ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
 
 #if DBG
             /* Setup the Debug Wait Block */
-            WaitBlock->Signaled = 0;
-            WaitBlock->OldValue = OldValue;
-            WaitBlock->NewValue = NewValue;
-            WaitBlock->PushLock = PushLock;
+            WaitBlock.Signaled = 0;
+            WaitBlock.OldValue = OldValue;
+            WaitBlock.NewValue = NewValue;
+            WaitBlock.PushLock = PushLock;
 #endif
 
             /* Write the new value */
@@ -718,26 +683,26 @@ ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
             }
 
             /* Set up the Wait Gate */
-            KeInitializeGate(&WaitBlock->WakeGate);
+            KeInitializeGate(&WaitBlock.WakeGate);
 
             /* Now spin on the push lock if necessary */
             i = ExPushLockSpinCount;
-            if ((i) && (WaitBlock->Flags & EX_PUSH_LOCK_WAITING))
+            if ((i) && (WaitBlock.Flags & EX_PUSH_LOCK_WAITING))
             {
                 /* Spin */
                 while (--i) YieldProcessor();
             }
 
             /* Now try to remove the wait bit */
-            if (InterlockedBitTestAndReset(&WaitBlock->Flags, 1))
+            if (InterlockedBitTestAndReset(&WaitBlock.Flags, 1))
             {
                 /* Fast-path did not work, we need to do a full wait */
-                KeWaitForGate(&WaitBlock->WakeGate, WrPushLock, KernelMode);
-                ASSERT(WaitBlock->Signaled);
+                KeWaitForGate(&WaitBlock.WakeGate, WrPushLock, KernelMode);
+                ASSERT(WaitBlock.Signaled);
             }
 
             /* We shouldn't be shared anymore */
-            ASSERT((WaitBlock->ShareCount == 0));
+            ASSERT((WaitBlock.ShareCount == 0));
         }
     }
 }
@@ -1039,7 +1004,7 @@ VOID
 FASTCALL
 ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
 {
-    EX_PUSH_LOCK NewValue, WakeValue;
+    EX_PUSH_LOCK NewValue;
     EX_PUSH_LOCK OldValue = *PushLock;
 
     /* Loop until we can change */
@@ -1059,8 +1024,7 @@ ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
             /* Sanity check */
             ASSERT(NewValue.Waking && !NewValue.Locked);
 
-            /* Write the New Value. Save our original value for waking */
-            WakeValue = NewValue;
+            /* Write the New Value */
             NewValue.Ptr = InterlockedCompareExchangePointer(PushLock,
                                                              NewValue.Ptr,
                                                              OldValue.Ptr);
@@ -1068,10 +1032,14 @@ ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
             /* Check if the value changed behind our back */
             if (NewValue.Value != OldValue.Value)
             {
-                /* Wake the Pushlock */
-                ExfWakePushLock(PushLock, WakeValue);
-                break;
+                /* Loop again */
+                OldValue = NewValue;
+                continue;
             }
+
+            /* Wake the Pushlock */
+            ExfWakePushLock(PushLock, NewValue);
+            break;
         }
         else
         {
@@ -1088,10 +1056,10 @@ ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
 
             /* Check if the value changed behind our back */
             if (NewValue.Value == OldValue.Value) break;
-        }
 
-        /* Loop again */
-        OldValue = NewValue;
+            /* Loop again */
+            OldValue = NewValue;
+        }
     }
 }
 
@@ -1160,7 +1128,7 @@ ExfUnblockPushLock(PEX_PUSH_LOCK PushLock,
     KIRQL OldIrql = DISPATCH_LEVEL;
 
     /* Get the wait block and erase the previous one */
-    WaitBlock = InterlockedExchangePointer(&PushLock->Ptr, NULL);
+    WaitBlock = InterlockedExchangePointer(PushLock->Ptr, 0);
     if (WaitBlock)
     {
         /* Check if there is a linked pushlock and raise IRQL appropriately */
@@ -1176,7 +1144,7 @@ ExfUnblockPushLock(PEX_PUSH_LOCK PushLock,
             if (InterlockedBitTestAndReset(&WaitBlock->Flags, 1))
             {
                 /* Nobody removed the flag before us, so signal the event */
-                KeSetEventBoostPriority(&WaitBlock->WakeEvent, NULL);
+                KeSetEventBoostPriority(&WaitBlock->WakeEvent, IO_NO_INCREMENT);
             }
 
             /* Check if there was a next block */
@@ -1193,6 +1161,6 @@ ExfUnblockPushLock(PEX_PUSH_LOCK PushLock,
            EX_PUSH_LOCK_FLAGS_WAIT))
     {
         /* Wait for the pushlock to be unblocked */
-        ExWaitForUnblockPushLock(PushLock, CurrentWaitBlock);
+        ExTimedWaitForUnblockPushLock(PushLock, CurrentWaitBlock, NULL);
     }
 }
index 3a4e2b9..a34fad9 100644 (file)
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
+
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, ExpResourceInitialization)
+#endif
 
 /* Macros for reading resource flags */
 #define IsExclusiveWaiting(r)   (r->NumberOfExclusiveWaiters)
 #define IsSharedWaiting(r)      (r->NumberOfSharedWaiters)
 #define IsOwnedExclusive(r)     (r->Flag & ResourceOwnedExclusive)
-#define IsBoostAllowed(r)       (r->Flag & ResourceHasDisabledPriorityBoost)
 
 /* DATA***********************************************************************/
 
@@ -255,7 +258,6 @@ ExpExpandResourceOwnerTable(IN PERESOURCE_XP Resource,
                             IN PKIRQL OldIrql)
 {
     POWNER_ENTRY Owner, Table;
-    KIRQL OldIrql2;
     ULONG NewSize, OldSize;
     DPRINT("ExpExpandResourceOwnerTable: %p\n", Resource);
 
@@ -283,7 +285,7 @@ ExpExpandResourceOwnerTable(IN PERESOURCE_XP Resource,
                                   TAG_RESOURCE_TABLE);
 
     /* Zero the table */
-    RtlZeroMemory(Table + OldSize,
+    RtlZeroMemory((PVOID)(Table + OldSize),
                   (NewSize - OldSize) * sizeof(OWNER_ENTRY));
 
     /* Lock the resource */
@@ -300,24 +302,22 @@ ExpExpandResourceOwnerTable(IN PERESOURCE_XP Resource,
     else
     {
         /* Copy the table */
-        RtlCopyMemory(Table,
+        RtlCopyMemory((PVOID)Table,
                       Owner,
                       OldSize * sizeof(OWNER_ENTRY));
 
         /* Acquire dispatcher lock to prevent thread boosting */
-        OldIrql2 = KiAcquireDispatcherLock();
+        KiAcquireDispatcherLockAtDpcLevel();
 
         /* Set the new table data */
         Table->TableSize = NewSize;
         Resource->OwnerTable = Table;
 
-        /* Release dispatcher lock */
-        KiReleaseDispatcherLock(OldIrql2);
-
         /* Sanity check */
         ExpVerifyResource(Resource);
 
-        /* Release lock */
+        /* Release locks */
+        KiReleaseDispatcherLockFromDpcLevel();
         ExReleaseResourceLock(&Resource->SpinLock, *OldIrql);
 
         /* Free the old table */
@@ -358,7 +358,9 @@ ExpFindFreeEntry(IN PERESOURCE_XP Resource,
                  IN PKIRQL OldIrql)
 {
     POWNER_ENTRY Owner, Limit;
+    ULONG Size;
     POWNER_ENTRY FreeEntry = NULL;
+    DPRINT("ExpFindFreeEntry: %p\n", Resource);
 
     /* Sanity check */
     ASSERT(OldIrql != 0);
@@ -376,24 +378,34 @@ ExpFindFreeEntry(IN PERESOURCE_XP Resource,
         Owner = Resource->OwnerTable;
         if (Owner)
         {
-            /* Set the limit, move to the next owner and loop owner entries */
-            Limit = &Owner[Owner->TableSize];
+            /* Loop every entry */
+            Size = Owner->TableSize;
+            Limit = &Owner[Size];
+
+            /* Go to the next entry and loop */
             Owner++;
             do
             {
-                /* Check if the entry is free */
+                /* Check for a free entry */
                 if (!Owner->OwnerThread)
                 {
-                    /* Update the resource entry and return it */
-                    KeGetCurrentThread()->ResourceIndex = (UCHAR)(Owner -
-                                                                  Resource->
-                                                                  OwnerTable);
-                    return Owner;
+                    /* Found one, return it!*/
+                    FreeEntry = Owner;
+                    break;
                 }
 
-                /* Move to the next one */
+                /* Move on */
                 Owner++;
             } while (Owner != Limit);
+
+            /* If we found a free entry by now, return it */
+            if (FreeEntry)
+            {
+                /* Set the resource index */
+                KeGetCurrentThread()->ResourceIndex = 
+                    (UCHAR)(Owner - Resource->OwnerTable);
+                return FreeEntry;
+            }
         }
 
         /* No free entry, expand the table */
@@ -433,39 +445,63 @@ ExpFindEntryForThread(IN PERESOURCE_XP Resource,
                       IN PKIRQL OldIrql)
 {
     POWNER_ENTRY FreeEntry, Owner, Limit;
+    ULONG Size;
+    DPRINT("ExpFindEntryForThread: %p\n", Resource);
 
     /* Start by looking in the static array */
-    Owner = &Resource->OwnerThreads[0];
-    if (Owner->OwnerThread == Thread) return Owner;
-    Owner++;
-    if (Owner->OwnerThread == Thread) return Owner;
-
-    /* Check if this is a free entry */
-    FreeEntry = !Owner->OwnerThread ? Owner : NULL;
-
-    /* Loop the table */
-    Owner = Resource->OwnerTable;
-    if (Owner)
+    if (Resource->OwnerThreads[0].OwnerThread == Thread)
     {
-        /* Calculate the limit, skip the first entry, and start looping */
-        Limit = &Owner[Owner->TableSize];
-        Owner++;
-        do
+        /* Found it, return it! */
+        return &Resource->OwnerThreads[0];
+    }
+    else if (Resource->OwnerThreads[1].OwnerThread == Thread)
+    {
+        /* Return it */
+        return &Resource->OwnerThreads[1];
+    }
+    else
+    {
+        /* Check if the first array is empty for our use */
+        FreeEntry = NULL;
+        if (!Resource->OwnerThreads[1].OwnerThread)
         {
-            /* Check if we found a match */
-            if (Owner->OwnerThread == Thread)
-            {
-                /* We did, update the index and return it */
-                KeGetCurrentThread()->ResourceIndex = (UCHAR)(Owner -
-                                                              Resource->
-                                                              OwnerTable);
-                return Owner;
-            }
+            /* Use this as the first free entry */
+            FreeEntry = &Resource->OwnerThreads[1];
+        }
+
+        /* Get the current table pointer */
+        Owner = Resource->OwnerTable;
+        if (!Owner)
+        {
+            /* The current table is empty, so no size */
+            Size = 0;
+        }
+        else
+        {
+            /* We have a table, get it's size and limit */
+            Size = Owner->TableSize;
+            Limit = &Owner[Size];
 
-            /* If we don't yet have a free entry and this one is, choose it */
-            if (!(FreeEntry) && !(Owner->OwnerThread)) FreeEntry = Owner;
+            /* Go to the next entry and loop */
             Owner++;
-        } while (Owner != Limit);
+            do
+            {
+                /* Check for a match */
+                if (Owner->OwnerThread == Thread)
+                {
+                    /* Match found! Set the resource index */
+                    KeGetCurrentThread()->ResourceIndex = 
+                        (UCHAR)(Owner - Resource->OwnerTable);
+                    return Owner;
+                }
+
+                /* If we don't have a free entry yet, make this one free */
+                if (!(FreeEntry) && !(Owner->OwnerThread)) FreeEntry = Owner;
+
+                /* Move on */
+                Owner++;
+            } while (Owner != Limit);
+        }
     }
 
     /* Check if it's OK to do an expansion */
@@ -475,8 +511,8 @@ ExpFindEntryForThread(IN PERESOURCE_XP Resource,
     if (FreeEntry)
     {
         /* Set the resource index */
-        KeGetCurrentThread()->ResourceIndex = (UCHAR)(FreeEntry -
-                                                      Resource->OwnerTable);
+        KeGetCurrentThread()->ResourceIndex = (UCHAR)
+                                              (Owner - Resource->OwnerTable);
         return FreeEntry;
     }
 
@@ -502,11 +538,19 @@ ExpFindEntryForThread(IN PERESOURCE_XP Resource,
  * @remarks None.
  *
  *--*/
+#if 0
+
+/*
+ * Disabled, read the comments bellow.
+ */
 VOID
 FASTCALL
 ExpBoostOwnerThread(IN PKTHREAD Thread,
                     IN PKTHREAD OwnerThread)
 {
+    BOOLEAN Released = FALSE;
+    DPRINT("ExpBoostOwnerThread: %p\n", Thread);
+
     /* Make sure the owner thread is a pointer, not an ID */
     if (!((ULONG_PTR)OwnerThread & 0x3))
     {
@@ -514,8 +558,8 @@ ExpBoostOwnerThread(IN PKTHREAD Thread,
         if ((OwnerThread->Priority < Thread->Priority) &&
             (OwnerThread->Priority < 14))
         {
-            /* Acquire the thread lock */
-            KiAcquireThreadLock(Thread);
+            /* Make sure we're at dispatch */
+            ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
 
             /* Set the new priority */
             OwnerThread->PriorityDecrement += 14 - OwnerThread->Priority;
@@ -524,13 +568,17 @@ ExpBoostOwnerThread(IN PKTHREAD Thread,
             OwnerThread->Quantum = OwnerThread->QuantumReset;
 
             /* Update the kernel state */
-            KiSetPriorityThread(OwnerThread, 14);
+            KiSetPriorityThread(OwnerThread, 14, &Released);
+
+            /* Reacquire lock if it got releases */
+            if (Released) KiAcquireDispatcherLockFromDpcLevel();
 
-            /* Release the thread lock */
-            KiReleaseThreadLock(Thread);
+            /* Make sure we're still at dispatch */
+            ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
         }
     }
 }
+#endif
 
 /*++
  * @name ExpWaitForResource
@@ -553,21 +601,20 @@ FASTCALL
 ExpWaitForResource(IN PERESOURCE_XP Resource,
                    IN PVOID Object)
 {
+#if DBG
     ULONG i;
     ULONG Size;
+    KIRQL OldIrql;
     POWNER_ENTRY Owner;
+#endif
     ULONG WaitCount = 0;
     NTSTATUS Status;
     LARGE_INTEGER Timeout;
-    PKTHREAD Thread, OwnerThread;
-#if DBG
-    KIRQL OldIrql;
-#endif
 
     /* Increase contention count and use a 5 second timeout */
     Resource->ContentionCount++;
     Timeout.QuadPart = 500 * -10000;
-    for (;;)
+    for(;;)
     {
         /* Wait for ownership */
         Status = KeWaitForSingleObject(Object,
@@ -628,10 +675,20 @@ ExpWaitForResource(IN PERESOURCE_XP Resource,
             ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
 #endif
         }
+#if 0
+/* 
+ * Disabled because:
+ * - We cannot access the OwnerTable without locking the resource.  
+ * - The shared waiters may wait also on the semaphore. It makes no sense to boost a waiting thread.  
+ * - The thread header is initialized like KeWaitForSingleObject (?, ?, ?, TRUE, ?). 
+ *   During the boost, possible the dispatcher lock is released but the thread block (WaitNext) isn't changed. 
+ */
 
         /* Check if we can boost */
-        if (IsBoostAllowed(Resource))
+        if (!(Resource->Flag & ResourceHasDisabledPriorityBoost))
         {
+            PKTHREAD Thread, OwnerThread;
+
             /* Get the current kernel thread and lock the dispatcher */
             Thread = KeGetCurrentThread();
             Thread->WaitIrql = KiAcquireDispatcherLock();
@@ -668,6 +725,7 @@ ExpWaitForResource(IN PERESOURCE_XP Resource,
                 }
             }
         }
+#endif
     }
 }
 
@@ -733,6 +791,8 @@ ExAcquireResourceExclusiveLite(PERESOURCE resource,
 
     /* Check if there is a shared owner or exclusive owner */
 TryAcquire:
+    DPRINT("ExAcquireResourceExclusiveLite(Resource 0x%p, Wait %d)\n",
+           Resource, Wait);
     if (Resource->ActiveCount)
     {
         /* Check if it's exclusively owned, and we own it */
@@ -771,7 +831,7 @@ TryAcquire:
                     ExpWaitForResource(Resource, Resource->ExclusiveWaiters);
 
                     /* Set owner and return success */
-                    Resource->OwnerThreads[0].OwnerThread = ExGetCurrentResourceThread();
+                    Resource->OwnerThreads[0].OwnerThread = Thread;
                     return TRUE;
                 }
             }
@@ -845,10 +905,21 @@ ExAcquireResourceSharedLite(PERESOURCE resource,
 
     /* See if nobody owns us */
 TryAcquire:
+    DPRINT("ExAcquireResourceSharedLite(Resource 0x%p, Wait %d)\n",
+            Resource, Wait);
     if (!Resource->ActiveCount)
     {
-        /* Setup the owner entry */
-        Owner = &Resource->OwnerThreads[1];
+        if (Resource->NumberOfSharedWaiters == 0)
+        {
+           Owner = &Resource->OwnerThreads[1];
+        }
+        else
+        {
+           /* Find a free entry */
+           Owner = ExpFindFreeEntry(Resource, &OldIrql);
+           if (!Owner) goto TryAcquire;
+        }
+
         Owner->OwnerThread = Thread;
         Owner->OwnerCount = 1;
         Resource->ActiveCount = 1;
@@ -995,6 +1066,8 @@ ExAcquireSharedStarveExclusive(PERESOURCE resource,
 
     /* See if nobody owns us */
 TryAcquire:
+    DPRINT("ExAcquireSharedStarveExclusive(Resource 0x%p, Wait %d)\n",
+            Resource, Wait);
     if (!Resource->ActiveCount)
     {
         /* Nobody owns it, so let's take control */
@@ -1024,6 +1097,22 @@ TryAcquire:
         /* Find a free entry */
         Owner = ExpFindFreeEntry(Resource, &OldIrql);
         if (!Owner) goto TryAcquire;
+
+        /* If we got here, then we need to wait. Are we allowed? */
+        if (!Wait)
+        {
+            /* Release the lock and return */
+            ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
+            return TRUE;
+        }
+
+        /* Check if we have a shared waiters semaphore */
+        if (!Resource->SharedWaiters)
+        {
+            /* Allocate one and try again */
+            ExpAllocateSharedWaiterSemaphore(Resource, &OldIrql);
+            goto TryAcquire;
+        }
     }
     else
     {
@@ -1105,8 +1194,8 @@ TryAcquire:
  *--*/
 BOOLEAN
 NTAPI
-ExAcquireSharedWaitForExclusive(IN PERESOURCE resource,
-                                IN BOOLEAN Wait)
+ExAcquireSharedWaitForExclusive(PERESOURCE resource,
+                                BOOLEAN Wait)
 {
     KIRQL OldIrql;
     ERESOURCE_THREAD Thread;
@@ -1125,6 +1214,8 @@ ExAcquireSharedWaitForExclusive(IN PERESOURCE resource,
 
     /* See if nobody owns us */
 TryAcquire:
+    DPRINT("ExAcquireSharedWaitForExclusive(Resource 0x%p, Wait %d)\n",
+            Resource, Wait);
     if (!Resource->ActiveCount)
     {
         /* Nobody owns it, so let's take control */
@@ -1150,10 +1241,38 @@ TryAcquire:
             ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
             return TRUE;
         }
+        else
+        {
+            /* Find a free entry */
+            Owner = ExpFindFreeEntry(Resource, &OldIrql);
+            if (!Owner) goto TryAcquire;
 
-        /* Find a free entry */
-        Owner = ExpFindFreeEntry(Resource, &OldIrql);
-        if (!Owner) goto TryAcquire;
+            /* If we got here, then we need to wait. Are we allowed? */
+            if (!Wait)
+            {
+                /* Release the lock and return */
+                ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
+                return TRUE;
+            }
+
+            /* Check if we have a shared waiters semaphore */
+            if (!Resource->SharedWaiters)
+            {
+                /* Allocate one and try again */
+                ExpAllocateSharedWaiterSemaphore(Resource, &OldIrql);
+                goto TryAcquire;
+            }
+
+            /* Now take control of the resource */
+            Owner->OwnerThread = Thread;
+            Owner->OwnerCount = 1;
+            Resource->NumberOfSharedWaiters++;
+
+            /* Release the lock and wait for it to be ours */
+            ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
+            ExpWaitForResource(Resource, Resource->SharedWaiters);
+            return TRUE;
+        }
     }
     else
     {
@@ -1185,7 +1304,7 @@ TryAcquire:
             ExAcquireResourceLock(&Resource->SpinLock, &OldIrql);
 
             /* Find who owns it now */
-            while (!(Owner = ExpFindEntryForThread(Resource, Thread, &OldIrql)));
+            Owner = ExpFindEntryForThread(Resource, Thread, &OldIrql);
 
             /* Sanity checks */
             ASSERT(IsOwnedExclusive(Resource) == FALSE);
@@ -1228,32 +1347,6 @@ TryAcquire:
             return TRUE;
         }
     }
-
-    /* We have to wait for the exclusive waiter to be done */
-    if (!Wait)
-    {
-        /* So bail out if we're not allowed */
-        ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
-        return TRUE;
-    }
-
-    /* Check if we have a shared waiters semaphore */
-    if (!Resource->SharedWaiters)
-    {
-        /* Allocate one and try again */
-        ExpAllocateSharedWaiterSemaphore(Resource, &OldIrql);
-        goto TryAcquire;
-    }
-
-    /* Take control */
-    Owner->OwnerThread = Thread;
-    Owner->OwnerCount = 1;
-    Resource->NumberOfSharedWaiters++;
-
-    /* Release the lock and return */
-    ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
-    ExpWaitForResource(Resource, Resource->SharedWaiters);
-    return TRUE;
 }
 
 /*++
@@ -1279,6 +1372,10 @@ ExConvertExclusiveToSharedLite(PERESOURCE resource)
     ULONG OldWaiters;
     KIRQL OldIrql;
     PERESOURCE_XP Resource = (PERESOURCE_XP)resource;
+    DPRINT("ExConvertExclusiveToSharedLite(Resource 0x%p)\n", Resource);
+
+    /* Lock the resource */
+    ExAcquireResourceLock(&Resource->SpinLock, &OldIrql);
 
     /* Sanity checks */
     ASSERT(KeIsExecutingDpc() == FALSE);
@@ -1286,17 +1383,14 @@ ExConvertExclusiveToSharedLite(PERESOURCE resource)
     ASSERT(IsOwnedExclusive(Resource));
     ASSERT(Resource->OwnerThreads[0].OwnerThread == (ERESOURCE_THREAD)PsGetCurrentThread());
 
-    /* Lock the resource */
-    ExAcquireResourceLock(&Resource->SpinLock, &OldIrql);
-
     /* Erase the exclusive flag */
     Resource->Flag &= ~ResourceOwnedExclusive;
 
     /* Check if we have shared waiters */
-    if (IsSharedWaiting(Resource))
+    OldWaiters = Resource->NumberOfSharedWaiters;
+    if (OldWaiters)
     {
         /* Make the waiters active owners */
-        OldWaiters = Resource->NumberOfSharedWaiters;
         Resource->ActiveCount = Resource->ActiveCount + (USHORT)OldWaiters;
         Resource->NumberOfSharedWaiters = 0;
 
@@ -1333,6 +1427,7 @@ ExDeleteResourceLite(PERESOURCE resource)
 {
     KIRQL OldIrql;
     PERESOURCE_XP Resource = (PERESOURCE_XP)resource;
+    DPRINT("ExDeleteResourceLite(Resource 0x%p)\n", Resource);
 
     /* Sanity checks */
     ASSERT(IsSharedWaiting(Resource) == FALSE);
@@ -1464,6 +1559,7 @@ NTAPI
 ExInitializeResourceLite(PERESOURCE resource)
 {
     PERESOURCE_XP Resource = (PERESOURCE_XP)resource;
+    DPRINT("ExInitializeResourceLite(Resource 0x%p)\n", Resource);
 
     /* Clear the structure */
     RtlZeroMemory(Resource, sizeof(ERESOURCE_XP));
@@ -1710,6 +1806,7 @@ ExReleaseResourceLite(PERESOURCE resource)
     KIRQL OldIrql;
     POWNER_ENTRY Owner, Limit;
     PERESOURCE_XP Resource = (PERESOURCE_XP)resource;
+    DPRINT("ExReleaseResourceLite: %p\n", Resource);
 
     /* Sanity check */
     ExpVerifyResource(Resource);
@@ -1735,45 +1832,42 @@ ExReleaseResourceLite(PERESOURCE resource)
         /* Clear the owner */
         Resource->OwnerThreads[0].OwnerThread = 0;
 
-        /* Check the active count */
-        ASSERT(Resource->ActiveCount > 0);
-        if (!(--Resource->ActiveCount))
+        /* Check if there are shared waiters */
+        if (IsSharedWaiting(Resource))
         {
-            /* Check if there are shared waiters */
-            if (IsSharedWaiting(Resource))
-            {
-                /* Remove the exclusive flag */
-                Resource->Flag &= ~ResourceOwnedExclusive;
-
-                /* Give ownage to another thread */
-                Count = Resource->NumberOfSharedWaiters;
-                Resource->ActiveCount = (SHORT)Count;
-                Resource->NumberOfSharedWaiters = 0;
+            /* Remove the exclusive flag */
+            Resource->Flag &= ~ResourceOwnedExclusive;
 
-                /* Release lock and let someone else have it */
-                ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
-                KeReleaseSemaphore(Resource->SharedWaiters, 0, Count, FALSE);
-                return;
-            }
-            else if (IsExclusiveWaiting(Resource))
-            {
-                /* Give exclusive access */
-                Resource->OwnerThreads[0].OwnerThread = 1;
-                Resource->OwnerThreads[0].OwnerCount = 1;
-                Resource->ActiveCount = 1;
-                Resource->NumberOfExclusiveWaiters--;
+            /* Give ownage to another thread */
+            Count = Resource->NumberOfSharedWaiters;
+            Resource->ActiveCount = (USHORT)Count;
+            Resource->NumberOfSharedWaiters = 0;
 
-                /* Release the lock and give it away */
-                ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
-                KeSetEventBoostPriority(Resource->ExclusiveWaiters,
-                                        (PKTHREAD*)
-                                        &Resource->OwnerThreads[0].OwnerThread);
-                return;
-            }
-        }
+            /* Release lock and let someone else have it */
+            ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
+            KeReleaseSemaphore(Resource->SharedWaiters, 0, Count, FALSE);
+            return;
+         }
+         else if (IsExclusiveWaiting(Resource))
+         {
+            /* Give exclusive access */
+            Resource->OwnerThreads[0].OwnerThread = 1;
+            Resource->OwnerThreads[0].OwnerCount = 1;
+            Resource->ActiveCount = 1;
+            Resource->NumberOfExclusiveWaiters--;
+
+            /* Release the lock and give it away */
+            ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
+            KeSetEventBoostPriority(Resource->ExclusiveWaiters,
+                                    (PKTHREAD*)
+                                    &Resource->OwnerThreads[0].OwnerThread);
+            return;
+         }
 
          /* Remove the exclusive flag */
          Resource->Flag &= ~ResourceOwnedExclusive;
+
+         Resource->ActiveCount = 0;
     }
     else
     {
@@ -1783,11 +1877,6 @@ ExReleaseResourceLite(PERESOURCE resource)
             /* Found it, get owner */
             Owner = &Resource->OwnerThreads[1];
         }
-        else if (Resource->OwnerThreads[0].OwnerThread == Thread)
-        {
-            /* Found it, get owner */
-            Owner = &Resource->OwnerThreads[0];
-        }
         else
         {
             /* Not in the list, do a full table look up */
@@ -1876,6 +1965,7 @@ ExReleaseResourceLite(PERESOURCE resource)
 
     /* Release lock */
     ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
+    return;
 }
 
 /*++
@@ -1908,6 +1998,7 @@ ExReleaseResourceForThreadLite(PERESOURCE resource,
     POWNER_ENTRY Owner;
     PERESOURCE_XP Resource = (PERESOURCE_XP)resource;
     ASSERT(Thread != 0);
+    DPRINT("ExReleaseResourceForThreadLite: %p\n", Resource);
 
     /* Get the thread and lock the resource */
     ExAcquireResourceLock(&Resource->SpinLock, &OldIrql);
@@ -1943,7 +2034,7 @@ ExReleaseResourceForThreadLite(PERESOURCE resource,
 
                 /* Give ownage to another thread */
                 Count = Resource->NumberOfSharedWaiters;
-                Resource->ActiveCount = (SHORT)Count;
+                Resource->ActiveCount = (USHORT)Count;
                 Resource->NumberOfSharedWaiters = 0;
 
                 /* Release lock and let someone else have it */
@@ -2056,6 +2147,7 @@ ExReleaseResourceForThreadLite(PERESOURCE resource,
 
     /* Release lock */
     ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
+    return;
 }
 
 /*++
@@ -2174,6 +2266,7 @@ ExTryToAcquireResourceExclusiveLite(PERESOURCE resource)
     KIRQL OldIrql;
     BOOLEAN Acquired = FALSE;
     PERESOURCE_XP Resource = (PERESOURCE_XP)resource;
+    DPRINT("ExTryToAcquireResourceExclusiveLite: %p\n", Resource);
 
     /* Sanity check */
     ASSERT((Resource->Flag & ResourceNeverExclusive) == 0);
index c04659e..ee87bc6 100644 (file)
@@ -38,6 +38,21 @@ ExGetPreviousMode (VOID)
     return KeGetPreviousMode();
 }
 
+/*
+ * @unimplemented
+ */
+VOID
+STDCALL
+ExEnumHandleTable (
+       PULONG  HandleTable,
+       PVOID   Callback,
+       PVOID   Param,
+       PHANDLE Handle OPTIONAL
+       )
+{
+       UNIMPLEMENTED;
+}
+
 /*
  * @implemented
  */
index e3a6963..cb35557 100644 (file)
@@ -82,7 +82,7 @@ ExRefreshTimeZoneInformation(IN PLARGE_INTEGER CurrentBootTime)
 NTSTATUS
 ExpSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation)
 {
-    LARGE_INTEGER LocalTime, SystemTime, OldTime;
+    LARGE_INTEGER LocalTime, SystemTime;
     TIME_FIELDS TimeFields;
     DPRINT("ExpSetTimeZoneInformation() called\n");
 
@@ -123,7 +123,7 @@ ExpSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation)
     ExLocalTimeToSystemTime(&LocalTime, &SystemTime);
 
     /* Set the new system time */
-    KeSetSystemTime(&SystemTime, &OldTime, FALSE, NULL);
+    KiSetSystemTime(&SystemTime);
 
     /* Return success */
     DPRINT("ExpSetTimeZoneInformation() done\n");
@@ -184,13 +184,16 @@ NtSetSystemTime(IN PLARGE_INTEGER SystemTime,
         return STATUS_PRIVILEGE_NOT_HELD;
     }
 
+    /* Check if caller wants the old time */
+    if(PreviousTime) KeQuerySystemTime(&OldSystemTime);
+
     /* Convert the time and set it in HAL */
     ExSystemTimeToLocalTime(&NewSystemTime, &LocalTime);
     RtlTimeToTimeFields(&LocalTime, &TimeFields);
     HalSetRealTimeClock(&TimeFields);
 
     /* Now set system time */
-    KeSetSystemTime(&NewSystemTime, &OldSystemTime, FALSE, NULL);
+    KiSetSystemTime(&NewSystemTime);
 
     /* Check if caller wanted previous time */
     if(PreviousTime)
index 3669608..e45058a 100644 (file)
@@ -1,18 +1,40 @@
 /*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/ex/timer.c
  * PURPOSE:         Executive Timer Implementation
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ *
+ * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)
+ *                  David Welch (welch@mcmail.com)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
-/* GLOBALS *******************************************************************/
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, ExpInitializeTimerImplementation)
+#endif
+
+
+/* TYPES ********************************************************************/
+
+/* Executive Timer Object */
+typedef struct _ETIMER
+{
+    KTIMER KeTimer;
+    KAPC TimerApc;
+    KDPC TimerDpc;
+    LIST_ENTRY ActiveTimerListEntry;
+    KSPIN_LOCK Lock;
+    BOOLEAN ApcAssociated;
+    BOOLEAN WakeTimer;
+    LIST_ENTRY WakeTimerListEntry;
+} ETIMER, *PETIMER;
+
+/* GLOBALS ******************************************************************/
 
 /* Timer Object Type */
 POBJECT_TYPE ExTimerType = NULL;
@@ -33,198 +55,191 @@ static GENERIC_MAPPING ExpTimerMapping =
 static const INFORMATION_CLASS_INFO ExTimerInfoClass[] =
 {
     /* TimerBasicInformation */
-    ICI_SQ_SAME(sizeof(TIMER_BASIC_INFORMATION), sizeof(ULONG), ICIF_QUERY),
+    ICI_SQ_SAME( sizeof(TIMER_BASIC_INFORMATION), sizeof(ULONG), ICIF_QUERY ),
 };
 
-/* PRIVATE FUNCTIONS *********************************************************/
+/* FUNCTIONS *****************************************************************/
 
 VOID
-NTAPI
+STDCALL
 ExTimerRundown(VOID)
 {
     PETHREAD Thread = PsGetCurrentThread();
     KIRQL OldIrql;
     PLIST_ENTRY CurrentEntry;
     PETIMER Timer;
-    ULONG DerefsToDo;
 
-    /* Lock the Thread's Active Timer List and loop it */
+    /* Lock the Thread's Active Timer List*/
     KeAcquireSpinLock(&Thread->ActiveTimerListLock, &OldIrql);
-    CurrentEntry = Thread->ActiveTimerListHead.Flink;
-    while (CurrentEntry != &Thread->ActiveTimerListHead)
+
+    while (!IsListEmpty(&Thread->ActiveTimerListHead))
     {
-        /* Get the timer */
+        /* Remove a Timer */
+        CurrentEntry = RemoveTailList(&Thread->ActiveTimerListHead);
+
+        /* Get the Timer */
         Timer = CONTAINING_RECORD(CurrentEntry, ETIMER, ActiveTimerListEntry);
+        DPRINT("Timer, ThreadList: 0x%p, 0x%p\n", Timer, Thread);
 
-        /* Reference it */
-        ObReferenceObject(Timer);
-        DerefsToDo = 1;
+        /* Mark it as deassociated */
+        ASSERT (Timer->ApcAssociated);
+        Timer->ApcAssociated = FALSE;
 
         /* Unlock the list */
-        KeReleaseSpinLock(&Thread->ActiveTimerListLock, OldIrql);
+        KeReleaseSpinLockFromDpcLevel(&Thread->ActiveTimerListLock);
 
         /* Lock the Timer */
-        KeAcquireSpinLock(&Timer->Lock, &OldIrql);
+        KeAcquireSpinLockAtDpcLevel(&Timer->Lock);
 
-        /* Lock the list again */
-        KeAcquireSpinLockAtDpcLevel(&Thread->ActiveTimerListLock);
-
-        /* Make sure that the timer is valid */
-        if ((Timer->ApcAssociated) && (&Thread->Tcb == Timer->TimerApc.Thread))
-        {
-            /* Remove it from the list */
-            RemoveEntryList(&Timer->ActiveTimerListEntry);
-            Timer->ApcAssociated = FALSE;
-
-            /* Cancel the timer and remove its DPC and APC */
-            KeCancelTimer(&Timer->KeTimer);
-            KeRemoveQueueDpc(&Timer->TimerDpc);
-            if (KeRemoveQueueApc(&Timer->TimerApc)) DerefsToDo++;
-
-            /* Add another dereference to do */
-            DerefsToDo++;
-        }
-
-        /* Unlock the list */
-        KeReleaseSpinLockFromDpcLevel(&Thread->ActiveTimerListLock);
+        /* Cancel the timer and remove its DPC and APC */
+        ASSERT(&Thread->Tcb == Timer->TimerApc.Thread);
+        KeCancelTimer(&Timer->KeTimer);
+        KeRemoveQueueDpc(&Timer->TimerDpc);
+        KeRemoveQueueApc(&Timer->TimerApc);
 
         /* Unlock the Timer */
         KeReleaseSpinLock(&Timer->Lock, OldIrql);
 
         /* Dereference it */
-        ObDereferenceObjectEx(Timer, DerefsToDo);
+        ObDereferenceObject(Timer);
 
         /* Loop again */
         KeAcquireSpinLock(&Thread->ActiveTimerListLock, &OldIrql);
-        CurrentEntry = Thread->ActiveTimerListHead.Flink;
     }
 
     /* Release lock and return */
     KeReleaseSpinLock(&Thread->ActiveTimerListLock, OldIrql);
+    return;
 }
 
 VOID
-NTAPI
-ExpDeleteTimer(IN PVOID ObjectBody)
+STDCALL
+ExpDeleteTimer(PVOID ObjectBody)
 {
     KIRQL OldIrql;
     PETIMER Timer = ObjectBody;
+    DPRINT("ExpDeleteTimer(Timer: 0x%p)\n", Timer);
 
     /* Check if it has a Wait List */
-    if (Timer->WakeTimerListEntry.Flink)
+    if (Timer->WakeTimer)
     {
         /* Lock the Wake List */
         KeAcquireSpinLock(&ExpWakeListLock, &OldIrql);
 
         /* Check again, since it might've changed before we locked */
-        if (Timer->WakeTimerListEntry.Flink)
+        if (Timer->WakeTimer)
         {
             /* Remove it from the Wait List */
+            DPRINT("Removing wake list\n");
             RemoveEntryList(&Timer->WakeTimerListEntry);
-            Timer->WakeTimerListEntry.Flink = NULL;
+            Timer->WakeTimer = FALSE;
         }
 
         /* Release the Wake List */
         KeReleaseSpinLock(&ExpWakeListLock, OldIrql);
     }
 
-    /* Tell the Kernel to cancel the Timer and flush all queued DPCs */
+    /* Tell the Kernel to cancel the Timer */
+    DPRINT("Cancelling Timer\n");
     KeCancelTimer(&Timer->KeTimer);
-    KeFlushQueuedDpcs();
 }
 
 VOID
-NTAPI
-ExpTimerDpcRoutine(IN PKDPC Dpc,
-                   IN PVOID DeferredContext,
-                   IN PVOID SystemArgument1,
-                   IN PVOID SystemArgument2)
+STDCALL
+ExpTimerDpcRoutine(PKDPC Dpc,
+                   PVOID DeferredContext,
+                   PVOID SystemArgument1,
+                   PVOID SystemArgument2)
 {
-    PETIMER Timer = DeferredContext;
-    BOOLEAN Inserted = FALSE;
+    PETIMER Timer;
+    KIRQL OldIrql;
+
+    DPRINT("ExpTimerDpcRoutine(Dpc: 0x%p)\n", Dpc);
 
-    /* Reference the timer */
-    if (!ObReferenceObjectSafe(Timer)) return;
+    /* Get the Timer Object */
+    Timer = (PETIMER)DeferredContext;
 
     /* Lock the Timer */
-    KeAcquireSpinLockAtDpcLevel(&Timer->Lock);
+    KeAcquireSpinLock(&Timer->Lock, &OldIrql);
 
-    /* Check if the timer is associated */
-    if (Timer->ApcAssociated)
+    /* Queue the APC */
+    if(Timer->ApcAssociated)
     {
-        /* Queue the APC */
-        Inserted = KeInsertQueueApc(&Timer->TimerApc,
-                                    SystemArgument1,
-                                    SystemArgument2,
-                                    IO_NO_INCREMENT);
+        DPRINT("Queuing APC\n");
+        KeInsertQueueApc(&Timer->TimerApc,
+                         SystemArgument1,
+                         SystemArgument2,
+                         IO_NO_INCREMENT);
     }
 
     /* Release the Timer */
-    KeReleaseSpinLockFromDpcLevel(&Timer->Lock);
-
-    /* Dereference it if we couldn't queue the APC */
-    if (!Inserted) ObDereferenceObject(Timer);
+    KeReleaseSpinLock(&Timer->Lock, OldIrql);
+    return;
 }
 
+
 VOID
-NTAPI
-ExpTimerApcKernelRoutine(IN PKAPC Apc,
-                         IN OUT PKNORMAL_ROUTINE* NormalRoutine,
-                         IN OUT PVOID* NormalContext,
-                         IN OUT PVOID* SystemArgument1,
-                         IN OUT PVOID* SystemArguemnt2)
+STDCALL
+ExpTimerApcKernelRoutine(PKAPC Apc,
+                         PKNORMAL_ROUTINE* NormalRoutine,
+                         PVOID* NormalContext,
+                         PVOID* SystemArgument1,
+                         PVOID* SystemArguemnt2)
 {
     PETIMER Timer;
     KIRQL OldIrql;
-    ULONG DerefsToDo = 1;
-    PETHREAD Thread = PsGetCurrentThread();
+    PETHREAD CurrentThread = PsGetCurrentThread();
 
     /* We need to find out which Timer we are */
     Timer = CONTAINING_RECORD(Apc, ETIMER, TimerApc);
+    DPRINT("ExpTimerApcKernelRoutine(Apc: 0x%p. Timer: 0x%p)\n", Apc, Timer);
 
     /* Lock the Timer */
     KeAcquireSpinLock(&Timer->Lock, &OldIrql);
 
     /* Lock the Thread's Active Timer List*/
-    KeAcquireSpinLockAtDpcLevel(&Thread->ActiveTimerListLock);
+    KeAcquireSpinLockAtDpcLevel(&CurrentThread->ActiveTimerListLock);
 
-    /* Make sure that the Timer is valid, and that it belongs to this thread */
-    if ((Timer->ApcAssociated) && (&Thread->Tcb == Timer->TimerApc.Thread))
+    /*
+     * Make sure that the Timer is still valid, and that it belongs to this thread
+     * Remove it if it's not periodic
+     */
+    if ((Timer->ApcAssociated) &&
+        (&CurrentThread->Tcb == Timer->TimerApc.Thread) &&
+        (!Timer->KeTimer.Period))
     {
-        /* Check if it's not periodic */
-        if (!Timer->Period)
-        {
-            /* Remove it from the Active Timers List */
-            RemoveEntryList(&Timer->ActiveTimerListEntry);
+        /* Remove it from the Active Timers List */
+        DPRINT("Removing Timer\n");
+        RemoveEntryList(&Timer->ActiveTimerListEntry);
 
-            /* Disable it */
-            Timer->ApcAssociated = FALSE;
-            DerefsToDo++;
-        }
-    }
-    else
-    {
-        /* Clear the normal routine */
-        *NormalRoutine = NULL;
+        /* Disable it */
+        Timer->ApcAssociated = FALSE;
+
+        /* Release spinlocks */
+        KeReleaseSpinLockFromDpcLevel(&CurrentThread->ActiveTimerListLock);
+        KeReleaseSpinLock(&Timer->Lock, OldIrql);
+
+        /* Dereference the Timer Object */
+        ObDereferenceObject(Timer);
+        return;
     }
 
-    /* Release locks */
-    KeReleaseSpinLockFromDpcLevel(&Thread->ActiveTimerListLock);
+    /* Release spinlocks */
+    KeReleaseSpinLockFromDpcLevel(&CurrentThread->ActiveTimerListLock);
     KeReleaseSpinLock(&Timer->Lock, OldIrql);
-
-    /* Dereference as needed */
-    ObDereferenceObjectEx(Timer, DerefsToDo);
 }
 
 VOID
 INIT_FUNCTION
-NTAPI
+STDCALL
 ExpInitializeTimerImplementation(VOID)
 {
     OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
     UNICODE_STRING Name;
 
-    /* Create the Timer Object Type */
+    DPRINT("Creating Timer Object Type\n");
+  
+    /* Create the Event Pair Object Type */
     RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
     RtlInitUnicodeString(&Name, L"Timer");
     ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
@@ -241,10 +256,8 @@ ExpInitializeTimerImplementation(VOID)
     InitializeListHead(&ExpWakeList);
 }
 
-/* PUBLIC FUNCTIONS **********************************************************/
-
 NTSTATUS
-NTAPI
+STDCALL
 NtCancelTimer(IN HANDLE TimerHandle,
               OUT PBOOLEAN CurrentState OPTIONAL)
 {
@@ -253,12 +266,13 @@ NtCancelTimer(IN HANDLE TimerHandle,
     BOOLEAN State;
     KIRQL OldIrql;
     PETHREAD TimerThread;
-    ULONG DerefsToDo = 1;
+    BOOLEAN KillTimer = FALSE;
     NTSTATUS Status = STATUS_SUCCESS;
     PAGED_CODE();
+    DPRINT("NtCancelTimer(0x%p, 0x%x)\n", TimerHandle, CurrentState);
 
     /* Check Parameter Validity */
-    if ((CurrentState) && (PreviousMode != KernelMode))
+    if(CurrentState && PreviousMode != KernelMode)
     {
         _SEH_TRY
         {
@@ -269,6 +283,7 @@ NtCancelTimer(IN HANDLE TimerHandle,
             Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
+
         if(!NT_SUCCESS(Status)) return Status;
     }
 
@@ -279,25 +294,30 @@ NtCancelTimer(IN HANDLE TimerHandle,
                                        PreviousMode,
                                        (PVOID*)&Timer,
                                        NULL);
-    if (NT_SUCCESS(Status))
+
+    /* Check for success */
+    if(NT_SUCCESS(Status))
     {
+        DPRINT("Timer Referenced: 0x%p\n", Timer);
+
         /* Lock the Timer */
         KeAcquireSpinLock(&Timer->Lock, &OldIrql);
 
         /* Check if it's enabled */
         if (Timer->ApcAssociated)
         {
-            /* Get the Thread. */
-            TimerThread = CONTAINING_RECORD(Timer->TimerApc.Thread,
-                                            ETHREAD,
-                                            Tcb);
+            /*
+             * First, remove it from the Thread's Active List
+             * Get the Thread.
+             */
+            TimerThread = CONTAINING_RECORD(Timer->TimerApc.Thread, ETHREAD, Tcb);
+            DPRINT("Removing from Thread: 0x%p\n", TimerThread);
 
             /* Lock its active list */
             KeAcquireSpinLockAtDpcLevel(&TimerThread->ActiveTimerListLock);
 
             /* Remove it */
             RemoveEntryList(&TimerThread->ActiveTimerListHead);
-            Timer->ApcAssociated = FALSE;
 
             /* Unlock the list */
             KeReleaseSpinLockFromDpcLevel(&TimerThread->ActiveTimerListLock);
@@ -305,27 +325,30 @@ NtCancelTimer(IN HANDLE TimerHandle,
             /* Cancel the Timer */
             KeCancelTimer(&Timer->KeTimer);
             KeRemoveQueueDpc(&Timer->TimerDpc);
-            if (KeRemoveQueueApc(&Timer->TimerApc)) DerefsToDo++;
-            DerefsToDo++;
+            KeRemoveQueueApc(&Timer->TimerApc);
+            Timer->ApcAssociated = FALSE;
+            KillTimer = TRUE;
         }
         else
         {
             /* If timer was disabled, we still need to cancel it */
+            DPRINT("APC was not Associated. Cancelling Timer\n");
             KeCancelTimer(&Timer->KeTimer);
         }
 
         /* Handle a Wake Timer */
-        if (Timer->WakeTimerListEntry.Flink)
+        if (Timer->WakeTimer)
         {
             /* Lock the Wake List */
             KeAcquireSpinLockAtDpcLevel(&ExpWakeListLock);
 
             /* Check again, since it might've changed before we locked */
-            if (Timer->WakeTimerListEntry.Flink)
+            if (Timer->WakeTimer)
             {
                 /* Remove it from the Wait List */
+                DPRINT("Removing wake list\n");
                 RemoveEntryList(&Timer->WakeTimerListEntry);
-                Timer->WakeTimerListEntry.Flink = NULL;
+                Timer->WakeTimer = FALSE;
             }
 
             /* Release the Wake List */
@@ -339,10 +362,14 @@ NtCancelTimer(IN HANDLE TimerHandle,
         State = KeReadStateTimer(&Timer->KeTimer);
 
         /* Dereference the Object */
-        ObDereferenceObjectEx(Timer, DerefsToDo);
+        ObDereferenceObject(Timer);
+
+        /* Dereference if it was previously enabled */
+        if (KillTimer) ObDereferenceObject(Timer);
+        DPRINT1("Timer disabled\n");
 
         /* Make sure it's safe to write to the handle */
-        if (CurrentState)
+        if(CurrentState)
         {
             _SEH_TRY
             {
@@ -350,7 +377,7 @@ NtCancelTimer(IN HANDLE TimerHandle,
             }
             _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
             {
-
+                Status = _SEH_GetExceptionCode();
             }
             _SEH_END;
         }
@@ -361,7 +388,7 @@ NtCancelTimer(IN HANDLE TimerHandle,
 }
 
 NTSTATUS
-NTAPI
+STDCALL
 NtCreateTimer(OUT PHANDLE TimerHandle,
               IN ACCESS_MASK DesiredAccess,
               IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
@@ -372,14 +399,7 @@ NtCreateTimer(OUT PHANDLE TimerHandle,
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status = STATUS_SUCCESS;
     PAGED_CODE();
-
-    /* Check for correct timer type */
-    if ((TimerType != NotificationTimer) &&
-        (TimerType != SynchronizationTimer))
-    {
-        /* Fail */
-        return STATUS_INVALID_PARAMETER_4;
-    }
+    DPRINT("NtCreateTimer(Handle: 0x%p, Type: %d)\n", TimerHandle, TimerType);
 
     /* Check Parameter Validity */
     if (PreviousMode != KernelMode)
@@ -393,9 +413,17 @@ NtCreateTimer(OUT PHANDLE TimerHandle,
             Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
+
         if(!NT_SUCCESS(Status)) return Status;
     }
 
+    /* Check for correct timer type */
+    if ((TimerType != NotificationTimer) && (TimerType != SynchronizationTimer))
+    {
+        DPRINT1("Invalid Timer Type!\n");
+        return STATUS_INVALID_PARAMETER_4;
+    }
+
     /* Create the Object */
     Status = ObCreateObject(PreviousMode,
                             ExTimerType,
@@ -406,19 +434,23 @@ NtCreateTimer(OUT PHANDLE TimerHandle,
                             0,
                             0,
                             (PVOID*)&Timer);
-    if (NT_SUCCESS(Status))
-    {
-        /* Initialize the DPC */
-        KeInitializeDpc(&Timer->TimerDpc, ExpTimerDpcRoutine, Timer);
 
+    /* Check for Success */
+    if(NT_SUCCESS(Status))
+    {
         /* Initialize the Kernel Timer */
+        DPRINT("Initializing Timer: 0x%p\n", Timer);
         KeInitializeTimerEx(&Timer->KeTimer, TimerType);
 
-        /* Initialize the timer fields */
+        /* Initialize the Timer Lock */
         KeInitializeSpinLock(&Timer->Lock);
+
+        /* Initialize the DPC */
+        KeInitializeDpc(&Timer->TimerDpc, ExpTimerDpcRoutine, Timer);
+
+        /* Set Initial State */
         Timer->ApcAssociated = FALSE;
         Timer->WakeTimer = FALSE;
-        Timer->WakeTimerListEntry.Flink = NULL;
 
         /* Insert the Timer */
         Status = ObInsertObject((PVOID)Timer,
@@ -427,21 +459,18 @@ NtCreateTimer(OUT PHANDLE TimerHandle,
                                 0,
                                 NULL,
                                 &hTimer);
+        DPRINT("Timer Inserted\n");
 
-        /* Check for success */
-        if (NT_SUCCESS(Status))
+        /* Make sure it's safe to write to the handle */
+        _SEH_TRY
         {
-            /* Make sure it's safe to write to the handle */
-            _SEH_TRY
-            {
-                *TimerHandle = hTimer;
-            }
-            _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
-            {
-
-            }
-            _SEH_END;
+            *TimerHandle = hTimer;
+        }
+        _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
+        {
+            Status = _SEH_GetExceptionCode();
         }
+        _SEH_END;
     }
 
     /* Return to Caller */
@@ -449,7 +478,7 @@ NtCreateTimer(OUT PHANDLE TimerHandle,
 }
 
 NTSTATUS
-NTAPI
+STDCALL
 NtOpenTimer(OUT PHANDLE TimerHandle,
             IN ACCESS_MASK DesiredAccess,
             IN POBJECT_ATTRIBUTES ObjectAttributes)
@@ -458,6 +487,7 @@ NtOpenTimer(OUT PHANDLE TimerHandle,
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status = STATUS_SUCCESS;
     PAGED_CODE();
+    DPRINT("NtOpenTimer(TimerHandle: 0x%p)\n", TimerHandle);
 
     /* Check Parameter Validity */
     if (PreviousMode != KernelMode)
@@ -471,6 +501,7 @@ NtOpenTimer(OUT PHANDLE TimerHandle,
             Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
+
         if(!NT_SUCCESS(Status)) return Status;
     }
 
@@ -482,7 +513,9 @@ NtOpenTimer(OUT PHANDLE TimerHandle,
                                 DesiredAccess,
                                 NULL,
                                 &hTimer);
-    if (NT_SUCCESS(Status))
+
+    /* Check for success */
+    if(NT_SUCCESS(Status))
     {
         /* Make sure it's safe to write to the handle */
         _SEH_TRY
@@ -491,7 +524,7 @@ NtOpenTimer(OUT PHANDLE TimerHandle,
         }
         _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
         {
-
+            Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
     }
@@ -500,30 +533,35 @@ NtOpenTimer(OUT PHANDLE TimerHandle,
     return Status;
 }
 
+
 NTSTATUS
-NTAPI
+STDCALL
 NtQueryTimer(IN HANDLE TimerHandle,
              IN TIMER_INFORMATION_CLASS TimerInformationClass,
              OUT PVOID TimerInformation,
              IN ULONG TimerInformationLength,
-             OUT PULONG ReturnLength OPTIONAL)
+             OUT PULONG ReturnLength  OPTIONAL)
 {
     PETIMER Timer;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
-    NTSTATUS Status;
-    PTIMER_BASIC_INFORMATION BasicInfo = TimerInformation;
+    NTSTATUS Status = STATUS_SUCCESS;
+    PTIMER_BASIC_INFORMATION BasicInfo = (PTIMER_BASIC_INFORMATION)TimerInformation;
     PAGED_CODE();
+    DPRINT("NtQueryTimer(TimerHandle: 0x%p, Class: %d)\n", TimerHandle, TimerInformationClass);
 
     /* Check Validity */
     Status = DefaultQueryInfoBufferCheck(TimerInformationClass,
                                          ExTimerInfoClass,
-                                         sizeof(ExTimerInfoClass) /
-                                         sizeof(ExTimerInfoClass[0]),
+                                         sizeof(ExTimerInfoClass) / sizeof(ExTimerInfoClass[0]),
                                          TimerInformation,
                                          TimerInformationLength,
                                          ReturnLength,
                                          PreviousMode);
-    if(!NT_SUCCESS(Status)) return Status;
+    if(!NT_SUCCESS(Status))
+    {
+        DPRINT1("NtQueryTimer() failed, Status: 0x%x\n", Status);
+        return Status;
+    }
 
     /* Get the Timer Object */
     Status = ObReferenceObjectByHandle(TimerHandle,
@@ -532,21 +570,25 @@ NtQueryTimer(IN HANDLE TimerHandle,
                                        PreviousMode,
                                        (PVOID*)&Timer,
                                        NULL);
+
+    /* Check for Success */
     if(NT_SUCCESS(Status))
     {
         /* Return the Basic Information */
         _SEH_TRY
         {
             /* Return the remaining time, corrected */
-            BasicInfo->TimeRemaining.QuadPart = Timer->
-                                                KeTimer.DueTime.QuadPart -
+            BasicInfo->TimeRemaining.QuadPart = Timer->KeTimer.DueTime.QuadPart -
                                                 KeQueryInterruptTime();
 
             /* Return the current state */
             BasicInfo->SignalState = KeReadStateTimer(&Timer->KeTimer);
 
             /* Return the buffer length if requested */
-            if (ReturnLength) *ReturnLength = sizeof(TIMER_BASIC_INFORMATION);
+            if(ReturnLength != NULL) *ReturnLength = sizeof(TIMER_BASIC_INFORMATION);
+
+            DPRINT("Returning Information for Timer: 0x%p. Time Remaining: %I64x\n",
+                    Timer, BasicInfo->TimeRemaining.QuadPart);
         }
         _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
         {
@@ -563,7 +605,7 @@ NtQueryTimer(IN HANDLE TimerHandle,
 }
 
 NTSTATUS
-NTAPI
+STDCALL
 NtSetTimer(IN HANDLE TimerHandle,
            IN PLARGE_INTEGER DueTime,
            IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
@@ -576,15 +618,14 @@ NtSetTimer(IN HANDLE TimerHandle,
     KIRQL OldIrql;
     BOOLEAN State;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
-    PETHREAD Thread = PsGetCurrentThread();
+    PETHREAD CurrentThread = PsGetCurrentThread();
     LARGE_INTEGER TimerDueTime;
     PETHREAD TimerThread;
-    ULONG DerefsToDo = 1;
+    BOOLEAN KillTimer = FALSE;
     NTSTATUS Status = STATUS_SUCCESS;
     PAGED_CODE();
-
-    /* Check for a valid Period */
-    if (Period < 0) return STATUS_INVALID_PARAMETER_6;
+    DPRINT("NtSetTimer(TimerHandle: 0x%p, DueTime: %I64x, Apc: 0x%p, Period: %d)\n",
+            TimerHandle, DueTime->QuadPart, TimerApcRoutine, Period);
 
     /* Check Parameter Validity */
     if (PreviousMode != KernelMode)
@@ -592,19 +633,26 @@ NtSetTimer(IN HANDLE TimerHandle,
         _SEH_TRY
         {
             TimerDueTime = ProbeForReadLargeInteger(DueTime);
-            if (PreviousState) ProbeForWriteBoolean(PreviousState);
+
+            if(PreviousState)
+            {
+                ProbeForWriteBoolean(PreviousState);
+            }
         }
         _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
         {
             Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
+
         if(!NT_SUCCESS(Status)) return Status;
     }
-    else
+
+    /* Check for a valid Period */
+    if (Period < 0)
     {
-        /* Capture the time directly */
-        TimerDueTime = *DueTime;
+        DPRINT1("Invalid Period for timer\n");
+        return STATUS_INVALID_PARAMETER_6;
     }
 
     /* Get the Timer Object */
@@ -618,7 +666,7 @@ NtSetTimer(IN HANDLE TimerHandle,
     /* 
      * Tell the user we don't support Wake Timers...
      * when we have the ability to use/detect the Power Management 
-     * functionality required to support them, make this check dependent
+     * functionatliy required to support them, make this check dependent
      * on the actual PM capabilities
      */
     if (WakeTimer) Status = STATUS_TIMER_RESUME_IGNORED;
@@ -627,22 +675,24 @@ NtSetTimer(IN HANDLE TimerHandle,
     if (NT_SUCCESS(Status))
     {
         /* Lock the Timer */
+        DPRINT("Timer Referencced: 0x%p\n", Timer);
         KeAcquireSpinLock(&Timer->Lock, &OldIrql);
 
         /* Cancel Running Timer */
         if (Timer->ApcAssociated)
         {
-            /* Get the Thread. */
-            TimerThread = CONTAINING_RECORD(Timer->TimerApc.Thread,
-                                            ETHREAD,
-                                            Tcb);
+            /*
+             * First, remove it from the Thread's Active List
+             * Get the Thread.
+             */
+            TimerThread = CONTAINING_RECORD(Timer->TimerApc.Thread, ETHREAD, Tcb);
+            DPRINT("Thread already running. Removing from Thread: 0x%p\n", TimerThread);
 
             /* Lock its active list */
             KeAcquireSpinLockAtDpcLevel(&TimerThread->ActiveTimerListLock);
 
             /* Remove it */
             RemoveEntryList(&TimerThread->ActiveTimerListHead);
-            Timer->ApcAssociated = FALSE;
 
             /* Unlock the list */
             KeReleaseSpinLockFromDpcLevel(&TimerThread->ActiveTimerListLock);
@@ -650,12 +700,14 @@ NtSetTimer(IN HANDLE TimerHandle,
             /* Cancel the Timer */
             KeCancelTimer(&Timer->KeTimer);
             KeRemoveQueueDpc(&Timer->TimerDpc);
-            if (KeRemoveQueueApc(&Timer->TimerApc)) DerefsToDo++;
-            DerefsToDo++;
-        }
-        else
-        {
+            KeRemoveQueueApc(&Timer->TimerApc);
+            Timer->ApcAssociated = FALSE;
+            KillTimer = TRUE;
+
+        } else {
+
             /* If timer was disabled, we still need to cancel it */
+            DPRINT("No APCs. Simply cancelling\n");
             KeCancelTimer(&Timer->KeTimer);
         }
 
@@ -663,60 +715,62 @@ NtSetTimer(IN HANDLE TimerHandle,
         State = KeReadStateTimer(&Timer->KeTimer);
 
         /* Handle Wake Timers */
-        Timer->WakeTimer = WakeTimer;
+        DPRINT("Doing Wake Semantics\n");
         KeAcquireSpinLockAtDpcLevel(&ExpWakeListLock);
-        if ((WakeTimer) && !(Timer->WakeTimerListEntry.Flink))
+        if (WakeTimer && !Timer->WakeTimer)
         {
             /* Insert it into the list */
+            Timer->WakeTimer = TRUE;
             InsertTailList(&ExpWakeList, &Timer->WakeTimerListEntry);
         }
-        else if (!(WakeTimer) && (Timer->WakeTimerListEntry.Flink))
+        else if (!WakeTimer && Timer->WakeTimer)
         {
             /* Remove it from the list */
             RemoveEntryList(&Timer->WakeTimerListEntry);
-            Timer->WakeTimerListEntry.Flink = NULL;
+            Timer->WakeTimer = FALSE;
         }
         KeReleaseSpinLockFromDpcLevel(&ExpWakeListLock);
 
         /* Set up the APC Routine if specified */
-        Timer->Period = Period;
         if (TimerApcRoutine)
         {
             /* Initialize the APC */
+            DPRINT("Initializing APC: 0x%p\n", Timer->TimerApc);
             KeInitializeApc(&Timer->TimerApc,
-                            &Thread->Tcb,
+                            &CurrentThread->Tcb,
                             CurrentApcEnvironment,
-                            ExpTimerApcKernelRoutine,
+                            &ExpTimerApcKernelRoutine,
                             (PKRUNDOWN_ROUTINE)NULL,
                             (PKNORMAL_ROUTINE)TimerApcRoutine,
                             PreviousMode,
                             TimerContext);
 
             /* Lock the Thread's Active List and Insert */
-            KeAcquireSpinLockAtDpcLevel(&Thread->ActiveTimerListLock);
-            InsertTailList(&Thread->ActiveTimerListHead,
+            KeAcquireSpinLockAtDpcLevel(&CurrentThread->ActiveTimerListLock);
+            InsertTailList(&CurrentThread->ActiveTimerListHead,
                            &Timer->ActiveTimerListEntry);
-            Timer->ApcAssociated = TRUE;
-            KeReleaseSpinLockFromDpcLevel(&Thread->ActiveTimerListLock);
+            KeReleaseSpinLockFromDpcLevel(&CurrentThread->ActiveTimerListLock);
 
-            /* One less dereference to do */
-            DerefsToDo--;
          }
 
         /* Enable and Set the Timer */
+        DPRINT("Setting Kernel Timer\n");
         KeSetTimerEx(&Timer->KeTimer,
                      TimerDueTime,
                      Period,
-                     TimerApcRoutine ? &Timer->TimerDpc : NULL);
+                     TimerApcRoutine ? &Timer->TimerDpc : 0);
+        Timer->ApcAssociated = TimerApcRoutine ? TRUE : FALSE;
 
         /* Unlock the Timer */
         KeReleaseSpinLock(&Timer->Lock, OldIrql);
 
         /* Dereference if it was previously enabled */
-        if (DerefsToDo) ObDereferenceObjectEx(Timer, DerefsToDo);
+        if (!TimerApcRoutine) ObDereferenceObject(Timer);
+        if (KillTimer) ObDereferenceObject(Timer);
+        DPRINT("Finished Setting the Timer\n");
 
         /* Make sure it's safe to write to the handle */
-        if (PreviousState)
+        if(PreviousState != NULL)
         {
             _SEH_TRY
             {
@@ -724,6 +778,7 @@ NtSetTimer(IN HANDLE TimerHandle,
             }
             _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
             {
+                Status = _SEH_GetExceptionCode();
             }
             _SEH_END;
         }
@@ -732,3 +787,5 @@ NtSetTimer(IN HANDLE TimerHandle,
     /* Return to Caller */
     return Status;
 }
+
+/* EOF */
index c17f498..5af58d8 100644 (file)
@@ -617,8 +617,8 @@ ExpInitializeWorkerThreads(VOID)
  *--*/
 VOID
 NTAPI
-ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem,
-                IN WORK_QUEUE_TYPE QueueType)
+ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
+                WORK_QUEUE_TYPE QueueType)
 {
     PEX_WORK_QUEUE WorkQueue = &ExWorkerQueue[QueueType];
     ASSERT(QueueType < MaximumWorkQueue);
diff --git a/reactos/ntoskrnl/fs/context.c b/reactos/ntoskrnl/fs/context.c
new file mode 100644 (file)
index 0000000..f1b2ba6
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/context.c
+ * PURPOSE:         File and Stream Context Functions
+ *
+ * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+/* GLOBALS *******************************************************************/
+
+/* PRIVATE FUNCTIONS**********************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+FsRtlInsertPerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,
+                            IN PFSRTL_PER_STREAM_CONTEXT Ptr)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+PFSRTL_PER_STREAM_CONTEXT
+NTAPI
+FsRtlRemovePerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
+                            IN PVOID OwnerId OPTIONAL,
+                            IN PVOID InstanceId OPTIONAL)
+{
+    UNIMPLEMENTED;
+    return NULL;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+FsRtlInsertPerFileObjectContext(IN PFILE_OBJECT FileObject,
+                                IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+PFSRTL_PER_FILEOBJECT_CONTEXT
+NTAPI
+FsRtlRemovePerFileObjectContext(IN PFILE_OBJECT PerFileObjectContext,
+                                IN PVOID OwnerId OPTIONAL,
+                                IN PVOID InstanceId OPTIONAL)
+{
+    UNIMPLEMENTED;
+    return NULL;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+FsRtlTeardownPerStreamContexts(IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader)
+{
+    UNIMPLEMENTED;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/fs/fastio.c b/reactos/ntoskrnl/fs/fastio.c
new file mode 100644 (file)
index 0000000..8943b8d
--- /dev/null
@@ -0,0 +1,578 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/fastio.c
+ * PURPOSE:         File System Routines which support Fast I/O or Cc Access.
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+*/
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <internal/debug.h>
+
+/* GLOBALS *******************************************************************/
+
+extern ULONG CcFastReadNotPossible;
+extern ULONG CcFastReadResourceMiss;
+extern ULONG CcFastReadWait;
+extern ULONG CcFastReadNoWait;
+ULONG CcFastMdlReadNotPossible;
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlIncrementCcFastReadResourceMiss(VOID)
+{
+    CcFastReadResourceMiss++;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlIncrementCcFastReadNotPossible(VOID)
+{
+    CcFastReadNotPossible++;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlIncrementCcFastReadWait(VOID)
+{
+    CcFastReadWait++;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlIncrementCcFastReadNoWait(VOID)
+{
+    CcFastReadNoWait++;
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+FsRtlCopyRead(IN PFILE_OBJECT FileObject,
+              IN PLARGE_INTEGER FileOffset,
+              IN ULONG Length,
+              IN BOOLEAN Wait,
+              IN ULONG LockKey,
+              OUT PVOID Buffer,
+              OUT PIO_STATUS_BLOCK IoStatus,
+              IN PDEVICE_OBJECT DeviceObject)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+FsRtlCopyWrite(IN PFILE_OBJECT FileObject,
+               IN PLARGE_INTEGER FileOffset,
+               IN ULONG Length,
+               IN BOOLEAN Wait,
+               IN ULONG LockKey,
+               OUT PVOID Buffer,
+               OUT PIO_STATUS_BLOCK IoStatus,
+               IN PDEVICE_OBJECT DeviceObject)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+FsRtlGetFileSize(IN PFILE_OBJECT  FileObject,
+                 IN OUT PLARGE_INTEGER FileSize)
+{
+    FILE_STANDARD_INFORMATION Info;
+    NTSTATUS Status;
+    IO_STATUS_BLOCK IoStatusBlock;
+    ULONG Length;
+    PDEVICE_OBJECT DeviceObject;
+    PFAST_IO_DISPATCH FastDispatch;
+
+    /* Get Device Object and Fast Calls */
+    DeviceObject = IoGetRelatedDeviceObject(FileObject);
+    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
+
+    /* Check if we support Fast Calls, and check this one */
+    if (FastDispatch && FastDispatch->FastIoQueryStandardInfo)
+    {
+        /* Fast Path */
+        FastDispatch->FastIoQueryStandardInfo(FileObject,
+                                              TRUE,
+                                              &Info,
+                                              &IoStatusBlock,
+                                              DeviceObject);
+        Status = IoStatusBlock.Status;
+    }
+    else
+    {
+        /* Slow Path */
+        Status = IoQueryFileInformation(FileObject,
+                                        FileStandardInformation,
+                                        sizeof(Info),
+                                        &Info,
+                                        &Length);
+    }
+
+    /* Check success */
+    if (NT_SUCCESS(Status))
+    {
+        *FileSize = Info.EndOfFile;
+    }
+
+    /* Return status */
+    return Status;
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlMdlRead(IN PFILE_OBJECT FileObject,
+             IN PLARGE_INTEGER FileOffset,
+             IN ULONG Length,
+             IN ULONG LockKey,
+             OUT PMDL *MdlChain,
+             OUT PIO_STATUS_BLOCK IoStatus)
+{
+    PDEVICE_OBJECT DeviceObject, BaseDeviceObject;
+    PFAST_IO_DISPATCH FastDispatch;
+
+    /* Get Device Object and Fast Calls */
+    DeviceObject = IoGetRelatedDeviceObject(FileObject);
+    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
+
+    /* Check if we support Fast Calls, and check this one */
+    if (FastDispatch && FastDispatch->MdlRead)
+    {
+        /* Use the fast path */
+        return FastDispatch->MdlRead(FileObject,
+                                     FileOffset,
+                                     Length,
+                                     LockKey,
+                                     MdlChain,
+                                     IoStatus,
+                                     DeviceObject);
+    }
+
+    /* Get the Base File System (Volume) and Fast Calls */
+    BaseDeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);
+    FastDispatch = BaseDeviceObject->DriverObject->FastIoDispatch;
+
+    /* If the Base Device Object has its own FastDispatch Routine, fail */
+    if (FastDispatch && FastDispatch->MdlRead &&
+        BaseDeviceObject != DeviceObject)
+    {
+        return FALSE;
+    }
+
+    /* No fast path, use slow path */
+    return FsRtlMdlReadDev(FileObject,
+                           FileOffset,
+                           Length,
+                           LockKey,
+                           MdlChain,
+                           IoStatus,
+                           DeviceObject);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlMdlReadComplete(IN PFILE_OBJECT FileObject,
+                     IN OUT PMDL MdlChain)
+{
+    PDEVICE_OBJECT DeviceObject, BaseDeviceObject;
+    PFAST_IO_DISPATCH FastDispatch;
+
+    /* Get Device Object and Fast Calls */
+    DeviceObject = IoGetRelatedDeviceObject(FileObject);
+    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
+
+    /* Check if we support Fast Calls, and check this one */
+    if (FastDispatch && FastDispatch->MdlReadComplete)
+    {
+        /* Use the fast path */
+        return FastDispatch->MdlReadComplete(FileObject,
+                                             MdlChain,
+                                             DeviceObject);
+    }
+
+    /* Get the Base File System (Volume) and Fast Calls */
+    BaseDeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);
+    FastDispatch = BaseDeviceObject->DriverObject->FastIoDispatch;
+
+    /* If the Base Device Object has its own FastDispatch Routine, fail */
+    if (FastDispatch && FastDispatch->MdlReadComplete &&
+        BaseDeviceObject != DeviceObject)
+    {
+        return FALSE;
+    }
+
+    /* No fast path, use slow path */
+    return FsRtlMdlReadCompleteDev(FileObject, MdlChain, DeviceObject);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlMdlReadCompleteDev(IN PFILE_OBJECT FileObject,
+                        IN PMDL MdlChain,
+                        IN PDEVICE_OBJECT DeviceObject)
+{
+    /* Call the Cache Manager */
+    CcMdlReadCompleteDev(MdlChain, FileObject);
+    return TRUE;
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlMdlReadDev(IN PFILE_OBJECT FileObject,
+                IN PLARGE_INTEGER FileOffset,
+                IN ULONG Length,
+                IN ULONG LockKey,
+                OUT PMDL *MdlChain,
+                OUT PIO_STATUS_BLOCK IoStatus,
+                IN PDEVICE_OBJECT DeviceObject)
+{
+    PFSRTL_COMMON_FCB_HEADER FcbHeader;
+    BOOLEAN Result = TRUE;
+    LARGE_INTEGER Offset;
+    PFAST_IO_DISPATCH FastIoDispatch;
+    PDEVICE_OBJECT Device;
+    PAGED_CODE();
+
+    /* No actual read */
+    if (!Length)
+    {
+        /* Return success */
+        IoStatus->Status = STATUS_SUCCESS;
+        IoStatus->Information = 0;
+        return TRUE;
+    }
+
+    /* Sanity check */
+    ASSERT(MAXLONGLONG - FileOffset->QuadPart >= (LONGLONG)Length);
+
+    /* Get the offset and FCB header */
+    Offset.QuadPart = FileOffset->QuadPart + Length;
+    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext;
+
+    /* Enter the FS */
+    FsRtlEnterFileSystem();
+    CcFastMdlReadWait++;
+
+    /* Lock the FCB */
+    ExAcquireResourceShared(FcbHeader->Resource, TRUE);
+
+    /* Check if this is a fast I/O cached file */
+    if (!(FileObject->PrivateCacheMap) ||
+        (FcbHeader->IsFastIoPossible == FastIoIsNotPossible))
+    {
+        /* It's not, so fail */
+        CcFastMdlReadNotPossible += 1;
+        Result = FALSE;
+        goto Cleanup;
+    }
+
+    /* Check if we need to find out if fast I/O is available */
+    if (FcbHeader->IsFastIoPossible == FastIoIsQuestionable)
+    {
+        /* Sanity check */
+        ASSERT(!KeIsExecutingDpc());
+
+        /* Get the Fast I/O table */
+        Device = IoGetRelatedDeviceObject(FileObject);
+        FastIoDispatch = Device->DriverObject->FastIoDispatch;
+
+        /* Sanity check */
+        ASSERT(FastIoDispatch != NULL);
+        ASSERT(FastIoDispatch->FastIoCheckIfPossible != NULL);
+
+        /* Ask the driver if we can do it */
+        if (!FastIoDispatch->FastIoCheckIfPossible(FileObject,
+                                                   FileOffset,
+                                                   Length,
+                                                   TRUE,
+                                                   LockKey,
+                                                   TRUE,
+                                                   IoStatus,
+                                                   Device))
+        {
+            /* It's not, fail */
+            CcFastMdlReadNotPossible += 1;
+            Result = FALSE;
+            goto Cleanup;
+        }
+    }
+
+    /* Check if we read too much */
+    if (Offset.QuadPart > FcbHeader->FileSize.QuadPart)
+    {
+        /* We did, check if the file offset is past the end */
+        if (FileOffset->QuadPart >= FcbHeader->FileSize.QuadPart)
+        {
+            /* Set end of file */
+            IoStatus->Status = STATUS_END_OF_FILE;
+            IoStatus->Information = 0;
+            goto Cleanup;
+        }
+
+        /* Otherwise, just normalize the length */
+        Length = (ULONG)(FcbHeader->FileSize.QuadPart - FileOffset->QuadPart);
+    }
+
+    /* Set this as top-level IRP */
+    PsGetCurrentThread()->TopLevelIrp = FSRTL_FAST_IO_TOP_LEVEL_IRP;
+
+    /* Attempt a read */
+    CcMdlRead(FileObject, FileOffset, Length, MdlChain, IoStatus);
+    FileObject->Flags |= FO_FILE_FAST_IO_READ;
+
+    /* Remove the top-level IRP flag */
+    PsGetCurrentThread()->TopLevelIrp = 0;
+
+    /* Return to caller */
+Cleanup:
+    ExReleaseResourceLite(FcbHeader->Resource);
+    FsRtlExitFileSystem();
+    return Result;
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlMdlWriteComplete(IN PFILE_OBJECT FileObject,
+                      IN PLARGE_INTEGER FileOffset,
+                      IN PMDL MdlChain)
+{
+    PDEVICE_OBJECT DeviceObject, BaseDeviceObject;
+    PFAST_IO_DISPATCH FastDispatch;
+
+    /* Get Device Object and Fast Calls */
+    DeviceObject = IoGetRelatedDeviceObject(FileObject);
+    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
+
+    /* Check if we support Fast Calls, and check this one */
+    if (FastDispatch && FastDispatch->MdlWriteComplete)
+    {
+        /* Use the fast path */
+        return FastDispatch->MdlWriteComplete(FileObject,
+                                              FileOffset,
+                                              MdlChain,
+                                              DeviceObject);
+    }
+
+    /* Get the Base File System (Volume) and Fast Calls */
+    BaseDeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);
+    FastDispatch = BaseDeviceObject->DriverObject->FastIoDispatch;
+
+    /* If the Base Device Object has its own FastDispatch Routine, fail */
+    if (FastDispatch && FastDispatch->MdlWriteComplete &&
+        BaseDeviceObject != DeviceObject)
+    {
+        return FALSE;
+    }
+
+    /* No fast path, use slow path */
+    return FsRtlMdlWriteCompleteDev(FileObject,
+                                    FileOffset,
+                                    MdlChain,
+                                    DeviceObject);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlMdlWriteCompleteDev(IN PFILE_OBJECT FileObject,
+                         IN PLARGE_INTEGER FileOffset,
+                         IN PMDL MdlChain,
+                         IN PDEVICE_OBJECT DeviceObject)
+{
+    /* Call the Cache Manager */
+    CcMdlWriteCompleteDev(FileOffset, MdlChain, FileObject);
+    return TRUE;
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlPrepareMdlWrite(IN PFILE_OBJECT FileObject,
+                     IN PLARGE_INTEGER FileOffset,
+                     IN ULONG Length,
+                     IN ULONG LockKey,
+                     OUT PMDL *MdlChain,
+                     OUT PIO_STATUS_BLOCK IoStatus)
+{
+    PDEVICE_OBJECT DeviceObject, BaseDeviceObject;
+    PFAST_IO_DISPATCH FastDispatch;
+
+    /* Get Device Object and Fast Calls */
+    DeviceObject = IoGetRelatedDeviceObject(FileObject);
+    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
+
+    /* Check if we support Fast Calls, and check this one */
+    if (FastDispatch && FastDispatch->PrepareMdlWrite)
+    {
+        /* Use the fast path */
+        return FastDispatch->PrepareMdlWrite(FileObject,
+                                             FileOffset,
+                                             Length,
+                                             LockKey,
+                                             MdlChain,
+                                             IoStatus,
+                                             DeviceObject);
+    }
+
+    /* Get the Base File System (Volume) and Fast Calls */
+    BaseDeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);
+    FastDispatch = BaseDeviceObject->DriverObject->FastIoDispatch;
+
+    /* If the Base Device Object has its own FastDispatch Routine, fail */
+    if (FastDispatch && FastDispatch->PrepareMdlWrite &&
+        BaseDeviceObject != DeviceObject)
+    {
+        return FALSE;
+    }
+
+    /* No fast path, use slow path */
+    return FsRtlPrepareMdlWriteDev(FileObject,
+                                   FileOffset,
+                                   Length,
+                                   LockKey,
+                                   MdlChain,
+                                   IoStatus,
+                                   DeviceObject);
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+FsRtlPrepareMdlWriteDev(IN PFILE_OBJECT FileObject,
+                        IN PLARGE_INTEGER FileOffset,
+                        IN ULONG Length,
+                        IN ULONG LockKey,
+                        OUT PMDL *MdlChain,
+                        OUT PIO_STATUS_BLOCK IoStatus,
+                        IN PDEVICE_OBJECT DeviceObject)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+* @implemented
+*/
+VOID
+NTAPI
+FsRtlAcquireFileExclusive(IN PFILE_OBJECT FileObject)
+{
+    PFAST_IO_DISPATCH FastDispatch;
+    PDEVICE_OBJECT DeviceObject;
+    PFSRTL_COMMON_FCB_HEADER FcbHeader;
+
+    /* Get the Device Object and fast dispatch */
+    DeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);
+    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
+
+    /* Check if we have to do a Fast I/O Dispatch */
+    if ((FastDispatch) && (FastDispatch->AcquireFileForNtCreateSection))
+    {
+        /* Enter the file system and call it */
+        FsRtlEnterFileSystem();
+        FastDispatch->AcquireFileForNtCreateSection(FileObject);
+        return;
+    }
+
+    /* Get the FCB Header */
+    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext;
+    if (FcbHeader->Resource)
+    {
+        /* Use a Resource Acquire */
+        FsRtlEnterFileSystem();
+        ExAcquireResourceExclusive(FcbHeader->Resource, TRUE);
+    }
+
+    /* All done, return */
+    return;
+}
+
+/*
+* @implemented
+*/
+VOID
+NTAPI
+FsRtlReleaseFile(IN PFILE_OBJECT FileObject)
+{
+    PFAST_IO_DISPATCH FastDispatch;
+    PDEVICE_OBJECT DeviceObject;
+    PFSRTL_COMMON_FCB_HEADER FcbHeader;
+
+    /* Get the Device Object */
+    DeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);
+
+    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
+
+    /* Check if we have to do a Fast I/O Dispatch */
+    if ((FastDispatch) && (FastDispatch->ReleaseFileForNtCreateSection))
+    {
+        /* Call the release function and exit the file system */
+        FastDispatch->ReleaseFileForNtCreateSection(FileObject);
+        FsRtlExitFileSystem();
+        return;
+    }
+
+    /* Get the FCB Header */
+    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext;
+    if (FcbHeader->Resource)
+    {
+        /* Use a Resource release */
+        ExReleaseResourceLite(FcbHeader->Resource);
+        FsRtlExitFileSystem();
+    }
+
+    /* All done, return */
+    return;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/fs/filelock.c b/reactos/ntoskrnl/fs/filelock.c
new file mode 100644 (file)
index 0000000..1bd4fe5
--- /dev/null
@@ -0,0 +1,1127 @@
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/fs/filelock.c
+ * PURPOSE:         No purpose listed.
+ *
+ * PROGRAMMERS:     No programmer listed.
+ */
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <internal/debug.h>
+
+/*
+NOTE:
+I'm not using resource syncronization here, since FsRtlFastCheckLockForRead/Write
+are allowed to be called at DISPATCH_LEVEL. Must therefore use nonpaged memory for
+the lists.
+UPDATE: I'm not sure about this! -Gunnar
+*/
+
+FAST_MUTEX              LockTocMutex;
+NPAGED_LOOKASIDE_LIST   GrantedLookaside;
+NPAGED_LOOKASIDE_LIST   LockTocLookaside;
+PAGED_LOOKASIDE_LIST    LockLookaside;
+
+__inline BOOLEAN
+IsOverlappingLock(PFILE_LOCK_INFO Lock,
+                  PLARGE_INTEGER StartOffset,
+                  PLARGE_INTEGER EndOffset)
+{
+   if ((ULONGLONG)StartOffset->QuadPart > (ULONGLONG)Lock->EndingByte.QuadPart)
+   {
+      return FALSE;
+   }
+
+   if ((ULONGLONG)EndOffset->QuadPart < (ULONGLONG)Lock->StartingByte.QuadPart)
+   {
+      return FALSE;
+   }
+
+   return TRUE;
+}
+
+__inline BOOLEAN
+IsSurroundingLock(PFILE_LOCK_INFO Lock,
+                  PLARGE_INTEGER StartOffset,
+                  PLARGE_INTEGER EndOffset)
+{
+   if ((ULONGLONG)StartOffset->QuadPart >= (ULONGLONG)Lock->StartingByte.QuadPart &&
+       (ULONGLONG)EndOffset->QuadPart <= (ULONGLONG)Lock->EndingByte.QuadPart)
+   {
+      return TRUE;
+   }
+
+   return FALSE;
+}
+
+VOID
+NTAPI
+FsRtlInitSystem(VOID)
+{
+    /* Initialize the list for all lock information structures */
+    ExInitializeNPagedLookasideList(&LockTocLookaside,
+                                    NULL,
+                                    NULL,
+                                    0,
+                                    sizeof(FILE_LOCK_TOC),
+                                    IFS_POOL_TAG,
+                                    0);
+
+    /* Initialize the list for granted locks */
+    ExInitializeNPagedLookasideList(&GrantedLookaside,
+                                    NULL,
+                                    NULL,
+                                    0,
+                                    sizeof(FILE_LOCK_GRANTED),
+                                    IFS_POOL_TAG,
+                                    0);
+
+    /* Initialize the list for lock allocations */
+    ExInitializePagedLookasideList(&LockLookaside,
+                                    NULL,
+                                    NULL,
+                                    0,
+                                    sizeof(FILE_LOCK),
+                                    IFS_POOL_TAG,
+                                    0);
+
+    /* Initialize the lock information mutex */
+    ExInitializeFastMutex(&LockTocMutex);
+}
+
+VOID
+NTAPI
+FsRtlCompleteLockIrpReal(IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteRoutine,
+                         IN PVOID Context,
+                         IN PIRP Irp,
+                         IN NTSTATUS Status,
+                         OUT PNTSTATUS NewStatus,
+                         IN PFILE_OBJECT FileObject OPTIONAL)
+{
+    /* Check if we have a complete routine */
+    if (CompleteRoutine)
+    {
+        /* Check if we have a file object */
+        if (FileObject) FileObject->LastLock = NULL;
+
+        /* Set the I/O Status and do completion */
+        Irp->IoStatus.Status = Status;
+        *NewStatus = CompleteRoutine(Context, Irp);
+    }
+    else
+    {
+        /* Otherwise do a normal I/O complete request */
+        FsRtlCompleteRequest(Irp, Status);
+        *NewStatus = Status;
+    }
+}
+
+VOID
+STDCALL
+FsRtlpFileLockCancelRoutine(IN PDEVICE_OBJECT DeviceObject,
+                            IN PIRP Irp)
+{
+   KIRQL                         oldIrql;
+   PKSPIN_LOCK                   SpinLock;
+
+   //don't need this since we have our own sync. protecting irp cancellation
+   IoReleaseCancelSpinLock(Irp->CancelIrql);
+
+   SpinLock = Irp->Tail.Overlay.DriverContext[3];
+
+   KeAcquireSpinLock(SpinLock, &oldIrql);
+
+   RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+
+   KeReleaseSpinLock(SpinLock, oldIrql);
+
+   Irp->IoStatus.Status = STATUS_CANCELLED;
+   Irp->IoStatus.Information = 0;
+
+   IoCompleteRequest(Irp, IO_NO_INCREMENT);
+}
+
+BOOLEAN
+FASTCALL
+FsRtlpCheckLockForReadOrWriteAccess(IN PFILE_LOCK FileLock,
+                                    IN PLARGE_INTEGER FileOffset,
+                                    IN PLARGE_INTEGER Length,
+                                    IN ULONG Key,
+                                    IN PFILE_OBJECT FileObject,
+                                    IN PEPROCESS Process,
+                                    IN BOOLEAN Read)
+{
+   KIRQL                oldirql;
+   PFILE_LOCK_TOC       LockToc;
+   PFILE_LOCK_GRANTED   Granted;
+   LARGE_INTEGER        EndOffset;
+
+   ASSERT(FileLock);
+
+   LockToc = FileLock->LockInformation;
+
+   if (LockToc == NULL || Length->QuadPart == 0)
+   {
+      return TRUE;
+   }
+
+   EndOffset.QuadPart = FileOffset->QuadPart + Length->QuadPart - 1;
+
+   KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
+
+   LIST_FOR_EACH(Granted, &LockToc->GrantedListHead, FILE_LOCK_GRANTED, ListEntry)
+   {
+      //if overlapping
+      if(IsOverlappingLock(&Granted->Lock, FileOffset, &EndOffset))
+      {
+         //No read conflict if (shared lock) OR (exclusive + our lock)
+         //No write conflict if exclusive lock AND our lock
+         if ((Read && !Granted->Lock.ExclusiveLock) ||
+            (Granted->Lock.ExclusiveLock &&
+            Granted->Lock.ProcessId == Process &&
+            Granted->Lock.FileObject == FileObject &&
+            Granted->Lock.Key == Key ) )
+         {
+            //AND if lock surround request region, stop searching and grant
+            if (IsSurroundingLock(&Granted->Lock, FileOffset, &EndOffset) )
+            {
+               KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+               return TRUE;
+            }
+
+            //else continue searching for conflicts
+            continue;
+         }
+
+         //found conflict
+         KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+         return FALSE;
+      }
+
+   }
+
+   //no conflict
+   KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+   return TRUE;
+}
+
+NTSTATUS
+FASTCALL
+FsRtlpFastUnlockAllByKey(IN PFILE_LOCK           FileLock,
+                         IN PFILE_OBJECT         FileObject,
+                         IN PEPROCESS            Process,
+                         IN ULONG                Key,
+                         IN BOOLEAN              UseKey,
+                         IN PVOID                Context OPTIONAL)
+{
+    KIRQL                                    oldirql;
+    PFILE_LOCK_TOC                LockToc;
+    PFILE_LOCK_GRANTED Granted, tmp;
+    BOOLEAN                               Unlock = FALSE;
+    //must make local copy since FILE_LOCK struct is allowed to be paged
+    BOOLEAN                    GotUnlockRoutine;
+    LIST_ENTRY           UnlockedListHead;
+    PLIST_ENTRY          EnumEntry;
+
+    ASSERT(FileLock);
+    LockToc = FileLock->LockInformation;
+
+    if (LockToc == NULL)
+    {
+        return STATUS_RANGE_NOT_LOCKED;
+    }
+
+    InitializeListHead(&UnlockedListHead);
+    GotUnlockRoutine = FileLock->UnlockRoutine != NULL;
+    KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
+
+    LIST_FOR_EACH_SAFE(Granted, tmp, &LockToc->GrantedListHead, FILE_LOCK_GRANTED, ListEntry)
+    {
+
+        if (Granted->Lock.ProcessId == Process &&
+            Granted->Lock.FileObject == FileObject &&
+            (!UseKey || (UseKey && Granted->Lock.Key == Key)) )
+        {
+            RemoveEntryList(&Granted->ListEntry);
+            Unlock = TRUE;
+
+            if (GotUnlockRoutine)
+            {
+                /*
+                Put on unlocked list and call unlock routine for them afterwards.
+                This way we don't have to restart enum after each call
+                */
+                InsertHeadList(&UnlockedListHead,&Granted->ListEntry);
+            }
+            else
+            {
+                ExFreeToNPagedLookasideList(&GrantedLookaside,Granted);
+            }
+        }
+    }
+
+    KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+
+    if (Unlock)
+    {
+        //call unlock routine for each unlocked lock (if any)
+        while (!IsListEmpty(&UnlockedListHead))
+        {
+            EnumEntry = RemoveTailList(&UnlockedListHead);
+            Granted = CONTAINING_RECORD(EnumEntry,FILE_LOCK_GRANTED, ListEntry);
+
+            FileLock->UnlockRoutine(Granted->UnlockContext, &Granted->Lock);
+            ExFreeToNPagedLookasideList(&GrantedLookaside,Granted);
+        }
+
+        //NOTE: holding spinlock while calling this
+        KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
+        FsRtlpCompletePendingLocks(FileLock, LockToc, &oldirql, Context);
+
+        if (IsListEmpty(&LockToc->GrantedListHead))
+        {
+            KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+            FsRtlAreThereCurrentFileLocks(FileLock) = FALSE;
+        }
+        else
+        {
+            KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+        }
+
+        return STATUS_SUCCESS;
+    }
+
+    return STATUS_RANGE_NOT_LOCKED;
+}
+
+BOOLEAN
+FASTCALL
+FsRtlpAddLock(IN PFILE_LOCK_TOC LockToc,
+              IN PFILE_OBJECT FileObject,
+              IN PLARGE_INTEGER FileOffset,
+              IN PLARGE_INTEGER Length,
+              IN PEPROCESS Process,
+              IN ULONG Key,
+              IN BOOLEAN ExclusiveLock,
+              IN PVOID Context)
+{
+    PFILE_LOCK_GRANTED   Granted;
+    LARGE_INTEGER        EndOffset;
+
+    EndOffset.QuadPart = FileOffset->QuadPart + Length->QuadPart - 1;
+
+    //loop and try to find conflicking locks
+    LIST_FOR_EACH(Granted, &LockToc->GrantedListHead, FILE_LOCK_GRANTED, ListEntry)
+    {
+        if (IsOverlappingLock(&Granted->Lock, FileOffset, &EndOffset))
+        {
+            //we found a locks that overlap with the new lock
+
+            //if both locks are shared, we might have a fast path outa here...
+            if (!Granted->Lock.ExclusiveLock && !ExclusiveLock)
+            {
+                //if existing lock surround new lock, we know that no other exclusive lock
+                //may overlap with our new lock;-D
+                if (IsSurroundingLock(&Granted->Lock, FileOffset, &EndOffset))
+                {
+                    break;
+                }
+
+                //else keep locking for conflicts
+                continue;
+            }
+
+            //we found a conflict:
+            //we want shared access to an excl. lock OR exlc. access to a shared lock
+            return FALSE;
+        }
+    }
+
+    Granted = ExAllocateFromNPagedLookasideList(&GrantedLookaside);
+
+    //starting offset
+    Granted->Lock.StartingByte = *FileOffset;
+    Granted->Lock.Length = *Length;
+    Granted->Lock.ExclusiveLock = ExclusiveLock;
+    Granted->Lock.Key = Key;
+    Granted->Lock.FileObject = FileObject;
+    Granted->Lock.ProcessId = Process;
+    //ending offset
+    Granted->Lock.EndingByte = EndOffset;
+    Granted->UnlockContext = Context;
+
+    InsertHeadList(&LockToc->GrantedListHead,&Granted->ListEntry);
+    return TRUE;
+}
+
+VOID
+FASTCALL
+FsRtlpCompletePendingLocks(IN PFILE_LOCK FileLock,
+                           IN PFILE_LOCK_TOC LockToc,
+                           IN OUT PKIRQL oldirql,
+                           IN PVOID          Context)
+{
+    //walk pending list, FIFO order, try 2 complete locks
+    PLIST_ENTRY                   EnumEntry;
+    PIRP                          Irp, tmp;
+    PIO_STACK_LOCATION            Stack;
+    LIST_ENTRY                    CompletedListHead;
+
+    InitializeListHead(&CompletedListHead);
+
+    LIST_FOR_EACH_SAFE(Irp, tmp, &LockToc->PendingListHead, IRP, Tail.Overlay.ListEntry)
+    {
+        Stack = IoGetCurrentIrpStackLocation(Irp);
+        if (FsRtlpAddLock(LockToc,
+            Stack->FileObject,
+            &Stack->Parameters.LockControl.ByteOffset,
+            Stack->Parameters.LockControl.Length,
+            IoGetRequestorProcess(Irp),
+            Stack->Parameters.LockControl.Key,
+            Stack->Flags & SL_EXCLUSIVE_LOCK,
+            Irp->Tail.Overlay.DriverContext[2] //Context
+        ) )
+        {
+            RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+
+            if (!IoSetCancelRoutine(Irp, NULL))
+            {
+                //irp is canceled and cancelroutine will run when we release the lock
+                InitializeListHead(&Irp->Tail.Overlay.ListEntry);
+                continue;
+            }
+
+            /*
+            Put on completed list and complete them all afterwards.
+            This way we don't have to restart enum after each completion.
+            */
+            InsertHeadList(&CompletedListHead, &Irp->Tail.Overlay.ListEntry);
+        }
+    }
+
+    KeReleaseSpinLock(&LockToc->SpinLock, *oldirql);
+
+    //complete irp's (if any)
+    while (!IsListEmpty(&CompletedListHead))
+    {
+        EnumEntry = RemoveTailList(&CompletedListHead);
+
+        Irp = CONTAINING_RECORD(EnumEntry, IRP, Tail.Overlay.ListEntry);
+
+        Irp->IoStatus.Status = STATUS_SUCCESS;
+        Irp->IoStatus.Information = 0;
+
+        if (FileLock->CompleteLockIrpRoutine)
+        {
+            if (FileLock->CompleteLockIrpRoutine(Context, Irp)!=STATUS_SUCCESS)
+            {
+                Stack = IoGetCurrentIrpStackLocation(Irp);
+
+                //revert
+                FsRtlpUnlockSingle ( FileLock,
+                    Stack->FileObject,
+                    &Stack->Parameters.LockControl.ByteOffset,
+                    Stack->Parameters.LockControl.Length,
+                    IoGetRequestorProcess(Irp),
+                    Stack->Parameters.LockControl.Key,
+                    NULL, /* unused context */
+                    FALSE /* don't call unlock copletion rout.*/
+                    );
+            }
+        }
+        else
+        {
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        }
+
+    }
+
+    KeAcquireSpinLock(&LockToc->SpinLock, oldirql);
+}
+
+NTSTATUS
+FASTCALL
+FsRtlpUnlockSingle(IN PFILE_LOCK FileLock,
+                   IN PFILE_OBJECT FileObject,
+                   IN PLARGE_INTEGER FileOffset,
+                   IN PLARGE_INTEGER Length,
+                   IN PEPROCESS Process,
+                   IN ULONG Key,
+                   IN PVOID Context OPTIONAL,
+                   IN BOOLEAN CallUnlockRoutine)
+{
+    KIRQL                oldirql;
+    PFILE_LOCK_TOC       LockToc;
+    PFILE_LOCK_GRANTED   Granted, tmp;
+
+    ASSERT(FileLock);
+    LockToc = FileLock->LockInformation;
+
+    if (LockToc == NULL)
+    {
+        return STATUS_RANGE_NOT_LOCKED;
+    }
+
+    KeAcquireSpinLock(&LockToc->SpinLock, &oldirql );
+
+    LIST_FOR_EACH_SAFE(Granted, tmp, &LockToc->GrantedListHead, FILE_LOCK_GRANTED,ListEntry)
+    {
+
+        //must be exact match
+        if (FileOffset->QuadPart == Granted->Lock.StartingByte.QuadPart &&
+            Length->QuadPart == Granted->Lock.Length.QuadPart &&
+            Granted->Lock.ProcessId == Process &&
+            Granted->Lock.FileObject == FileObject &&
+            Granted->Lock.Key == Key)
+        {
+            RemoveEntryList(&Granted->ListEntry);
+            FsRtlpCompletePendingLocks(FileLock, LockToc, &oldirql, Context);
+
+            if (IsListEmpty(&LockToc->GrantedListHead))
+            {
+                KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+
+                FsRtlAreThereCurrentFileLocks(FileLock) = FALSE; //paged data
+            }
+            else
+            {
+                KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+            }
+
+            if (FileLock->UnlockRoutine && CallUnlockRoutine)
+            {
+                FileLock->UnlockRoutine(Granted->UnlockContext, &Granted->Lock);
+            }
+
+            ExFreeToNPagedLookasideList(&GrantedLookaside, Granted);
+
+            return STATUS_SUCCESS;
+        }
+    }
+
+    KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+
+    return STATUS_RANGE_NOT_LOCKED;
+
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @implemented
+ */
+PFILE_LOCK_INFO
+NTAPI
+FsRtlGetNextFileLock(IN PFILE_LOCK FileLock,
+                     IN BOOLEAN Restart)
+{
+    /*
+    Messy enumeration of granted locks.
+    What our last ptr. in LastReturnedLock points at, might have been freed between
+    calls, so we have to scan thru the list every time, searching for our last lock.
+    If it's not there anymore, restart the enumeration...
+    */
+    KIRQL                oldirql;
+    PLIST_ENTRY          EnumEntry;
+    PFILE_LOCK_GRANTED   Granted;
+    PFILE_LOCK_TOC       LockToc;
+    BOOLEAN              FoundPrevious = FALSE;
+    //must make local copy since FILE_LOCK struct is allowed to be in paged mem
+    FILE_LOCK_INFO       LocalLastReturnedLockInfo;
+    PVOID                LocalLastReturnedLock;
+
+    ASSERT(FileLock);
+    LockToc = FileLock->LockInformation;
+    if (LockToc == NULL)
+    {
+        return NULL;
+    }
+
+    LocalLastReturnedLock = FileLock->LastReturnedLock;
+
+    KeAcquireSpinLock(&LockToc->SpinLock,&oldirql);
+
+restart:;
+
+    EnumEntry = LockToc->GrantedListHead.Flink;
+
+    if (Restart)
+    {
+        if (EnumEntry != &LockToc->GrantedListHead)
+        {
+            Granted = CONTAINING_RECORD(EnumEntry,FILE_LOCK_GRANTED,ListEntry);
+            LocalLastReturnedLockInfo = Granted->Lock;
+            KeReleaseSpinLock(&LockToc->SpinLock,oldirql);
+
+            FileLock->LastReturnedLockInfo = LocalLastReturnedLockInfo;
+            FileLock->LastReturnedLock = EnumEntry;
+            return &FileLock->LastReturnedLockInfo;
+        }
+        else
+        {
+            KeReleaseSpinLock(&LockToc->SpinLock,oldirql);
+            return NULL;
+        }
+    }
+
+    //else: continue enum
+    while (EnumEntry != &LockToc->GrantedListHead)
+    {
+        //found previous lock?
+        if (EnumEntry == LocalLastReturnedLock)
+        {
+            FoundPrevious = TRUE;
+            //get next
+            EnumEntry = EnumEntry->Flink;
+            if (EnumEntry != &LockToc->GrantedListHead)
+            {
+                Granted = CONTAINING_RECORD(EnumEntry,FILE_LOCK_GRANTED,ListEntry);
+                LocalLastReturnedLockInfo = Granted->Lock;
+                KeReleaseSpinLock(&LockToc->SpinLock,oldirql);
+
+                FileLock->LastReturnedLockInfo = LocalLastReturnedLockInfo;
+                FileLock->LastReturnedLock = EnumEntry;
+                return &FileLock->LastReturnedLockInfo;
+            }
+            break;
+        }
+        EnumEntry = EnumEntry->Flink;
+    }
+
+    if (!FoundPrevious)
+    {
+        //got here? uh no, didn't find our last lock..must have been freed...restart
+        Restart = TRUE;
+        goto restart;
+    }
+
+    KeReleaseSpinLock(&LockToc->SpinLock,oldirql);
+
+    return NULL;//no (more) locks
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlPrivateLock(IN PFILE_LOCK FileLock,
+                 IN PFILE_OBJECT FileObject,
+                 IN PLARGE_INTEGER FileOffset,
+                 IN PLARGE_INTEGER Length,
+                 IN PEPROCESS Process,
+                 IN ULONG Key,
+                 IN BOOLEAN FailImmediately, //seems meaningless for fast io
+                 IN BOOLEAN ExclusiveLock,
+                 OUT PIO_STATUS_BLOCK IoStatus,
+                 IN PIRP Irp OPTIONAL,
+                 IN PVOID Context OPTIONAL,
+                 IN BOOLEAN AlreadySynchronized)
+{
+    PFILE_LOCK_TOC       LockToc;
+    KIRQL                oldirql;
+
+    ASSERT(FileLock);
+    if (FileLock->LockInformation == NULL)
+    {
+        ExAcquireFastMutex(&LockTocMutex);
+        //still NULL?
+        if (FileLock->LockInformation == NULL)
+        {
+            FileLock->LockInformation = ExAllocateFromNPagedLookasideList(&LockTocLookaside);
+            LockToc =  FileLock->LockInformation;
+            KeInitializeSpinLock(&LockToc->SpinLock);
+            InitializeListHead(&LockToc->GrantedListHead);
+            InitializeListHead(&LockToc->PendingListHead);
+        }
+        ExReleaseFastMutex(&LockTocMutex);
+    }
+
+    LockToc =  FileLock->LockInformation;
+    KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
+
+    //try add new lock (while holding spin lock)
+    if (FsRtlpAddLock(LockToc,
+        FileObject,
+        FileOffset,
+        Length,
+        Process,
+        Key,
+        ExclusiveLock,
+        Context
+        ) )
+    {
+        IoStatus->Status = STATUS_SUCCESS;
+    }
+    else if (Irp && !FailImmediately)
+    {
+        //failed + irp + no fail = make. pending
+
+        Irp->Tail.Overlay.DriverContext[3] = &LockToc->SpinLock;
+        Irp->Tail.Overlay.DriverContext[2] = Context;
+
+        (void)IoSetCancelRoutine(Irp, FsRtlpFileLockCancelRoutine);
+        if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL))
+        {
+            //irp was canceled
+            KeReleaseSpinLock(&LockToc->SpinLock, oldirql);
+
+            Irp->IoStatus.Status = STATUS_CANCELLED;
+            Irp->IoStatus.Information = 0;
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+            return TRUE;
+        }
+
+        IoMarkIrpPending(Irp);
+        Irp->IoStatus.Status = IoStatus->Status = STATUS_PENDING;
+        Irp->IoStatus.Information = 0;
+        InsertHeadList(&LockToc->PendingListHead,&Irp->Tail.Overlay.ListEntry);
+
+    }
+    else
+    {
+        IoStatus->Status = STATUS_LOCK_NOT_GRANTED;
+    }
+
+    KeReleaseSpinLock(&LockToc->SpinLock, oldirql);    //fires cancel routine
+
+    //never pending if no irp;-)
+    ASSERT(!(IoStatus->Status == STATUS_PENDING && !Irp));
+
+    if (IoStatus->Status != STATUS_PENDING)
+    {
+        if (IoStatus->Status == STATUS_SUCCESS)
+        {
+            FsRtlAreThereCurrentFileLocks(FileLock) = TRUE;
+        }
+
+        if (Irp)
+        {
+            Irp->IoStatus.Status = IoStatus->Status;
+            Irp->IoStatus.Information = 0;
+            if (FileLock->CompleteLockIrpRoutine)
+            {
+                if (FileLock->CompleteLockIrpRoutine(Context,Irp)!=STATUS_SUCCESS)
+                {
+                    //CompleteLockIrpRoutine complain: revert changes
+                    FsRtlpUnlockSingle(  FileLock,
+                        FileObject,
+                        FileOffset,
+                        Length,
+                        Process,
+                        Key,
+                        NULL, /* context */
+                        FALSE  /* don't call unlock copletion routine */
+                        );
+                }
+            }
+            else
+            {
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+            }
+        }
+    }
+
+    //NOTE: only fast io seems to care about this return value
+    return (IoStatus->Status == STATUS_SUCCESS || FailImmediately);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlCheckLockForReadAccess(IN PFILE_LOCK FileLock,
+                            IN PIRP Irp)
+{
+    PIO_STACK_LOCATION Stack;
+    LARGE_INTEGER LocalLength;
+
+    /* Get the I/O Stack location and length */
+    Stack = IoGetCurrentIrpStackLocation(Irp);
+    LocalLength.QuadPart = Stack->Parameters.Read.Length;
+
+    /* Call the internal API */
+    return FsRtlpCheckLockForReadOrWriteAccess(FileLock,
+                                               &Stack->Parameters.
+                                               Read.ByteOffset,
+                                               &LocalLength,
+                                               Stack->Parameters.Read.Key,
+                                               Stack->FileObject,
+                                               IoGetRequestorProcess(Irp),
+                                               TRUE);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlCheckLockForWriteAccess(IN PFILE_LOCK FileLock,
+                             IN PIRP Irp)
+{
+    PIO_STACK_LOCATION Stack;
+    LARGE_INTEGER LocalLength;
+
+    /* Get the I/O Stack location and length */
+    Stack = IoGetCurrentIrpStackLocation(Irp);
+    LocalLength.QuadPart = Stack->Parameters.Read.Length;
+
+    /* Call the internal API */
+    return FsRtlpCheckLockForReadOrWriteAccess(FileLock,
+                                               &Stack->Parameters.
+                                               Read.ByteOffset,
+                                               &LocalLength,
+                                               Stack->Parameters.Read.Key,
+                                               Stack->FileObject,
+                                               IoGetRequestorProcess(Irp),
+                                               FALSE);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlFastCheckLockForRead(IN PFILE_LOCK FileLock,
+                          IN PLARGE_INTEGER FileOffset,
+                          IN PLARGE_INTEGER Length,
+                          IN ULONG Key,
+                          IN PFILE_OBJECT FileObject,
+                          IN PEPROCESS Process)
+{
+    /* Call the internal API */
+    return FsRtlpCheckLockForReadOrWriteAccess(FileLock,
+                                               FileOffset,
+                                               Length,
+                                               Key,
+                                               FileObject,
+                                               Process,
+                                               TRUE);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlFastCheckLockForWrite(IN PFILE_LOCK FileLock,
+                           IN PLARGE_INTEGER FileOffset,
+                           IN PLARGE_INTEGER Length,
+                           IN ULONG Key,
+                           IN PFILE_OBJECT FileObject,
+                           IN PEPROCESS Process)
+{
+    /* Call the internal API */
+    return FsRtlpCheckLockForReadOrWriteAccess(FileLock,
+                                               FileOffset,
+                                               Length,
+                                               Key,
+                                               FileObject,
+                                               Process,
+                                               FALSE);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
+                      IN PFILE_OBJECT FileObject,
+                      IN PLARGE_INTEGER FileOffset,
+                      IN PLARGE_INTEGER Length,
+                      IN PEPROCESS Process,
+                      IN ULONG Key,
+                      IN PVOID Context OPTIONAL,
+                      IN BOOLEAN AlreadySynchronized)
+{
+    /* Call the internal API */
+    return FsRtlpUnlockSingle(FileLock,
+                              FileObject,
+                              FileOffset,
+                              Length,
+                              Process,
+                              Key,
+                              Context,
+                              TRUE);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+FsRtlFastUnlockAll(IN PFILE_LOCK FileLock,
+                   IN PFILE_OBJECT FileObject,
+                   IN PEPROCESS Process,
+                   IN PVOID Context OPTIONAL)
+{
+    /* Call the generic function by process */
+    return FsRtlpFastUnlockAllByKey(FileLock,
+                                    FileObject,
+                                    Process,
+                                    0,
+                                    FALSE,
+                                    Context);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+FsRtlFastUnlockAllByKey(IN PFILE_LOCK FileLock,
+                        IN PFILE_OBJECT FileObject,
+                        IN PEPROCESS Process,
+                        IN ULONG Key,
+                        IN PVOID Context OPTIONAL)
+{
+    /* Call the generic function by key */
+    return FsRtlpFastUnlockAllByKey(FileLock,
+                                    FileObject,
+                                    Process,
+                                    Key,
+                                    TRUE,
+                                    Context);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+FsRtlProcessFileLock(IN PFILE_LOCK FileLock,
+                     IN PIRP Irp,
+                     IN PVOID Context OPTIONAL)
+{
+    PIO_STACK_LOCATION IoStackLocation;
+    NTSTATUS Status;
+    IO_STATUS_BLOCK IoStatusBlock;
+
+    /* Get the I/O Stack location */
+    IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
+    ASSERT(IoStackLocation->MajorFunction == IRP_MJ_LOCK_CONTROL);
+
+    /* Clear the I/O status block and check what function this is */
+    IoStatusBlock.Information = 0;
+    switch(IoStackLocation->MinorFunction)
+    {
+        /* A lock */
+        case IRP_MN_LOCK:
+
+            /* Call the private lock routine */
+            FsRtlPrivateLock(FileLock,
+                             IoStackLocation->FileObject,
+                             &IoStackLocation->
+                             Parameters.LockControl.ByteOffset,
+                             IoStackLocation->Parameters.LockControl.Length,
+                             IoGetRequestorProcess(Irp),
+                             IoStackLocation->Parameters.LockControl.Key,
+                             IoStackLocation->Flags & SL_FAIL_IMMEDIATELY,
+                             IoStackLocation->Flags & SL_EXCLUSIVE_LOCK,
+                             &IoStatusBlock,
+                             Irp,
+                             Context,
+                             FALSE);
+            break;
+
+        /* A single unlock */
+        case IRP_MN_UNLOCK_SINGLE:
+
+            /* Call fast unlock */
+            IoStatusBlock.Status =
+                FsRtlFastUnlockSingle(FileLock,
+                                      IoStackLocation->FileObject,
+                                      &IoStackLocation->Parameters.LockControl.
+                                      ByteOffset,
+                                      IoStackLocation->Parameters.LockControl.
+                                      Length,
+                                      IoGetRequestorProcess(Irp),
+                                      IoStackLocation->Parameters.LockControl.
+                                      Key,
+                                      Context,
+                                      FALSE);
+
+            /* Complete the IRP */
+            FsRtlCompleteLockIrpReal(FileLock->CompleteLockIrpRoutine,
+                                     Context,
+                                     Irp,
+                                     IoStatusBlock.Status,
+                                     &Status,
+                                     NULL);
+            break;
+
+        /* Total unlock */
+        case IRP_MN_UNLOCK_ALL:
+
+            /* Do a fast unlock */
+            IoStatusBlock.Status = FsRtlFastUnlockAll(FileLock,
+                                                      IoStackLocation->
+                                                      FileObject,
+                                                      IoGetRequestorProcess(Irp),
+                                                      Context);
+
+            /* Complete the IRP */
+            FsRtlCompleteLockIrpReal(FileLock->CompleteLockIrpRoutine,
+                                     Context,
+                                     Irp,
+                                     IoStatusBlock.Status,
+                                     &Status,
+                                     NULL);
+            break;
+
+        /* Unlock by key */
+        case IRP_MN_UNLOCK_ALL_BY_KEY:
+
+            /* Do it */
+            IoStatusBlock.Status =
+                FsRtlFastUnlockAllByKey(FileLock,
+                                        IoStackLocation->FileObject,
+                                        IoGetRequestorProcess(Irp),
+                                        IoStackLocation->Parameters.
+                                        LockControl.Key,
+                                        Context);
+
+            /* Complete the IRP */
+            FsRtlCompleteLockIrpReal(FileLock->CompleteLockIrpRoutine,
+                                     Context,
+                                     Irp,
+                                     IoStatusBlock.Status,
+                                     &Status,
+                                     NULL);
+            break;
+
+        /* Invalid request */
+        default:
+
+            /* Complete it */
+            FsRtlCompleteRequest(Irp, STATUS_INVALID_DEVICE_REQUEST);
+            IoStatusBlock.Status = STATUS_INVALID_DEVICE_REQUEST;
+            break;
+    }
+
+    /* Return the status */
+    return IoStatusBlock.Status;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlInitializeFileLock (IN PFILE_LOCK FileLock,
+                         IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,
+                         IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL)
+{
+    /* Setup the lock */
+    FileLock->FastIoIsQuestionable = FALSE;
+    FileLock->CompleteLockIrpRoutine = CompleteLockIrpRoutine;
+    FileLock->UnlockRoutine = UnlockRoutine;
+    FileLock->LockInformation = NULL;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlUninitializeFileLock(IN PFILE_LOCK FileLock)
+{
+    PFILE_LOCK_TOC LockToc;
+    PIRP Irp;
+    PFILE_LOCK_GRANTED Granted;
+    PLIST_ENTRY EnumEntry;
+    KIRQL OldIrql;
+
+    /* Get the lock information */
+    LockToc = FileLock->LockInformation;
+    if (!FileLock->LockInformation) return;
+
+    /* Acquire the lock queue */
+    KeAcquireSpinLock(&LockToc->SpinLock, &OldIrql);
+
+    /* Loop the lock tree */
+    while (!IsListEmpty(&LockToc->GrantedListHead))
+    {
+        /* Get the entry */
+        EnumEntry = RemoveTailList(&LockToc->GrantedListHead);
+
+        /* Get the granted lock and free it */
+        Granted = CONTAINING_RECORD(EnumEntry, FILE_LOCK_GRANTED, ListEntry);
+        ExFreeToNPagedLookasideList(&GrantedLookaside, Granted);
+    }
+
+    /* Loop the waiting locks */
+    while (!IsListEmpty(&LockToc->PendingListHead))
+    {
+        /* Get the entry and IRP */
+        EnumEntry = RemoveTailList(&LockToc->PendingListHead);
+        Irp = CONTAINING_RECORD(EnumEntry, IRP, Tail.Overlay.ListEntry);
+
+        /* Release the lock */
+        KeReleaseSpinLock(&LockToc->SpinLock, OldIrql);
+
+        /* Acquire cancel spinlock and clear the cancel routine */
+        IoAcquireCancelSpinLock(&Irp->CancelIrql);
+        (void)IoSetCancelRoutine(Irp, NULL);
+        IoReleaseCancelSpinLock(Irp->CancelIrql);
+
+        /* Complete the IRP */
+        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = STATUS_RANGE_NOT_LOCKED;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+        /* Acquire the lock again */
+        KeAcquireSpinLock(&LockToc->SpinLock, &OldIrql);
+    }
+
+    /* Release the lock and free it */
+    KeReleaseSpinLock(&LockToc->SpinLock, OldIrql);
+    ExFreeToNPagedLookasideList(&LockTocLookaside, LockToc);
+
+    /* Remove the lock information pointer */
+    FileLock->LockInformation = NULL;
+}
+
+/*
+ * @implemented
+ */
+PFILE_LOCK
+NTAPI
+FsRtlAllocateFileLock(IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,
+                      IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL)
+{
+    PFILE_LOCK FileLock;
+
+    /* Try to allocate it */
+    FileLock = ExAllocateFromPagedLookasideList(&LockLookaside);
+    if (FileLock)
+    {
+        /* Initialize it */
+        FsRtlInitializeFileLock(FileLock,
+                                CompleteLockIrpRoutine,
+                                UnlockRoutine);
+    }
+
+    /* Return the lock */
+    return FileLock;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlFreeFileLock(IN PFILE_LOCK FileLock)
+{
+    /* Uninitialize and free the lock */
+    FsRtlUninitializeFileLock(FileLock);
+    ExFreeToPagedLookasideList(&LockLookaside, FileLock);
+}
+
+/* EOF */
similarity index 62%
rename from reactos/ntoskrnl/fsrtl/largemcb.c
rename to reactos/ntoskrnl/fs/mcb.c
index a63dc90..ce8fdbf 100644 (file)
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/largemcb.c\r
- * PURPOSE:         Mapping Control Block (MCB) support for File System Drivers\r
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlAddLargeMcbEntry(IN PLARGE_MCB Mcb,\r
-                      IN LONGLONG Vbn,\r
-                      IN LONGLONG Lbn,\r
-                      IN LONGLONG SectorCount)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlAddMcbEntry(IN PMCB Mcb,\r
-                 IN VBN Vbn,\r
-                 IN LBN Lbn,\r
-                 IN ULONG SectorCount)\r
-{\r
-    /* Call the newer function */\r
-    return FsRtlAddLargeMcbEntry(&Mcb->\r
-                                 DummyFieldThatSizesThisStructureCorrectly,\r
-                                 (LONGLONG)Vbn,\r
-                                 (LONGLONG)Lbn,\r
-                                 (LONGLONG)SectorCount);\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlGetNextLargeMcbEntry(IN PLARGE_MCB Mcb,\r
-                          IN ULONG RunIndex,\r
-                          OUT PLONGLONG Vbn,\r
-                          OUT PLONGLONG Lbn,\r
-                          OUT PLONGLONG SectorCount)\r
-{\r
-    KEBUGCHECK(0);\r
-    *Vbn = 0;\r
-    *Lbn = 0;\r
-    *SectorCount= 0;\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlGetNextMcbEntry(IN PMCB Mcb,\r
-                     IN ULONG RunIndex,\r
-                     OUT PVBN Vbn,\r
-                     OUT PLBN Lbn,\r
-                     OUT PULONG SectorCount)\r
-{\r
-    BOOLEAN Return = FALSE;\r
-    LONGLONG llVbn;\r
-    LONGLONG llLbn;\r
-    LONGLONG llSectorCount;\r
-\r
-    /* Call the Large version */\r
-    Return = FsRtlGetNextLargeMcbEntry(\r
-        &Mcb->DummyFieldThatSizesThisStructureCorrectly,\r
-        RunIndex,\r
-        &llVbn,\r
-        &llLbn,\r
-        &llSectorCount);\r
-\r
-    /* Return the lower 32 bits */\r
-    *Vbn = (ULONG)llVbn;\r
-    *Lbn = (ULONG)llLbn;\r
-    *SectorCount = (ULONG)llSectorCount;\r
-\r
-    /* And return the original value */\r
-    return Return;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlInitializeLargeMcb(IN PLARGE_MCB Mcb,\r
-                        IN POOL_TYPE PoolType)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlInitializeMcb(IN PMCB Mcb,\r
-                   IN POOL_TYPE PoolType)\r
-{\r
-    /* Call the newer function */\r
-    FsRtlInitializeLargeMcb(&Mcb->DummyFieldThatSizesThisStructureCorrectly,\r
-                            PoolType);\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlLookupLargeMcbEntry(IN PLARGE_MCB Mcb,\r
-                         IN LONGLONG Vbn,\r
-                         OUT PLONGLONG Lbn OPTIONAL,\r
-                         OUT PLONGLONG SectorCountFromLbn OPTIONAL,\r
-                         OUT PLONGLONG StartingLbn OPTIONAL,\r
-                         OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL,\r
-                         OUT PULONG Index OPTIONAL)\r
-{\r
-    KEBUGCHECK(0);\r
-    *Lbn = 0;\r
-    *SectorCountFromLbn = 0;\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlLookupLastLargeMcbEntryAndIndex(IN PLARGE_MCB OpaqueMcb,\r
-                                     OUT PLONGLONG LargeVbn,\r
-                                     OUT PLONGLONG LargeLbn,\r
-                                     OUT PULONG Index)\r
-{\r
-    KEBUGCHECK(0);\r
-    *LargeVbn = 0;\r
-    *LargeLbn = 0;\r
-    *Index = 0;\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlLookupLastLargeMcbEntry(IN PLARGE_MCB Mcb,\r
-                             OUT PLONGLONG Vbn,\r
-                             OUT PLONGLONG Lbn)\r
-{\r
-    KEBUGCHECK(0);\r
-    return(FALSE);\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlLookupLastMcbEntry(IN PMCB Mcb,\r
-                        OUT PVBN Vbn,\r
-                        OUT PLBN Lbn)\r
-{\r
-    BOOLEAN Return = FALSE;\r
-    LONGLONG llVbn = 0;\r
-    LONGLONG llLbn = 0;\r
-\r
-    /* Call the Large version */\r
-    Return = FsRtlLookupLastLargeMcbEntry(\r
-        &Mcb->DummyFieldThatSizesThisStructureCorrectly,\r
-        &llVbn,\r
-        &llLbn);\r
-\r
-    /* Return the lower 32-bits */\r
-    *Vbn = (ULONG)llVbn;\r
-    *Lbn = (ULONG)llLbn;\r
-\r
-    /* And return the original value */\r
-    return Return;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlLookupMcbEntry(IN PMCB Mcb,\r
-                    IN VBN Vbn,\r
-                    OUT PLBN Lbn,\r
-                    OUT PULONG SectorCount OPTIONAL,\r
-                    OUT PULONG Index)\r
-{\r
-    BOOLEAN Return = FALSE;\r
-    LONGLONG llLbn;\r
-    LONGLONG llSectorCount;\r
-\r
-    /* Call the Large version */\r
-    Return = FsRtlLookupLargeMcbEntry(&Mcb->\r
-                                      DummyFieldThatSizesThisStructureCorrectly,\r
-                                      (LONGLONG)Vbn,\r
-                                      &llLbn,\r
-                                      &llSectorCount,\r
-                                      NULL,\r
-                                      NULL,\r
-                                      Index);\r
-\r
-    /* Return the lower 32-bits */\r
-    *Lbn = (ULONG)llLbn;\r
-    if (SectorCount) *SectorCount = (ULONG)llSectorCount;\r
-\r
-    /* And return the original value */\r
-    return Return;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-ULONG\r
-NTAPI\r
-FsRtlNumberOfRunsInLargeMcb(IN PLARGE_MCB Mcb)\r
-{\r
-    ULONG NumberOfRuns;\r
-\r
-    /* Read the number of runs while holding the MCB lock */\r
-    KeAcquireGuardedMutex(Mcb->GuardedMutex);\r
-    NumberOfRuns = Mcb->BaseMcb.PairCount;\r
-    KeReleaseGuardedMutex(Mcb->GuardedMutex);\r
-\r
-    /* Return the count */\r
-    return NumberOfRuns;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-ULONG\r
-NTAPI\r
-FsRtlNumberOfRunsInMcb (IN PMCB Mcb)\r
-{\r
-    /* Call the newer function */\r
-    return FsRtlNumberOfRunsInLargeMcb(\r
-        &Mcb->DummyFieldThatSizesThisStructureCorrectly);\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlRemoveLargeMcbEntry(IN PLARGE_MCB Mcb,\r
-                         IN LONGLONG Vbn,\r
-                         IN LONGLONG SectorCount)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlRemoveMcbEntry(IN PMCB Mcb,\r
-                    IN VBN Vbn,\r
-                    IN ULONG SectorCount)\r
-{\r
-    /* Call the large function */\r
-    FsRtlRemoveLargeMcbEntry(&Mcb->DummyFieldThatSizesThisStructureCorrectly,\r
-                             (LONGLONG)Vbn,\r
-                             (LONGLONG)SectorCount);\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlResetLargeMcb(IN PLARGE_MCB Mcb,\r
-                   IN BOOLEAN SelfSynchronized)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlSplitLargeMcb(IN PLARGE_MCB Mcb,\r
-                   IN LONGLONG Vbn,\r
-                   IN LONGLONG Amount)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlTruncateLargeMcb(IN PLARGE_MCB Mcb,\r
-                      IN LONGLONG Vbn)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlTruncateMcb (IN PMCB Mcb,\r
-                  IN VBN  Vbn)\r
-{\r
-    /* Call the newer function */\r
-    FsRtlTruncateLargeMcb(&Mcb->DummyFieldThatSizesThisStructureCorrectly,\r
-                          (LONGLONG)Vbn);\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlUninitializeLargeMcb(IN PLARGE_MCB Mcb)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlUninitializeMcb(IN PMCB Mcb)\r
-{\r
-    /* Call the newer function */\r
-    FsRtlUninitializeLargeMcb(&Mcb->DummyFieldThatSizesThisStructureCorrectly);\r
-}\r
-\r
+/* $Id$
+ *
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/mcb.c
+ * PURPOSE:         No purpose listed.
+ *
+ * PROGRAMMERS:     No programmer listed.
+ */
+
+/* INCLUDES ****************************************************************/
+
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * NOTES
+ *
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+FsRtlAddLargeMcbEntry(IN PLARGE_MCB Mcb,
+                      IN LONGLONG Vbn,
+                      IN LONGLONG Lbn,
+                      IN LONGLONG SectorCount)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+ * FsRtlAddMcbEntry: Obsolete
+ *
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlAddMcbEntry(IN PMCB     Mcb,
+                 IN VBN      Vbn,
+                 IN LBN      Lbn,
+                 IN ULONG    SectorCount)
+{
+    return FsRtlAddLargeMcbEntry(&Mcb->DummyFieldThatSizesThisStructureCorrectly,
+                                 (LONGLONG)Vbn,
+                                 (LONGLONG)Lbn,
+                                 (LONGLONG)SectorCount);
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+FsRtlGetNextLargeMcbEntry(IN PLARGE_MCB Mcb,
+                          IN ULONG RunIndex,
+                          OUT PLONGLONG Vbn,
+                          OUT PLONGLONG Lbn,
+                          OUT PLONGLONG SectorCount)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlGetNextMcbEntry(IN PMCB     Mcb,
+                     IN ULONG    RunIndex,
+                     OUT PVBN    Vbn,
+                     OUT PLBN    Lbn,
+                     OUT PULONG  SectorCount)
+{
+    BOOLEAN Return = FALSE;
+    LONGLONG llVbn;
+    LONGLONG llLbn;
+    LONGLONG llSectorCount;
+
+    /* Call the Large version */
+    Return = FsRtlGetNextLargeMcbEntry(&Mcb->DummyFieldThatSizesThisStructureCorrectly,
+                                       RunIndex,
+                                       &llVbn,
+                                       &llLbn,
+                                       &llSectorCount);
+
+    /* Return everything typecasted */
+    *Vbn = (ULONG)llVbn;
+    *Lbn = (ULONG)llLbn;
+    *SectorCount = (ULONG)llSectorCount;
+
+    /* And return the original value */
+    return(Return);
+}
+
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+FsRtlInitializeLargeMcb(IN PLARGE_MCB Mcb,
+                        IN POOL_TYPE PoolType)
+{
+    UNIMPLEMENTED;
+    Mcb->BaseMcb.PoolType = PoolType;
+}
+
+/*
+ * FsRtlInitializeMcb: Obsolete
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlInitializeMcb (IN PMCB         Mcb,
+                    IN POOL_TYPE    PoolType)
+{
+    FsRtlInitializeLargeMcb(& Mcb->DummyFieldThatSizesThisStructureCorrectly, PoolType);
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+FsRtlLookupLargeMcbEntry(IN PLARGE_MCB Mcb,
+                         IN LONGLONG Vbn,
+                         OUT PLONGLONG Lbn OPTIONAL,
+                         OUT PLONGLONG SectorCountFromLbn OPTIONAL,
+                         OUT PLONGLONG StartingLbn OPTIONAL,
+                         OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL,
+                         OUT PULONG Index OPTIONAL)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+FsRtlLookupLastLargeMcbEntryAndIndex(IN PLARGE_MCB OpaqueMcb,
+                                     OUT PLONGLONG LargeVbn,
+                                     OUT PLONGLONG LargeLbn,
+                                     OUT PULONG Index)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+PFSRTL_PER_STREAM_CONTEXT
+NTAPI
+FsRtlLookupPerStreamContextInternal(IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
+                                    IN PVOID OwnerId OPTIONAL,
+                                    IN PVOID InstanceId OPTIONAL)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+PFSRTL_PER_FILEOBJECT_CONTEXT
+NTAPI
+FsRtlLookupPerFileObjectContext(IN PFILE_OBJECT FileObject,
+                                IN PVOID OwnerId OPTIONAL,
+                                IN PVOID InstanceId OPTIONAL)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+FsRtlLookupLastLargeMcbEntry(IN PLARGE_MCB Mcb,
+                             OUT PLONGLONG Vbn,
+                             OUT PLONGLONG Lbn)
+{
+    UNIMPLEMENTED;
+    return(FALSE);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlLookupLastMcbEntry(IN PMCB Mcb,
+                        OUT PVBN Vbn,
+                        OUT PLBN Lbn)
+{
+    BOOLEAN Return = FALSE;
+    LONGLONG llVbn;
+    LONGLONG llLbn;
+
+    /* Call the Large version */
+    Return = FsRtlLookupLastLargeMcbEntry(&Mcb->DummyFieldThatSizesThisStructureCorrectly,
+        &llVbn,
+        &llLbn);
+
+    /* Return everything typecasted */
+    *Vbn = (ULONG)llVbn;
+    *Lbn = (ULONG)llLbn;
+
+    /* And return the original value */
+    return(Return);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+FsRtlLookupMcbEntry(IN PMCB Mcb,
+                    IN VBN Vbn,
+                    OUT PLBN Lbn,
+                    OUT PULONG SectorCount OPTIONAL,
+                    OUT PULONG Index)
+{
+    BOOLEAN Return = FALSE;
+    LONGLONG llLbn;
+    LONGLONG llSectorCount;
+
+    /* Call the Large version */
+    Return = FsRtlLookupLargeMcbEntry(&Mcb->DummyFieldThatSizesThisStructureCorrectly,
+                                      (LONGLONG)Vbn,
+                                      &llLbn,
+                                      &llSectorCount,
+                                      NULL,
+                                      NULL,
+                                      Index);
+
+    /* Return everything typecasted */
+    *Lbn = (ULONG)llLbn;
+    if (SectorCount) *SectorCount = (ULONG)llSectorCount;
+
+    /* And return the original value */
+    return(Return);
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+FsRtlNumberOfRunsInLargeMcb(IN PLARGE_MCB Mcb)
+{
+    ULONG NumberOfRuns;
+
+    KeAcquireGuardedMutex(Mcb->GuardedMutex);
+    NumberOfRuns = Mcb->BaseMcb.PairCount;
+    KeReleaseGuardedMutex(Mcb->GuardedMutex);
+
+    return NumberOfRuns;
+}
+
+
+/*
+ * FsRtlNumberOfRunsInMcb: Obsolete
+ *
+ * @implemented
+ */
+ULONG
+NTAPI
+FsRtlNumberOfRunsInMcb (IN PMCB Mcb)
+{
+    return FsRtlNumberOfRunsInLargeMcb(&Mcb->DummyFieldThatSizesThisStructureCorrectly);
+}
+
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+FsRtlRemoveLargeMcbEntry(IN PLARGE_MCB Mcb,
+                         IN LONGLONG Vbn,
+                         IN LONGLONG SectorCount)
+{
+    UNIMPLEMENTED;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlRemoveMcbEntry(IN PMCB     Mcb,
+                    IN VBN      Vbn,
+                    IN ULONG    SectorCount)
+{
+    /* Call the large function */
+    FsRtlRemoveLargeMcbEntry(&Mcb->DummyFieldThatSizesThisStructureCorrectly,
+                             (LONGLONG)Vbn,
+                             (LONGLONG)SectorCount);
+}
+
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+FsRtlResetLargeMcb(IN PLARGE_MCB Mcb,
+                   IN BOOLEAN SelfSynchronized)
+{
+    UNIMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+FsRtlSplitLargeMcb(IN PLARGE_MCB Mcb,
+                   IN LONGLONG Vbn,
+                   IN LONGLONG Amount)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+FsRtlTruncateLargeMcb(IN PLARGE_MCB Mcb,
+                      IN LONGLONG Vbn)
+{
+    UNIMPLEMENTED;
+}
+
+/*
+ * FsRtlTruncateMcb: Obsolete
+ *
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlTruncateMcb (IN PMCB Mcb,
+                  IN VBN  Vbn)
+{
+    FsRtlTruncateLargeMcb(&Mcb->DummyFieldThatSizesThisStructureCorrectly, (LONGLONG)Vbn);
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+FsRtlUninitializeLargeMcb(IN PLARGE_MCB Mcb)
+{
+    UNIMPLEMENTED;
+}
+
+/*
+ * FsRtlUninitializeMcb: Obsolete
+ *
+ * @implemented
+ */
+VOID
+NTAPI
+FsRtlUninitializeMcb(IN PMCB Mcb)
+{
+    FsRtlUninitializeLargeMcb(& Mcb->DummyFieldThatSizesThisStructureCorrectly);
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/fs/name.c b/reactos/ntoskrnl/fs/name.c
new file mode 100644 (file)
index 0000000..2e9f09d
--- /dev/null
@@ -0,0 +1,655 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/name.c
+ * PURPOSE:         Name and DBCS Name Validation and Dissection Functions.
+ *
+ * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)
+ *                  Eric Kohl
+ *                  Filip Navara
+ */
+
+/* INCLUDES ****************************************************************/
+
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+/* GLOBALS *******************************************************************/
+
+static UCHAR LegalAnsiCharacterArray[] =
+{
+  0,                                                        /* CTRL+@, 0x00 */
+  0,                                                        /* CTRL+A, 0x01 */
+  0,                                                        /* CTRL+B, 0x02 */
+  0,                                                        /* CTRL+C, 0x03 */
+  0,                                                        /* CTRL+D, 0x04 */
+  0,                                                        /* CTRL+E, 0x05 */
+  0,                                                        /* CTRL+F, 0x06 */
+  0,                                                        /* CTRL+G, 0x07 */
+  0,                                                        /* CTRL+H, 0x08 */
+  0,                                                        /* CTRL+I, 0x09 */
+  0,                                                        /* CTRL+J, 0x0a */
+  0,                                                        /* CTRL+K, 0x0b */
+  0,                                                        /* CTRL+L, 0x0c */
+  0,                                                        /* CTRL+M, 0x0d */
+  0,                                                        /* CTRL+N, 0x0e */
+  0,                                                        /* CTRL+O, 0x0f */
+  0,                                                        /* CTRL+P, 0x10 */
+  0,                                                        /* CTRL+Q, 0x11 */
+  0,                                                        /* CTRL+R, 0x12 */
+  0,                                                        /* CTRL+S, 0x13 */
+  0,                                                        /* CTRL+T, 0x14 */
+  0,                                                        /* CTRL+U, 0x15 */
+  0,                                                        /* CTRL+V, 0x16 */
+  0,                                                        /* CTRL+W, 0x17 */
+  0,                                                        /* CTRL+X, 0x18 */
+  0,                                                        /* CTRL+Y, 0x19 */
+  0,                                                        /* CTRL+Z, 0x1a */
+  0,                                                        /* CTRL+[, 0x1b */
+  0,                                                        /* CTRL+\, 0x1c */
+  0,                                                        /* CTRL+], 0x1d */
+  0,                                                        /* CTRL+^, 0x1e */
+  0,                                                        /* CTRL+_, 0x1f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* ` ',    0x20 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `!',    0x21 */
+  FSRTL_WILD_CHARACTER,                                     /* `"',    0x22 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `#',    0x23 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `$',    0x24 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `%',    0x25 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `&',    0x26 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `'',    0x27 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `(',    0x28 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `)',    0x29 */
+  FSRTL_WILD_CHARACTER,                                     /* `*',    0x2a */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `+',    0x2b */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `,',    0x2c */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `-',    0x2d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `.',    0x2e */
+  0,                                                        /* `/',    0x2f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `0',    0x30 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `1',    0x31 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `2',    0x32 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `3',    0x33 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `4',    0x34 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `5',    0x35 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `6',    0x36 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `7',    0x37 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `8',    0x38 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `9',    0x39 */
+  FSRTL_NTFS_LEGAL,                                         /* `:',    0x3a */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `;',    0x3b */
+  FSRTL_WILD_CHARACTER,                                     /* `<',    0x3c */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `=',    0x3d */
+  FSRTL_WILD_CHARACTER,                                     /* `>',    0x3e */
+  FSRTL_WILD_CHARACTER,                                     /* `?',    0x3f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `@',    0x40 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `A',    0x41 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `B',    0x42 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `C',    0x43 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `D',    0x44 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `E',    0x45 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `F',    0x46 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `G',    0x47 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `H',    0x48 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `I',    0x49 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `J',    0x4a */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `K',    0x4b */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `L',    0x4c */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `M',    0x4d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `N',    0x4e */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `O',    0x4f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `P',    0x50 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `Q',    0x51 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `R',    0x52 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `S',    0x53 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `T',    0x54 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `U',    0x55 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `V',    0x56 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `W',    0x57 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `X',    0x58 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `Y',    0x59 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `Z',    0x5a */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `[',    0x5b */
+  0,                                                        /* `\',    0x5c */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `]',    0x5d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `^',    0x5e */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `_',    0x5f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* ``',    0x60 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `a',    0x61 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `b',    0x62 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `c',    0x63 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `d',    0x64 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `e',    0x65 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `f',    0x66 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `g',    0x67 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `h',    0x68 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `i',    0x69 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `j',    0x6a */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `k',    0x6b */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `l',    0x6c */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `m',    0x6d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `n',    0x6e */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `o',    0x6f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `p',    0x70 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `q',    0x71 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `r',    0x72 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `s',    0x73 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `t',    0x74 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `u',    0x75 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `v',    0x76 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `w',    0x77 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `x',    0x78 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `y',    0x79 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `z',    0x7a */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `{',    0x7b */
+  0,                                                        /* `|',    0x7c */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `}',    0x7d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `~',    0x7e */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL     /*         0x7f */
+};
+
+PUCHAR FsRtlLegalAnsiCharacterArray = LegalAnsiCharacterArray;
+
+/* FUNCTIONS *****************************************************************/
+
+/*++
+ * @name FsRtlAreNamesEqual
+ * @implemented
+ *
+ * FILLME
+ *
+ * @param Name1
+ *        FILLME
+ *
+ * @param Name2
+ *        FILLME
+ *
+ * @param IgnoreCase
+ *        FILLME
+ *
+ * @param UpcaseTable
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks From Bo Branten's ntifs.h v25.
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlAreNamesEqual(IN PCUNICODE_STRING Name1,
+                   IN PCUNICODE_STRING Name2,
+                   IN BOOLEAN IgnoreCase,
+                   IN PCWCH UpcaseTable OPTIONAL)
+{
+    UNICODE_STRING UpcaseName1;
+    UNICODE_STRING UpcaseName2;
+    BOOLEAN StringsAreEqual;
+
+    /* Well, first check their size */
+    if (Name1->Length != Name2->Length) {
+        /* Not equal! */
+        return FALSE;
+    }
+
+    /* Turn them into Upcase if we don't have a table */
+    if (IgnoreCase && !UpcaseTable) {
+        RtlUpcaseUnicodeString(&UpcaseName1, Name1, TRUE);
+        RtlUpcaseUnicodeString(&UpcaseName2, Name2, TRUE);
+        Name1 = &UpcaseName1;
+        Name2 = &UpcaseName2;
+
+        goto ManualCase;
+    }
+
+    /* Do a case-sensitive search */
+    if (!IgnoreCase) {
+
+ManualCase:
+        /* Use a raw memory compare */
+        StringsAreEqual = RtlEqualMemory(Name1->Buffer,
+                                         Name2->Buffer,
+                                         Name1->Length);
+
+        /* Clear the strings if we need to */
+        if (IgnoreCase) {
+            RtlFreeUnicodeString(&UpcaseName1);
+            RtlFreeUnicodeString(&UpcaseName2);
+        }
+
+        /* Return the equality */
+        return StringsAreEqual;
+
+    } else {
+
+        /* Case in-sensitive search */
+
+        LONG i;
+
+        for (i = Name1->Length / sizeof(WCHAR) - 1; i >= 0; i--) {
+
+            if (UpcaseTable[Name1->Buffer[i]] != UpcaseTable[Name2->Buffer[i]]) {
+
+                /* Non-match found! */
+                return FALSE;
+            }
+        }
+
+        /* We finished the loop so we are equal */
+        return TRUE;
+    }
+}
+
+/*++
+ * @name FsRtlDissectDbcs
+ * @implemented
+ *
+ * Dissects a given path name into first and remaining part.
+ *
+ * @param Name
+ *        ANSI string to dissect.
+ *
+ * @param FirstPart
+ *        Pointer to user supplied ANSI_STRING, that will later point
+ *        to the first part of the original name.
+ *
+ * @param RemainingPart
+ *        Pointer to user supplied ANSI_STRING, that will later point
+ *        to the remaining part of the original name.
+ *
+ * @return None
+ *
+ * @remarks Example:
+ *          Name:           \test1\test2\test3
+ *          FirstPart:      test1
+ *          RemainingPart:  test2\test3
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlDissectDbcs(IN ANSI_STRING Name,
+                 OUT PANSI_STRING FirstPart,
+                 OUT PANSI_STRING RemainingPart)
+{
+    ULONG i;
+    ULONG FirstLoop;
+
+    /* Initialize the Outputs */
+    RtlZeroMemory(&FirstPart, sizeof(ANSI_STRING));
+    RtlZeroMemory(&RemainingPart, sizeof(ANSI_STRING));
+
+    /* Bail out if empty */
+    if (!Name.Length) return;
+
+    /* Ignore backslash */
+    if (Name.Buffer[0] == '\\') {
+        i = 1;
+    } else {
+        i = 0;
+    }
+
+    /* Loop until we find a backslash */
+    for (FirstLoop = i;i < Name.Length;i++) {
+        if (Name.Buffer[i] != '\\') break;
+        if (FsRtlIsLeadDbcsCharacter(Name.Buffer[i])) i++;
+    }
+
+    /* Now we have the First Part */
+    FirstPart->Length = (USHORT)(i - FirstLoop);
+    FirstPart->MaximumLength = FirstPart->Length; /* +2?? */
+    FirstPart->Buffer = &Name.Buffer[FirstLoop];
+
+    /* Make the second part if something is still left */
+    if (i<Name.Length) {
+        RemainingPart->Length = (USHORT)(Name.Length - (i+1));
+        RemainingPart->MaximumLength = RemainingPart->Length; /* +2?? */
+        RemainingPart->Buffer = &Name.Buffer[i+1];
+    }
+
+    return;
+}
+
+/*++
+ * @name FsRtlDissectName
+ * @implemented
+ *
+ * Dissects a given path name into first and remaining part.
+ *
+ * @param Name
+ *        Unicode string to dissect.
+ *
+ * @param FirstPart
+ *        Pointer to user supplied UNICODE_STRING, that will later point
+ *        to the first part of the original name.
+ *
+ * @param RemainingPart
+ *        Pointer to user supplied UNICODE_STRING, that will later point
+ *        to the remaining part of the original name.
+ *
+ * @return None
+ *
+ * @remarks Example:
+ *          Name:           \test1\test2\test3
+ *          FirstPart:      test1
+ *          RemainingPart:  test2\test3
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlDissectName(IN UNICODE_STRING Name,
+                 OUT PUNICODE_STRING FirstPart,
+                 OUT PUNICODE_STRING RemainingPart)
+{
+    USHORT NameOffset = 0;
+    USHORT NameLength = 0;
+    USHORT Length;
+
+    FirstPart->Length = 0;
+    FirstPart->MaximumLength = 0;
+    FirstPart->Buffer = NULL;
+
+    RemainingPart->Length = 0;
+    RemainingPart->MaximumLength = 0;
+    RemainingPart->Buffer = NULL;
+
+    if (Name.Length == 0)
+        return;
+
+    /* Skip leading backslash */
+    if (Name.Buffer[0] == L'\\')
+        NameOffset++;
+
+    Length = Name.Length / sizeof(WCHAR);
+
+    /* Search for next backslash or end-of-string */
+    while ((NameOffset + NameLength < Length) &&
+        (Name.Buffer[NameOffset + NameLength] != L'\\'))
+    {
+        NameLength++;
+    }
+
+    FirstPart->Length =
+        FirstPart->MaximumLength = NameLength * sizeof(WCHAR);
+    FirstPart->Buffer = &Name.Buffer[NameOffset];
+
+    NameOffset += NameLength + 1;
+    if (NameOffset < Length)
+    {
+        RemainingPart->Length = (Length - NameOffset) * sizeof(WCHAR);
+        RemainingPart->MaximumLength = (Length - NameOffset) * sizeof(WCHAR);
+        RemainingPart->Buffer = &Name.Buffer[NameOffset];
+    }
+}
+
+/*++
+ * @name FsRtlDoesDbcsContainWildCards
+ * @implemented
+ *
+ * FILLME
+ *
+ * @param Name
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlDoesDbcsContainWildCards(IN PANSI_STRING Name)
+{
+    ULONG i;
+
+    /* Check every character */
+    for (i=0;i < Name->Length;i++) {
+
+        /* First make sure it's not the Lead DBCS */
+        if (FsRtlIsLeadDbcsCharacter(Name->Buffer[i])) {
+            i++;
+        } else if (FsRtlIsAnsiCharacterWild(Name->Buffer[i])) {
+            /* Now return if it has a Wilcard */
+            return TRUE;
+        }
+    }
+
+    /* We didn't return above...so none found */
+    return FALSE;
+}
+
+/*++
+ * @name FsRtlDoesNameContainWildCards
+ * @implemented
+ *
+ * FILLME
+ *
+ * @param Name
+ *        Pointer to a UNICODE_STRING containing Name to examine
+ *
+ * @return TRUE if Name contains wildcards, FALSE otherwise
+ *
+ * @remarks From Bo Branten's ntifs.h v12.
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name)
+{
+    PWCHAR Ptr;
+
+    /* Loop through every character */
+    if (Name->Length) {
+        for (Ptr = Name->Buffer + (Name->Length / sizeof(WCHAR))-1;
+             Ptr >= Name->Buffer && *Ptr != L'\\';Ptr--) {
+
+            /* Check for Wildcard */
+            if (FsRtlIsUnicodeCharacterWild(*Ptr)) {
+                return TRUE;
+            }
+        }
+    }
+
+    /* Nothing Found */
+    return FALSE;
+}
+
+/*++
+ * @name FsRtlIsDbcsInExpression
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Expression
+ *        FILLME
+ *
+ * @param Name
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
+                        IN PANSI_STRING Name)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*++
+ * @name FsRtlIsFatDbcsLegal
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param DbcsName
+ *        FILLME
+ *
+ * @param WildCardsPermissible
+ *        FILLME
+ *
+ * @param PathNamePermissible
+ *        FILLME
+ *
+ * @param LeadingBackslashPermissible
+ *        FILLME
+ *
+ * @return TRUE if the DbcsName is legal, FALSE otherwise
+ *
+ * @remarks None
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlIsFatDbcsLegal(IN ANSI_STRING DbcsName,
+                    IN BOOLEAN WildCardsPermissible,
+                    IN BOOLEAN PathNamePermissible,
+                    IN BOOLEAN LeadingBackslashPermissible)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*++
+ * @name FsRtlIsHpfsDbcsLegal
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param DbcsName
+ *        FILLME
+ *
+ * @param WildCardsPermissible
+ *        FILLME
+ *
+ * @param PathNamePermissible
+ *        FILLME
+ *
+ * @param LeadingBackslashPermissible
+ *        FILLME
+ *
+ * @return TRUE if the DbcsName is legal, FALSE otherwise
+ *
+ * @remarks None
+ *
+ *--*/
+BOOLEAN
+STDCALL
+FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
+                     IN BOOLEAN WildCardsPermissible,
+                     IN BOOLEAN PathNamePermissible,
+                     IN BOOLEAN LeadingBackslashPermissible)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*++
+ * @name FsRtlIsNameInExpression
+ * @implemented
+ *
+ * FILLME
+ *
+ * @param DeviceObject
+ *        FILLME
+ *
+ * @param Irp
+ *        FILLME
+ *
+ * @return TRUE if Name is in Expression, FALSE otherwise
+ *
+ * @remarks From Bo Branten's ntifs.h v12. This function should be
+ *          rewritten to avoid recursion and better wildcard handling
+ *          should be implemented (see FsRtlDoesNameContainWildCards).
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlIsNameInExpression(IN PUNICODE_STRING Expression,
+                        IN PUNICODE_STRING Name,
+                        IN BOOLEAN IgnoreCase,
+                        IN PWCHAR UpcaseTable OPTIONAL)
+{
+    USHORT ExpressionPosition, NamePosition;
+    UNICODE_STRING TempExpression, TempName;
+
+    ExpressionPosition = 0;
+    NamePosition = 0;
+    while (ExpressionPosition < (Expression->Length / sizeof(WCHAR)) &&
+        NamePosition < (Name->Length / sizeof(WCHAR)))
+    {
+        if (Expression->Buffer[ExpressionPosition] == L'*')
+        {
+            ExpressionPosition++;
+            if (ExpressionPosition == (Expression->Length / sizeof(WCHAR)))
+            {
+                return TRUE;
+            }
+            while (NamePosition < (Name->Length / sizeof(WCHAR)))
+            {
+                TempExpression.Length =
+                    TempExpression.MaximumLength =
+                    Expression->Length - (ExpressionPosition * sizeof(WCHAR));
+                TempExpression.Buffer = Expression->Buffer + ExpressionPosition;
+                TempName.Length =
+                    TempName.MaximumLength =
+                    Name->Length - (NamePosition * sizeof(WCHAR));
+                TempName.Buffer = Name->Buffer + NamePosition;
+                /* FIXME: Rewrite to get rid of recursion */
+                if (FsRtlIsNameInExpression(&TempExpression, &TempName,
+                    IgnoreCase, UpcaseTable))
+                {
+                    return TRUE;
+                }
+                NamePosition++;
+            }
+        }
+        else
+        {
+            /* FIXME: Take UpcaseTable into account! */
+            if (Expression->Buffer[ExpressionPosition] == L'?' ||
+                (IgnoreCase &&
+                RtlUpcaseUnicodeChar(Expression->Buffer[ExpressionPosition]) ==
+                RtlUpcaseUnicodeChar(Name->Buffer[NamePosition])) ||
+                (!IgnoreCase &&
+                Expression->Buffer[ExpressionPosition] ==
+                Name->Buffer[NamePosition]))
+            {
+                NamePosition++;
+                ExpressionPosition++;
+            }
+            else
+            {
+                return FALSE;
+            }
+        }
+    }
+
+    /* Handle matching of "f0_*.*" expression to "f0_000" file name. */
+    if (ExpressionPosition < (Expression->Length / sizeof(WCHAR)) &&
+        Expression->Buffer[ExpressionPosition] == L'.')
+    {
+        while (ExpressionPosition < (Expression->Length / sizeof(WCHAR)) &&
+            (Expression->Buffer[ExpressionPosition] == L'.' ||
+            Expression->Buffer[ExpressionPosition] == L'*' ||
+            Expression->Buffer[ExpressionPosition] == L'?'))
+        {
+            ExpressionPosition++;
+        }
+    }
+
+    if (ExpressionPosition == (Expression->Length / sizeof(WCHAR)) &&
+        NamePosition == (Name->Length / sizeof(WCHAR)))
+    {
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/fs/notify.c b/reactos/ntoskrnl/fs/notify.c
new file mode 100644 (file)
index 0000000..759f0e7
--- /dev/null
@@ -0,0 +1,1214 @@
+/* $Id$
+ *
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/notify.c
+ * PURPOSE:         No purpose listed.
+ *
+ * PROGRAMMERS:     Gunnar Dalsnes
+ */
+
+/* INCLUDES *****************************************************************/
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, FsRtlpInitNotifyImplementation)
+#endif
+
+/* GLOBALS *******************************************************************/
+
+PAGED_LOOKASIDE_LIST    NotifyEntryLookaside;
+
+typedef struct _NOTIFY_ENTRY
+{
+    LIST_ENTRY ListEntry;
+    PSTRING FullDirectoryName;
+    BOOLEAN WatchTree;
+    BOOLEAN PendingChanges;
+    ULONG CompletionFilter;
+    LIST_ENTRY IrpQueue;
+    PVOID Fcb;
+    PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback;
+    PSECURITY_SUBJECT_CONTEXT SubjectContext;
+    PVOID FsContext;
+    BOOLEAN Unicode;
+    BOOLEAN BufferExhausted;
+    PVOID Buffer; /* Buffer == NULL equals IgnoreBuffer == TRUE */
+    ULONG BufferSize;
+    ULONG NextEntryOffset;
+    PFILE_NOTIFY_INFORMATION PrevEntry;
+} NOTIFY_ENTRY, *PNOTIFY_ENTRY;
+
+/* FUNCTIONS *****************************************************************/
+
+/*++
+ * @name FsRtlpInitNotifyImplementation
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI INIT_FUNCTION
+FsRtlpInitNotifyImplementation(VOID)
+{
+    ExInitializePagedLookasideList(&NotifyEntryLookaside,
+                                   NULL,
+                                   NULL,
+                                   0,
+                                   sizeof(NOTIFY_ENTRY),
+                                   FSRTL_NOTIFY_TAG,
+                                   0);
+}
+
+/*++
+ * @name FsRtlpIsUnicodePath
+ *
+ * FILLME
+ *
+ * @param Path
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+static
+__inline
+BOOLEAN
+FsRtlpIsUnicodePath(PSTRING Path)
+{
+    ASSERT(Path->Length);
+
+    if (Path->Length == 1)
+        return FALSE;
+
+    if (*(WCHAR*)Path->Buffer == '\\')
+        return TRUE;
+
+    return FALSE;
+}
+
+/*++
+ * @name FsRtlpNotifyCancelRoutine
+ *
+ * FILLME
+ *
+ * @param DeviceObject
+ *        FILLME
+ *
+ * @param Irp
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+static
+VOID
+NTAPI
+FsRtlpNotifyCancelRoutine(IN PDEVICE_OBJECT DeviceObject,
+                          IN PIRP Irp)
+{
+   PFAST_MUTEX Lock;
+
+   //don't need this since we have our own sync. protecting irp cancellation
+   IoReleaseCancelSpinLock(Irp->CancelIrql);
+
+   Lock = (PFAST_MUTEX)Irp->Tail.Overlay.DriverContext[3];
+
+   ExAcquireFastMutex(Lock );
+
+   RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+
+   ExReleaseFastMutex(Lock);
+
+   Irp->IoStatus.Status = STATUS_CANCELLED;
+   Irp->IoStatus.Information = 0;
+
+   IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+}
+
+/*++
+ * @name FsRtlpFindNotifyEntry
+ *
+ * FILLME
+ *
+ * @param NotifyList
+ *        FILLME
+ *
+ * @param FsContext
+ *        FILLME
+ *
+ * @return FILLME
+ *
+ * @remarks None
+ *
+ *--*/
+static
+PNOTIFY_ENTRY
+FASTCALL
+FsRtlpFindNotifyEntry(PLIST_ENTRY NotifyList,
+                      PVOID FsContext)
+{
+    PNOTIFY_ENTRY NotifyEntry;
+
+    LIST_FOR_EACH(NotifyEntry, NotifyList, NOTIFY_ENTRY, ListEntry)
+    {
+        if (NotifyEntry->FsContext == FsContext)
+        {
+            return NotifyEntry;
+        }
+    }
+
+    return NULL;
+}
+
+/*++
+ * @name FsRtlNotifyChangeDirectory
+ * @implemented
+ *
+ * FILLME
+ *
+ * @param NotifySync
+ *        FILLME
+ *
+ * @param FsContext
+ *        FILLME
+ *
+ * @param FullDirectoryName
+ *        FILLME
+ *
+ * @param NotifyList
+ *        FILLME
+ *
+ * @param WatchTree
+ *        FILLME
+ *
+ * @param CompletionFilter
+ *        FILLME
+ *
+ * @param NotifyIrp
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlNotifyChangeDirectory(IN PNOTIFY_SYNC NotifySync,
+                           IN PVOID        FsContext,
+                           IN PSTRING      FullDirectoryName,
+                           IN PLIST_ENTRY  NotifyList,
+                           IN BOOLEAN      WatchTree,
+                           IN ULONG        CompletionFilter,
+                           IN PIRP         NotifyIrp)
+{
+    FsRtlNotifyFullChangeDirectory(NotifySync,
+                                   NotifyList,
+                                   FsContext,
+                                   FullDirectoryName,
+                                   WatchTree,
+                                   TRUE, /* IgnoreBuffer */
+                                   CompletionFilter,
+                                   NotifyIrp,
+                                   NULL,
+                                   NULL);
+}
+
+/*++
+ * @name FsRtlNotifyCleanup
+ * @unimplemented
+ *
+ * Called by FSD when all handles to FileObject (identified by FsContext) are closed
+ *
+ * @param NotifySync
+ *        FILLME
+ *
+ * @param NotifyList
+ *        FILLME
+ *
+ * @param FsContext
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlNotifyCleanup(IN PNOTIFY_SYNC NotifySync,
+                   IN PLIST_ENTRY NotifyList,
+                   IN PVOID FsContext)
+{
+    PNOTIFY_ENTRY NotifyEntry;
+    LIST_ENTRY CompletedListHead;
+    PLIST_ENTRY TmpEntry;
+    PIRP Irp;
+
+    InitializeListHead(&CompletedListHead);
+
+    ExAcquireFastMutex((PFAST_MUTEX)NotifySync);
+
+    NotifyEntry = FsRtlpFindNotifyEntry(NotifyList, FsContext);
+
+    if (NotifyEntry)
+    {
+        /* free buffered changes */
+        if (NotifyEntry->Buffer)
+        {
+            ExFreePool(NotifyEntry->Buffer);
+        }
+
+        /* cancel(?) pending irps */
+        while (!IsListEmpty(&NotifyEntry->IrpQueue))
+        {
+            TmpEntry = RemoveHeadList(&NotifyEntry->IrpQueue);
+            Irp = CONTAINING_RECORD(TmpEntry , IRP, Tail.Overlay.ListEntry);
+
+            /* irp cancelation bolilerplate */
+            if (!IoSetCancelRoutine(Irp, NULL))
+            {
+                //The cancel routine will be called. When we release the lock it will complete the irp.
+                InitializeListHead(&Irp->Tail.Overlay.ListEntry);
+                continue;
+            }
+
+            Irp->IoStatus.Status = STATUS_NOTIFY_CLEANUP; /* FIXME: correct status? */
+            Irp->IoStatus.Information = 0;
+
+            /* avoid holding lock while completing irp */
+            InsertTailList(&CompletedListHead, &Irp->Tail.Overlay.ListEntry);
+        }
+
+        /* Unlink and free the NotifyStruct */
+        RemoveEntryList(&NotifyEntry->ListEntry);
+        ExFreeToPagedLookasideList(&NotifyEntryLookaside, NotifyEntry);
+    }
+
+    ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
+
+    /* complete defered irps */
+    while (!IsListEmpty(&CompletedListHead))
+    {
+        TmpEntry = RemoveHeadList(&CompletedListHead);
+        Irp = CONTAINING_RECORD(TmpEntry , IRP, Tail.Overlay.ListEntry);
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
+}
+
+/*++
+ * @name FsRtlNotifyFilterChangeDirectory
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param NotifySync
+ *        FILLME
+ *
+ * @param NotifyList
+ *        FILLME
+ *
+ * @param FsContext
+ *        FILLME
+ *
+ * @param FullDirectoryName
+ *        FILLME
+ *
+ * @param WatchTree
+ *        FILLME
+ *
+ * @param IgnoreBuffer
+ *        FILLME
+ *
+ * @param CompletionFilter
+ *        FILLME
+ *
+ * @param NotifyIrp
+ *        FILLME
+ *
+ * @param TraverseCallback
+ *        FILLME
+ *
+ * @param SubjectContext
+ *        FILLME
+ *
+ * @param FilterCallback
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlNotifyFilterChangeDirectory(IN PNOTIFY_SYNC NotifySync,
+                                 IN PLIST_ENTRY NotifyList,
+                                 IN PVOID FsContext,
+                                 IN PSTRING FullDirectoryName,
+                                 IN BOOLEAN WatchTree,
+                                 IN BOOLEAN IgnoreBuffer,
+                                 IN ULONG CompletionFilter,
+                                 IN PIRP NotifyIrp,
+                                 IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,
+                                 IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL,
+                                 IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL)
+{
+    UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlNotifyFilterReportChange
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param NotifySync
+ *        FILLME
+ *
+ * @param NotifyList
+ *        FILLME
+ *
+ * @param FullTargetName
+ *        FILLME
+ *
+ * @param TargetNameOffset
+ *        FILLME
+ *
+ * @param StreamName
+ *        FILLME
+ *
+ * @param NormalizedParentName
+ *        FILLME
+ *
+ * @param FilterMatch
+ *        FILLME
+ *
+ * @param Action
+ *        FILLME
+ *
+ * @param TargetContext
+ *        FILLME
+ *
+ * @param FilterContext
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlNotifyFilterReportChange(IN PNOTIFY_SYNC NotifySync,
+                              IN PLIST_ENTRY NotifyList,
+                              IN PSTRING FullTargetName,
+                              IN USHORT TargetNameOffset,
+                              IN PSTRING StreamName OPTIONAL,
+                              IN PSTRING NormalizedParentName OPTIONAL,
+                              IN ULONG FilterMatch,
+                              IN ULONG Action,
+                              IN PVOID TargetContext,
+                              IN PVOID FilterContext)
+{
+    UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlpWatchedDirectoryWasDeleted
+ *
+ * FILLME
+ *
+ * @param NotifySync
+ *        FILLME
+ *
+ * @param NotifyList
+ *        FILLME
+ *
+ * @param Fcb
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks Private function
+ *
+ *--*/
+static
+VOID
+FASTCALL
+FsRtlpWatchedDirectoryWasDeleted(IN PNOTIFY_SYNC    NotifySync,
+                                 IN PLIST_ENTRY     NotifyList,
+                                 IN PVOID           Fcb)
+{
+    LIST_ENTRY CompletedListHead;
+    PLIST_ENTRY TmpEntry;
+    PNOTIFY_ENTRY NotifyEntry, tmp;
+    PIRP Irp;
+
+    InitializeListHead(&CompletedListHead);
+
+    ExAcquireFastMutex((PFAST_MUTEX)NotifySync);
+
+    LIST_FOR_EACH_SAFE(NotifyEntry, tmp, NotifyList, NOTIFY_ENTRY, ListEntry )
+    {
+        if (NotifyEntry->Fcb == Fcb)
+        {
+            RemoveEntryList(&NotifyEntry->ListEntry);
+
+            /* free buffered changes */
+            if (NotifyEntry->Buffer)
+            {
+                ExFreePool(NotifyEntry->Buffer);
+            }
+
+            /* cleanup pending irps */
+            while (!IsListEmpty(&NotifyEntry->IrpQueue))
+            {
+                TmpEntry = RemoveHeadList(&NotifyEntry->IrpQueue);
+                Irp = CONTAINING_RECORD(TmpEntry , IRP, Tail.Overlay.ListEntry);
+
+                /* irp cancelation bolilerplate */
+                if (!IoSetCancelRoutine(Irp, NULL))
+                {
+                    //The cancel routine will be called. When we release the lock it will complete the irp.
+                    InitializeListHead(&Irp->Tail.Overlay.ListEntry);
+                    continue;
+                }
+
+                Irp->IoStatus.Status = STATUS_DELETE_PENDING;
+                Irp->IoStatus.Information = 0;
+
+                /* avoid holding lock while completing irp */
+                InsertTailList(&CompletedListHead, &Irp->Tail.Overlay.ListEntry);
+            }
+        }
+    }
+
+    ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
+
+    /* complete defered irps */
+    while (!IsListEmpty(&CompletedListHead))
+    {
+        TmpEntry = RemoveHeadList(&CompletedListHead);
+        Irp = CONTAINING_RECORD(TmpEntry , IRP, Tail.Overlay.ListEntry);
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
+}
+
+/*++
+ * @name FsRtlNotifyFullChangeDirectory
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param NotifySync
+ *        FILLME
+ *
+ * @param NotifyList
+ *        FILLME
+ *
+ * @param FsContext
+ *        FILLME
+ *
+ * @param FullDirectoryName
+ *        FILLME
+ *
+ * @param WatchTree
+ *        FILLME
+ *
+ * @param IgnoreBuffer
+ *        FILLME
+ *
+ * @param CompletionFilter
+ *        FILLME
+ *
+ * @param Irp
+ *        FILLME
+ *
+ * @param TraverseCallback
+ *        FILLME
+ *
+ * @param SubjectContext
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlNotifyFullChangeDirectory(IN PNOTIFY_SYNC  NotifySync,
+                               IN PLIST_ENTRY   NotifyList,
+                               IN PVOID         FsContext,
+                               IN PSTRING       FullDirectoryName,
+                               IN BOOLEAN       WatchTree,
+                               IN BOOLEAN       IgnoreBuffer,
+                               IN ULONG         CompletionFilter,
+                               IN PIRP          Irp,
+                               IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,
+                               IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL)
+{
+    PIO_STACK_LOCATION IrpStack;
+    PNOTIFY_ENTRY NotifyEntry;
+    ULONG IrpBuffLen;
+
+    if (!Irp)
+    {
+        /* all other params are ignored if NotifyIrp == NULL */
+        FsRtlpWatchedDirectoryWasDeleted(NotifySync, NotifyList, FsContext);
+        return;
+    }
+
+    DPRINT("FullDirectoryName: %wZ\n", FullDirectoryName);
+
+    ExAcquireFastMutex((PFAST_MUTEX)NotifySync);
+
+    IrpStack = IoGetCurrentIrpStackLocation(Irp);
+    if (IrpStack->FileObject->Flags & FO_CLEANUP_COMPLETE)
+    {
+        ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
+
+        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = STATUS_NOTIFY_CLEANUP;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return;
+    }
+
+    IrpBuffLen = IrpStack->Parameters.NotifyDirectory.Length;
+
+    NotifyEntry = FsRtlpFindNotifyEntry(NotifyList, FsContext);
+
+    if (!NotifyEntry)
+    {
+        /* No NotifyStruct for this FileObject existed */
+
+        /* The first request for this FileObject set the standards.
+        * For subsequent requests, these params will be ignored.
+        * Ref: Windows NT File System Internals page 516
+        */
+
+        NotifyEntry = ExAllocateFromPagedLookasideList(&NotifyEntryLookaside);
+
+        RtlZeroMemory(NotifyEntry, sizeof(NOTIFY_ENTRY));
+
+        NotifyEntry->FsContext = FsContext;
+        NotifyEntry->FullDirectoryName = FullDirectoryName;
+        NotifyEntry->WatchTree = WatchTree;
+        NotifyEntry->CompletionFilter = CompletionFilter;
+        NotifyEntry->TraverseCallback = TraverseCallback;
+        NotifyEntry->SubjectContext = SubjectContext;
+        NotifyEntry->Fcb = IrpStack->FileObject->FsContext;
+        NotifyEntry->Unicode = FsRtlpIsUnicodePath(FullDirectoryName);
+
+        /* Init. buffer */
+        if (IrpBuffLen && !IgnoreBuffer)
+        {
+            _SEH_TRY
+            {
+                NotifyEntry->Buffer = ExAllocatePoolWithQuotaTag(
+                    PagedPool,
+                    IrpBuffLen,
+                    FSRTL_NOTIFY_TAG
+                    );
+
+                NotifyEntry->BufferSize = IrpBuffLen;
+            }
+            _SEH_HANDLE
+            {
+                /* ExAllocatePoolWithQuotaTag raised exception but we dont care.
+                The impl. doesnt require a buffer, so well continue as usual.
+                */
+            }
+            _SEH_END;
+        }
+
+        InitializeListHead(&NotifyEntry->IrpQueue);
+
+        InsertTailList(NotifyList, &NotifyEntry->ListEntry);
+    }
+
+
+    if (!NotifyEntry->PendingChanges)
+    {
+        /* No changes are pending. Queue the irp */
+
+        /* Irp cancelation boilerplate */
+
+        /* save NotifySych for use in the cancel routine */
+        Irp->Tail.Overlay.DriverContext[3] = NotifySync;
+
+        (void)IoSetCancelRoutine(Irp, FsRtlpNotifyCancelRoutine);
+        if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL))
+        {
+            //irp was canceled
+            ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
+
+            Irp->IoStatus.Status = STATUS_CANCELLED;
+            Irp->IoStatus.Information = 0;
+
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+            return;
+        }
+
+        IoMarkIrpPending(Irp);
+
+        //FIXME: any point in setting irp status/information before queueing?
+        Irp->IoStatus.Status = STATUS_PENDING;
+
+        InsertTailList(&NotifyEntry->IrpQueue, &Irp->Tail.Overlay.ListEntry);
+
+        ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
+        return;
+    }
+
+
+    /* Pending changes exist */
+
+    if (NotifyEntry->Buffer == NULL ||
+        NotifyEntry->BufferExhausted ||
+        IrpBuffLen < NotifyEntry->NextEntryOffset)
+    {
+        /*
+        Can't return detailed changes to user cause:
+        -No buffer exist, OR
+        -Buffer were overflowed, OR
+        -Current irp buff was not large enough
+        */
+
+        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = STATUS_NOTIFY_ENUM_DIR;
+
+    }
+    else
+    {
+        PVOID Adr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, LowPagePriority);
+
+        if (Adr)
+        {
+            memcpy(Adr, NotifyEntry->Buffer, NotifyEntry->NextEntryOffset);
+            Irp->IoStatus.Information = NotifyEntry->NextEntryOffset;
+        }
+        else
+        {
+            Irp->IoStatus.Information = 0;
+        }
+
+        Irp->IoStatus.Status = STATUS_SUCCESS;
+    }
+
+    /* reset buffer */
+    NotifyEntry->PrevEntry = NULL;
+    NotifyEntry->NextEntryOffset = 0;
+    NotifyEntry->BufferExhausted = FALSE;
+
+    NotifyEntry->PendingChanges = FALSE;
+
+    ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
+
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    /* caller must return STATUS_PENDING */
+}
+
+/*++
+ * @name FsRtlpGetNextIrp
+ *
+ * FILLME
+ *
+ * @param NotifyEntry
+ *        FILLME
+ *
+ * @return FILLME
+ *
+ * @remarks Private function
+ *
+ *--*/
+static
+PIRP
+FASTCALL
+FsRtlpGetNextIrp(PNOTIFY_ENTRY NotifyEntry)
+{
+    PIRP Irp;
+    PLIST_ENTRY TmpEntry;
+
+    /* Loop to get a non-canceled irp */
+    while (!IsListEmpty(&NotifyEntry->IrpQueue))
+    {
+        /* If we have queued irp(s) we can't possibly have pending changes too */
+        ASSERT(!NotifyEntry->PendingChanges);
+
+        TmpEntry = RemoveHeadList(&NotifyEntry->IrpQueue);
+        Irp = CONTAINING_RECORD(TmpEntry , IRP, Tail.Overlay.ListEntry);
+
+        /* irp cancelation bolilerplate */
+        if (!IoSetCancelRoutine(Irp, NULL))
+        {
+            //The cancel routine will be called. When we release the lock it will complete the irp.
+            InitializeListHead(&Irp->Tail.Overlay.ListEntry);
+            continue;
+        }
+
+        /* Finally we got a non-canceled irp */
+        return Irp;
+    }
+
+    return NULL;
+}
+
+/*++
+ * @name FsRtlpCopyName
+ *
+ * FILLME
+ *
+ * @param CurrentEntry
+ *        FILLME
+ *
+ * @param Unicode
+ *        FILLME
+ *
+ * @param RelativeName
+ *        FILLME
+ *
+ * @param StreamName
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks Private function
+ *
+ *--*/
+static
+__inline
+VOID
+FsRtlpCopyName(PFILE_NOTIFY_INFORMATION CurrentEntry,
+               BOOLEAN Unicode,
+               PSTRING RelativeName,
+               PSTRING StreamName)
+{
+    /* Buffer size is allready probed, so just copy the data */
+
+    if (Unicode)
+    {
+        memcpy(CurrentEntry->FileName, RelativeName->Buffer, RelativeName->Length);
+        if (StreamName)
+        {
+            CurrentEntry->FileName[RelativeName->Length/sizeof(WCHAR)] = ':';
+            memcpy(&CurrentEntry->FileName[(RelativeName->Length/sizeof(WCHAR))+1],
+                StreamName->Buffer,
+                StreamName->Length);
+        }
+    }
+    else
+    {
+        //FIXME: convert to unicode etc.
+        DPRINT1("FIXME: ansi strings in notify impl. not supported yet\n");
+    }
+}
+
+/*++
+ * @name FsRtlNotifyFullReportChange
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param NotifySync
+ *        FILLME
+ *
+ * @param NotifyList
+ *        FILLME
+ *
+ * @param FullTargetName
+ *        FILLME
+ *
+ * @param TargetNameOffset
+ *        FILLME
+ *
+ * @param StreamName
+ *        FILLME
+ *
+ * @param NormalizedParentName
+ *        FILLME
+ *
+ * @param FilterMatch
+ *        FILLME
+ *
+ * @param Action
+ *        FILLME
+ *
+ * @param TargetContext
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlNotifyFullReportChange(IN PNOTIFY_SYNC NotifySync,
+                            IN PLIST_ENTRY  NotifyList,
+                            IN PSTRING      FullTargetName, /* can include short names! */
+                            IN USHORT       TargetNameOffset, /* in bytes */
+                            IN PSTRING      StreamName           OPTIONAL,
+                            IN PSTRING      NormalizedParentName OPTIONAL, /* same as FullTargetName, but with long names */
+                            IN ULONG        FilterMatch,
+                            IN ULONG        Action,
+                            IN PVOID        TargetContext)
+{
+    USHORT FullDirLen;
+    STRING RelativeName;
+    PNOTIFY_ENTRY NotifyEntry, tmp;
+    PLIST_ENTRY EnumEntry;
+    PIRP Irp;
+    LIST_ENTRY CompletedListHead;
+    USHORT NameLenU;
+    ULONG RecordLen;
+    PFILE_NOTIFY_INFORMATION CurrentEntry;
+
+    InitializeListHead(&CompletedListHead);
+
+    DPRINT("FullTargetName: %wZ\n", FullTargetName);
+
+    /*
+    I think FullTargetName can include/be a short file name! What the heck do i do with this?
+    Dont think this apply to FsRtlNotifyFullChangeDirectory's FullDirectoryName.
+    */
+
+    ExAcquireFastMutex((PFAST_MUTEX)NotifySync);
+
+    LIST_FOR_EACH_SAFE(NotifyEntry, tmp, NotifyList, NOTIFY_ENTRY, ListEntry )
+    {
+        ASSERT(NotifyEntry->Unicode == FsRtlpIsUnicodePath(FullTargetName));
+
+        /* rule out some easy cases */
+        /* FIXME: short vs. long names??? lower case/upper case/mixed case? */
+        if (!(FilterMatch & NotifyEntry->CompletionFilter)) continue;
+
+        FullDirLen = TargetNameOffset - (NotifyEntry->Unicode ? sizeof(WCHAR) : sizeof(char));
+        if (FullDirLen == 0)
+        {
+            /* special case for root dir */
+            FullDirLen = (NotifyEntry->Unicode ? sizeof(WCHAR) : sizeof(char));
+        }
+
+        if (FullDirLen < NotifyEntry->FullDirectoryName->Length) continue;
+
+        if (!NotifyEntry->WatchTree && FullDirLen != NotifyEntry->FullDirectoryName->Length) continue;
+
+        DPRINT("NotifyEntry->FullDirectoryName: %wZ\n", NotifyEntry->FullDirectoryName);
+
+        /* FIXME: short vs. long names??? lower case/upper case/mixed case? */
+        if (memcmp(NotifyEntry->FullDirectoryName->Buffer,
+            FullTargetName->Buffer,
+            NotifyEntry->FullDirectoryName->Length) != 0) continue;
+
+
+        if (NotifyEntry->WatchTree &&
+            NotifyEntry->TraverseCallback &&
+            FullDirLen != NotifyEntry->FullDirectoryName->Length)
+        {
+            /* change happend in a subdir. ask caller if we are allowed in here */
+            NTSTATUS Status = NotifyEntry->TraverseCallback(NotifyEntry->FsContext,
+                TargetContext,
+                NotifyEntry->SubjectContext);
+
+            if (!NT_SUCCESS(Status)) continue;
+
+            /*
+            FIXME: notify-dir impl. should release and free the SubjectContext
+            */
+        }
+
+        DPRINT("Found match\n");
+
+        /* Found a valid change */
+
+        RelativeName.Buffer = FullTargetName->Buffer + TargetNameOffset;
+        RelativeName.MaximumLength =
+            RelativeName.Length =
+            FullTargetName->Length - TargetNameOffset;
+
+        DPRINT("RelativeName: %wZ\n",&RelativeName);
+
+        /* calculate unicode bytes of relative-name + stream-name */
+        if (NotifyEntry->Unicode)
+        {
+            NameLenU = RelativeName.Length + (StreamName ? (StreamName->Length + sizeof(WCHAR)) : 0);
+        }
+        else
+        {
+            NameLenU = RelativeName.Length * sizeof(WCHAR) +
+                (StreamName ? ((StreamName->Length * sizeof(WCHAR)) + sizeof(WCHAR)) : 0);
+        }
+
+        RecordLen = FIELD_OFFSET(FILE_NOTIFY_INFORMATION, FileName) + NameLenU;
+
+        if ((Irp = FsRtlpGetNextIrp(NotifyEntry)))
+        {
+            PIO_STACK_LOCATION IrpStack;
+            ULONG IrpBuffLen;
+
+            IrpStack = IoGetCurrentIrpStackLocation(Irp);
+            IrpBuffLen = IrpStack->Parameters.NotifyDirectory.Length;
+
+            DPRINT("Got pending irp\n");
+
+            ASSERT(!NotifyEntry->PendingChanges);
+
+            if (NotifyEntry->Buffer == NULL || /* aka. IgnoreBuffer */
+                RecordLen > IrpBuffLen)
+            {
+                /* ignore buffer / buffer not large enough */
+                Irp->IoStatus.Status = STATUS_NOTIFY_ENUM_DIR;
+                Irp->IoStatus.Information = 0;
+            }
+            else
+            {
+                CurrentEntry = (PFILE_NOTIFY_INFORMATION)
+                    MmGetSystemAddressForMdlSafe(Irp->MdlAddress, LowPagePriority);
+
+                if (CurrentEntry)
+                {
+                    CurrentEntry->Action = Action;
+                    CurrentEntry->FileNameLength = NameLenU;
+                    CurrentEntry->NextEntryOffset = 0;
+
+                    FsRtlpCopyName(
+                        CurrentEntry,
+                        NotifyEntry->Unicode,
+                        &RelativeName,
+                        StreamName
+                        );
+
+                    Irp->IoStatus.Information = RecordLen;
+                }
+                else
+                {
+                    Irp->IoStatus.Information = 0;
+                }
+
+
+                Irp->IoStatus.Status = STATUS_SUCCESS;
+            }
+
+            /* avoid holding lock while completing irp */
+            InsertTailList(&CompletedListHead, &Irp->Tail.Overlay.ListEntry);
+        }
+        else
+        {
+            DPRINT("No irp\n");
+
+            NotifyEntry->PendingChanges = TRUE;
+
+            if (NotifyEntry->Buffer == NULL || NotifyEntry->BufferExhausted) continue;
+
+            if (RecordLen > NotifyEntry->BufferSize - NotifyEntry->NextEntryOffset)
+            {
+                /* overflow. drop these changes and stop buffering any other changes too */
+                NotifyEntry->BufferExhausted = TRUE;
+                continue;
+            }
+
+            /* The buffer has enough room for the changes.
+            * Copy data to buffer.
+            */
+
+            CurrentEntry = (PFILE_NOTIFY_INFORMATION)NotifyEntry->Buffer;
+
+            CurrentEntry->Action = Action;
+            CurrentEntry->FileNameLength = NameLenU;
+            CurrentEntry->NextEntryOffset = 0;
+
+            FsRtlpCopyName(CurrentEntry,
+                NotifyEntry->Unicode,
+                &RelativeName,
+                StreamName
+                );
+
+            if (NotifyEntry->PrevEntry)
+            {
+                NotifyEntry->PrevEntry->NextEntryOffset = (char*)CurrentEntry - (char*)NotifyEntry->PrevEntry;
+            }
+            NotifyEntry->PrevEntry = CurrentEntry;
+            NotifyEntry->NextEntryOffset += RecordLen;
+
+            //         {
+            //            UNICODE_STRING TmpStr;
+            //            TmpStr.Buffer = BufferedChange->RelativeName;
+            //            TmpStr.MaximumLength = TmpStr.Length = BufferedChange->NameLen;
+            //            DPRINT("BufferedChange->RelativeName: %wZ\n", &TmpStr);
+            //         }
+
+        }
+    }
+
+    ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
+
+    /* complete defered irps */
+    while (!IsListEmpty(&CompletedListHead))
+    {
+        EnumEntry = RemoveHeadList(&CompletedListHead);
+        Irp = CONTAINING_RECORD(EnumEntry, IRP, Tail.Overlay.ListEntry);
+
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
+}
+
+/*++
+ * @name FsRtlNotifyInitializeSync
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param NotifySync
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlNotifyInitializeSync(IN PNOTIFY_SYNC *NotifySync)
+{
+    *NotifySync = ExAllocatePoolWithTag(NonPagedPool, sizeof(FAST_MUTEX), FSRTL_NOTIFY_TAG );
+    ExInitializeFastMutex((PFAST_MUTEX)*NotifySync);
+}
+
+/*++
+ * @name FsRtlNotifyReportChange
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param NotifySync
+ *        FILLME
+ *
+ * @param NotifyList
+ *        FILLME
+ *
+ * @param FullTargetName
+ *        FILLME
+ *
+ * @param FileNamePartLength
+ *        FILLME
+ *
+ * @param FilterMatch
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlNotifyReportChange(IN PNOTIFY_SYNC NotifySync,
+                        IN PLIST_ENTRY  NotifyList,
+                        IN PSTRING      FullTargetName,
+                        IN PUSHORT      FileNamePartLength,
+                        IN ULONG        FilterMatch)
+{
+    FsRtlNotifyFullReportChange(
+        NotifySync,
+        NotifyList,
+        FullTargetName,
+        (FullTargetName->Length - *FileNamePartLength),
+        NULL,
+        NULL,
+        FilterMatch,
+        0,
+        NULL
+        );
+}
+
+/*++
+ * @name FsRtlCurrentBatchOplock
+ * @implemented
+ *
+ * Uninitialize a NOTIFY_SYNC object
+ *
+ * @param NotifySync
+ *        Address of a pointer to a PNOTIFY_SYNC object previously
+ *        initialized by FsRtlNotifyInitializeSync()
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlNotifyUninitializeSync(IN PNOTIFY_SYNC *NotifySync)
+{
+    ExFreePool(*NotifySync);
+}
+
+/*++
+ * @name FsRtlNotifyVolumeEvent
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param FileObject
+ *        FILLME
+ *
+ * @param EventCode
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks Only present in NT 5+.
+ *
+ *--*/
+NTSTATUS
+NTAPI
+FsRtlNotifyVolumeEvent(IN PFILE_OBJECT  FileObject,
+                       IN ULONG         EventCode)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlRegisterFileSystemFilterCallbacks
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param FilterDriverObject
+ *        FILLME
+ *
+ * @param Callbacks
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+NTSTATUS
+NTAPI
+FsRtlRegisterFileSystemFilterCallbacks(IN PDRIVER_OBJECT FilterDriverObject,
+                                       IN PFS_FILTER_CALLBACKS Callbacks)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+/* EOF */
similarity index 75%
rename from reactos/ntoskrnl/fsrtl/oplock.c
rename to reactos/ntoskrnl/fs/oplock.c
index d92643e..c83d437 100644 (file)
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/oplock.c\r
- * PURPOSE:         Provides an Opportunistic Lock for file system drivers.\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlCheckOplock\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Oplock\r
- *        FILLME\r
- *\r
- * @param Irp\r
- *        FILLME\r
- *\r
- * @param Context\r
- *        FILLME\r
- *\r
- * @param CompletionRoutine\r
- *        FILLME\r
- *\r
- * @param PostIrpRoutine\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-NTSTATUS\r
-NTAPI\r
-FsRtlCheckOplock(IN POPLOCK Oplock,\r
-                 IN PIRP Irp,\r
-                 IN PVOID Context,\r
-                 IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,\r
-                 IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-    return STATUS_NOT_IMPLEMENTED;\r
-}\r
-\r
-/*++\r
- * @name FsRtlCurrentBatchOplock\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Oplock\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlCurrentBatchOplock(IN POPLOCK Oplock)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*++\r
- * @name FsRtlInitializeOplock\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Oplock\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlInitializeOplock(IN OUT POPLOCK Oplock)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlOplockFsctrl\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Oplock\r
- *        FILLME\r
- *\r
- * @param Irp\r
- *        FILLME\r
- *\r
- * @param OpenCount\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-NTSTATUS\r
-NTAPI\r
-FsRtlOplockFsctrl(IN POPLOCK Oplock,\r
-                  IN PIRP Irp,\r
-                  IN ULONG OpenCount)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-    return STATUS_NOT_IMPLEMENTED;\r
-}\r
-\r
-/*++\r
- * @name FsRtlOplockIsFastIoPossible\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Oplock\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlOplockIsFastIoPossible(IN POPLOCK Oplock)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*++\r
- * @name FsRtlUninitializeOplock\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Oplock\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlUninitializeOplock(IN POPLOCK Oplock)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-}\r
-\r
+/* $Id$
+ *
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/oplock.c
+ * PURPOSE:         Oplock-functions
+ *
+ * PROGRAMMERS:     Emanuele Aliberti
+ *                  Eric Kohl
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/*++
+ * @name FsRtlCheckOplock
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Oplock
+ *        FILLME
+ *
+ * @param Irp
+ *        FILLME
+ *
+ * @param Context
+ *        FILLME
+ *
+ * @param CompletionRoutine
+ *        FILLME
+ *
+ * @param PostIrpRoutine
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+NTSTATUS
+NTAPI
+FsRtlCheckOplock(IN POPLOCK Oplock,
+                 IN PIRP Irp,
+                 IN PVOID Context,
+                 IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
+                 IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlCurrentBatchOplock
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Oplock
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlCurrentBatchOplock(IN POPLOCK Oplock)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*++
+ * @name FsRtlInitializeOplock
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Oplock
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlInitializeOplock(IN OUT POPLOCK Oplock)
+{
+    UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlOplockFsctrl
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Oplock
+ *        FILLME
+ *
+ * @param Irp
+ *        FILLME
+ *
+ * @param OpenCount
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+NTSTATUS
+NTAPI
+FsRtlOplockFsctrl(IN POPLOCK Oplock,
+                  IN PIRP Irp,
+                  IN ULONG OpenCount)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlOplockIsFastIoPossible
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Oplock
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlOplockIsFastIoPossible(IN POPLOCK Oplock)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*++
+ * @name FsRtlUninitializeOplock
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Oplock
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlUninitializeOplock(IN POPLOCK Oplock)
+{
+    UNIMPLEMENTED;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/fs/pool.c b/reactos/ntoskrnl/fs/pool.c
new file mode 100644 (file)
index 0000000..ffaf43e
--- /dev/null
@@ -0,0 +1,173 @@
+/* $Id$
+ *
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/pool.c
+ * PURPOSE:         No purpose listed.
+ *
+ * PROGRAMMERS:     No programmer listed.
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/*++
+ * @name FsRtlAllocatePool
+ * @implemented
+ *
+ * FILLME
+ *
+ * @param PoolType
+ *        FILLME
+ *
+ * @param NumberOfBytes
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks IFS_POOL_TAG is "FSrt" in mem view.
+ *
+ *--*/
+PVOID
+NTAPI
+FsRtlAllocatePool(IN POOL_TYPE PoolType,
+                  IN ULONG     NumberOfBytes)
+{
+    PVOID   Address;
+
+    Address = ExAllocatePoolWithTag(PoolType,
+                                    NumberOfBytes,
+                                    IFS_POOL_TAG);
+
+    if (NULL == Address)
+    {
+        ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);
+    }
+
+    return Address;
+}
+
+/*++
+ * @name FsRtlAllocatePoolWithQuota
+ * @implemented
+ *
+ * FILLME
+ *
+ * @param PoolType
+ *        FILLME
+ *
+ * @param NumberOfBytes
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks IFS_POOL_TAG is "FSrt" in mem view.
+ *
+ *--*/
+PVOID
+NTAPI
+FsRtlAllocatePoolWithQuota(IN POOL_TYPE PoolType,
+                           IN ULONG     NumberOfBytes)
+{
+    PVOID      Address;
+
+    Address = ExAllocatePoolWithQuotaTag(PoolType,
+                                         NumberOfBytes,
+                                         IFS_POOL_TAG);
+    if (NULL == Address)
+    {
+        ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);
+    }
+    return Address;
+}
+
+/*++
+ * @name FsRtlAllocatePoolWithQuotaTag
+ * @implemented
+ *
+ * FILLME
+ *
+ * @param PoolType
+ *        FILLME
+ *
+ * @param NumberOfBytes
+ *        FILLME
+ *
+ * @param Tag
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+#undef FsRtlAllocatePoolWithQuotaTag
+PVOID
+NTAPI
+FsRtlAllocatePoolWithQuotaTag (IN POOL_TYPE PoolType,
+                               IN ULONG     NumberOfBytes,
+                               IN ULONG     Tag)
+{
+    PVOID   Address;
+
+    Address = ExAllocatePoolWithQuotaTag(PoolType,
+                                         NumberOfBytes,
+                                         Tag);
+
+    if (NULL == Address)
+    {
+        ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);
+    }
+
+    return Address;
+}
+
+/*++
+ * @name FsRtlAllocatePoolWithTag
+ * @implemented
+ *
+ * FILLME
+ *
+ * @param PoolType
+ *        FILLME
+ *
+ * @param NumberOfBytes
+ *        FILLME
+ *
+ * @param Tag
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+#undef FsRtlAllocatePoolWithTag
+PVOID
+NTAPI
+FsRtlAllocatePoolWithTag(IN POOL_TYPE   PoolType,
+                         IN ULONG       NumberOfBytes,
+                         IN ULONG       Tag)
+{
+    PVOID   Address;
+
+    Address = ExAllocatePoolWithTag(PoolType,
+                                    NumberOfBytes,
+                                    Tag);
+
+    if (NULL == Address)
+    {
+        ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);
+    }
+
+    return Address;
+}
+
+
+/* EOF */
similarity index 57%
rename from reactos/ntoskrnl/fsrtl/tunnel.c
rename to reactos/ntoskrnl/fs/tunnel.c
index 6347126..4922ea2 100644 (file)
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/tunnel.c\r
- * PURPOSE:         Provides the Tunnel Cache implementation for file system drivers.\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlAddToTunnelCache\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Cache\r
- *        FILLME\r
- *\r
- * @param DirectoryKey\r
- *        FILLME\r
- *\r
- * @param ShortName\r
- *        FILLME\r
- *\r
- * @param LongName\r
- *        FILLME\r
- *\r
- * @param KeyByShortName\r
- *        FILLME\r
- *\r
- * @param DataLength\r
- *        FILLME\r
- *\r
- * @param Data\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlAddToTunnelCache(IN PTUNNEL Cache,\r
-                      IN ULONGLONG DirectoryKey,\r
-                      IN PUNICODE_STRING ShortName,\r
-                      IN PUNICODE_STRING LongName,\r
-                      IN BOOLEAN KeyByShortName,\r
-                      IN ULONG DataLength,\r
-                      IN PVOID Data)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlDeleteKeyFromTunnelCache\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Cache\r
- *        FILLME\r
- *\r
- * @param DirectoryKey\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlDeleteKeyFromTunnelCache(IN PTUNNEL Cache,\r
-                              IN ULONGLONG DirectoryKey)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlDeleteTunnelCache\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Cache\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlDeleteTunnelCache(IN PTUNNEL Cache)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlFindInTunnelCache\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Cache\r
- *        FILLME\r
- *\r
- * @param DirectoryKey\r
- *        FILLME\r
- *\r
- * @param ShortName\r
- *        FILLME\r
- *\r
- * @param LongName\r
- *        FILLME\r
- *\r
- * @param KeyByShortName\r
- *        FILLME\r
- *\r
- * @param DataLength\r
- *        FILLME\r
- *\r
- * @param Data\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlFindInTunnelCache(IN PTUNNEL Cache,\r
-                       IN ULONGLONG DirectoryKey,\r
-                       IN PUNICODE_STRING Name,\r
-                       OUT PUNICODE_STRING ShortName,\r
-                       OUT PUNICODE_STRING LongName,\r
-                       IN OUT PULONG DataLength,\r
-                       OUT PVOID Data)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*++\r
- * @name FsRtlDeleteTunnelCache\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Cache\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlInitializeTunnelCache(IN PTUNNEL Cache)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/* EOF */\r
+/* $Id$
+ *
+ * PROJECT:         ReactOS kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/tunnel.c
+ * PURPOSE:         No purpose listed.
+ *
+ * PROGRAMMERS:     Emanuele Aliberti
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/*++
+ * @name FsRtlAddToTunnelCache
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Cache
+ *        FILLME
+ *
+ * @param DirectoryKey
+ *        FILLME
+ *
+ * @param ShortName
+ *        FILLME
+ *
+ * @param LongName
+ *        FILLME
+ *
+ * @param KeyByShortName
+ *        FILLME
+ *
+ * @param DataLength
+ *        FILLME
+ *
+ * @param Data
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlAddToTunnelCache(IN PTUNNEL          Cache,
+                      IN ULONGLONG        DirectoryKey,
+                      IN PUNICODE_STRING  ShortName,
+                      IN PUNICODE_STRING  LongName,
+                      IN BOOLEAN          KeyByShortName,
+                      IN ULONG            DataLength,
+                      IN PVOID            Data)
+{
+    UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlDeleteKeyFromTunnelCache
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Cache
+ *        FILLME
+ *
+ * @param DirectoryKey
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlDeleteKeyFromTunnelCache(IN PTUNNEL      Cache,
+                              IN ULONGLONG    DirectoryKey)
+{
+    UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlDeleteTunnelCache
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Cache
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlDeleteTunnelCache(IN PTUNNEL Cache)
+{
+    UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlFindInTunnelCache
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Cache
+ *        FILLME
+ *
+ * @param DirectoryKey
+ *        FILLME
+ *
+ * @param ShortName
+ *        FILLME
+ *
+ * @param LongName
+ *        FILLME
+ *
+ * @param KeyByShortName
+ *        FILLME
+ *
+ * @param DataLength
+ *        FILLME
+ *
+ * @param Data
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlFindInTunnelCache(IN PTUNNEL          Cache,
+                       IN ULONGLONG        DirectoryKey,
+                       IN PUNICODE_STRING  Name,
+                       OUT PUNICODE_STRING ShortName,
+                       OUT PUNICODE_STRING LongName,
+                       IN OUT PULONG       DataLength,
+                       OUT PVOID           Data)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*++
+ * @name FsRtlDeleteTunnelCache
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Cache
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlInitializeTunnelCache(IN PTUNNEL Cache)
+{
+    UNIMPLEMENTED;
+}
+
+/* EOF */
similarity index 66%
rename from reactos/ntoskrnl/fsrtl/unc.c
rename to reactos/ntoskrnl/fs/unc.c
index 8738a97..2c3d924 100644 (file)
@@ -1,67 +1,72 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/unc.c\r
- * PURPOSE:         Manages UNC support routines for file system drivers.\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlDeregisterUncProvider\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Handle\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlDeregisterUncProvider(IN HANDLE Handle)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlRegisterUncProvider\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Handle\r
- *        FILLME\r
- *\r
- * @param RedirectorDeviceName\r
- *        FILLME\r
- *\r
- * @param MailslotsSupported\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-NTSTATUS\r
-NTAPI\r
-FsRtlRegisterUncProvider(IN OUT PHANDLE Handle,\r
-                         IN PUNICODE_STRING RedirectorDeviceName,\r
-                         IN BOOLEAN MailslotsSupported)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-    return STATUS_NOT_IMPLEMENTED;\r
-}\r
+/* $Id$
+ *
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/unc.c
+ * PURPOSE:         Functions to work with UNC providers
+ *
+ * PROGRAMMERS:     Emanuele Aliberti
+ *                  Eric Kohl
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/*++
+ * @name FsRtlDeregisterUncProvider
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Handle
+ *        FILLME
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlDeregisterUncProvider(IN HANDLE Handle)
+{
+    UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlRegisterUncProvider
+ * @unimplemented
+ *
+ * FILLME
+ *
+ * @param Handle
+ *        FILLME
+ *
+ * @param RedirectorDeviceName
+ *        FILLME
+ *
+ * @param MailslotsSupported
+ *
+ * @return None
+ *
+ * @remarks None
+ *
+ *--*/
+NTSTATUS
+NTAPI
+FsRtlRegisterUncProvider(IN OUT PHANDLE Handle,
+                         IN PUNICODE_STRING RedirectorDeviceName,
+                         IN BOOLEAN MailslotsSupported)
+{
+    UNIMPLEMENTED;
+    return(STATUS_NOT_IMPLEMENTED);
+}
+
+
+/* EOF */
diff --git a/reactos/ntoskrnl/fs/util.c b/reactos/ntoskrnl/fs/util.c
new file mode 100644 (file)
index 0000000..58853be
--- /dev/null
@@ -0,0 +1,305 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/fs/util.c
+ * PURPOSE:         Misc Utility Functions for File System Drivers
+ *
+ * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)
+                    Emanuele Aliberti
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <internal/debug.h>
+
+#define FSRTL_MAX_RESOURCES 16
+
+#define FTTYPE  ((ULONG)'f')
+#define FT_BALANCED_READ_MODE \
+    CTL_CODE(FTTYPE, 6, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+/* GLOBALS *******************************************************************/
+
+BOOLEAN STDCALL MmIsFileAPagingFile(PFILE_OBJECT FileObject);
+VOID NTAPI INIT_FUNCTION RtlpInitializeResources(VOID);
+static ULONG FsRtlpAllocatedResources = 0;
+static PERESOURCE FsRtlpResources;
+
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, RtlpInitializeResources)
+#endif
+
+/* PRIVATE FUNCTIONS**********************************************************/
+
+VOID
+NTAPI
+INIT_FUNCTION
+RtlpInitializeResources(VOID)
+{
+    ULONG i;
+
+    /* Allocate the Resource Buffer */
+    FsRtlpResources = FsRtlAllocatePoolWithTag(NonPagedPool,
+                                               FSRTL_MAX_RESOURCES *
+                                               sizeof(ERESOURCE),
+                                               TAG('F', 's', 'R', 'e'));
+
+    /* Initialize the Resources */
+    for (i = 0; i < FSRTL_MAX_RESOURCES; i++)
+    {
+        ExInitializeResource(&FsRtlpResources[i]);
+    }
+}
+
+/* FUNCTIONS *****************************************************************/
+
+/*++
+ * @name FsRtlIsTotalDeviceFailure
+ * @implemented NT 4.0
+ *
+ *     The FsRtlIsTotalDeviceFailure routine checks if an NTSTATUS error code
+ *     represents a disk hardware failure.
+ *
+ * @param NtStatus
+ *        The NTSTATUS Code to Test
+ *
+ * @return TRUE in case of Hardware Failure, FALSE otherwise.
+ *
+ * @remarks None.
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlIsTotalDeviceFailure(IN NTSTATUS NtStatus)
+{
+    return((NT_SUCCESS(NtStatus)) ||
+           (STATUS_CRC_ERROR == NtStatus) ||
+           (STATUS_DEVICE_DATA_ERROR == NtStatus) ? FALSE : TRUE);
+}
+
+/*++
+ * @name FsRtlIsNtstatusExpected
+ * @implemented NT 4.0
+ *
+ *     The FsRtlIsNtstatusExpected routine checks if an NTSTATUS error code
+ *     is expected by the File System Support Library.
+ *
+ * @param NtStatus
+ *        The NTSTATUS Code to Test
+ *
+ * @return TRUE if the Value is Expected, FALSE otherwise.
+ *
+ * @remarks None.
+ *
+ *--*/
+BOOLEAN
+NTAPI
+FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus)
+{
+    return((STATUS_DATATYPE_MISALIGNMENT == NtStatus) ||
+           (STATUS_ACCESS_VIOLATION == NtStatus) ||
+           (STATUS_ILLEGAL_INSTRUCTION == NtStatus) ||
+           (STATUS_INSTRUCTION_MISALIGNMENT == NtStatus)) ? FALSE : TRUE;
+}
+
+/*++
+ * @name FsRtlIsPagingFile
+ * @implemented NT 4.0
+ *
+ *     The FsRtlIsPagingFile routine checks if the FileObject is a Paging File.
+ *
+ * @param FileObject
+ *        A pointer to the File Object to be tested.
+ *
+ * @return TRUE if the File is a Paging File, FALSE otherwise.
+ *
+ * @remarks None.
+ *
+ *--*/
+LOGICAL
+NTAPI
+FsRtlIsPagingFile(IN PFILE_OBJECT FileObject)
+{
+    return MmIsFileAPagingFile(FileObject);
+}
+
+/*++
+ * @name FsRtlNormalizeNtstatus
+ * @implemented NT 4.0
+ *
+ *     The FsRtlNormalizeNtstatus routine normalizes an NTSTATUS error code.
+ *
+ * @param NtStatusToNormalize
+ *        The NTSTATUS error code to Normalize.
+ *
+ * @param NormalizedNtStatus
+ *        The NTSTATUS error code to return if the NtStatusToNormalize is not
+ *        a proper expected error code by the File System Library.
+ *
+ * @return NtStatusToNormalize if it is an expected value, otherwise
+ *         NormalizedNtStatus.
+ *
+ * @remarks None.
+ *
+ *--*/
+NTSTATUS
+NTAPI
+FsRtlNormalizeNtstatus(IN NTSTATUS NtStatusToNormalize,
+                       IN NTSTATUS NormalizedNtStatus)
+{
+    return(TRUE == FsRtlIsNtstatusExpected(NtStatusToNormalize)) ?
+           NtStatusToNormalize : NormalizedNtStatus;
+}
+
+/*++
+ * @name FsRtlAllocateResource
+ * @implemented NT 4.0
+ *
+ *     The FsRtlAllocateResource routine returns a pre-initialized ERESOURCE
+ *     for use by a File System Driver.
+ *
+ * @return A Pointer to a pre-initialized ERESOURCE.
+ *
+ * @remarks The File System Library only provides up to 16 Resources.
+ *
+ *--*/
+PERESOURCE
+NTAPI
+FsRtlAllocateResource(VOID)
+{
+    /* Return a pre-allocated ERESOURCE */
+    return &FsRtlpResources[FsRtlpAllocatedResources++ & FSRTL_MAX_RESOURCES];
+}
+
+/*++
+ * @name FsRtlBalanceReads
+ * @implemented NT 4.0
+ *
+ *     The FsRtlBalanceReads routine sends an IRP to an FTDISK Driver
+ *     requesting the driver to balance read requests across a mirror set.
+ *
+ * @param TargetDevice
+ *        A pointer to an FTDISK Device Object.
+ *
+ * @return The NTSTATUS error code returned by the FTDISK Driver.
+ *
+ * @remarks FTDISK is a Software RAID Implementation.
+ *
+ *--*/
+NTSTATUS
+NTAPI
+FsRtlBalanceReads(PDEVICE_OBJECT TargetDevice)
+{
+    PIRP Irp;
+    KEVENT Event;
+    IO_STATUS_BLOCK IoStatusBlock;
+    NTSTATUS Status;
+
+    /* Initialize the Local Event */
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+    /* Build the special IOCTL */
+    Irp = IoBuildDeviceIoControlRequest(FT_BALANCED_READ_MODE,
+                                        TargetDevice,
+                                        NULL,
+                                        0,
+                                        NULL,
+                                        0,
+                                        FALSE,
+                                        &Event,
+                                        &IoStatusBlock);
+
+    /* Send it */
+    Status = IoCallDriver(TargetDevice, Irp);
+
+    /* Wait if needed */
+    if (Status == STATUS_PENDING)
+    {
+        Status = KeWaitForSingleObject(&Event,
+                                       Executive,
+                                       KernelMode,
+                                       FALSE,
+                                       NULL);
+        /* Return Status */
+        Status = IoStatusBlock.Status;
+    }
+
+    return Status;
+}
+
+/*++
+ * @name FsRtlPostPagingFileStackOverflow
+ * @unimplemented NT 4.0
+ *
+ *     The FsRtlPostPagingFileStackOverflow routine
+ *
+ * @param Context
+ *
+ * @param Event
+ *
+ * @param StackOverflowRoutine
+ *
+ * @return
+ *
+ * @remarks None.
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlPostPagingFileStackOverflow(IN PVOID Context,
+                                 IN PKEVENT Event,
+                                 IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
+{
+    UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlPostStackOverflow
+ * @unimplemented NT 4.0
+ *
+ *     The FsRtlPostStackOverflow routine
+ *
+ * @param Context
+ *
+ * @param Event
+ *
+ * @param StackOverflowRoutine
+ *
+ * @return
+ *
+ * @remarks None.
+ *
+ *--*/
+VOID
+NTAPI
+FsRtlPostStackOverflow(IN PVOID Context,
+                       IN PKEVENT Event,
+                       IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
+{
+    UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlSyncVolumes
+ * @implemented NT 4.0
+ *
+ *     The FsRtlSyncVolumes routine is deprecated.
+ *
+ * @return Always returns STATUS_SUCCESS.
+ *
+ * @remarks Deprecated.
+ *
+ *--*/
+NTSTATUS
+NTAPI
+FsRtlSyncVolumes(ULONG Unknown0,
+                 ULONG Unknown1,
+                 ULONG Unknown2)
+{
+    return STATUS_SUCCESS;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/fsrtl/dbcsname.c b/reactos/ntoskrnl/fsrtl/dbcsname.c
deleted file mode 100644 (file)
index f2535d3..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/name.c\r
- * PURPOSE:         Provides DBCS parsing and other support routines for FSDs\r
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlDissectDbcs\r
- * @implemented\r
- *\r
- * Dissects a given path name into first and remaining part.\r
- *\r
- * @param Name\r
- *        ANSI string to dissect.\r
- *\r
- * @param FirstPart\r
- *        Pointer to user supplied ANSI_STRING, that will later point\r
- *        to the first part of the original name.\r
- *\r
- * @param RemainingPart\r
- *        Pointer to user supplied ANSI_STRING, that will later point\r
- *        to the remaining part of the original name.\r
- *\r
- * @return None\r
- *\r
- * @remarks Example:\r
- *          Name:           \test1\test2\test3\r
- *          FirstPart:      test1\r
- *          RemainingPart:  test2\test3\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlDissectDbcs(IN ANSI_STRING Name,\r
-                 OUT PANSI_STRING FirstPart,\r
-                 OUT PANSI_STRING RemainingPart)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlDoesDbcsContainWildCards\r
- * @implemented\r
- *\r
- * FILLME\r
- *\r
- * @param Name\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlDoesDbcsContainWildCards(IN PANSI_STRING Name)\r
-{\r
-    ULONG i;\r
-\r
-    /* Check every character */\r
-    for (i = 0; i < Name->Length; i++)\r
-    {\r
-        /* First make sure it's not the Lead DBCS */\r
-        if (FsRtlIsLeadDbcsCharacter(Name->Buffer[i]))\r
-        {\r
-            i++;\r
-        }\r
-        else if (FsRtlIsAnsiCharacterWild(Name->Buffer[i]))\r
-        {\r
-            /* Now return if it has a wildcard */\r
-            return TRUE;\r
-        }\r
-    }\r
-\r
-    /* We didn't return above...so none found */\r
-    return FALSE;\r
-}\r
-\r
-/*++\r
- * @name FsRtlIsDbcsInExpression\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param Expression\r
- *        FILLME\r
- *\r
- * @param Name\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,\r
-                        IN PANSI_STRING Name)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*++\r
- * @name FsRtlIsFatDbcsLegal\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param DbcsName\r
- *        FILLME\r
- *\r
- * @param WildCardsPermissible\r
- *        FILLME\r
- *\r
- * @param PathNamePermissible\r
- *        FILLME\r
- *\r
- * @param LeadingBackslashPermissible\r
- *        FILLME\r
- *\r
- * @return TRUE if the DbcsName is legal, FALSE otherwise\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlIsFatDbcsLegal(IN ANSI_STRING DbcsName,\r
-                    IN BOOLEAN WildCardsPermissible,\r
-                    IN BOOLEAN PathNamePermissible,\r
-                    IN BOOLEAN LeadingBackslashPermissible)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*++\r
- * @name FsRtlIsHpfsDbcsLegal\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param DbcsName\r
- *        FILLME\r
- *\r
- * @param WildCardsPermissible\r
- *        FILLME\r
- *\r
- * @param PathNamePermissible\r
- *        FILLME\r
- *\r
- * @param LeadingBackslashPermissible\r
- *        FILLME\r
- *\r
- * @return TRUE if the DbcsName is legal, FALSE otherwise\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-BOOLEAN\r
-STDCALL\r
-FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,\r
-                     IN BOOLEAN WildCardsPermissible,\r
-                     IN BOOLEAN PathNamePermissible,\r
-                     IN BOOLEAN LeadingBackslashPermissible)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
diff --git a/reactos/ntoskrnl/fsrtl/fastio.c b/reactos/ntoskrnl/fsrtl/fastio.c
deleted file mode 100644 (file)
index 80938b9..0000000
+++ /dev/null
@@ -1,1129 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/fastio.c\r
- * PURPOSE:         Provides Fast I/O entrypoints to the Cache Manager\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#ifdef _WINDOWS_TESTING\r
-#include <ntifs.h>\r
-#include "ntndk.h"\r
-#include "fsrtl_glue.h"\r
-#else\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-#include <ntifs.h>\r
-#include <cctypes.h>\r
-#endif /* _WINDOWS_TESTING */\r
-\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlIncrementCcFastReadResourceMiss(VOID)\r
-{\r
-    CcFastReadResourceMiss++;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID \r
-NTAPI\r
-FsRtlIncrementCcFastReadNotPossible(VOID)\r
-{\r
-    CcFastReadNotPossible++;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlIncrementCcFastReadWait(VOID)\r
-{\r
-    CcFastReadWait++;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlIncrementCcFastReadNoWait(VOID)\r
-{\r
-    CcFastReadNoWait++;\r
-}\r
-\r
-_SEH_FILTER(FsRtlCcCopyFilter)\r
-{\r
-   LONG ExceptionDisposition;\r
\r
-   /* Check if this was an expected exception */\r
-   ExceptionDisposition = FsRtlIsNtstatusExpected(_SEH_GetExceptionCode() ?\r
-                                                  EXCEPTION_EXECUTE_HANDLER :\r
-                                                  EXCEPTION_CONTINUE_SEARCH);\r
\r
-   /* Continue execution if we expected it, otherwise fail the call */\r
-   return ExceptionDisposition;\r
-}      \r
-\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlCopyRead(IN PFILE_OBJECT FileObject,\r
-              IN PLARGE_INTEGER FileOffset,\r
-              IN ULONG Length,\r
-              IN BOOLEAN Wait,\r
-              IN ULONG LockKey,\r
-              OUT PVOID Buffer,\r
-              OUT PIO_STATUS_BLOCK IoStatus,\r
-              IN PDEVICE_OBJECT DeviceObject)\r
-{\r
-\r
-    PFSRTL_COMMON_FCB_HEADER FcbHeader;\r
-    LARGE_INTEGER Offset;\r
-    PFAST_IO_DISPATCH FastIoDispatch;\r
-    PDEVICE_OBJECT Device;\r
-    BOOLEAN Result = TRUE;\r
-       ULONG PageCount = COMPUTE_PAGES_SPANNED(FileOffset,Length);\r
-\r
-       PAGED_CODE();\r
-    ASSERT(FileObject);\r
-    ASSERT(FileObject->FsContext);\r
-\r
-    /* No actual read */\r
-    if (!Length)\r
-    {\r
-        /* Return success */\r
-        IoStatus->Status = STATUS_SUCCESS;\r
-        IoStatus->Information = 0;\r
-        return TRUE;\r
-    }\r
-               \r
-    if (MAXLONGLONG < (LONGLONG) FileOffset->QuadPart + Length) {\r
-                       IoStatus->Status = STATUS_INVALID_PARAMETER;\r
-                       IoStatus->Information = 0;\r
-                       return FALSE;\r
-    }\r
-\r
-    /* Get the offset and FCB header */\r
-    Offset.QuadPart = FileOffset->QuadPart + Length;\r
-    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext;\r
-\r
-    \r
-       if (Wait) {\r
-        /* Use a Resource Acquire */\r
-        FsRtlEnterFileSystem();\r
-               CcFastReadWait++;\r
-        ExAcquireResourceSharedLite(FcbHeader->Resource, TRUE);\r
-       } else {\r
-               /* Acquire the resource without blocking */\r
-               /* Return false and the I/O manager will retry using the standard IRP method. */\r
-        /* Use a Resource Acquire */\r
-        FsRtlEnterFileSystem();\r
-        if (!ExAcquireResourceSharedLite(FcbHeader->Resource, FALSE)) {\r
-               FsRtlExitFileSystem();\r
-                       FsRtlIncrementCcFastReadResourceMiss();\r
-                       return FALSE;\r
-        }\r
-    }\r
-\r
-\r
-    /* Check if this is a fast I/O cached file */\r
-    if (!(FileObject->PrivateCacheMap) ||\r
-        (FcbHeader->IsFastIoPossible == FastIoIsNotPossible)) {\r
-        /* It's not, so fail */\r
-               Result = FALSE;\r
-       goto Cleanup;\r
-    }\r
-\r
-    /* Check if we need to find out if fast I/O is available */\r
-    if (FcbHeader->IsFastIoPossible == FastIoIsQuestionable)\r
-    {\r
-        /* Sanity check */\r
-        ASSERT(!KeIsExecutingDpc());\r
-\r
-        /* Get the Fast I/O table */\r
-        Device = IoGetRelatedDeviceObject(FileObject);\r
-            FastIoDispatch = Device->DriverObject->FastIoDispatch;\r
-\r
-        /* Sanity check */\r
-        ASSERT(FastIoDispatch != NULL);\r
-        ASSERT(FastIoDispatch->FastIoCheckIfPossible != NULL);\r
-\r
-        /* Ask the driver if we can do it */\r
-        if (!FastIoDispatch->FastIoCheckIfPossible(FileObject,\r
-                                                   FileOffset,\r
-                                                   Length,\r
-                                                   TRUE,\r
-                                                   LockKey,\r
-                                                   TRUE,\r
-                                                   IoStatus,\r
-                                                   Device))\r
-        {\r
-            /* It's not, fail */\r
-            Result = FALSE;\r
-            goto Cleanup;\r
-        }\r
-       }\r
-\r
-    /* Check if we read too much */\r
-    if (Offset.QuadPart > FcbHeader->FileSize.QuadPart){\r
-        /* We did, check if the file offset is past the end */\r
-        if (FileOffset->QuadPart >= FcbHeader->FileSize.QuadPart){\r
-            /* Set end of file */\r
-            IoStatus->Status = STATUS_END_OF_FILE;\r
-            IoStatus->Information = 0;\r
-            goto Cleanup;\r
-        }\r
-\r
-        /* Otherwise, just normalize the length */\r
-        Length = (ULONG)(FcbHeader->FileSize.QuadPart - FileOffset->QuadPart);\r
-    }\r
-\r
-    /* Set this as top-level IRP */ \r
-       PsGetCurrentThread()->TopLevelIrp = FSRTL_FAST_IO_TOP_LEVEL_IRP;\r
-\r
-       _SEH_TRY {\r
-           /* Make sure the IO and file size is below 4GB */\r
-               if (Wait && !(Offset.HighPart | FcbHeader->FileSize.HighPart )) {\r
-                               \r
-                /* Call the cache controller */\r
-                               CcFastCopyRead (FileObject,FileOffset->LowPart,Length,PageCount,Buffer,IoStatus);\r
-                /* File was accessed */\r
-                               FileObject->Flags |= FO_FILE_FAST_IO_READ;\r
-                               if (IoStatus->Status != STATUS_END_OF_FILE) {\r
-                                       ASSERT(( FcbHeader->FileSize.QuadPart) >= (FileOffset->QuadPart + IoStatus->Information));\r
-                               }\r
-                               \r
-               } else {\r
-               \r
-            /* Call the cache controller */\r
-                       Result = CcCopyRead(FileObject, FileOffset, Length, Wait,Buffer, IoStatus);\r
-            /* File was accessed */\r
-                       FileObject->Flags |= FO_FILE_FAST_IO_READ;\r
-                       if (Result == TRUE) {\r
-                               ASSERT(         (IoStatus->Status == STATUS_END_OF_FILE) ||     \r
-                                                                       ((LONGLONG)(FileOffset->QuadPart + IoStatus->Information) <= FcbHeader->FileSize.QuadPart)\r
-                                                         );\r
-                       }\r
-               }\r
-\r
-        /* Update the current file offset */\r
-               if (Result == TRUE) {\r
-                       FileObject->CurrentByteOffset.QuadPart += IoStatus->Information;\r
-               }\r
-       }\r
-       _SEH_EXCEPT(FsRtlCcCopyFilter) {\r
-               Result = FALSE;\r
-       } _SEH_END;\r
-       \r
-       PsGetCurrentThread()->TopLevelIrp = 0;\r
-       \r
-    /* Return to caller */\r
-Cleanup:\r
-\r
-    ExReleaseResourceLite(FcbHeader->Resource);\r
-    FsRtlExitFileSystem();\r
-\r
-       if (Result == FALSE) {\r
-        CcFastReadNotPossible += 1;\r
-       }\r
-\r
-    return Result;\r
-    \r
-}\r
-\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlCopyWrite(IN PFILE_OBJECT FileObject,\r
-               IN PLARGE_INTEGER FileOffset,\r
-               IN ULONG Length,\r
-               IN BOOLEAN Wait,\r
-               IN ULONG LockKey,\r
-               OUT PVOID Buffer,\r
-               OUT PIO_STATUS_BLOCK IoStatus,\r
-               IN PDEVICE_OBJECT DeviceObject)\r
-{\r
-\r
-    BOOLEAN Result = TRUE;\r
-    PFAST_IO_DISPATCH FastIoDispatch;\r
-    PDEVICE_OBJECT Device;\r
-    PFSRTL_COMMON_FCB_HEADER FcbHeader;\r
-\r
-    /* WDK doc. Offset=0xffffffffffffffff indicates append to the end of file */\r
-    BOOLEAN FileOffsetAppend = ((FileOffset->HighPart == 0xffffffff) && (FileOffset->LowPart == 0xffffffff));\r
-    BOOLEAN ResourceAquiredShared = FALSE;\r
-\r
-    BOOLEAN b_4GB = FALSE;\r
-\r
-    BOOLEAN FileSizeModified = FALSE;\r
-    LARGE_INTEGER OldFileSize;\r
-    LARGE_INTEGER OldValidDataLength;\r
-\r
-    LARGE_INTEGER NewSize;\r
-    LARGE_INTEGER Offset;\r
-    \r
-    PAGED_CODE();\r
-\r
-    ASSERT(FileObject);\r
-    ASSERT(FileObject->FsContext);\r
-\r
-    /* Initialize some of the vars and pointers */\r
-    NewSize.QuadPart = 0;\r
-    Offset.QuadPart = FileOffset->QuadPart + Length;\r
-    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext;\r
-\r
-    /* Nagar p.544 -- Check with Cc if we can write and check if the IO > 64kB (WDK macro) */\r
-    if ( (CcCanIWrite(FileObject, Length,Wait, FALSE) == FALSE) ||\r
-          (CcCopyWriteWontFlush(FileObject,FileOffset,Length) == FALSE) ||\r
-          ((FileObject->Flags & FO_WRITE_THROUGH )== TRUE)\r
-       )\r
-    {\r
-       return FALSE;\r
-    }\r
-\r
-    /* No actual read */\r
-    if (!Length)\r
-    {\r
-        IoStatus->Status = STATUS_SUCCESS;\r
-        IoStatus->Information = Length;\r
-        return TRUE;\r
-    }\r
-\r
-    FsRtlEnterFileSystem();\r
-\r
-    /* Nagar p.544/545 -- The CcFastCopyWrite doesn't deal with filesize beyond 4GB*/\r
-    if (Wait && (FcbHeader->AllocationSize.HighPart == 0)) \r
-    {\r
-        /* If the file offset is not past the file size, then we can acquire the lock shared */\r
-        if ((FileOffsetAppend == FALSE) && (Offset.LowPart <= FcbHeader->ValidDataLength.LowPart)){\r
-               ExAcquireResourceSharedLite(FcbHeader->Resource,TRUE);\r
-               ResourceAquiredShared = TRUE;\r
-        } else {\r
-               ExAcquireResourceExclusiveLite(FcbHeader->Resource,TRUE);\r
-        }\r
-\r
-        /* Nagar p.544/545 -- If we append, use the file size as offset. Also, check that we aren't crossing the 4GB boundary */\r
-        if ((FileOffsetAppend == TRUE)) {\r
-               Offset.LowPart = FcbHeader->FileSize.LowPart;\r
-               NewSize.LowPart = FcbHeader->FileSize.LowPart + Length;\r
-               b_4GB = (NewSize.LowPart < FcbHeader->FileSize.LowPart);\r
-               \r
-        } else {\r
-               Offset.LowPart = FileOffset->LowPart; \r
-               NewSize.LowPart = FileOffset->LowPart + Length;\r
-               b_4GB = ((NewSize.LowPart < FileOffset->LowPart) || (FileOffset->HighPart != 0));\r
-        }\r
-\r
-        /*  Nagar p.544/545\r
-            Make sure that caching is initated.\r
-            That fast are allowed for this file stream.\r
-            That we are not extending past the allocated size\r
-            That we are not creating a hole bigger than 8k\r
-            That we are not crossing the 4GB boundary            \r
-        */\r
-        if (   (FileObject->PrivateCacheMap != NULL)  &&\r
-                       (FcbHeader->IsFastIoPossible != FastIoIsNotPossible) &&\r
-                       (FcbHeader->AllocationSize.LowPart >= NewSize.LowPart) &&\r
-                       (Offset.LowPart < (FcbHeader->ValidDataLength.LowPart + 0x2000) ) &&\r
-                       !b_4GB\r
-               )\r
-        {\r
-            /*  If we are extending past the file size, we need to release the lock and acquire it\r
-                exclusively, because we are going to need to update the FcbHeader */\r
-               if (ResourceAquiredShared && (NewSize.LowPart  > (FcbHeader->ValidDataLength.LowPart + 0x2000))) {\r
-                       /* Then we need to acquire the resource exclusive */\r
-                       ExReleaseResourceLite(FcbHeader->Resource); \r
-                       ExAcquireResourceExclusiveLite(FcbHeader->Resource,TRUE);\r
-                       if (FileOffsetAppend == TRUE) {\r
-                               Offset.LowPart = FcbHeader->FileSize.LowPart; // ??\r
-                               NewSize.LowPart = FcbHeader->FileSize.LowPart + Length;\r
-                               /* Make sure we don't cross the 4GB boundary */\r
-                               b_4GB = (NewSize.LowPart < Offset.LowPart);\r
-                       } \r
-                       \r
-                /* Recheck some of the conditions since we let the lock go */\r
-                       if (    (FileObject->PrivateCacheMap != NULL)  &&\r
-                                       (FcbHeader->IsFastIoPossible != FastIoIsNotPossible) &&\r
-                                       (FcbHeader->AllocationSize.LowPart >= NewSize.LowPart) &&\r
-                                       (FcbHeader->AllocationSize.HighPart == 0) &&\r
-                                       !b_4GB\r
-                               ) {\r
-                       } else {\r
-                               goto FailAndCleanup;\r
-                       }\r
-               }\r
-                       \r
-        }else {\r
-                       goto FailAndCleanup;\r
-        }\r
-\r
-           /* Check if we need to find out if fast I/O is available */\r
-           if (FcbHeader->IsFastIoPossible == FastIoIsQuestionable)\r
-           {\r
-                        IO_STATUS_BLOCK FastIoCheckIfPossibleStatus;\r
-           \r
-               /* Sanity check */\r
-               ASSERT(!KeIsExecutingDpc());\r
-\r
-               /* Get the Fast I/O table */\r
-               Device = IoGetRelatedDeviceObject(FileObject);\r
-                    FastIoDispatch = Device->DriverObject->FastIoDispatch;\r
-\r
-               /* Sanity check */\r
-               ASSERT(FastIoDispatch != NULL);\r
-               ASSERT(FastIoDispatch->FastIoCheckIfPossible != NULL);\r
-\r
-               /* Ask the driver if we can do it */\r
-               if (!FastIoDispatch->FastIoCheckIfPossible(FileObject,\r
-                                                          FileOffsetAppend? &FcbHeader->FileSize:FileOffset,\r
-                                                          Length,\r
-                                                          TRUE,\r
-                                                          LockKey,\r
-                                                          FALSE,\r
-                                                          &FastIoCheckIfPossibleStatus,\r
-                                                          Device))\r
-               {\r
-                   /* It's not, fail */\r
-                   goto FailAndCleanup;\r
-               }\r
-               }\r
-                       \r
-        /*  If we are going to extend the file then save the old file size\r
-            in case the operation fails\r
-        */\r
-               if (NewSize.LowPart > FcbHeader->FileSize.LowPart) {\r
-                       FileSizeModified = TRUE;\r
-                       OldFileSize.LowPart = FcbHeader->FileSize.LowPart;\r
-                       OldValidDataLength.LowPart = FcbHeader->ValidDataLength.LowPart;\r
-                       FcbHeader->FileSize.LowPart = NewSize.LowPart;\r
-               }\r
-                       \r
-           /* Set this as top-level IRP */ \r
-           PsGetCurrentThread()->TopLevelIrp = FSRTL_FAST_IO_TOP_LEVEL_IRP;\r
-\r
-               _SEH_TRY {\r
-                       if (Offset.LowPart > FcbHeader->ValidDataLength.LowPart) {\r
-                               LARGE_INTEGER OffsetVar;\r
-                               OffsetVar.LowPart = Offset.LowPart;\r
-                               OffsetVar.HighPart = 0;\r
-                               CcZeroData(FileObject,&FcbHeader->ValidDataLength,&OffsetVar,TRUE);\r
-                       }\r
-\r
-                       /* Call the cache manager */\r
-                       CcFastCopyWrite(FileObject,Offset.LowPart,Length,Buffer);\r
-               }       \r
-               _SEH_EXCEPT(FsRtlCcCopyFilter) {\r
-                       Result = FALSE;\r
-           } _SEH_END;\r
-                               \r
-        /* Remove ourselves at the top level component after the IO is done */\r
-           PsGetCurrentThread()->TopLevelIrp = 0;\r
-\r
-        /* Did the operation succeed ? */\r
-           if (Result == TRUE) {\r
-               /* Update the valid file size if necessary */\r
-                       if (NewSize.LowPart > FcbHeader->ValidDataLength.LowPart){\r
-                               FcbHeader->ValidDataLength.LowPart = NewSize.LowPart ;\r
-                       }\r
-\r
-            /* Flag the file as modified */\r
-                       FileObject->Flags |= FO_FILE_MODIFIED;\r
-\r
-                       /* Update the strucutres if the file size changed */\r
-                       if (FileSizeModified) {\r
-                               ((SHARED_CACHE_MAP*) FileObject->SectionObjectPointer->SharedCacheMap)->FileSize.LowPart = NewSize.LowPart;\r
-                               FileObject->Flags |= FO_FILE_SIZE_CHANGED;\r
-                       }\r
-\r
-            /* Update the file object current file offset */\r
-                       FileObject->CurrentByteOffset.QuadPart = NewSize.LowPart;\r
-                       \r
-               } else {\r
-               \r
-                       /* Result == FALSE if we get here. */\r
-                       if (FileSizeModified) {\r
-                           /* If the file size was modified then restore the old file size */\r
-                               if(FcbHeader->PagingIoResource != NULL) {\r
-                                       // Nagar P.544 Restore the old file size if operation didn't succeed.\r
-                                       ExAcquireResourceExclusiveLite(FcbHeader->PagingIoResource,TRUE);\r
-                                       FcbHeader->FileSize.LowPart = OldFileSize.LowPart;\r
-                                       FcbHeader->ValidDataLength.LowPart = OldValidDataLength.LowPart;\r
-                                       ExReleaseResourceLite(FcbHeader->PagingIoResource);\r
-                               } else {\r
-                                   /* If there is no lock and do it without */\r
-                                       FcbHeader->FileSize.LowPart = OldFileSize.LowPart;\r
-                                       FcbHeader->ValidDataLength.LowPart = OldValidDataLength.LowPart;\r
-                               }\r
-                       } else {\r
-                       }\r
-               }\r
-               \r
-               goto Cleanup;\r
-               \r
-       } else {\r
-               \r
-               LARGE_INTEGER OldFileSize;\r
-\r
-               /* Sanity check */\r
-               ASSERT(!KeIsExecutingDpc());\r
-               \r
-               // Nagar P.544 \r
-        /* Check if we need to acquire the resource exclusive */               \r
-               if (    (FileOffsetAppend == FALSE) &&\r
-                               ( (FileOffset->QuadPart + Length)  <= FcbHeader->ValidDataLength.QuadPart )\r
-                       )\r
-               {\r
-                   /* Acquire the resource shared */\r
-                       if (!ExAcquireResourceSharedLite(FcbHeader->Resource,Wait)) {\r
-                               goto FailAndCleanup;\r
-                       }\r
-                       ResourceAquiredShared =TRUE;\r
-               } else {\r
-                   /* Acquire the resource exclusive */\r
-                       if (!ExAcquireResourceExclusiveLite(FcbHeader->Resource,Wait)) {\r
-                               goto FailAndCleanup;\r
-                       }\r
-               }\r
-\r
-               /* Check if we are appending */\r
-               if (FileOffsetAppend == TRUE) {\r
-                       Offset.QuadPart = FcbHeader->FileSize.QuadPart;\r
-                       NewSize.QuadPart = FcbHeader->FileSize.QuadPart + Length;\r
-               } else {\r
-                       Offset.QuadPart = FileOffset->QuadPart;\r
-                       NewSize.QuadPart += FileOffset->QuadPart + Length;\r
-               }\r
-\r
-        /*  Nagar p.544/545\r
-            Make sure that caching is initated.\r
-            That fast are allowed for this file stream.\r
-            That we are not extending past the allocated size\r
-            That we are not creating a hole bigger than 8k\r
-        */\r
-               if (    (FileObject->PrivateCacheMap != NULL)  &&\r
-                               (FcbHeader->IsFastIoPossible != FastIoIsNotPossible) &&\r
-                               ((FcbHeader->ValidDataLength.QuadPart + 0x2000) > Offset.QuadPart) &&\r
-                               (MAXLONGLONG > (Offset.QuadPart + Length)) &&\r
-                               (FcbHeader->AllocationSize.QuadPart >= NewSize.QuadPart)\r
-                       ) \r
-               {\r
-                   /* Check if we can keep the lock shared */\r
-                       if (ResourceAquiredShared && (NewSize.QuadPart > FcbHeader->ValidDataLength.QuadPart) ) {\r
-                               ExReleaseResourceLite(FcbHeader->Resource);\r
-                               if(!ExAcquireResourceExclusiveLite(FcbHeader->Resource,Wait)) {\r
-                                       goto LeaveCriticalAndFail;\r
-                               }\r
-\r
-                /* Compute the offset and the new filesize */\r
-                               if (FileOffsetAppend) {\r
-                                       Offset.QuadPart = FcbHeader->FileSize.QuadPart;\r
-                                       NewSize.QuadPart = FcbHeader->FileSize.QuadPart + Length;\r
-                               }\r
-\r
-                /* Recheck the above points since we released and reacquire the lock   */\r
-                               if (    (FileObject->PrivateCacheMap != NULL)  &&\r
-                                               (FcbHeader->IsFastIoPossible != FastIoIsNotPossible) &&\r
-                                               (FcbHeader->AllocationSize.QuadPart > NewSize.QuadPart)\r
-                                       ) {\r
-                                       /* Do nothing */\r
-                               } else {\r
-                                       goto FailAndCleanup;\r
-                               }\r
-                       }\r
-\r
-                   /* Check if we need to find out if fast I/O is available */\r
-                   if (FcbHeader->IsFastIoPossible == FastIoIsQuestionable)\r
-                   {\r
-                                IO_STATUS_BLOCK FastIoCheckIfPossibleStatus;\r
-                   \r
-                       /* Sanity check */\r
-                       ASSERT(!KeIsExecutingDpc());\r
-\r
-                       /* Get the Fast I/O table */\r
-                       Device = IoGetRelatedDeviceObject(FileObject);\r
-                            FastIoDispatch = Device->DriverObject->FastIoDispatch;\r
-\r
-                       /* Sanity check */\r
-                       ASSERT(FastIoDispatch != NULL);\r
-                       ASSERT(FastIoDispatch->FastIoCheckIfPossible != NULL);\r
-\r
-                       /* Ask the driver if we can do it */\r
-                       if (!FastIoDispatch->FastIoCheckIfPossible(FileObject,\r
-                                                                  FileOffsetAppend? &FcbHeader->FileSize:FileOffset,\r
-                                                                  Length,\r
-                                                                  TRUE,\r
-                                                                  LockKey,\r
-                                                                  FALSE,\r
-                                                                  &FastIoCheckIfPossibleStatus,\r
-                                                                  Device))\r
-                       {\r
-                           /* It's not, fail */\r
-                           goto FailAndCleanup;\r
-                       }\r
-                       }\r
-\r
-\r
-            /* If we are going to modify the filesize, save the old fs in case the operation fails */            \r
-                       if (NewSize.QuadPart > FcbHeader->FileSize.QuadPart) {\r
-                               FileSizeModified = TRUE;\r
-                               OldFileSize.QuadPart = FcbHeader->FileSize.QuadPart;\r
-                               OldValidDataLength.QuadPart = FcbHeader->ValidDataLength.QuadPart;\r
-\r
-                               /* If the high part of the filesize is going to change, grab the Paging IoResouce */\r
-                               if (NewSize.HighPart != FcbHeader->FileSize.HighPart && FcbHeader->PagingIoResource) {\r
-                                       ExAcquireResourceExclusiveLite(FcbHeader->PagingIoResource, TRUE);\r
-                                       FcbHeader->FileSize.QuadPart = NewSize.QuadPart;\r
-                                       ExReleaseResourceLite(FcbHeader->PagingIoResource);\r
-                               } else {\r
-                                       FcbHeader->FileSize.QuadPart = NewSize.QuadPart;\r
-                               }\r
-                       }\r
-\r
-            /* Nagar p.544 */\r
-            /* Set ourselves as top component */\r
-                   PsGetCurrentThread()->TopLevelIrp = FSRTL_FAST_IO_TOP_LEVEL_IRP;\r
-                       _SEH_TRY {\r
-                               BOOLEAN CallCc = TRUE;\r
-                /*  Check if there is a gap between the end of the file and the offset\r
-                    If yes, then we have to zero the data\r
-                */\r
-                               if (Offset.QuadPart > FcbHeader->ValidDataLength.QuadPart) {\r
-                                       if (!(Result = CcZeroData(FileObject,&FcbHeader->ValidDataLength,&Offset,Wait))) {\r
-                                           /*  If this operation fails, then we have to exit\r
-                                               We can jump outside the SEH, so I a using a variable to exit\r
-                                               normally\r
-                                           */\r
-                                               CallCc = FALSE;\r
-                                       } \r
-                               }\r
-\r
-                /* Unless the CcZeroData failed, call the cache manager */\r
-                               if (CallCc) {\r
-                                       Result = CcCopyWrite(FileObject,&Offset,Length, Wait, Buffer);\r
-                               }\r
-                       }_SEH_EXCEPT(FsRtlCcCopyFilter) {\r
-                               Result = FALSE;\r
-                   } _SEH_END;\r
-               \r
-            /* Reset the top component */\r
-                   PsGetCurrentThread()->TopLevelIrp = FSRTL_FAST_IO_TOP_LEVEL_IRP;\r
-\r
-            /* Did the operation suceeded */\r
-                       if (Result) {\r
-                           /* Check if we need to update the filesize */\r
-                               if (NewSize.QuadPart > FcbHeader->ValidDataLength.QuadPart) {\r
-                                       if (NewSize.HighPart != FcbHeader->ValidDataLength.HighPart && FcbHeader->PagingIoResource) {\r
-                                               ExAcquireResourceExclusiveLite(FcbHeader->PagingIoResource, TRUE);\r
-                                               FcbHeader->ValidDataLength.QuadPart = NewSize.QuadPart;\r
-                                               ExReleaseResourceLite(FcbHeader->PagingIoResource);\r
-                                       } else {\r
-                                               FcbHeader->ValidDataLength.QuadPart = NewSize.QuadPart;\r
-                                       }\r
-\r
-                    /* Flag the file as modified */                                    \r
-                                       FileObject->Flags |= FO_FILE_MODIFIED;\r
-                                       /* Check if the filesize has changed */\r
-                                       if (FileSizeModified) {\r
-                                           /* Update the file sizes */\r
-                                               ((SHARED_CACHE_MAP*) FileObject->SectionObjectPointer->SharedCacheMap)->FileSize.QuadPart = NewSize.QuadPart;\r
-                                               FileObject->Flags |= FO_FILE_SIZE_CHANGED;\r
-                                       }\r
-                                       /* Update the current FO byte offset */\r
-                                       FileObject->CurrentByteOffset.QuadPart = NewSize.QuadPart;\r
-                               }\r
-                       }\r
-                       else\r
-                       {\r
-                           /*  The operation did not succeed\r
-                               Reset the file size to what it should be\r
-                           */\r
-                               if (FileSizeModified) {\r
-                                       if (FcbHeader->PagingIoResource) {\r
-                                               ExAcquireResourceExclusiveLite(FcbHeader->PagingIoResource, TRUE);\r
-                                               FcbHeader->FileSize.QuadPart = OldFileSize.QuadPart;\r
-                                               FcbHeader->ValidDataLength.QuadPart = OldValidDataLength.QuadPart;\r
-                                               ExReleaseResourceLite(FcbHeader->PagingIoResource);\r
-                                       }else{\r
-                                               FcbHeader->FileSize.QuadPart = OldFileSize.QuadPart;\r
-                                               FcbHeader->ValidDataLength.QuadPart = OldValidDataLength.QuadPart;\r
-                                       }\r
-                               }\r
-                       }\r
-                       goto Cleanup;\r
-               } else {\r
-                       goto FailAndCleanup;\r
-               }\r
-\r
-               ASSERT(0);\r
-       }\r
-\r
-LeaveCriticalAndFail:\r
-    FsRtlExitFileSystem();\r
-    return FALSE;\r
-\r
-\r
-FailAndCleanup:\r
-\r
-    ExReleaseResourceLite(FcbHeader->Resource);\r
-    FsRtlExitFileSystem();\r
-    return FALSE;\r
-\r
-Cleanup:\r
-\r
-    ExReleaseResourceLite(FcbHeader->Resource);\r
-    FsRtlExitFileSystem();\r
-    return Result;\r
-}   \r
-\r
-/*\r
- * @implemented\r
- */\r
-NTSTATUS\r
-NTAPI\r
-FsRtlGetFileSize(IN PFILE_OBJECT  FileObject,\r
-                 IN OUT PLARGE_INTEGER FileSize)\r
-{\r
-    FILE_STANDARD_INFORMATION Info;\r
-    NTSTATUS Status;\r
-    IO_STATUS_BLOCK IoStatus;\r
-    PDEVICE_OBJECT DeviceObject;\r
-    PFAST_IO_DISPATCH FastDispatch;\r
-    KEVENT Event;\r
-    PIO_STACK_LOCATION IoStackLocation;\r
-    PIRP Irp;\r
-    BOOLEAN OldHardError;\r
-\r
-    \r
-    PAGED_CODE();\r
-\r
-    /* Get Device Object and Fast Calls */\r
-    DeviceObject = IoGetRelatedDeviceObject(FileObject);\r
-    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;\r
-\r
-    /* Check if we support Fast Calls, and check FastIoQueryStandardInfo */\r
-    /* Call the function and see if it succeeds */\r
-    if (    !FastDispatch ||\r
-            !FastDispatch->FastIoQueryStandardInfo ||\r
-            !FastDispatch->FastIoQueryStandardInfo(FileObject,TRUE,\r
-                &Info,&IoStatus,DeviceObject))\r
-    {\r
-        /* If any of the above failed, then we are going to send an IRP to the device object */\r
-        /* Initialize the even for the IO */\r
-        KeInitializeEvent(&Event,NotificationEvent,FALSE);\r
-        /* Allocate the IRP */\r
-        Irp = IoAllocateIrp(DeviceObject->StackSize,FALSE);\r
-        if (Irp == NULL) \r
-        {\r
-            return STATUS_INSUFFICIENT_RESOURCES;\r
-        }\r
-\r
-\r
-        /* Don't process hard error */\r
-        OldHardError = IoSetThreadHardErrorMode(FALSE);\r
-\r
-        /* Setup the IRP */\r
-        Irp->UserIosb = &IoStatus;\r
-        Irp->UserEvent = &Event;\r
-        Irp->Tail.Overlay.Thread = PsGetCurrentThread();\r
-        Irp->Flags = IRP_INPUT_OPERATION | IRP_PAGING_IO;\r
-        Irp->RequestorMode = KernelMode;\r
-        Irp->Tail.Overlay.OriginalFileObject = FileObject;\r
-        Irp->AssociatedIrp.SystemBuffer = &Info;\r
-\r
-        /* Setup out stack location */\r
-        IoStackLocation = Irp->Tail.Overlay.CurrentStackLocation;\r
-        IoStackLocation--;\r
-        IoStackLocation->MajorFunction = IRP_MJ_QUERY_INFORMATION;\r
-        IoStackLocation->FileObject = FileObject;\r
-        IoStackLocation->DeviceObject = DeviceObject;\r
-        IoStackLocation->Parameters.QueryFile.Length =  ALIGN_UP(sizeof(FILE_INFORMATION_CLASS),ULONG);\r
-        IoStackLocation->Parameters.QueryFile.FileInformationClass = FileStandardInformation;\r
-\r
-        /* Send the IRP to the related device object */\r
-        Status = IofCallDriver(DeviceObject,Irp);\r
-\r
-        /* Standard DDK IRP result processing */\r
-        if (Status == STATUS_PENDING) {\r
-            KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);\r
-        }\r
-\r
-        /* If there was a synchronous error, signal it */\r
-        if (!NT_SUCCESS(Status)) {\r
-            IoStatus.Status = Status;\r
-        }\r
-        \r
-        IoSetThreadHardErrorMode(OldHardError);\r
-    }\r
-\r
-    /* Check the sync/async IO result */\r
-    if (NT_SUCCESS(IoStatus.Status)) \r
-    {\r
-        /* Was the request for a directory ? */\r
-        if (Info.Directory) \r
-        {\r
-            IoStatus.Status = STATUS_FILE_IS_A_DIRECTORY;\r
-        }\r
-        else\r
-        {\r
-            FileSize->QuadPart = Info.EndOfFile.QuadPart;\r
-         }\r
-    }\r
-\r
-    return IoStatus.Status;\r
-}\r
-                \r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlMdlRead(IN PFILE_OBJECT FileObject,\r
-             IN PLARGE_INTEGER FileOffset,\r
-             IN ULONG Length,\r
-             IN ULONG LockKey,\r
-             OUT PMDL *MdlChain,\r
-             OUT PIO_STATUS_BLOCK IoStatus)\r
-{\r
-    PDEVICE_OBJECT DeviceObject, BaseDeviceObject;\r
-    PFAST_IO_DISPATCH FastDispatch;\r
-\r
-    /* Get Device Object and Fast Calls */\r
-    DeviceObject = IoGetRelatedDeviceObject(FileObject);\r
-    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;\r
-\r
-    /* Check if we support Fast Calls, and check this one */\r
-    if (FastDispatch && FastDispatch->MdlRead)\r
-    {\r
-        /* Use the fast path */\r
-        return FastDispatch->MdlRead(FileObject,\r
-                                     FileOffset,\r
-                                     Length,\r
-                                     LockKey,\r
-                                     MdlChain,\r
-                                     IoStatus,\r
-                                     DeviceObject);\r
-    }\r
-\r
-    /* Get the Base File System (Volume) and Fast Calls */\r
-    BaseDeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);\r
-    FastDispatch = BaseDeviceObject->DriverObject->FastIoDispatch;\r
-\r
-    /* If the Base Device Object has its own FastDispatch Routine, fail */\r
-    if (FastDispatch && FastDispatch->MdlRead &&\r
-        BaseDeviceObject != DeviceObject)\r
-    {\r
-        return FALSE;\r
-    }\r
-\r
-    /* No fast path, use slow path */\r
-    return FsRtlMdlReadDev(FileObject,\r
-                           FileOffset,\r
-                           Length,\r
-                           LockKey,\r
-                           MdlChain,\r
-                           IoStatus,\r
-                           DeviceObject);\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlMdlReadComplete(IN PFILE_OBJECT FileObject,\r
-                     IN OUT PMDL MdlChain)\r
-{\r
-    PDEVICE_OBJECT DeviceObject, BaseDeviceObject;\r
-    PFAST_IO_DISPATCH FastDispatch;\r
-\r
-    /* Get Device Object and Fast Calls */\r
-    DeviceObject = IoGetRelatedDeviceObject(FileObject);\r
-    FastDispatch = DeviceObject->DriverObject->FastIoDispatch;\r
-\r
-    /* Check if we support Fast Calls, and check this one */\r
-    if (FastDispatch && FastDispatch->MdlReadComplete)\r
-    {\r
-        /* Use the fast path */\r
-        return FastDispatch->MdlReadComplete(FileObject,\r
-                                             MdlChain,\r
-                                             DeviceObject);\r
-    }\r
-\r
-    /* Get the Base File System (Volume) and Fast Calls */\r
-    BaseDeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);\r
-    FastDispatch = BaseDeviceObject->DriverObject->FastIoDispatch;\r
-\r
-    /* If the Base Device Object has its own FastDispatch Routine, fail */\r
-    if ((BaseDeviceObject != DeviceObject) && FastDispatch \r
-        && FastDispatch->MdlReadComplete)\r
-    {\r
-        return FALSE;\r
-    }\r
-\r
-    /* No fast path, use slow path */\r
-    return FsRtlMdlReadCompleteDev(FileObject, MdlChain, DeviceObject);\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
- BOOLEAN\r
- NTAPI\r
-FsRtlMdlReadCompleteDev(IN PFILE_OBJECT FileObject,\r
-                        IN PMDL MemoryDescriptorList,\r
-                        IN PDEVICE_OBJECT DeviceObject)\r
-{\r
-    /* Call the Cache Manager */\r
-    CcMdlReadComplete2(MemoryDescriptorList, FileObject);\r
-    return TRUE;\r
-}\r
-\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlMdlReadDev(IN PFILE_OBJECT FileObject,\r
-                IN PLARGE_INTEGER FileOffset,\r
-                IN ULONG Length,\r
-                IN ULONG LockKey,\r
-                OUT PMDL *MdlChain,\r
-                OUT PIO_STATUS_BLOCK IoStatus,\r
-                IN PDEVICE_OBJECT DeviceObject)\r
-{\r
-    PFSRTL_COMMON_FCB_HEADER FcbHeader;\r
-    BOOLEAN Result = TRUE;\r
-    LARGE_INTEGER Offset;\r
-    PFAST_IO_DISPATCH FastIoDispatch;\r
-    PDEVICE_OBJECT Device;\r
-    PAGED_CODE();\r
-\r
-    /* No actual read */\r
-    if (!Length)\r
-    {\r
-        /* Return success */\r
-        IoStatus->Status = STATUS_SUCCESS;\r
-        IoStatus->Information = 0;\r
-        return TRUE;\r
-    }\r
-\r
-    /* Sanity check */\r
-    ASSERT(MAXLONGLONG - FileOffset->QuadPart >= (LONGLONG)Length);\r
-\r
-    /* Get the offset and FCB header */\r
-    Offset.QuadPart = FileOffset->QuadPart + Length;\r
-    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext;\r
-\r
-    /* Enter the FS */\r
-    FsRtlEnterFileSystem();\r
-    CcFastMdlReadWait++;\r
-\r
-    /* Lock the FCB */\r
-    ExAcquireResourceShared(FcbHeader->Resource, TRUE);\r
-\r
-    /* Check if this is a fast I/O cached file */\r
-    if (!(FileObject->PrivateCacheMap) ||\r
-        (FcbHeader->IsFastIoPossible == FastIoIsNotPossible))\r
-    {\r
-        /* It's not, so fail */\r
-        CcFastMdlReadNotPossible += 1;\r
-        Result = FALSE;\r
-        goto Cleanup;\r
-    }\r
-\r
-    /* Check if we need to find out if fast I/O is available */\r
-    if (FcbHeader->IsFastIoPossible == FastIoIsQuestionable)\r
-    {\r
-        /* Get the Fast I/O table */\r
-        Device = IoGetRelatedDeviceObject(FileObject);\r
-        FastIoDispatch = Device->DriverObject->FastIoDispatch;\r
-\r
-        /* Sanity check */\r
-        ASSERT(!KeIsExecutingDpc());\r
-        ASSERT(FastIoDispatch != NULL);\r
-        ASSERT(FastIoDispatch->FastIoCheckIfPossible != NULL);\r
-\r
-        /* Ask the driver if we can do it */\r
-        if (!FastIoDispatch->FastIoCheckIfPossible(FileObject,\r
-                                                   FileOffset,\r
-                                                   Length,\r
-                                                   TRUE,\r
-                                                   LockKey,\r
-                                                   TRUE,\r
-                                                   IoStatus,\r
-                                                   Device))\r
-        {\r
-            /* It's not, fail */\r
-            CcFastMdlReadNotPossible += 1;\r
-            Result = FALSE;\r
-            goto Cleanup;\r
-        }\r
-    }\r
-\r
-    /* Check if we read too much */\r
-    if (Offset.QuadPart > FcbHeader->FileSize.QuadPart)\r
-    {\r
-        /* We did, check if the file offset is past the end */\r
-        if (FileOffset->QuadPart >= FcbHeader->FileSize.QuadPart)\r
-        {\r
-            /* Set end of file */\r
-            IoStatus->Status = STATUS_END_OF_FILE;\r
-            IoStatus->Information = 0;\r
-            goto Cleanup;\r
-        }\r
-\r
-        /* Otherwise, just normalize the length */\r
-        Length = (ULONG)(FcbHeader->FileSize.QuadPart - FileOffset->QuadPart);\r
-    }\r
-\r
-    /* Set this as top-level IRP */\r
-    PsGetCurrentThread()->TopLevelIrp = FSRTL_FAST_IO_TOP_LEVEL_IRP;\r
-\r
-    _SEH_TRY \r
-    {    \r
-        /* Attempt a read */\r
-        CcMdlRead(FileObject, FileOffset, Length, MdlChain, IoStatus);\r
-        FileObject->Flags |= FO_FILE_FAST_IO_READ;\r
-    }\r
-       _SEH_EXCEPT(FsRtlCcCopyFilter) \r
-       {\r
-               Result = FALSE;\r
-    } _SEH_END;\r
-    \r
-\r
-    /* Remove the top-level IRP flag */\r
-    PsGetCurrentThread()->TopLevelIrp = 0;\r
-\r
-    /* Return to caller */\r
-Cleanup:\r
-    ExReleaseResourceLite(FcbHeader->Resource);\r
-    FsRtlExitFileSystem();\r
-    return Result;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlMdlWriteComplete(IN PFILE_OBJECT FileObject,\r
-                      IN PLARGE_INTEGER FileOffset,\r
-                      IN PMDL MdlChain)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlMdlWriteCompleteDev(IN PFILE_OBJECT FileObject,\r
-                         IN PLARGE_INTEGER FileOffset,\r
-                         IN PMDL MdlChain,\r
-                         IN PDEVICE_OBJECT DeviceObject)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlPrepareMdlWrite(IN PFILE_OBJECT FileObject,\r
-                     IN PLARGE_INTEGER FileOffset,\r
-                     IN ULONG Length,\r
-                     IN ULONG LockKey,\r
-                     OUT PMDL *MdlChain,\r
-                     OUT PIO_STATUS_BLOCK IoStatus)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlPrepareMdlWriteDev(IN PFILE_OBJECT FileObject,\r
-                        IN PLARGE_INTEGER FileOffset,\r
-                        IN ULONG Length,\r
-                        IN ULONG LockKey,\r
-                        OUT PMDL *MdlChain,\r
-                        OUT PIO_STATUS_BLOCK IoStatus,\r
-                        IN PDEVICE_OBJECT DeviceObject)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
-* @implemented\r
-*/\r
-VOID\r
-NTAPI\r
-FsRtlAcquireFileExclusive(IN PFILE_OBJECT FileObject)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*\r
-* @implemented\r
-*/\r
-VOID\r
-NTAPI\r
-FsRtlReleaseFile(IN PFILE_OBJECT FileObject)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlRegisterFileSystemFilterCallbacks\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param FilterDriverObject\r
- *        FILLME\r
- *\r
- * @param Callbacks\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-NTSTATUS\r
-NTAPI\r
-FsRtlRegisterFileSystemFilterCallbacks(IN PDRIVER_OBJECT FilterDriverObject,\r
-                                       IN PFS_FILTER_CALLBACKS Callbacks)\r
-{\r
-    UNIMPLEMENTED;\r
-    return STATUS_NOT_IMPLEMENTED;\r
-}\r
-\r
diff --git a/reactos/ntoskrnl/fsrtl/faulttol.c b/reactos/ntoskrnl/fsrtl/faulttol.c
deleted file mode 100644 (file)
index 7e95a6e..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/faulttol.c\r
- * PURPOSE:         Provides Fault Tolerance support for File System Drivers\r
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#include "ntddft.h"\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlBalanceReads\r
- * @implemented NT 4.0\r
- *\r
- *     The FsRtlBalanceReads routine sends an IRP to an FTDISK Driver\r
- *     requesting the driver to balance read requests across a mirror set.\r
- *\r
- * @param TargetDevice\r
- *        A pointer to an FTDISK Device Object.\r
- *\r
- * @return The NTSTATUS error code returned by the FTDISK Driver.\r
- *\r
- * @remarks FTDISK is a Software RAID Implementation.\r
- *\r
- *--*/\r
-NTSTATUS\r
-NTAPI\r
-FsRtlBalanceReads(PDEVICE_OBJECT TargetDevice)\r
-{\r
-    PIRP Irp;\r
-    KEVENT Event;\r
-    IO_STATUS_BLOCK IoStatusBlock;\r
-    NTSTATUS Status;\r
-\r
-    /* Initialize the Local Event */\r
-    KeInitializeEvent(&Event, NotificationEvent, FALSE);\r
-\r
-    /* Build the special IOCTL */\r
-    Irp = IoBuildDeviceIoControlRequest(FT_BALANCED_READ_MODE,\r
-                                        TargetDevice,\r
-                                        NULL,\r
-                                        0,\r
-                                        NULL,\r
-                                        0,\r
-                                        FALSE,\r
-                                        &Event,\r
-                                        &IoStatusBlock);\r
-\r
-    /* Send it */\r
-    Status = IoCallDriver(TargetDevice, Irp);\r
-\r
-    /* Wait if needed */\r
-    if (Status == STATUS_PENDING)\r
-    {\r
-        Status = KeWaitForSingleObject(&Event,\r
-                                       Executive,\r
-                                       KernelMode,\r
-                                       FALSE,\r
-                                       NULL);\r
-        /* Return Status */\r
-        Status = IoStatusBlock.Status;\r
-    }\r
-\r
-    /* Return the status */\r
-    return Status;\r
-}\r
-\r
-/*++\r
- * @name FsRtlSyncVolumes\r
- * @implemented NT 4.0\r
- *\r
- *     The FsRtlSyncVolumes routine is deprecated.\r
- *\r
- * @return Always returns STATUS_SUCCESS.\r
- *\r
- * @remarks Deprecated.\r
- *\r
- *--*/\r
-NTSTATUS\r
-NTAPI\r
-FsRtlSyncVolumes(ULONG Unknown0,\r
-                 ULONG Unknown1,\r
-                 ULONG Unknown2)\r
-{\r
-    /* Always return success */\r
-    return STATUS_SUCCESS;\r
-}\r
diff --git a/reactos/ntoskrnl/fsrtl/filelock.c b/reactos/ntoskrnl/fsrtl/filelock.c
deleted file mode 100644 (file)
index 2bbd0da..0000000
+++ /dev/null
@@ -1,367 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/filelock.c\r
- * PURPOSE:         File Locking implementation for File System Drivers\r
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* GLOBALS *******************************************************************/\r
-\r
-PAGED_LOOKASIDE_LIST FsRtlFileLockLookasideList;\r
-\r
-/* PRIVATE FUNCTIONS *********************************************************/\r
-\r
-VOID\r
-NTAPI\r
-FsRtlCompleteLockIrpReal(IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteRoutine,\r
-                         IN PVOID Context,\r
-                         IN PIRP Irp,\r
-                         IN NTSTATUS Status,\r
-                         OUT PNTSTATUS NewStatus,\r
-                         IN PFILE_OBJECT FileObject OPTIONAL)\r
-{\r
-    /* Check if we have a complete routine */\r
-    if (CompleteRoutine)\r
-    {\r
-        /* Check if we have a file object */\r
-        if (FileObject) FileObject->LastLock = NULL;\r
-\r
-        /* Set the I/O Status and do completion */\r
-        Irp->IoStatus.Status = Status;\r
-        *NewStatus = CompleteRoutine(Context, Irp);\r
-    }\r
-    else\r
-    {\r
-        /* Otherwise do a normal I/O complete request */\r
-        FsRtlCompleteRequest(Irp, Status);\r
-        *NewStatus = Status;\r
-    }\r
-}\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*\r
- * @implemented\r
- */\r
-PFILE_LOCK_INFO\r
-NTAPI\r
-FsRtlGetNextFileLock(IN PFILE_LOCK FileLock,\r
-                     IN BOOLEAN Restart)\r
-{\r
-    KEBUGCHECK(0);\r
-    return NULL;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlPrivateLock(IN PFILE_LOCK FileLock,\r
-                 IN PFILE_OBJECT FileObject,\r
-                 IN PLARGE_INTEGER FileOffset,\r
-                 IN PLARGE_INTEGER Length,\r
-                 IN PEPROCESS Process,\r
-                 IN ULONG Key,\r
-                 IN BOOLEAN FailImmediately,\r
-                 IN BOOLEAN ExclusiveLock,\r
-                 OUT PIO_STATUS_BLOCK IoStatus,\r
-                 IN PIRP Irp OPTIONAL,\r
-                 IN PVOID Context OPTIONAL,\r
-                 IN BOOLEAN AlreadySynchronized)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlCheckLockForReadAccess(IN PFILE_LOCK FileLock,\r
-                            IN PIRP Irp)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlCheckLockForWriteAccess(IN PFILE_LOCK FileLock,\r
-                             IN PIRP Irp)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlFastCheckLockForRead(IN PFILE_LOCK FileLock,\r
-                          IN PLARGE_INTEGER FileOffset,\r
-                          IN PLARGE_INTEGER Length,\r
-                          IN ULONG Key,\r
-                          IN PFILE_OBJECT FileObject,\r
-                          IN PEPROCESS Process)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-BOOLEAN\r
-NTAPI\r
-FsRtlFastCheckLockForWrite(IN PFILE_LOCK FileLock,\r
-                           IN PLARGE_INTEGER FileOffset,\r
-                           IN PLARGE_INTEGER Length,\r
-                           IN ULONG Key,\r
-                           IN PFILE_OBJECT FileObject,\r
-                           IN PEPROCESS Process)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-NTSTATUS\r
-NTAPI\r
-FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,\r
-                      IN PFILE_OBJECT FileObject,\r
-                      IN PLARGE_INTEGER FileOffset,\r
-                      IN PLARGE_INTEGER Length,\r
-                      IN PEPROCESS Process,\r
-                      IN ULONG Key,\r
-                      IN PVOID Context OPTIONAL,\r
-                      IN BOOLEAN AlreadySynchronized)\r
-{\r
-    KEBUGCHECK(0);\r
-    return STATUS_UNSUCCESSFUL;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-NTSTATUS\r
-NTAPI\r
-FsRtlFastUnlockAll(IN PFILE_LOCK FileLock,\r
-                   IN PFILE_OBJECT FileObject,\r
-                   IN PEPROCESS Process,\r
-                   IN PVOID Context OPTIONAL)\r
-{\r
-    KEBUGCHECK(0);\r
-    return STATUS_UNSUCCESSFUL;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-NTSTATUS\r
-NTAPI\r
-FsRtlFastUnlockAllByKey(IN PFILE_LOCK FileLock,\r
-                        IN PFILE_OBJECT FileObject,\r
-                        IN PEPROCESS Process,\r
-                        IN ULONG Key,\r
-                        IN PVOID Context OPTIONAL)\r
-{\r
-    KEBUGCHECK(0);\r
-    return STATUS_UNSUCCESSFUL;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-NTSTATUS\r
-NTAPI\r
-FsRtlProcessFileLock(IN PFILE_LOCK FileLock,\r
-                     IN PIRP Irp,\r
-                     IN PVOID Context OPTIONAL)\r
-{\r
-    PIO_STACK_LOCATION IoStackLocation;\r
-    NTSTATUS Status;\r
-    IO_STATUS_BLOCK IoStatusBlock;\r
-\r
-    /* Get the I/O Stack location */\r
-    IoStackLocation = IoGetCurrentIrpStackLocation(Irp);\r
-    ASSERT(IoStackLocation->MajorFunction == IRP_MJ_LOCK_CONTROL);\r
-\r
-    /* Clear the I/O status block and check what function this is */\r
-    IoStatusBlock.Information = 0;\r
-    switch(IoStackLocation->MinorFunction)\r
-    {\r
-        /* A lock */\r
-        case IRP_MN_LOCK:\r
-\r
-            /* Call the private lock routine */\r
-            FsRtlPrivateLock(FileLock,\r
-                             IoStackLocation->FileObject,\r
-                             &IoStackLocation->\r
-                             Parameters.LockControl.ByteOffset,\r
-                             IoStackLocation->Parameters.LockControl.Length,\r
-                             IoGetRequestorProcess(Irp),\r
-                             IoStackLocation->Parameters.LockControl.Key,\r
-                             IoStackLocation->Flags & SL_FAIL_IMMEDIATELY,\r
-                             IoStackLocation->Flags & SL_EXCLUSIVE_LOCK,\r
-                             &IoStatusBlock,\r
-                             Irp,\r
-                             Context,\r
-                             FALSE);\r
-            break;\r
-\r
-        /* A single unlock */\r
-        case IRP_MN_UNLOCK_SINGLE:\r
-\r
-            /* Call fast unlock */\r
-            IoStatusBlock.Status =\r
-                FsRtlFastUnlockSingle(FileLock,\r
-                                      IoStackLocation->FileObject,\r
-                                      &IoStackLocation->Parameters.LockControl.\r
-                                      ByteOffset,\r
-                                      IoStackLocation->Parameters.LockControl.\r
-                                      Length,\r
-                                      IoGetRequestorProcess(Irp),\r
-                                      IoStackLocation->Parameters.LockControl.\r
-                                      Key,\r
-                                      Context,\r
-                                      FALSE);\r
-\r
-            /* Complete the IRP */\r
-            FsRtlCompleteLockIrpReal(FileLock->CompleteLockIrpRoutine,\r
-                                     Context,\r
-                                     Irp,\r
-                                     IoStatusBlock.Status,\r
-                                     &Status,\r
-                                     NULL);\r
-            break;\r
-\r
-        /* Total unlock */\r
-        case IRP_MN_UNLOCK_ALL:\r
-\r
-            /* Do a fast unlock */\r
-            IoStatusBlock.Status = FsRtlFastUnlockAll(FileLock,\r
-                                                      IoStackLocation->\r
-                                                      FileObject,\r
-                                                      IoGetRequestorProcess(Irp),\r
-                                                      Context);\r
-\r
-            /* Complete the IRP */\r
-            FsRtlCompleteLockIrpReal(FileLock->CompleteLockIrpRoutine,\r
-                                     Context,\r
-                                     Irp,\r
-                                     IoStatusBlock.Status,\r
-                                     &Status,\r
-                                     NULL);\r
-            break;\r
-\r
-        /* Unlock by key */\r
-        case IRP_MN_UNLOCK_ALL_BY_KEY:\r
-\r
-            /* Do it */\r
-            IoStatusBlock.Status =\r
-                FsRtlFastUnlockAllByKey(FileLock,\r
-                                        IoStackLocation->FileObject,\r
-                                        IoGetRequestorProcess(Irp),\r
-                                        IoStackLocation->Parameters.\r
-                                        LockControl.Key,\r
-                                        Context);\r
-\r
-            /* Complete the IRP */\r
-            FsRtlCompleteLockIrpReal(FileLock->CompleteLockIrpRoutine,\r
-                                     Context,\r
-                                     Irp,\r
-                                     IoStatusBlock.Status,\r
-                                     &Status,\r
-                                     NULL);\r
-            break;\r
-\r
-        /* Invalid request */\r
-        default:\r
-\r
-            /* Complete it */\r
-            FsRtlCompleteRequest(Irp, STATUS_INVALID_DEVICE_REQUEST);\r
-            IoStatusBlock.Status = STATUS_INVALID_DEVICE_REQUEST;\r
-            break;\r
-    }\r
-\r
-    /* Return the status */\r
-    return IoStatusBlock.Status;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlInitializeFileLock (IN PFILE_LOCK FileLock,\r
-                         IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,\r
-                         IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL)\r
-{\r
-    /* Setup the lock */\r
-    FileLock->FastIoIsQuestionable = FALSE;\r
-    FileLock->CompleteLockIrpRoutine = CompleteLockIrpRoutine;\r
-    FileLock->UnlockRoutine = UnlockRoutine;\r
-    FileLock->LockInformation = NULL;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlUninitializeFileLock(IN PFILE_LOCK FileLock)\r
-{\r
-    return;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-PFILE_LOCK\r
-NTAPI\r
-FsRtlAllocateFileLock(IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,\r
-                      IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL)\r
-{\r
-    PFILE_LOCK FileLock;\r
-\r
-    /* Try to allocate it */\r
-    FileLock = ExAllocateFromPagedLookasideList(&FsRtlFileLockLookasideList);\r
-    if (FileLock)\r
-    {\r
-        /* Initialize it */\r
-        FsRtlInitializeFileLock(FileLock,\r
-                                CompleteLockIrpRoutine,\r
-                                UnlockRoutine);\r
-    }\r
-\r
-    /* Return the lock */\r
-    return FileLock;\r
-}\r
-\r
-/*\r
- * @implemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlFreeFileLock(IN PFILE_LOCK FileLock)\r
-{\r
-    /* Uninitialize and free the lock */\r
-    FsRtlUninitializeFileLock(FileLock);\r
-    ExFreeToPagedLookasideList(&FsRtlFileLockLookasideList, FileLock);\r
-}\r
-\r
diff --git a/reactos/ntoskrnl/fsrtl/filter.c b/reactos/ntoskrnl/fsrtl/filter.c
deleted file mode 100644 (file)
index 9d8ca0d..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/filter.c\r
- * PURPOSE:         Provides support for usage of SEH inside File System Drivers\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-#undef FsRtlAllocatePoolWithQuotaTag\r
-#undef FsRtlAllocatePoolWithTag\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlIsTotalDeviceFailure\r
- * @implemented NT 4.0\r
- *\r
- *     The FsRtlIsTotalDeviceFailure routine checks if an NTSTATUS error code\r
- *     represents a disk hardware failure.\r
- *\r
- * @param NtStatus\r
- *        The NTSTATUS Code to Test\r
- *\r
- * @return TRUE in case of Hardware Failure, FALSE otherwise.\r
- *\r
- * @remarks None.\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlIsTotalDeviceFailure(IN NTSTATUS NtStatus)\r
-{\r
-    return((NT_SUCCESS(NtStatus)) ||\r
-           (STATUS_CRC_ERROR == NtStatus) ||\r
-           (STATUS_DEVICE_DATA_ERROR == NtStatus) ? FALSE : TRUE);\r
-}\r
-\r
-/*++\r
- * @name FsRtlIsNtstatusExpected\r
- * @implemented NT 4.0\r
- *\r
- *     The FsRtlIsNtstatusExpected routine checks if an NTSTATUS error code\r
- *     is expected by the File System Support Library.\r
- *\r
- * @param NtStatus\r
- *        The NTSTATUS Code to Test\r
- *\r
- * @return TRUE if the Value is Expected, FALSE otherwise.\r
- *\r
- * @remarks None.\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus)\r
-{\r
-    return((STATUS_DATATYPE_MISALIGNMENT == NtStatus) ||\r
-           (STATUS_ACCESS_VIOLATION == NtStatus) ||\r
-           (STATUS_ILLEGAL_INSTRUCTION == NtStatus) ||\r
-           (STATUS_INSTRUCTION_MISALIGNMENT == NtStatus)) ? FALSE : TRUE;\r
-}\r
-\r
-/*++\r
- * @name FsRtlNormalizeNtstatus\r
- * @implemented NT 4.0\r
- *\r
- *     The FsRtlNormalizeNtstatus routine normalizes an NTSTATUS error code.\r
- *\r
- * @param NtStatusToNormalize\r
- *        The NTSTATUS error code to Normalize.\r
- *\r
- * @param NormalizedNtStatus\r
- *        The NTSTATUS error code to return if the NtStatusToNormalize is not\r
- *        a proper expected error code by the File System Library.\r
- *\r
- * @return NtStatusToNormalize if it is an expected value, otherwise\r
- *         NormalizedNtStatus.\r
- *\r
- * @remarks None.\r
- *\r
- *--*/\r
-NTSTATUS\r
-NTAPI\r
-FsRtlNormalizeNtstatus(IN NTSTATUS NtStatusToNormalize,\r
-                       IN NTSTATUS NormalizedNtStatus)\r
-{\r
-    return(TRUE == FsRtlIsNtstatusExpected(NtStatusToNormalize)) ?\r
-           NtStatusToNormalize : NormalizedNtStatus;\r
-}\r
-\r
-/*++\r
- * @name FsRtlAllocatePool\r
- * @implemented\r
- *\r
- * FILLME\r
- *\r
- * @param PoolType\r
- *        FILLME\r
- *\r
- * @param NumberOfBytes\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks The pool tag used is "FSrt".\r
- *\r
- *--*/\r
-PVOID\r
-NTAPI\r
-FsRtlAllocatePool(IN POOL_TYPE PoolType,\r
-                  IN ULONG NumberOfBytes)\r
-{\r
-    PVOID   Address;\r
-\r
-    Address = ExAllocatePoolWithTag(PoolType,\r
-                                    NumberOfBytes,\r
-                                    IFS_POOL_TAG);\r
-\r
-    if (NULL == Address)\r
-    {\r
-        ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);\r
-    }\r
-\r
-    return Address;\r
-}\r
-\r
-/*++\r
- * @name FsRtlAllocatePoolWithQuota\r
- * @implemented\r
- *\r
- * FILLME\r
- *\r
- * @param PoolType\r
- *        FILLME\r
- *\r
- * @param NumberOfBytes\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks The pool tag used is "FSrt".\r
- *\r
- *--*/\r
-PVOID\r
-NTAPI\r
-FsRtlAllocatePoolWithQuota(IN POOL_TYPE PoolType,\r
-                           IN ULONG NumberOfBytes)\r
-{\r
-    PVOID      Address;\r
-\r
-    Address = ExAllocatePoolWithQuotaTag(PoolType,\r
-                                         NumberOfBytes,\r
-                                         IFS_POOL_TAG);\r
-    if (NULL == Address)\r
-    {\r
-        ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);\r
-    }\r
-    return Address;\r
-}\r
-\r
-/*++\r
- * @name FsRtlAllocatePoolWithQuotaTag\r
- * @implemented\r
- *\r
- * FILLME\r
- *\r
- * @param PoolType\r
- *        FILLME\r
- *\r
- * @param NumberOfBytes\r
- *        FILLME\r
- *\r
- * @param Tag\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-PVOID\r
-NTAPI\r
-FsRtlAllocatePoolWithQuotaTag (IN POOL_TYPE PoolType,\r
-                               IN ULONG NumberOfBytes,\r
-                               IN ULONG Tag)\r
-{\r
-    PVOID   Address;\r
-\r
-    Address = ExAllocatePoolWithQuotaTag(PoolType,\r
-                                         NumberOfBytes,\r
-                                         Tag);\r
-\r
-    if (NULL == Address)\r
-    {\r
-        ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);\r
-    }\r
-\r
-    return Address;\r
-}\r
-\r
-/*++\r
- * @name FsRtlAllocatePoolWithTag\r
- * @implemented\r
- *\r
- * FILLME\r
- *\r
- * @param PoolType\r
- *        FILLME\r
- *\r
- * @param NumberOfBytes\r
- *        FILLME\r
- *\r
- * @param Tag\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-PVOID\r
-NTAPI\r
-FsRtlAllocatePoolWithTag(IN POOL_TYPE PoolType,\r
-                         IN ULONG NumberOfBytes,\r
-                         IN ULONG Tag)\r
-{\r
-    PVOID   Address;\r
-\r
-    Address = ExAllocatePoolWithTag(PoolType,\r
-                                    NumberOfBytes,\r
-                                    Tag);\r
-\r
-    if (NULL == Address)\r
-    {\r
-        ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);\r
-    }\r
-\r
-    return Address;\r
-}\r
-\r
diff --git a/reactos/ntoskrnl/fsrtl/filtrctx.c b/reactos/ntoskrnl/fsrtl/filtrctx.c
deleted file mode 100644 (file)
index 7ce96f4..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/filtrctx.c\r
- * PURPOSE:         File Stream Filter Context support for File System Drivers\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlIsPagingFile\r
- * @implemented NT 4.0\r
- *\r
- *     The FsRtlIsPagingFile routine checks if the FileObject is a Paging File.\r
- *\r
- * @param FileObject\r
- *        A pointer to the File Object to be tested.\r
- *\r
- * @return TRUE if the File is a Paging File, FALSE otherwise.\r
- *\r
- * @remarks None.\r
- *\r
- *--*/\r
-LOGICAL\r
-NTAPI\r
-FsRtlIsPagingFile(IN PFILE_OBJECT FileObject)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-PFSRTL_PER_STREAM_CONTEXT\r
-NTAPI\r
-FsRtlLookupPerStreamContextInternal(IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,\r
-                                    IN PVOID OwnerId OPTIONAL,\r
-                                    IN PVOID InstanceId OPTIONAL)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-PFSRTL_PER_FILEOBJECT_CONTEXT\r
-NTAPI\r
-FsRtlLookupPerFileObjectContext(IN PFILE_OBJECT FileObject,\r
-                                IN PVOID OwnerId OPTIONAL,\r
-                                IN PVOID InstanceId OPTIONAL)\r
-{\r
-    KEBUGCHECK(0);\r
-    return FALSE;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-NTSTATUS\r
-NTAPI\r
-FsRtlInsertPerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,\r
-                            IN PFSRTL_PER_STREAM_CONTEXT Ptr)\r
-{\r
-    KEBUGCHECK(0);\r
-    return STATUS_NOT_IMPLEMENTED;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-PFSRTL_PER_STREAM_CONTEXT\r
-NTAPI\r
-FsRtlRemovePerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,\r
-                            IN PVOID OwnerId OPTIONAL,\r
-                            IN PVOID InstanceId OPTIONAL)\r
-{\r
-    KEBUGCHECK(0);\r
-    return NULL;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-NTSTATUS\r
-NTAPI\r
-FsRtlInsertPerFileObjectContext(IN PFILE_OBJECT FileObject,\r
-                                IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr)\r
-{\r
-    KEBUGCHECK(0);\r
-    return STATUS_NOT_IMPLEMENTED;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-PFSRTL_PER_FILEOBJECT_CONTEXT\r
-NTAPI\r
-FsRtlRemovePerFileObjectContext(IN PFILE_OBJECT PerFileObjectContext,\r
-                                IN PVOID OwnerId OPTIONAL,\r
-                                IN PVOID InstanceId OPTIONAL)\r
-{\r
-    KEBUGCHECK(0);\r
-    return NULL;\r
-}\r
-\r
-/*\r
- * @unimplemented\r
- */\r
-VOID\r
-NTAPI\r
-FsRtlTeardownPerStreamContexts(IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
diff --git a/reactos/ntoskrnl/fsrtl/fsfilter.c b/reactos/ntoskrnl/fsrtl/fsfilter.c
deleted file mode 100644 (file)
index 378c816..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/fsfilter.c\r
- * PURPOSE:         Provides support for the Filter Manager\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlCreateSectionForDataScan\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param SectionHandle\r
- *        FILLME\r
- *\r
- * @param SectionObject\r
- *        FILLME\r
- *\r
- * @param SectionFileSize\r
- *        FILLME\r
- *\r
- * @param FileObject\r
- *        FILLME\r
- *\r
- * @param DesiredAccess\r
- *        FILLME\r
- *\r
- * @param ObjectAttributes\r
- *        FILLME\r
- *\r
- * @param MaximumSize\r
- *        FILLME\r
- *\r
- * @param SectionPageProtection\r
- *        FILLME\r
- *\r
- * @param AllocationAttributes\r
- *        FILLME\r
- *\r
- * @param Flags\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-NTSTATUS\r
-NTAPI\r
-FsRtlCreateSectionForDataScan(OUT PHANDLE SectionHandle,\r
-                              OUT PVOID *SectionObject,\r
-                              OUT PLARGE_INTEGER SectionFileSize OPTIONAL,\r
-                              IN PFILE_OBJECT FileObject,\r
-                              IN ACCESS_MASK DesiredAccess,\r
-                              IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\r
-                              IN PLARGE_INTEGER MaximumSize OPTIONAL,\r
-                              IN ULONG SectionPageProtection,\r
-                              IN ULONG AllocationAttributes,\r
-                              IN ULONG Flags)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-    return STATUS_NOT_IMPLEMENTED;\r
-}\r
-\r
diff --git a/reactos/ntoskrnl/fsrtl/fsrtlpc.c b/reactos/ntoskrnl/fsrtl/fsrtlpc.c
deleted file mode 100644 (file)
index dd015b1..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/fsrtlpc.c\r
- * PURPOSE:         Contains initialization and support code for the FsRtl\r
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* GLOBALS *******************************************************************/\r
-\r
-PERESOURCE FsRtlPagingIoResources;\r
-ULONG FsRtlPagingIoResourceSelector;\r
-\r
-static UCHAR LegalAnsiCharacterArray[] =\r
-{\r
-  0,                                                        /* CTRL+@, 0x00 */\r
-  0,                                                        /* CTRL+A, 0x01 */\r
-  0,                                                        /* CTRL+B, 0x02 */\r
-  0,                                                        /* CTRL+C, 0x03 */\r
-  0,                                                        /* CTRL+D, 0x04 */\r
-  0,                                                        /* CTRL+E, 0x05 */\r
-  0,                                                        /* CTRL+F, 0x06 */\r
-  0,                                                        /* CTRL+G, 0x07 */\r
-  0,                                                        /* CTRL+H, 0x08 */\r
-  0,                                                        /* CTRL+I, 0x09 */\r
-  0,                                                        /* CTRL+J, 0x0a */\r
-  0,                                                        /* CTRL+K, 0x0b */\r
-  0,                                                        /* CTRL+L, 0x0c */\r
-  0,                                                        /* CTRL+M, 0x0d */\r
-  0,                                                        /* CTRL+N, 0x0e */\r
-  0,                                                        /* CTRL+O, 0x0f */\r
-  0,                                                        /* CTRL+P, 0x10 */\r
-  0,                                                        /* CTRL+Q, 0x11 */\r
-  0,                                                        /* CTRL+R, 0x12 */\r
-  0,                                                        /* CTRL+S, 0x13 */\r
-  0,                                                        /* CTRL+T, 0x14 */\r
-  0,                                                        /* CTRL+U, 0x15 */\r
-  0,                                                        /* CTRL+V, 0x16 */\r
-  0,                                                        /* CTRL+W, 0x17 */\r
-  0,                                                        /* CTRL+X, 0x18 */\r
-  0,                                                        /* CTRL+Y, 0x19 */\r
-  0,                                                        /* CTRL+Z, 0x1a */\r
-  0,                                                        /* CTRL+[, 0x1b */\r
-  0,                                                        /* CTRL+\, 0x1c */\r
-  0,                                                        /* CTRL+], 0x1d */\r
-  0,                                                        /* CTRL+^, 0x1e */\r
-  0,                                                        /* CTRL+_, 0x1f */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* ` ',    0x20 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `!',    0x21 */\r
-  FSRTL_WILD_CHARACTER,                                     /* `"',    0x22 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `#',    0x23 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `$',    0x24 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `%',    0x25 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `&',    0x26 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `'',    0x27 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `(',    0x28 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `)',    0x29 */\r
-  FSRTL_WILD_CHARACTER,                                     /* `*',    0x2a */\r
-  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `+',    0x2b */\r
-  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `,',    0x2c */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `-',    0x2d */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `.',    0x2e */\r
-  0,                                                        /* `/',    0x2f */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `0',    0x30 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `1',    0x31 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `2',    0x32 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `3',    0x33 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `4',    0x34 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `5',    0x35 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `6',    0x36 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `7',    0x37 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `8',    0x38 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `9',    0x39 */\r
-  FSRTL_NTFS_LEGAL,                                         /* `:',    0x3a */\r
-  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `;',    0x3b */\r
-  FSRTL_WILD_CHARACTER,                                     /* `<',    0x3c */\r
-  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `=',    0x3d */\r
-  FSRTL_WILD_CHARACTER,                                     /* `>',    0x3e */\r
-  FSRTL_WILD_CHARACTER,                                     /* `?',    0x3f */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `@',    0x40 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `A',    0x41 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `B',    0x42 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `C',    0x43 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `D',    0x44 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `E',    0x45 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `F',    0x46 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `G',    0x47 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `H',    0x48 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `I',    0x49 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `J',    0x4a */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `K',    0x4b */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `L',    0x4c */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `M',    0x4d */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `N',    0x4e */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `O',    0x4f */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `P',    0x50 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `Q',    0x51 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `R',    0x52 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `S',    0x53 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `T',    0x54 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `U',    0x55 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `V',    0x56 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `W',    0x57 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `X',    0x58 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `Y',    0x59 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `Z',    0x5a */\r
-  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `[',    0x5b */\r
-  0,                                                        /* `\',    0x5c */\r
-  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `]',    0x5d */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `^',    0x5e */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `_',    0x5f */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* ``',    0x60 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `a',    0x61 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `b',    0x62 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `c',    0x63 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `d',    0x64 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `e',    0x65 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `f',    0x66 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `g',    0x67 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `h',    0x68 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `i',    0x69 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `j',    0x6a */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `k',    0x6b */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `l',    0x6c */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `m',    0x6d */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `n',    0x6e */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `o',    0x6f */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `p',    0x70 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `q',    0x71 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `r',    0x72 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `s',    0x73 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `t',    0x74 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `u',    0x75 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `v',    0x76 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `w',    0x77 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `x',    0x78 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `y',    0x79 */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `z',    0x7a */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `{',    0x7b */\r
-  0,                                                        /* `|',    0x7c */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `}',    0x7d */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `~',    0x7e */\r
-  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL     /*         0x7f */\r
-};\r
-\r
-PUCHAR FsRtlLegalAnsiCharacterArray = LegalAnsiCharacterArray;\r
-\r
-/* PRIVATE FUNCTIONS *********************************************************/\r
-\r
-BOOLEAN\r
-NTAPI\r
-FsRtlInitSystem(VOID)\r
-{\r
-    ULONG i;\r
-\r
-    /* Initialize the list for granted locks */\r
-    ExInitializePagedLookasideList(&FsRtlFileLockLookasideList,\r
-                                   NULL,\r
-                                   NULL,\r
-                                   0,\r
-                                   sizeof(FILE_LOCK),\r
-                                   IFS_POOL_TAG,\r
-                                   0);\r
-\r
-    /* Allocate the Resource Buffer */\r
-    FsRtlPagingIoResources = FsRtlAllocatePoolWithTag(NonPagedPool,\r
-                                                      FSRTL_MAX_RESOURCES *\r
-                                                      sizeof(ERESOURCE),\r
-                                                      TAG('F', 's', 'R', 'e'));\r
-\r
-    /* Initialize the Resources */\r
-    for (i = 0; i < FSRTL_MAX_RESOURCES; i++)\r
-    {\r
-        ExInitializeResource(&FsRtlPagingIoResources[i]);\r
-    }\r
-\r
-    return TRUE;\r
-}\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlAllocateResource\r
- * @implemented NT 4.0\r
- *\r
- *     The FsRtlAllocateResource routine returns a pre-initialized ERESOURCE\r
- *     for use by a File System Driver.\r
- *\r
- * @return A Pointer to a pre-initialized ERESOURCE.\r
- *\r
- * @remarks The File System Library only provides up to 16 Resources.\r
- *\r
- *--*/\r
-PERESOURCE\r
-NTAPI\r
-FsRtlAllocateResource(VOID)\r
-{\r
-    PAGED_CODE();\r
-\r
-    /* Return a preallocated ERESOURCE */\r
-    return &FsRtlPagingIoResources[FsRtlPagingIoResourceSelector++ %\r
-                                   FSRTL_MAX_RESOURCES];\r
-}\r
-\r
diff --git a/reactos/ntoskrnl/fsrtl/name.c b/reactos/ntoskrnl/fsrtl/name.c
deleted file mode 100644 (file)
index f887d9f..0000000
+++ /dev/null
@@ -1,283 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/name.c\r
- * PURPOSE:         Provides name parsing and other support routines for FSDs\r
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)\r
- *                  Filip Navara (navaraf@reactos.org)\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlAreNamesEqual\r
- * @implemented\r
- *\r
- * FILLME\r
- *\r
- * @param Name1\r
- *        FILLME\r
- *\r
- * @param Name2\r
- *        FILLME\r
- *\r
- * @param IgnoreCase\r
- *        FILLME\r
- *\r
- * @param UpcaseTable\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks From Bo Branten's ntifs.h v25.\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlAreNamesEqual(IN PCUNICODE_STRING Name1,\r
-                   IN PCUNICODE_STRING Name2,\r
-                   IN BOOLEAN IgnoreCase,\r
-                   IN PCWCH UpcaseTable OPTIONAL)\r
-{\r
-    UNICODE_STRING UpcaseName1;\r
-    UNICODE_STRING UpcaseName2;\r
-    BOOLEAN StringsAreEqual, MemoryAllocated = FALSE;\r
-    ULONG i;\r
-    NTSTATUS Status;\r
-\r
-    /* Well, first check their size */\r
-    if (Name1->Length != Name2->Length) return FALSE;\r
-\r
-    /* Check if the caller didn't give an upcase table */\r
-    if ((IgnoreCase) && !(UpcaseTable))\r
-    {\r
-        /* Upcase the string ourselves */\r
-        Status = RtlUpcaseUnicodeString(&UpcaseName1, Name1, TRUE);\r
-        if (!NT_SUCCESS(Status)) RtlRaiseStatus(Status);\r
-\r
-        /* Upcase the second string too */\r
-        RtlUpcaseUnicodeString(&UpcaseName2, Name2, TRUE);\r
-        Name1 = &UpcaseName1;\r
-        Name2 = &UpcaseName2;\r
-\r
-        /* Make sure we go through the path below, but free the strings */\r
-        IgnoreCase = FALSE;\r
-        MemoryAllocated = TRUE;\r
-    }\r
-\r
-    /* Do a case-sensitive search */\r
-    if (!IgnoreCase)\r
-    {\r
-        /* Use a raw memory compare */\r
-        StringsAreEqual = RtlEqualMemory(Name1->Buffer,\r
-                                         Name2->Buffer,\r
-                                         Name1->Length);\r
-\r
-        /* Check if we allocated strings */\r
-        if (MemoryAllocated)\r
-        {\r
-            /* Free them */\r
-            RtlFreeUnicodeString(&UpcaseName1);\r
-            RtlFreeUnicodeString(&UpcaseName2);\r
-        }\r
-\r
-        /* Return the equality */\r
-        return StringsAreEqual;\r
-    }\r
-    else\r
-    {\r
-        /* Case in-sensitive search */\r
-        for (i = 0; i < Name1->Length / sizeof(WCHAR); i++)\r
-        {\r
-            /* Check if the character matches */\r
-            if (UpcaseTable[Name1->Buffer[i]] != UpcaseTable[Name2->Buffer[i]])\r
-            {\r
-                /* Non-match found! */\r
-                return FALSE;\r
-            }\r
-        }\r
-\r
-        /* We finished the loop so we are equal */\r
-        return TRUE;\r
-    }\r
-}\r
-\r
-/*++\r
- * @name FsRtlDissectName\r
- * @implemented\r
- *\r
- * Dissects a given path name into first and remaining part.\r
- *\r
- * @param Name\r
- *        Unicode string to dissect.\r
- *\r
- * @param FirstPart\r
- *        Pointer to user supplied UNICODE_STRING, that will later point\r
- *        to the first part of the original name.\r
- *\r
- * @param RemainingPart\r
- *        Pointer to user supplied UNICODE_STRING, that will later point\r
- *        to the remaining part of the original name.\r
- *\r
- * @return None\r
- *\r
- * @remarks Example:\r
- *          Name:           \test1\test2\test3\r
- *          FirstPart:      test1\r
- *          RemainingPart:  test2\test3\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlDissectName(IN UNICODE_STRING Name,\r
-                 OUT PUNICODE_STRING FirstPart,\r
-                 OUT PUNICODE_STRING RemainingPart)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlDoesNameContainWildCards\r
- * @implemented\r
- *\r
- * FILLME\r
- *\r
- * @param Name\r
- *        Pointer to a UNICODE_STRING containing Name to examine\r
- *\r
- * @return TRUE if Name contains wildcards, FALSE otherwise\r
- *\r
- * @remarks From Bo Branten's ntifs.h v12.\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name)\r
-{\r
-    PWCHAR Ptr;\r
-\r
-    /* Loop through every character */\r
-    if (Name->Length)\r
-    {\r
-        Ptr = Name->Buffer + (Name->Length / sizeof(WCHAR)) - 1;\r
-        while ((Ptr >= Name->Buffer) && (*Ptr != L'\\'))\r
-        {\r
-            /* Check for Wildcard */\r
-            if (FsRtlIsUnicodeCharacterWild(*Ptr)) return TRUE;\r
-            Ptr--;\r
-        }\r
-    }\r
-\r
-    /* Nothing Found */\r
-    return FALSE;\r
-}\r
-\r
-/*++\r
- * @name FsRtlIsNameInExpression\r
- * @implemented\r
- *\r
- * FILLME\r
- *\r
- * @param DeviceObject\r
- *        FILLME\r
- *\r
- * @param Irp\r
- *        FILLME\r
- *\r
- * @return TRUE if Name is in Expression, FALSE otherwise\r
- *\r
- * @remarks From Bo Branten's ntifs.h v12. This function should be\r
- *          rewritten to avoid recursion and better wildcard handling\r
- *          should be implemented (see FsRtlDoesNameContainWildCards).\r
- *\r
- *--*/\r
-BOOLEAN\r
-NTAPI\r
-FsRtlIsNameInExpression(IN PUNICODE_STRING Expression,\r
-                        IN PUNICODE_STRING Name,\r
-                        IN BOOLEAN IgnoreCase,\r
-                        IN PWCHAR UpcaseTable OPTIONAL)\r
-{\r
-    USHORT ExpressionPosition, NamePosition;\r
-    UNICODE_STRING TempExpression, TempName;\r
-\r
-    ExpressionPosition = 0;\r
-    NamePosition = 0;\r
-    while (ExpressionPosition < (Expression->Length / sizeof(WCHAR)) &&\r
-        NamePosition < (Name->Length / sizeof(WCHAR)))\r
-    {\r
-        if (Expression->Buffer[ExpressionPosition] == L'*')\r
-        {\r
-            ExpressionPosition++;\r
-            if (ExpressionPosition == (Expression->Length / sizeof(WCHAR)))\r
-            {\r
-                return TRUE;\r
-            }\r
-            while (NamePosition < (Name->Length / sizeof(WCHAR)))\r
-            {\r
-                TempExpression.Length =\r
-                    TempExpression.MaximumLength =\r
-                    Expression->Length - (ExpressionPosition * sizeof(WCHAR));\r
-                TempExpression.Buffer = Expression->Buffer + ExpressionPosition;\r
-                TempName.Length =\r
-                    TempName.MaximumLength =\r
-                    Name->Length - (NamePosition * sizeof(WCHAR));\r
-                TempName.Buffer = Name->Buffer + NamePosition;\r
-                /* FIXME: Rewrite to get rid of recursion */\r
-                if (FsRtlIsNameInExpression(&TempExpression, &TempName,\r
-                    IgnoreCase, UpcaseTable))\r
-                {\r
-                    return TRUE;\r
-                }\r
-                NamePosition++;\r
-            }\r
-        }\r
-        else\r
-        {\r
-            /* FIXME: Take UpcaseTable into account! */\r
-            if (Expression->Buffer[ExpressionPosition] == L'?' ||\r
-                (IgnoreCase &&\r
-                RtlUpcaseUnicodeChar(Expression->Buffer[ExpressionPosition]) ==\r
-                RtlUpcaseUnicodeChar(Name->Buffer[NamePosition])) ||\r
-                (!IgnoreCase &&\r
-                Expression->Buffer[ExpressionPosition] ==\r
-                Name->Buffer[NamePosition]))\r
-            {\r
-                NamePosition++;\r
-                ExpressionPosition++;\r
-            }\r
-            else\r
-            {\r
-                return FALSE;\r
-            }\r
-        }\r
-    }\r
-\r
-    /* Handle matching of "f0_*.*" expression to "f0_000" file name. */\r
-    if (ExpressionPosition < (Expression->Length / sizeof(WCHAR)) &&\r
-        Expression->Buffer[ExpressionPosition] == L'.')\r
-    {\r
-        while (ExpressionPosition < (Expression->Length / sizeof(WCHAR)) &&\r
-            (Expression->Buffer[ExpressionPosition] == L'.' ||\r
-            Expression->Buffer[ExpressionPosition] == L'*' ||\r
-            Expression->Buffer[ExpressionPosition] == L'?'))\r
-        {\r
-            ExpressionPosition++;\r
-        }\r
-    }\r
-\r
-    if (ExpressionPosition == (Expression->Length / sizeof(WCHAR)) &&\r
-        NamePosition == (Name->Length / sizeof(WCHAR)))\r
-    {\r
-        return TRUE;\r
-    }\r
-\r
-    return FALSE;\r
-}\r
-\r
diff --git a/reactos/ntoskrnl/fsrtl/notify.c b/reactos/ntoskrnl/fsrtl/notify.c
deleted file mode 100644 (file)
index f33a4af..0000000
+++ /dev/null
@@ -1,398 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/notify.c\r
- * PURPOSE:         Change Notifications and Sync for File System Drivers\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlNotifyChangeDirectory\r
- * @implemented\r
- *\r
- * FILLME\r
- *\r
- * @param NotifySync\r
- *        FILLME\r
- *\r
- * @param FsContext\r
- *        FILLME\r
- *\r
- * @param FullDirectoryName\r
- *        FILLME\r
- *\r
- * @param NotifyList\r
- *        FILLME\r
- *\r
- * @param WatchTree\r
- *        FILLME\r
- *\r
- * @param CompletionFilter\r
- *        FILLME\r
- *\r
- * @param NotifyIrp\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlNotifyChangeDirectory(IN PNOTIFY_SYNC NotifySync,\r
-                           IN PVOID FsContext,\r
-                           IN PSTRING FullDirectoryName,\r
-                           IN PLIST_ENTRY NotifyList,\r
-                           IN BOOLEAN WatchTree,\r
-                           IN ULONG CompletionFilter,\r
-                           IN PIRP NotifyIrp)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlNotifyCleanup\r
- * @unimplemented\r
- *\r
- * Called by FSD when all handles to FileObject (identified by FsContext) are closed\r
- *\r
- * @param NotifySync\r
- *        FILLME\r
- *\r
- * @param NotifyList\r
- *        FILLME\r
- *\r
- * @param FsContext\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlNotifyCleanup(IN PNOTIFY_SYNC NotifySync,\r
-                   IN PLIST_ENTRY NotifyList,\r
-                   IN PVOID FsContext)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlNotifyFilterChangeDirectory\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param NotifySync\r
- *        FILLME\r
- *\r
- * @param NotifyList\r
- *        FILLME\r
- *\r
- * @param FsContext\r
- *        FILLME\r
- *\r
- * @param FullDirectoryName\r
- *        FILLME\r
- *\r
- * @param WatchTree\r
- *        FILLME\r
- *\r
- * @param IgnoreBuffer\r
- *        FILLME\r
- *\r
- * @param CompletionFilter\r
- *        FILLME\r
- *\r
- * @param NotifyIrp\r
- *        FILLME\r
- *\r
- * @param TraverseCallback\r
- *        FILLME\r
- *\r
- * @param SubjectContext\r
- *        FILLME\r
- *\r
- * @param FilterCallback\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlNotifyFilterChangeDirectory(IN PNOTIFY_SYNC NotifySync,\r
-                                 IN PLIST_ENTRY NotifyList,\r
-                                 IN PVOID FsContext,\r
-                                 IN PSTRING FullDirectoryName,\r
-                                 IN BOOLEAN WatchTree,\r
-                                 IN BOOLEAN IgnoreBuffer,\r
-                                 IN ULONG CompletionFilter,\r
-                                 IN PIRP NotifyIrp,\r
-                                 IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,\r
-                                 IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL,\r
-                                 IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlNotifyFilterReportChange\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param NotifySync\r
- *        FILLME\r
- *\r
- * @param NotifyList\r
- *        FILLME\r
- *\r
- * @param FullTargetName\r
- *        FILLME\r
- *\r
- * @param TargetNameOffset\r
- *        FILLME\r
- *\r
- * @param StreamName\r
- *        FILLME\r
- *\r
- * @param NormalizedParentName\r
- *        FILLME\r
- *\r
- * @param FilterMatch\r
- *        FILLME\r
- *\r
- * @param Action\r
- *        FILLME\r
- *\r
- * @param TargetContext\r
- *        FILLME\r
- *\r
- * @param FilterContext\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlNotifyFilterReportChange(IN PNOTIFY_SYNC NotifySync,\r
-                              IN PLIST_ENTRY NotifyList,\r
-                              IN PSTRING FullTargetName,\r
-                              IN USHORT TargetNameOffset,\r
-                              IN PSTRING StreamName OPTIONAL,\r
-                              IN PSTRING NormalizedParentName OPTIONAL,\r
-                              IN ULONG FilterMatch,\r
-                              IN ULONG Action,\r
-                              IN PVOID TargetContext,\r
-                              IN PVOID FilterContext)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlNotifyFullChangeDirectory\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param NotifySync\r
- *        FILLME\r
- *\r
- * @param NotifyList\r
- *        FILLME\r
- *\r
- * @param FsContext\r
- *        FILLME\r
- *\r
- * @param FullDirectoryName\r
- *        FILLME\r
- *\r
- * @param WatchTree\r
- *        FILLME\r
- *\r
- * @param IgnoreBuffer\r
- *        FILLME\r
- *\r
- * @param CompletionFilter\r
- *        FILLME\r
- *\r
- * @param Irp\r
- *        FILLME\r
- *\r
- * @param TraverseCallback\r
- *        FILLME\r
- *\r
- * @param SubjectContext\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlNotifyFullChangeDirectory(IN PNOTIFY_SYNC NotifySync,\r
-                               IN PLIST_ENTRY NotifyList,\r
-                               IN PVOID FsContext,\r
-                               IN PSTRING FullDirectoryName,\r
-                               IN BOOLEAN WatchTree,\r
-                               IN BOOLEAN IgnoreBuffer,\r
-                               IN ULONG CompletionFilter,\r
-                               IN PIRP Irp,\r
-                               IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,\r
-                               IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlNotifyFullReportChange\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param NotifySync\r
- *        FILLME\r
- *\r
- * @param NotifyList\r
- *        FILLME\r
- *\r
- * @param FullTargetName\r
- *        FILLME\r
- *\r
- * @param TargetNameOffset\r
- *        FILLME\r
- *\r
- * @param StreamName\r
- *        FILLME\r
- *\r
- * @param NormalizedParentName\r
- *        FILLME\r
- *\r
- * @param FilterMatch\r
- *        FILLME\r
- *\r
- * @param Action\r
- *        FILLME\r
- *\r
- * @param TargetContext\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlNotifyFullReportChange(IN PNOTIFY_SYNC NotifySync,\r
-                            IN PLIST_ENTRY NotifyList,\r
-                            IN PSTRING FullTargetName,\r
-                            IN USHORT TargetNameOffset,\r
-                            IN PSTRING StreamName OPTIONAL,\r
-                            IN PSTRING NormalizedParentName OPTIONAL,\r
-                            IN ULONG FilterMatch,\r
-                            IN ULONG Action,\r
-                            IN PVOID TargetContext)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlNotifyInitializeSync\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param NotifySync\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlNotifyInitializeSync(IN PNOTIFY_SYNC *NotifySync)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlNotifyReportChange\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param NotifySync\r
- *        FILLME\r
- *\r
- * @param NotifyList\r
- *        FILLME\r
- *\r
- * @param FullTargetName\r
- *        FILLME\r
- *\r
- * @param FileNamePartLength\r
- *        FILLME\r
- *\r
- * @param FilterMatch\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlNotifyReportChange(IN PNOTIFY_SYNC NotifySync,\r
-                        IN PLIST_ENTRY NotifyList,\r
-                        IN PSTRING FullTargetName,\r
-                        IN PUSHORT FileNamePartLength,\r
-                        IN ULONG FilterMatch)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/*++\r
- * @name FsRtlCurrentBatchOplock\r
- * @implemented\r
- *\r
- * Uninitialize a NOTIFY_SYNC object\r
- *\r
- * @param NotifySync\r
- *        Address of a pointer to a PNOTIFY_SYNC object previously\r
- *        initialized by FsRtlNotifyInitializeSync()\r
- *\r
- * @return None\r
- *\r
- * @remarks None\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlNotifyUninitializeSync(IN PNOTIFY_SYNC *NotifySync)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
diff --git a/reactos/ntoskrnl/fsrtl/pnp.c b/reactos/ntoskrnl/fsrtl/pnp.c
deleted file mode 100644 (file)
index f0b23f3..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/pnp.c\r
- * PURPOSE:         Manages PnP support routines for file system drivers.\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlNotifyVolumeEvent\r
- * @unimplemented\r
- *\r
- * FILLME\r
- *\r
- * @param FileObject\r
- *        FILLME\r
- *\r
- * @param EventCode\r
- *        FILLME\r
- *\r
- * @return None\r
- *\r
- * @remarks Only present in NT 5+.\r
- *\r
- *--*/\r
-NTSTATUS\r
-NTAPI\r
-FsRtlNotifyVolumeEvent(IN PFILE_OBJECT FileObject,\r
-                       IN ULONG EventCode)\r
-{\r
-    /* Unimplemented */\r
-    KEBUGCHECK(0);\r
-    return STATUS_NOT_IMPLEMENTED;\r
-}\r
diff --git a/reactos/ntoskrnl/fsrtl/stackovf.c b/reactos/ntoskrnl/fsrtl/stackovf.c
deleted file mode 100644 (file)
index af6cd57..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * LICENSE:         GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/fsrtl/stackovf.c\r
- * PURPOSE:         Provides Stack Overflow support for File System Drivers\r
- * PROGRAMMERS:     None.\r
- */\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* PUBLIC FUNCTIONS **********************************************************/\r
-\r
-/*++\r
- * @name FsRtlPostPagingFileStackOverflow\r
- * @unimplemented NT 4.0\r
- *\r
- *     The FsRtlPostPagingFileStackOverflow routine\r
- *\r
- * @param Context\r
- *\r
- * @param Event\r
- *\r
- * @param StackOverflowRoutine\r
- *\r
- * @return\r
- *\r
- * @remarks None.\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlPostPagingFileStackOverflow(IN PVOID Context,\r
-                                 IN PKEVENT Event,\r
-                                 IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)\r
-{\r
-    UNIMPLEMENTED;\r
-}\r
-\r
-/*++\r
- * @name FsRtlPostStackOverflow\r
- * @unimplemented NT 4.0\r
- *\r
- *     The FsRtlPostStackOverflow routine\r
- *\r
- * @param Context\r
- *\r
- * @param Event\r
- *\r
- * @param StackOverflowRoutine\r
- *\r
- * @return\r
- *\r
- * @remarks None.\r
- *\r
- *--*/\r
-VOID\r
-NTAPI\r
-FsRtlPostStackOverflow(IN PVOID Context,\r
-                       IN PKEVENT Event,\r
-                       IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)\r
-{\r
-    KEBUGCHECK(0);\r
-}\r
-\r
-/* EOF */\r
index 4a704d7..b652ef8 100644 (file)
@@ -300,14 +300,14 @@ InbvDisplayInitialize2(BOOLEAN NoGuiBoot)
 
 
 VOID NTAPI
-InbvDisplayBootLogo(IN BOOLEAN SosEnabled)
+InbvDisplayBootLogo(VOID)
 {
    InbvEnableBootDriver(TRUE);
 
    if (BootVidDriverInstalled)
    {
       InbvResetDisplayParameters = BootVidResetDisplayParameters;
-      if (!SosEnabled) BootVidDisplayBootLogo(BootVidBase);
+      BootVidDisplayBootLogo(BootVidBase);
    }
 }
 
index 34483d5..db19b69 100644 (file)
@@ -63,8 +63,8 @@ typedef struct _INTERNAL_BCB
 
 VOID
 NTAPI
-CcMdlReadComplete2(
-    IN PMDL MemoryDescriptorList,
+CcMdlReadCompleteDev(
+    IN PMDL MdlChain,
     IN PFILE_OBJECT FileObject
 );
 
@@ -110,7 +110,7 @@ NTSTATUS
 NTAPI
 WriteCacheSegment(PCACHE_SEGMENT CacheSeg);
 
-BOOLEAN
+VOID
 NTAPI
 CcInitializeCacheManager(VOID);
 
index b5e0934..bcf3471 100644 (file)
@@ -21,41 +21,15 @@ ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset;
 ULONG ExpUnicodeCaseTableDataOffset;
 PVOID ExpNlsSectionPointer;
 
-typedef struct _EXHANDLE
-{
-    union
-    {
-        struct
-        {
-            ULONG TagBits:2;
-            ULONG Index:30;
-        };
-        HANDLE GenericHandleOverlay;
-        ULONG_PTR Value;
-    };
-} EXHANDLE, *PEXHANDLE;
-
-typedef struct _ETIMER
-{
-    KTIMER KeTimer;
-    KAPC TimerApc;
-    KDPC TimerDpc;
-    LIST_ENTRY ActiveTimerListEntry;
-    KSPIN_LOCK Lock;
-    LONG Period;
-    BOOLEAN ApcAssociated;
-    BOOLEAN WakeTimer;
-    LIST_ENTRY WakeTimerListEntry;
-} ETIMER, *PETIMER;
-
-typedef struct
-{
-    PCALLBACK_OBJECT *CallbackObject;
-    PWSTR Name;
-} SYSTEM_CALLBACKS;
-
 #define MAX_FAST_REFS           7
 
+#define EX_OBJ_TO_HDR(eob) ((POBJECT_HEADER)((ULONG_PTR)(eob) &                \
+  ~(EX_HANDLE_ENTRY_PROTECTFROMCLOSE | EX_HANDLE_ENTRY_INHERITABLE |           \
+  EX_HANDLE_ENTRY_AUDITONCLOSE)))
+#define EX_HTE_TO_HDR(hte) ((POBJECT_HEADER)((ULONG_PTR)((hte)->Object) &   \
+  ~(EX_HANDLE_ENTRY_PROTECTFROMCLOSE | EX_HANDLE_ENTRY_INHERITABLE |           \
+  EX_HANDLE_ENTRY_AUDITONCLOSE)))
+
 /* Note: we only use a spinlock on SMP. On UP, we cli/sti intead */
 #ifndef CONFIG_SMP
 #define ExAcquireResourceLock(l, i) { \
@@ -75,57 +49,6 @@ typedef struct
 #define ExRundownCompleted                              _ExRundownCompleted
 #define ExGetPreviousMode                               KeGetPreviousMode
 
-
-//
-// Various bits tagged on the handle or handle table
-//
-#define EXHANDLE_TABLE_ENTRY_LOCK_BIT    1
-#define FREE_HANDLE_MASK                -1
-
-//
-// Number of entries in each table level
-//
-#define LOW_LEVEL_ENTRIES   (PAGE_SIZE / sizeof(HANDLE_TABLE_ENTRY))
-#define MID_LEVEL_ENTRIES   (PAGE_SIZE / sizeof(PHANDLE_TABLE_ENTRY))
-#define HIGH_LEVEL_ENTRIES  (65535 / (LOW_LEVEL_ENTRIES * MID_LEVEL_ENTRIES))
-
-//
-// Maximum index in each table level before we need another table
-//
-#define MAX_LOW_INDEX       LOW_LEVEL_ENTRIES
-#define MAX_MID_INDEX       (MID_LEVEL_ENTRIES * LOW_LEVEL_ENTRIES)
-#define MAX_HIGH_INDEX      (MID_LEVEL_ENTRIES * MID_LEVEL_ENTRIES * LOW_LEVEL_ENTRIES)
-
-//
-// Detect GCC 4.1.2+
-//
-#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40102
-
-//
-// Broken GCC with Alignment Bug. We'll do alignment ourselves at higher cost.
-//
-#define DEFINE_WAIT_BLOCK(x)                                \
-    struct _AlignHack                                       \
-    {                                                       \
-        UCHAR Hack[15];                                     \
-        EX_PUSH_LOCK_WAIT_BLOCK UnalignedBlock;             \
-    } WaitBlockBuffer;                                      \
-    PEX_PUSH_LOCK_WAIT_BLOCK x = (PEX_PUSH_LOCK_WAIT_BLOCK) \
-        ((ULONG_PTR)&WaitBlockBuffer.UnalignedBlock &~ 0xF);
-        
-#else
-
-//
-// This is only for compatibility; the compiler will optimize the extra
-// local variable (the actual pointer) away, so we don't take any perf hit
-// by doing this.
-//
-#define DEFINE_WAIT_BLOCK(x)                                \
-    EX_PUSH_LOCK_WAIT_BLOCK WaitBlockBuffer;                \
-    PEX_PUSH_LOCK_WAIT_BLOCK x = &WaitBlockBuffer;
-    
-#endif
-
 /* INITIALIZATION FUNCTIONS *************************************************/
 
 VOID
@@ -138,7 +61,7 @@ ExInit2(VOID);
 
 VOID
 NTAPI
-Phase1Initialization(
+ExPhase2Init(
     IN PVOID Context
 );
 
@@ -171,7 +94,7 @@ ExInitializeSystemLookasideList(
     IN PLIST_ENTRY ListHead
 );
 
-BOOLEAN
+VOID
 NTAPI
 ExpInitializeCallbacks(VOID);
 
@@ -227,59 +150,7 @@ ExInitPoolLookasidePointers(VOID);
 VOID
 NTAPI
 ExInitializeCallBack(
-    IN OUT PEX_CALLBACK Callback
-);
-
-PEX_CALLBACK_ROUTINE_BLOCK
-NTAPI
-ExAllocateCallBack(
-    IN PEX_CALLBACK_FUNCTION Function,
-    IN PVOID Context
-);
-
-VOID
-NTAPI
-ExFreeCallBack(
-    IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
-);
-
-BOOLEAN
-NTAPI
-ExCompareExchangeCallBack (
-    IN OUT PEX_CALLBACK CallBack,
-    IN PEX_CALLBACK_ROUTINE_BLOCK NewBlock,
-    IN PEX_CALLBACK_ROUTINE_BLOCK OldBlock
-);
-
-PEX_CALLBACK_ROUTINE_BLOCK
-NTAPI
-ExReferenceCallBackBlock(
-    IN OUT PEX_CALLBACK CallBack
-);
-
-VOID
-NTAPI
-ExDereferenceCallBackBlock(
-    IN OUT PEX_CALLBACK CallBack,
-    IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
-);
-
-PEX_CALLBACK_FUNCTION
-NTAPI
-ExGetCallBackBlockRoutine(
-    IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
-);
-
-PVOID
-NTAPI
-ExGetCallBackBlockContext(
-    IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
-);
-
-VOID
-NTAPI
-ExWaitForCallBacks(
-    IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
+    IN PEX_CALLBACK Callback
 );
 
 /* Rundown Functions ********************************************************/
@@ -336,98 +207,104 @@ ExfWaitForRundownProtectionRelease(
 
 /* HANDLE TABLE FUNCTIONS ***************************************************/
 
-typedef VOID
-(NTAPI *PEX_SWEEP_HANDLE_CALLBACK)(
+#define EX_HANDLE_ENTRY_LOCKED (1 << ((sizeof(PVOID) * 8) - 1))
+#define EX_HANDLE_ENTRY_PROTECTFROMCLOSE (1 << 0)
+#define EX_HANDLE_ENTRY_INHERITABLE (1 << 1)
+#define EX_HANDLE_ENTRY_AUDITONCLOSE (1 << 2)
+
+#define EX_HANDLE_TABLE_CLOSING 0x1
+
+#define EX_HANDLE_ENTRY_FLAGSMASK (EX_HANDLE_ENTRY_LOCKED |                    \
+                                   EX_HANDLE_ENTRY_PROTECTFROMCLOSE |          \
+                                   EX_HANDLE_ENTRY_INHERITABLE |               \
+                                   EX_HANDLE_ENTRY_AUDITONCLOSE)
+
+typedef VOID (NTAPI PEX_SWEEP_HANDLE_CALLBACK)(
     PHANDLE_TABLE_ENTRY HandleTableEntry,
-    HANDLE Handle,
+    HANDLE Handle,  
     PVOID Context
 );
 
-typedef BOOLEAN
-(NTAPI *PEX_DUPLICATE_HANDLE_CALLBACK)(
-    IN PEPROCESS Process,
-    IN PHANDLE_TABLE HandleTable,
-    IN PHANDLE_TABLE_ENTRY HandleTableEntry,
-    IN PHANDLE_TABLE_ENTRY NewEntry
+typedef BOOLEAN (NTAPI PEX_DUPLICATE_HANDLE_CALLBACK)(
+    PHANDLE_TABLE HandleTable, 
+    PHANDLE_TABLE_ENTRY HandleTableEntry, 
+    PVOID Context
 );
 
-typedef BOOLEAN
-(NTAPI *PEX_CHANGE_HANDLE_CALLBACK)(
-    PHANDLE_TABLE_ENTRY HandleTableEntry,
-    ULONG_PTR Context
+typedef BOOLEAN (NTAPI PEX_CHANGE_HANDLE_CALLBACK)(
+    PHANDLE_TABLE HandleTable, 
+    PHANDLE_TABLE_ENTRY HandleTableEntry, 
+    PVOID Context
 );
 
 VOID
-NTAPI
-ExpInitializeHandleTables(
-    VOID
-);
+ExpInitializeHandleTables(VOID);
 
 PHANDLE_TABLE
-NTAPI
-ExCreateHandleTable(
-    IN PEPROCESS Process OPTIONAL
+ExCreateHandleTable(IN PEPROCESS QuotaProcess  OPTIONAL);
+
+VOID
+ExDestroyHandleTable(
+    IN PHANDLE_TABLE HandleTable
 );
 
 VOID
-NTAPI
-ExUnlockHandleTableEntry(
+ExSweepHandleTable(
     IN PHANDLE_TABLE HandleTable,
-    IN PHANDLE_TABLE_ENTRY HandleTableEntry
+    IN PEX_SWEEP_HANDLE_CALLBACK SweepHandleCallback  OPTIONAL,
+    IN PVOID Context  OPTIONAL
 );
 
-HANDLE
-NTAPI
-ExCreateHandle(
+PHANDLE_TABLE
+ExDupHandleTable(
+    IN PEPROCESS QuotaProcess  OPTIONAL,
+    IN PEX_DUPLICATE_HANDLE_CALLBACK DuplicateHandleCallback  OPTIONAL,
+    IN PVOID Context  OPTIONAL,
+    IN PHANDLE_TABLE SourceHandleTable
+);
+
+BOOLEAN
+ExLockHandleTableEntry(
     IN PHANDLE_TABLE HandleTable,
-    IN PHANDLE_TABLE_ENTRY HandleTableEntry
+    IN PHANDLE_TABLE_ENTRY Entry
 );
 
 VOID
-NTAPI
-ExDestroyHandleTable(
+ExUnlockHandleTableEntry(
+    IN PHANDLE_TABLE HandleTable,
+    IN PHANDLE_TABLE_ENTRY Entry
+);
+
+HANDLE
+ExCreateHandle(
     IN PHANDLE_TABLE HandleTable,
-    IN PVOID DestroyHandleProcedure OPTIONAL
+    IN PHANDLE_TABLE_ENTRY Entry
 );
 
 BOOLEAN
-NTAPI
 ExDestroyHandle(
     IN PHANDLE_TABLE HandleTable,
-    IN HANDLE Handle,
-    IN PHANDLE_TABLE_ENTRY HandleTableEntry OPTIONAL
+    IN HANDLE Handle
 );
 
-PHANDLE_TABLE_ENTRY
-NTAPI
-ExMapHandleToPointer(
+VOID
+ExDestroyHandleByEntry(
     IN PHANDLE_TABLE HandleTable,
+    IN PHANDLE_TABLE_ENTRY Entry,
     IN HANDLE Handle
 );
 
-PHANDLE_TABLE
-NTAPI
-ExDupHandleTable(
-    IN PEPROCESS Process,
+PHANDLE_TABLE_ENTRY
+ExMapHandleToPointer(
     IN PHANDLE_TABLE HandleTable,
-    IN PEX_DUPLICATE_HANDLE_CALLBACK DupHandleProcedure,
-    IN ULONG_PTR Mask
+    IN HANDLE Handle
 );
 
 BOOLEAN
-NTAPI
 ExChangeHandle(
     IN PHANDLE_TABLE HandleTable,
     IN HANDLE Handle,
-    IN PEX_CHANGE_HANDLE_CALLBACK ChangeRoutine,
-    IN ULONG_PTR Context
-);
-
-VOID
-NTAPI
-ExSweepHandleTable(
-    IN PHANDLE_TABLE HandleTable,
-    IN PEX_SWEEP_HANDLE_CALLBACK EnumHandleProcedure,
+    IN PEX_CHANGE_HANDLE_CALLBACK ChangeHandleCallback,
     IN PVOID Context
 );
 
@@ -442,33 +319,6 @@ static __inline _SEH_FILTER(_SEH_ExSystemExceptionFilter)
     return ExSystemExceptionFilter();
 }
 
-/* CALLBACKS *****************************************************************/
-
-VOID
-FORCEINLINE
-ExDoCallBack(IN OUT PEX_CALLBACK Callback,
-             IN PVOID Context,
-             IN PVOID Argument1,
-             IN PVOID Argument2)
-{
-    PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock;
-    PEX_CALLBACK_FUNCTION Function;
-
-    /* Reference the block */
-    CallbackRoutineBlock = ExReferenceCallBackBlock(Callback);
-    if (CallbackRoutineBlock)
-    {
-        /* Get the function */
-        Function = ExGetCallBackBlockRoutine(CallbackRoutineBlock);
-
-        /* Do the callback */
-        Function(Context, Argument1, Argument2);
-
-        /* Now dereference it */
-        ExDereferenceCallBackBlock(Callback, CallbackRoutineBlock);
-    }
-}
-
 /* RUNDOWN *******************************************************************/
 
 #ifdef _WIN64
@@ -648,29 +498,6 @@ _ExRundownCompleted(IN PEX_RUNDOWN_REF RunRef)
 
 /* PUSHLOCKS *****************************************************************/
 
-/* FIXME: VERIFY THESE! */
-
-VOID
-FASTCALL
-ExBlockPushLock(
-    IN PEX_PUSH_LOCK PushLock,
-    IN PVOID WaitBlock
-);
-
-VOID
-FASTCALL
-ExfUnblockPushLock(
-    IN PEX_PUSH_LOCK PushLock,
-    IN PVOID CurrentWaitBlock
-);
-
-VOID
-FASTCALL
-ExWaitForUnblockPushLock(
-    IN PEX_PUSH_LOCK PushLock,
-    IN PVOID WaitBlock
-);
-
 /*++
  * @name ExInitializePushLock
  * INTERNAL MACRO
@@ -825,17 +652,13 @@ ExConvertPushLockSharedToExclusive(IN PEX_PUSH_LOCK PushLock)
 VOID
 FORCEINLINE
 ExWaitOnPushLock(PEX_PUSH_LOCK PushLock)
-{  
-    /* Check if we're locked */
-    if (PushLock->Locked)
-    {
-        /* Acquire the lock */
-        ExfAcquirePushLockExclusive(PushLock);
-        ASSERT(PushLock->Locked);
+{
+    /* Acquire the lock */
+    ExfAcquirePushLockExclusive(PushLock);
+    ASSERT(PushLock->Locked);
 
-        /* Release it */
-        ExfReleasePushLockExclusive(PushLock);
-    }
+    /* Release it */
+    ExfReleasePushLockExclusive(PushLock);
 }
 
 /*++
index 7997abd..5387da9 100644 (file)
@@ -1,61 +1,96 @@
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            ntoskrnl/include/fsrtl.h
- * PURPOSE:         Internal header for the File System Runtime Library
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
- */
-
-//
-// Define this if you want debugging support
-//
-#define _FSRTL_DEBUG_                                   0x00
-
-//
-// These define the Debug Masks Supported
-//
-#define FSRTL_FASTIO_DEBUG                              0x01
-#define FSRTL_OPLOCK_DEBUG                              0x02
-#define FSRTL_TUNNEL_DEBUG                              0x04
-#define FSRTL_MCB_DEBUG                                 0x08
-#define FSRTL_NAME_DEBUG                                0x10
-#define FSRTL_NOTIFY_DEBUG                              0x20
-#define FSRTL_FILELOCK_DEBUG                            0x40
-#define FSRTL_UNC_DEBUG                                 0x80
-#define FSRTL_FILTER_DEBUG                              0x100
-#define FSRTL_CONTEXT_DEBUG                             0x200
-
-//
-// Debug/Tracing support
-//
-#if _FSRTL_DEBUG_
-#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
-#define FSTRACE DbgPrintEx
-#else
-#define FSTRACE(x, ...)                                 \
-    if (x & FsRtlpTraceLevel) DbgPrint(__VA_ARGS__)
-#endif
-#else
-#define FSTRACE(x, ...) DPRINT(__VA_ARGS__)
-#endif
+#ifndef __INCLUDE_INTERNAL_IFS_H
+#define __INCLUDE_INTERNAL_IFS_H
 
-//
-// Number of internal ERESOURCE structures allocated for callers to request
-//
-#define FSRTL_MAX_RESOURCES 16
+typedef struct _FILE_LOCK_GRANTED
+{
+    LIST_ENTRY            ListEntry;
+    FILE_LOCK_INFO            Lock;
+    PVOID             UnlockContext;
+} FILE_LOCK_GRANTED, *PFILE_LOCK_GRANTED;
 
-//
-// Initialization Routines
-//
-BOOLEAN
+typedef struct _FILE_LOCK_TOC
+{
+    KSPIN_LOCK            SpinLock;
+    LIST_ENTRY            GrantedListHead;
+    LIST_ENTRY            PendingListHead;
+} FILE_LOCK_TOC, *PFILE_LOCK_TOC;
+
+VOID
+INIT_FUNCTION
+NTAPI
+FsRtlpInitNotifyImplementation(VOID);
+
+VOID 
 NTAPI
-FsRtlInitSystem(
-    VOID
+FsRtlInitSystem(VOID);
+
+VOID
+NTAPI
+FsRtlpFileLockCancelRoutine(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp
+    );
+
+BOOLEAN
+FASTCALL
+FsRtlpCheckLockForReadOrWriteAccess(
+    IN PFILE_LOCK FileLock,
+    IN PLARGE_INTEGER FileOffset,
+    IN PLARGE_INTEGER Length,
+    IN ULONG Key,
+    IN PFILE_OBJECT FileObject,
+    IN PEPROCESS Process,
+    IN BOOLEAN Read
 );
 
-//
-// Global data inside the File System Runtime Library
-//
-extern PERESOURCE FsRtlPagingIoResources;
-extern PUCHAR _FsRtlLegalAnsiCharacterArray;
-extern PAGED_LOOKASIDE_LIST FsRtlFileLockLookasideList;
+NTSTATUS
+FASTCALL
+FsRtlpFastUnlockAllByKey(
+    IN PFILE_LOCK FileLock,
+    IN PFILE_OBJECT FileObject,
+    IN PEPROCESS Process,
+    IN ULONG Key,
+    IN BOOLEAN UseKey,
+    IN PVOID Context OPTIONAL
+);
+
+BOOLEAN
+FASTCALL
+FsRtlpAddLock(
+    IN PFILE_LOCK_TOC LockToc,
+    IN PFILE_OBJECT FileObject,
+    IN PLARGE_INTEGER FileOffset,
+    IN PLARGE_INTEGER Length,
+    IN PEPROCESS Process,
+    IN ULONG Key,
+    IN BOOLEAN ExclusiveLock,
+    IN PVOID UnlockContext
+);
+
+VOID
+FASTCALL
+FsRtlpCompletePendingLocks(
+    IN PFILE_LOCK FileLock,
+    IN PFILE_LOCK_TOC LockToc,
+    IN OUT PKIRQL  oldirql,
+    IN PVOID Context
+);
+
+NTSTATUS
+FASTCALL
+FsRtlpUnlockSingle(
+    IN PFILE_LOCK FileLock,
+    IN PFILE_OBJECT FileObject,
+    IN PLARGE_INTEGER FileOffset,
+    IN PLARGE_INTEGER Length,
+    IN PEPROCESS Process,
+    IN ULONG Key,
+    IN PVOID Context OPTIONAL,
+    IN BOOLEAN CallUnlockRoutine
+);
+
+VOID
+FASTCALL
+FsRtlpDumpFileLocks(IN PFILE_LOCK FileLock);
+
+#endif
index c189288..b13f133 100644 (file)
@@ -92,12 +92,6 @@ KiIsNpxPresent(
     VOID
 );
 
-BOOLEAN
-NTAPI
-KiIsNpxErrataPresent(
-    VOID
-);
-
 VOID
 NTAPI
 KiSetProcessorType(VOID);
index 9e6b34e..26a65e4 100644 (file)
@@ -14,7 +14,7 @@ VOID NTAPI
 InbvDisplayInitialize2(BOOLEAN NoGuiBoot);
 
 VOID NTAPI
-InbvDisplayBootLogo(IN BOOLEAN SosEnabled);
+InbvDisplayBootLogo(VOID);
 
 VOID NTAPI
 InbvUpdateProgressBar(ULONG Progress);
index 30d31cd..5fa33c0 100644 (file)
@@ -441,12 +441,6 @@ PnpInit(
     VOID
 );
 
-BOOLEAN
-NTAPI
-PpInitSystem(
-    VOID
-);
-
 VOID
 PnpInit2(
     VOID
index 36f4920..1449854 100644 (file)
@@ -15,7 +15,6 @@ struct _KD_DISPATCH_TABLE;
 extern KD_PORT_INFORMATION GdbPortInfo;
 extern BOOLEAN _KdDebuggerEnabled;
 extern BOOLEAN _KdDebuggerNotPresent;
-extern BOOLEAN KdBreakAfterSymbolLoad;
 
 BOOLEAN
 NTAPI
index a10789a..447c26a 100644 (file)
@@ -37,33 +37,12 @@ typedef struct _DISPATCH_INFO
     PKINTERRUPT_ROUTINE *FlatDispatch;
 } DISPATCH_INFO, *PDISPATCH_INFO;
 
-typedef struct _KI_SAMPLE_MAP
-{
-    LARGE_INTEGER PerfStart;
-    LARGE_INTEGER PerfEnd;
-    LONGLONG PerfDelta;
-    LARGE_INTEGER PerfFreq;
-    LONGLONG TSCStart;
-    LONGLONG TSCEnd;
-    LONGLONG TSCDelta;
-    ULONG MHz;
-} KI_SAMPLE_MAP, *PKI_SAMPLE_MAP;
-
 typedef struct _KTIMER_TABLE_ENTRY
 {
     LIST_ENTRY Entry;
     ULARGE_INTEGER Time;
 } KTIMER_TABLE_ENTRY, *PKTIMER_TABLE_ENTRY;
 
-#define MAX_TIMER_DPCS                      16
-
-typedef struct _DPC_QUEUE_ENTRY
-{
-    PKDPC Dpc;
-    PKDEFERRED_ROUTINE Routine;
-    PVOID Context;
-} DPC_QUEUE_ENTRY, *PDPC_QUEUE_ENTRY;
-
 typedef PCHAR
 (NTAPI *PKE_BUGCHECK_UNICODE_TO_ANSI)(
     IN PUNICODE_STRING Unicode,
@@ -85,8 +64,6 @@ extern PVOID KeUserCallbackDispatcher;
 extern PVOID KeUserExceptionDispatcher;
 extern PVOID KeRaiseUserExceptionDispatcher;
 extern LARGE_INTEGER KeBootTime;
-extern ULONGLONG KeBootTimeBias;
-extern BOOLEAN ExCmosClockIsSane;
 extern ULONG KeI386NpxPresent;
 extern ULONG KeI386XMMIPresent;
 extern ULONG KeI386FxsrPresent;
@@ -133,9 +110,10 @@ extern ULONG KiTimeLimitIsrMicroseconds;
 extern ULONG KiServiceLimit;
 extern LIST_ENTRY BugcheckCallbackListHead, BugcheckReasonCallbackListHead;
 extern KSPIN_LOCK BugCheckCallbackLock;
-extern KDPC KiTimerExpireDpc;
+extern KDPC KiExpireTimerDpc;
 extern KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE];
-extern FAST_MUTEX KiGenericCallDpcMutex;
+extern LIST_ENTRY KiTimerListHead;
+extern KMUTEX KiGenericCallDpcMutex;
 extern LIST_ENTRY KiProfileListHead, KiProfileSourceListHead;
 extern KSPIN_LOCK KiProfileLock;
 extern LIST_ENTRY KiProcessListHead;
@@ -217,29 +195,14 @@ KeReadyThread(
     IN PKTHREAD Thread
 );
 
-BOOLEAN
-NTAPI
-KeSetDisableBoostThread(
-    IN OUT PKTHREAD Thread,
-    IN BOOLEAN Disable
-);
-
-VOID
-NTAPI
-KeBalanceSetManager(IN PVOID Context);
-
 VOID
 NTAPI
 KiReadyThread(IN PKTHREAD Thread);
 
-ULONG
+NTSTATUS
 NTAPI
 KeSuspendThread(PKTHREAD Thread);
 
-BOOLEAN
-NTAPI
-KeReadStateThread(IN PKTHREAD Thread);
-
 BOOLEAN
 FASTCALL
 KiSwapContext(
@@ -260,46 +223,19 @@ NTAPI
 KiDeferredReadyThread(IN PKTHREAD Thread);
 
 KAFFINITY
-FASTCALL
+NTAPI
 KiSetAffinityThread(
     IN PKTHREAD Thread,
-    IN KAFFINITY Affinity
+    IN KAFFINITY Affinity,
+    IN PBOOLEAN Released // hack
 );
 
 PKTHREAD
-FASTCALL
+NTAPI
 KiSelectNextThread(
     IN PKPRCB Prcb
 );
 
-VOID
-NTAPI
-CPUID(
-    OUT ULONG CpuInfo[4],
-    IN ULONG InfoType
-);
-
-BOOLEAN
-FASTCALL
-KiInsertTimerTable(
-    IN PKTIMER Timer,
-    IN ULONG Hand
-);
-
-BOOLEAN
-FASTCALL
-KiInsertTreeTimer(
-    IN PKTIMER Timer,
-    IN LARGE_INTEGER Interval
-);
-
-VOID
-FASTCALL
-KiCompleteTimer(
-    IN PKTIMER Timer,
-    IN PKSPIN_LOCK_QUEUE LockQueue
-);
-
 /* gmutex.c ********************************************************************/
 
 VOID
@@ -514,10 +450,11 @@ NTAPI
 KeQueryBasePriorityThread(IN PKTHREAD Thread);
 
 VOID
-FASTCALL
+NTAPI
 KiSetPriorityThread(
     IN PKTHREAD Thread,
-    IN KPRIORITY Priority
+    IN KPRIORITY Priority,
+    IN PBOOLEAN Released // hack
 );
 
 BOOLEAN
@@ -604,6 +541,13 @@ BOOLEAN
 NTAPI
 KeDisableThreadApcQueueing(IN PKTHREAD Thread);
 
+BOOLEAN
+NTAPI
+KiInsertTimer(
+    PKTIMER Timer,
+    LARGE_INTEGER DueTime
+);
+
 VOID
 FASTCALL
 KiWaitTest(
@@ -633,21 +577,6 @@ KiInsertQueue(
     BOOLEAN Head
 );
 
-VOID
-NTAPI
-KiTimerExpiration(
-    IN PKDPC Dpc,
-    IN PVOID DeferredContext,
-    IN PVOID SystemArgument1,
-    IN PVOID SystemArgument2
-);
-
-ULONG
-NTAPI
-KiComputeTimerTableIndex(
-    IN LONGLONG TimeValue
-);
-
 ULONG
 NTAPI
 KeSetProcess(
@@ -794,12 +723,7 @@ KeRosDumpStackFrames(
 
 VOID
 NTAPI
-KeSetSystemTime(
-    IN PLARGE_INTEGER NewSystemTime,
-    OUT PLARGE_INTEGER OldSystemTime,
-    IN BOOLEAN FixInterruptTime,
-    IN PLARGE_INTEGER HalTime
-);
+KiSetSystemTime(PLARGE_INTEGER NewSystemTime);
 
 ULONG
 NTAPI
index 0a35421..a21d7ce 100644 (file)
@@ -175,115 +175,526 @@ Ke386SanitizeDr(IN PVOID DrAddress,
     }                                                                       \
 }
 
-#ifndef _CONFIG_SMP
 //
-// Spinlock Acquire at IRQL >= DISPATCH_LEVEL
+// Satisfies the wait of any dispatcher object
 //
-FORCEINLINE
-VOID
-KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock)
-{
-    /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
-    UNREFERENCED_PARAMETER(SpinLock);
+#define KiSatisfyObjectWait(Object, Thread)                                 \
+{                                                                           \
+    /* Special case for Mutants */                                          \
+    if ((Object)->Header.Type == MutantObject)                              \
+    {                                                                       \
+        /* Decrease the Signal State */                                     \
+        (Object)->Header.SignalState--;                                     \
+                                                                            \
+        /* Check if it's now non-signaled */                                \
+        if (!(Object)->Header.SignalState)                                  \
+        {                                                                   \
+            /* Set the Owner Thread */                                      \
+            (Object)->OwnerThread = Thread;                                 \
+                                                                            \
+            /* Disable APCs if needed */                                    \
+            Thread->KernelApcDisable -= (Object)->ApcDisable;               \
+                                                                            \
+            /* Check if it's abandoned */                                   \
+            if ((Object)->Abandoned)                                        \
+            {                                                               \
+                /* Unabandon it */                                          \
+                (Object)->Abandoned = FALSE;                                \
+                                                                            \
+                /* Return Status */                                         \
+                Thread->WaitStatus = STATUS_ABANDONED;                      \
+            }                                                               \
+                                                                            \
+            /* Insert it into the Mutant List */                            \
+            InsertHeadList(Thread->MutantListHead.Blink,                    \
+                           &(Object)->MutantListEntry);                     \
+        }                                                                   \
+    }                                                                       \
+    else if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) ==               \
+             EventSynchronizationObject)                                    \
+    {                                                                       \
+        /* Synchronization Timers and Events just get un-signaled */        \
+        (Object)->Header.SignalState = 0;                                   \
+    }                                                                       \
+    else if ((Object)->Header.Type == SemaphoreObject)                      \
+    {                                                                       \
+        /* These ones can have multiple states, so we only decrease it */   \
+        (Object)->Header.SignalState--;                                     \
+    }                                                                       \
 }
 
 //
-// Spinlock Release at IRQL >= DISPATCH_LEVEL
+// Satisfies the wait of a mutant dispatcher object
 //
-FORCEINLINE
-VOID
-KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock)
-{
-    /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
-    UNREFERENCED_PARAMETER(SpinLock);
+#define KiSatisfyMutantWait(Object, Thread)                                 \
+{                                                                           \
+    /* Decrease the Signal State */                                         \
+    (Object)->Header.SignalState--;                                         \
+                                                                            \
+    /* Check if it's now non-signaled */                                    \
+    if (!(Object)->Header.SignalState)                                      \
+    {                                                                       \
+        /* Set the Owner Thread */                                          \
+        (Object)->OwnerThread = Thread;                                     \
+                                                                            \
+        /* Disable APCs if needed */                                        \
+        Thread->KernelApcDisable -= (Object)->ApcDisable;                   \
+                                                                            \
+        /* Check if it's abandoned */                                       \
+        if ((Object)->Abandoned)                                            \
+        {                                                                   \
+            /* Unabandon it */                                              \
+            (Object)->Abandoned = FALSE;                                    \
+                                                                            \
+            /* Return Status */                                             \
+            Thread->WaitStatus = STATUS_ABANDONED;                          \
+        }                                                                   \
+                                                                            \
+        /* Insert it into the Mutant List */                                \
+        InsertHeadList(Thread->MutantListHead.Blink,                        \
+                       &(Object)->MutantListEntry);                         \
+    }                                                                       \
 }
 
 //
-// This routine protects against multiple CPU acquires, it's meaningless on UP.
+// Satisfies the wait of any nonmutant dispatcher object
 //
-VOID
-FORCEINLINE
-KiAcquireDispatcherObject(IN DISPATCHER_HEADER* Object)
-{
-    UNREFERENCED_PARAMETER(Object);
+#define KiSatisfyNonMutantWait(Object, Thread)                              \
+{                                                                           \
+    if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) ==                    \
+             EventSynchronizationObject)                                    \
+    {                                                                       \
+        /* Synchronization Timers and Events just get un-signaled */        \
+        (Object)->Header.SignalState = 0;                                   \
+    }                                                                       \
+    else if ((Object)->Header.Type == SemaphoreObject)                      \
+    {                                                                       \
+        /* These ones can have multiple states, so we only decrease it */   \
+        (Object)->Header.SignalState--;                                     \
+    }                                                                       \
 }
 
 //
-// This routine protects against multiple CPU acquires, it's meaningless on UP.
+// Recalculates the due time
 //
-VOID
+PLARGE_INTEGER
 FORCEINLINE
-KiReleaseDispatcherObject(IN DISPATCHER_HEADER* Object)
+KiRecalculateDueTime(IN PLARGE_INTEGER OriginalDueTime,
+                     IN PLARGE_INTEGER DueTime,
+                     IN OUT PLARGE_INTEGER NewDueTime)
 {
-    UNREFERENCED_PARAMETER(Object);
+    /* Don't do anything for absolute waits */
+    if (OriginalDueTime->QuadPart >= 0) return OriginalDueTime;
+
+    /* Otherwise, query the interrupt time and recalculate */
+    NewDueTime->QuadPart = KeQueryInterruptTime();
+    NewDueTime->QuadPart -= DueTime->QuadPart;
+    return NewDueTime;
 }
 
-KIRQL
+//
+// Determines wether a thread should be added to the wait list
+//
 FORCEINLINE
-KiAcquireDispatcherLock(VOID)
+BOOLEAN
+KiCheckThreadStackSwap(IN PKTHREAD Thread,
+                       IN KPROCESSOR_MODE WaitMode)
 {
-    /* Raise to DPC level */
-    return KeRaiseIrqlToDpcLevel();
+    /* Check the required conditions */
+    if ((WaitMode != KernelMode) &&
+        (Thread->EnableStackSwap) &&
+        (Thread->Priority >= (LOW_REALTIME_PRIORITY + 9)))
+    {
+        /* We are go for swap */
+        return TRUE;
+    }
+    else
+    {
+        /* Don't swap the thread */
+        return FALSE;
+    }
 }
 
-VOID
-FORCEINLINE
-KiReleaseDispatcherLock(IN KIRQL OldIrql)
-{
-    /* Just exit the dispatcher */
-    KiExitDispatcher(OldIrql);
+//
+// Adds a thread to the wait list
+//
+#define KiAddThreadToWaitList(Thread, Swappable)                            \
+{                                                                           \
+    /* Make sure it's swappable */                                          \
+    if (Swappable)                                                          \
+    {                                                                       \
+        /* Insert it into the PRCB's List */                                \
+        InsertTailList(&KeGetCurrentPrcb()->WaitListHead,                   \
+                       &Thread->WaitListEntry);                             \
+    }                                                                       \
 }
 
-VOID
+//
+// Checks if a wait in progress should be interrupted by APCs or an alertable
+// state.
+//
 FORCEINLINE
-KiAcquireDispatcherLockAtDpcLevel(VOID)
+NTSTATUS
+KiCheckAlertability(IN PKTHREAD Thread,
+                    IN BOOLEAN Alertable,
+                    IN KPROCESSOR_MODE WaitMode)
 {
-    /* This is a no-op at DPC Level for UP systems */
-    return;
+    /* Check if the wait is alertable */
+    if (Alertable)
+    {
+        /* It is, first check if the thread is alerted in this mode */
+        if (Thread->Alerted[WaitMode])
+        {
+            /* It is, so bail out of the wait */
+            Thread->Alerted[WaitMode] = FALSE;
+            return STATUS_ALERTED;
+        }
+        else if ((WaitMode != KernelMode) &&
+                (!IsListEmpty(&Thread->ApcState.ApcListHead[UserMode])))
+        {
+            /* It's isn't, but this is a user wait with queued user APCs */
+            Thread->ApcState.UserApcPending = TRUE;
+            return STATUS_USER_APC;
+        }
+        else if (Thread->Alerted[KernelMode])
+        {
+            /* It isn't that either, but we're alered in kernel mode */
+            Thread->Alerted[KernelMode] = FALSE;
+            return STATUS_ALERTED;
+        }
+    }
+    else if ((WaitMode != KernelMode) && (Thread->ApcState.UserApcPending))
+    {
+        /* Not alertable, but this is a user wait with pending user APCs */
+        return STATUS_USER_APC;
+    }
+
+    /* Otherwise, we're fine */
+    return STATUS_WAIT_0;
 }
 
-VOID
 FORCEINLINE
-KiReleaseDispatcherLockFromDpcLevel(VOID)
+BOOLEAN
+KxDelayThreadWait(IN PKTHREAD Thread,
+                   IN BOOLEAN Alertable,
+                   IN KPROCESSOR_MODE WaitMode)
 {
-    /* This is a no-op at DPC Level for UP systems */
-    return;
+    BOOLEAN Swappable;
+    PKWAIT_BLOCK TimerBlock = &Thread->WaitBlock[TIMER_WAIT_BLOCK];
+
+    /* Setup the Wait Block */
+    Thread->WaitBlockList = TimerBlock;
+    TimerBlock->NextWaitBlock = TimerBlock;
+
+    /* Link the timer to this Wait Block */
+    Thread->Timer.Header.WaitListHead.Flink = &TimerBlock->WaitListEntry;
+    Thread->Timer.Header.WaitListHead.Blink = &TimerBlock->WaitListEntry;
+
+    /* Clear wait status */
+    Thread->WaitStatus = STATUS_WAIT_0;
+
+    /* Setup wait fields */
+    Thread->Alertable = Alertable;
+    Thread->WaitReason = DelayExecution;
+    Thread->WaitMode = WaitMode;
+
+    /* Check if we can swap the thread's stack */
+    Thread->WaitListEntry.Flink = NULL;
+    Swappable = KiCheckThreadStackSwap(Thread, WaitMode);
+
+    /* Set the wait time */
+    Thread->WaitTime = ((PLARGE_INTEGER)&KeTickCount)->LowPart;
+    return Swappable;
 }
 
-//
-// This routine makes the thread deferred ready on the boot CPU.
-//
 FORCEINLINE
-VOID
-KiInsertDeferredReadyList(IN PKTHREAD Thread)
+BOOLEAN
+KxMultiThreadWait(IN PKTHREAD Thread,
+                  IN PKWAIT_BLOCK WaitBlock,
+                  IN BOOLEAN Alertable,
+                  IN KWAIT_REASON WaitReason,
+                  IN KPROCESSOR_MODE WaitMode)
 {
-    /* Set the thread to deferred state and boot CPU */
-    Thread->State = DeferredReady;
-    Thread->DeferredProcessor = 0;
+    BOOLEAN Swappable;
+    PKTIMER ThreadTimer = &Thread->Timer;
 
-    /* Make the thread ready immediately */
-    KiDeferredReadyThread(Thread);
+    /* Set default wait status */
+    Thread->WaitStatus = STATUS_WAIT_0;
+
+    /* Link wait block array to the thread */
+    Thread->WaitBlockList = WaitBlock;
+
+    /* Initialize the timer list */
+    InitializeListHead(&ThreadTimer->Header.WaitListHead);
+
+    /* Set wait settings */
+    Thread->Alertable = Alertable;
+    Thread->WaitMode = WaitMode;
+    Thread->WaitReason = WaitReason;
+
+    /* Check if we can swap the thread's stack */
+    Thread->WaitListEntry.Flink = NULL;
+    Swappable = KiCheckThreadStackSwap(Thread, WaitMode);
+
+    /* Set the wait time */
+    Thread->WaitTime = ((PLARGE_INTEGER)&KeTickCount)->LowPart;
+    return Swappable;
 }
 
 FORCEINLINE
-VOID
-KiRescheduleThread(IN BOOLEAN NewThread,
-                   IN ULONG Cpu)
-{
-    /* This is meaningless on UP systems */
-    UNREFERENCED_PARAMETER(NewThread);
-    UNREFERENCED_PARAMETER(Cpu);
+BOOLEAN
+KxSingleThreadWait(IN PKTHREAD Thread,
+                   IN PKWAIT_BLOCK WaitBlock,
+                   IN PVOID Object,
+                   IN PLARGE_INTEGER Timeout,
+                   IN BOOLEAN Alertable,
+                   IN KWAIT_REASON WaitReason,
+                   IN KPROCESSOR_MODE WaitMode)
+{
+    BOOLEAN Swappable;
+    PKWAIT_BLOCK TimerBlock = &Thread->WaitBlock[TIMER_WAIT_BLOCK];
+
+    /* Setup the Wait Block */
+    Thread->WaitBlockList = WaitBlock;
+    WaitBlock->WaitKey = STATUS_WAIT_0;
+    WaitBlock->Object = Object;
+    WaitBlock->WaitType = WaitAny;
+
+    /* Clear wait status */
+    Thread->WaitStatus = STATUS_WAIT_0;
+
+    /* Check if we have a timer */
+    if (Timeout)
+    {
+        /* Pointer to timer block */
+        WaitBlock->NextWaitBlock = TimerBlock;
+        TimerBlock->NextWaitBlock = WaitBlock;
+
+        /* Link the timer to this Wait Block */
+        Thread->Timer.Header.WaitListHead.Flink = &TimerBlock->WaitListEntry;
+        Thread->Timer.Header.WaitListHead.Blink = &TimerBlock->WaitListEntry;
+    }
+    else
+    {
+        /* No timer block, just ourselves */
+        WaitBlock->NextWaitBlock = WaitBlock;
+    }
+
+    /* Setup wait fields */
+    Thread->Alertable = Alertable;
+    Thread->WaitReason = WaitReason;
+    Thread->WaitMode = WaitMode;
+
+    /* Check if we can swap the thread's stack */
+    Thread->WaitListEntry.Flink = NULL;
+    Swappable = KiCheckThreadStackSwap(Thread, WaitMode);
+
+    /* Set the wait time */
+    Thread->WaitTime = ((PLARGE_INTEGER)&KeTickCount)->LowPart;
+    return Swappable;
 }
 
 //
-// This routine protects against multiple CPU acquires, it's meaningless on UP.
+// Unwaits a Thread
 //
 FORCEINLINE
 VOID
-KiSetThreadSwapBusy(IN PKTHREAD Thread)
+KxUnwaitThread(IN DISPATCHER_HEADER *Object,
+               IN KPRIORITY Increment)
 {
-    UNREFERENCED_PARAMETER(Thread);
-}
+    PLIST_ENTRY WaitEntry, WaitList;
+    PKWAIT_BLOCK CurrentWaitBlock;
+    PKTHREAD WaitThread;
+    ULONG WaitKey;
+
+    /* Loop the Wait Entries */
+    WaitList = &Object->WaitListHead;
+    WaitEntry = WaitList->Flink;
+    do
+    {
+        /* Get the current wait block */
+        CurrentWaitBlock = CONTAINING_RECORD(WaitEntry,
+                                             KWAIT_BLOCK,
+                                             WaitListEntry);
+
+        /* Get the waiting thread */
+        WaitThread = CurrentWaitBlock->Thread;
+
+        /* Check the current Wait Mode */
+        if (CurrentWaitBlock->WaitType == WaitAny)
+        {
+            /* Use the actual wait key */
+            WaitKey = CurrentWaitBlock->WaitKey;
+        }
+        else
+        {
+            /* Otherwise, use STATUS_KERNEL_APC */
+            WaitKey = STATUS_KERNEL_APC;
+        }
+
+        /* Unwait the thread */
+        KiUnwaitThread(WaitThread, WaitKey, Increment);
+
+        /* Next entry */
+        WaitEntry = WaitList->Flink;
+    } while (WaitEntry != WaitList);
+}
+
+//
+// Unwaits a Thread waiting on an event
+//
+FORCEINLINE
+VOID
+KxUnwaitThreadForEvent(IN PKEVENT Event,
+                       IN KPRIORITY Increment)
+{
+    PLIST_ENTRY WaitEntry, WaitList;
+    PKWAIT_BLOCK CurrentWaitBlock;
+    PKTHREAD WaitThread;
+
+    /* Loop the Wait Entries */
+    WaitList = &Event->Header.WaitListHead;
+    WaitEntry = WaitList->Flink;
+    do
+    {
+        /* Get the current wait block */
+        CurrentWaitBlock = CONTAINING_RECORD(WaitEntry,
+                                             KWAIT_BLOCK,
+                                             WaitListEntry);
+
+        /* Get the waiting thread */
+        WaitThread = CurrentWaitBlock->Thread;
+
+        /* Check the current Wait Mode */
+        if (CurrentWaitBlock->WaitType == WaitAny)
+        {
+            /* Un-signal it */
+            Event->Header.SignalState = 0;
+
+            /* Un-signal the event and unwait the thread */
+            KiUnwaitThread(WaitThread, CurrentWaitBlock->WaitKey, Increment);
+            break;
+        }
+        else
+        {
+            /* Unwait the thread with STATUS_KERNEL_APC */
+            KiUnwaitThread(WaitThread, STATUS_KERNEL_APC, Increment);
+        }
+
+        /* Next entry */
+        WaitEntry = WaitList->Flink;
+    } while (WaitEntry != WaitList);
+}
+
+#ifndef _CONFIG_SMP
+//
+// 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);
+}
+
+//
+// This routine protects against multiple CPU acquires, it's meaningless on UP.
+//
+VOID
+FORCEINLINE
+KiAcquireDispatcherObject(IN DISPATCHER_HEADER* Object)
+{
+    UNREFERENCED_PARAMETER(Object);
+}
+
+//
+// This routine protects against multiple CPU acquires, it's meaningless on UP.
+//
+VOID
+FORCEINLINE
+KiReleaseDispatcherObject(IN DISPATCHER_HEADER* Object)
+{
+    UNREFERENCED_PARAMETER(Object);
+}
+
+KIRQL
+FORCEINLINE
+KiAcquireDispatcherLock(VOID)
+{
+    /* Raise to DPC level */
+    return KeRaiseIrqlToDpcLevel();
+}
+
+VOID
+FORCEINLINE
+KiReleaseDispatcherLock(IN KIRQL OldIrql)
+{
+    /* Just exit the dispatcher */
+    KiExitDispatcher(OldIrql);
+}
+
+VOID
+FORCEINLINE
+KiAcquireDispatcherLockAtDpcLevel(VOID)
+{
+    /* This is a no-op at DPC Level for UP systems */
+    return;
+}
+
+VOID
+FORCEINLINE
+KiReleaseDispatcherLockFromDpcLevel(VOID)
+{
+    /* This is a no-op at DPC Level for UP systems */
+    return;
+}
+
+//
+// This routine makes the thread deferred ready on the boot CPU.
+//
+FORCEINLINE
+VOID
+KiInsertDeferredReadyList(IN PKTHREAD Thread)
+{
+    /* Set the thread to deferred state and boot CPU */
+    Thread->State = DeferredReady;
+    Thread->DeferredProcessor = 0;
+
+    /* Make the thread ready immediately */
+    KiDeferredReadyThread(Thread);
+}
+
+FORCEINLINE
+VOID
+KiRescheduleThread(IN BOOLEAN NewThread,
+                   IN ULONG Cpu)
+{
+    /* This is meaningless on UP systems */
+    UNREFERENCED_PARAMETER(NewThread);
+    UNREFERENCED_PARAMETER(Cpu);
+}
+
+//
+// This routine protects against multiple CPU acquires, it's meaningless on UP.
+//
+FORCEINLINE
+VOID
+KiSetThreadSwapBusy(IN PKTHREAD Thread)
+{
+    UNREFERENCED_PARAMETER(Thread);
+}
 
 //
 // This routine protects against multiple CPU acquires, it's meaningless on UP.
@@ -367,27 +778,6 @@ KiRequestApcInterrupt(IN BOOLEAN NeedApc,
     UNREFERENCED_PARAMETER(Processor);
 }
 
-FORCEINLINE
-PKSPIN_LOCK_QUEUE
-KiAcquireTimerLock(IN ULONG Hand)
-{
-    ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
-
-    /* Nothing to do on UP */
-    UNREFERENCED_PARAMETER(Hand);
-    return NULL;
-}
-
-FORCEINLINE
-VOID
-KiReleaseTimerLock(IN PKSPIN_LOCK_QUEUE LockQueue)
-{
-    ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
-
-    /* Nothing to do on UP */
-    UNREFERENCED_PARAMETER(LockQueue);
-}
-
 #else
 
 //
@@ -616,754 +1006,181 @@ KiAcquireThreadLock(IN PKTHREAD Thread)
 
         /* Loop until the other CPU releases it */
         do
-        {
-            /* Let the CPU know that this is a loop */
-            YieldProcessor();
-        } while (Thread->ThreadLock);
-    }
-}
-
-//
-// This routine releases the thread lock so that other callers can touch
-// volatile thread data.
-//
-// Since this is a simple optimized spin-lock, it must be be only acquired
-// at dispatcher level or higher!
-//
-FORCEINLINE
-VOID
-KiReleaseThreadLock(IN PKTHREAD Thread)
-{
-    /* Release it */
-    InterlockedAnd(&Thread->ThreadLock, 0);
-}
-
-FORCEINLINE
-BOOLEAN
-KiTryThreadLock(IN PKTHREAD Thread)
-{
-    LONG Value;
-
-    /* If the lock isn't acquired, return false */
-    if (!Thread->ThreadLock) return FALSE;
-
-    /* Otherwise, try to acquire it and check the result */
-    Value = 1;
-    Value = InterlockedExchange(&Thread->ThreadLock, &Value);
-
-    /* Return the lock state */
-    return (Value == TRUE);
-}
-
-FORCEINLINE
-VOID
-KiCheckDeferredReadyList(IN PKPRCB Prcb)
-{
-    /* Scan the deferred ready lists if required */
-    if (Prcb->DeferredReadyListHead.Next) KiProcessDeferredReadyList(Prcb);
-}
-
-FORCEINLINE
-VOID
-KiRequestApcInterrupt(IN BOOLEAN NeedApc,
-                      IN UCHAR Processor)
-{
-    /* Check if we need to request APC delivery */
-    if (NeedApc)
-    {
-        /* Check if it's on another CPU */
-        if (KeGetPcr()->Number != Cpu)
-        {
-            /* Send an IPI to request delivery */
-            KiIpiSendRequest(AFFINITY_MASK(Cpu), IPI_DPC);
-        }
-        else
-        {
-            /* Request a software interrupt */
-            HalRequestSoftwareInterrupt(APC_LEVEL);
-        }
-    }
-}
-
-#endif
-
-FORCEINLINE
-VOID
-KiAcquireApcLock(IN PKTHREAD Thread,
-                 IN PKLOCK_QUEUE_HANDLE Handle)
-{
-    /* Acquire the lock and raise to synchronization level */
-    KeAcquireInStackQueuedSpinLockRaiseToSynch(&Thread->ApcQueueLock, Handle);
-}
-
-FORCEINLINE
-VOID
-KiAcquireApcLockAtDpcLevel(IN PKTHREAD Thread,
-                           IN PKLOCK_QUEUE_HANDLE Handle)
-{
-    /* Acquire the lock */
-    KeAcquireInStackQueuedSpinLockAtDpcLevel(&Thread->ApcQueueLock, Handle);
-}
-
-FORCEINLINE
-VOID
-KiAcquireApcLockAtApcLevel(IN PKTHREAD Thread,
-                           IN PKLOCK_QUEUE_HANDLE Handle)
-{
-    /* Acquire the lock */
-    KeAcquireInStackQueuedSpinLock(&Thread->ApcQueueLock, Handle);
-}
-
-FORCEINLINE
-VOID
-KiReleaseApcLock(IN PKLOCK_QUEUE_HANDLE Handle)
-{
-    /* Release the lock */
-    KeReleaseInStackQueuedSpinLock(Handle);
-}
-
-FORCEINLINE
-VOID
-KiReleaseApcLockFromDpcLevel(IN PKLOCK_QUEUE_HANDLE Handle)
-{
-    /* Release the lock */
-    KeReleaseInStackQueuedSpinLockFromDpcLevel(Handle);
-}
-
-FORCEINLINE
-VOID
-KiAcquireProcessLock(IN PKPROCESS Process,
-                     IN PKLOCK_QUEUE_HANDLE Handle)
-{
-    /* Acquire the lock and raise to synchronization level */
-    KeAcquireInStackQueuedSpinLockRaiseToSynch(&Process->ProcessLock, Handle);
-}
-
-FORCEINLINE
-VOID
-KiReleaseProcessLock(IN PKLOCK_QUEUE_HANDLE Handle)
-{
-    /* Release the lock */
-    KeReleaseInStackQueuedSpinLock(Handle);
-}
-
-FORCEINLINE
-VOID
-KiReleaseProcessLockFromDpcLevel(IN PKLOCK_QUEUE_HANDLE Handle)
-{
-    /* Release the lock */
-    KeReleaseInStackQueuedSpinLockFromDpcLevel(Handle);
-}
-
-FORCEINLINE
-VOID
-KiAcquireDeviceQueueLock(IN PKDEVICE_QUEUE DeviceQueue,
-                         IN PKLOCK_QUEUE_HANDLE DeviceLock)
-{
-    /* Check if we were called from a threaded DPC */
-    if (KeGetCurrentPrcb()->DpcThreadActive)
-    {
-        /* Lock the Queue, we're not at DPC level */
-        KeAcquireInStackQueuedSpinLock(&DeviceQueue->Lock, DeviceLock);
-    }
-    else
-    {
-        /* We must be at DPC level, acquire the lock safely */
-        ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
-        KeAcquireInStackQueuedSpinLockAtDpcLevel(&DeviceQueue->Lock,
-                                                 DeviceLock);
-    }
-}
-
-FORCEINLINE
-VOID
-KiReleaseDeviceQueueLock(IN PKLOCK_QUEUE_HANDLE DeviceLock)
-{
-    /* Check if we were called from a threaded DPC */
-    if (KeGetCurrentPrcb()->DpcThreadActive)
-    {
-        /* Unlock the Queue, we're not at DPC level */
-        KeReleaseInStackQueuedSpinLock(DeviceLock);
-    }
-    else
-    {
-        /* We must be at DPC level, release the lock safely */
-        ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
-        KeReleaseInStackQueuedSpinLockFromDpcLevel(DeviceLock);
-    }
-}
-
-//
-// Satisfies the wait of any dispatcher object
-//
-#define KiSatisfyObjectWait(Object, Thread)                                 \
-{                                                                           \
-    /* Special case for Mutants */                                          \
-    if ((Object)->Header.Type == MutantObject)                              \
-    {                                                                       \
-        /* Decrease the Signal State */                                     \
-        (Object)->Header.SignalState--;                                     \
-                                                                            \
-        /* Check if it's now non-signaled */                                \
-        if (!(Object)->Header.SignalState)                                  \
-        {                                                                   \
-            /* Set the Owner Thread */                                      \
-            (Object)->OwnerThread = Thread;                                 \
-                                                                            \
-            /* Disable APCs if needed */                                    \
-            Thread->KernelApcDisable = Thread->KernelApcDisable -           \
-                                       (Object)->ApcDisable;                \
-                                                                            \
-            /* Check if it's abandoned */                                   \
-            if ((Object)->Abandoned)                                        \
-            {                                                               \
-                /* Unabandon it */                                          \
-                (Object)->Abandoned = FALSE;                                \
-                                                                            \
-                /* Return Status */                                         \
-                Thread->WaitStatus = STATUS_ABANDONED;                      \
-            }                                                               \
-                                                                            \
-            /* Insert it into the Mutant List */                            \
-            InsertHeadList(Thread->MutantListHead.Blink,                    \
-                           &(Object)->MutantListEntry);                     \
-        }                                                                   \
-    }                                                                       \
-    else if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) ==               \
-             EventSynchronizationObject)                                    \
-    {                                                                       \
-        /* Synchronization Timers and Events just get un-signaled */        \
-        (Object)->Header.SignalState = 0;                                   \
-    }                                                                       \
-    else if ((Object)->Header.Type == SemaphoreObject)                      \
-    {                                                                       \
-        /* These ones can have multiple states, so we only decrease it */   \
-        (Object)->Header.SignalState--;                                     \
-    }                                                                       \
-}
-
-//
-// Satisfies the wait of a mutant dispatcher object
-//
-#define KiSatisfyMutantWait(Object, Thread)                                 \
-{                                                                           \
-    /* Decrease the Signal State */                                         \
-    (Object)->Header.SignalState--;                                         \
-                                                                            \
-    /* Check if it's now non-signaled */                                    \
-    if (!(Object)->Header.SignalState)                                      \
-    {                                                                       \
-        /* Set the Owner Thread */                                          \
-        (Object)->OwnerThread = Thread;                                     \
-                                                                            \
-        /* Disable APCs if needed */                                        \
-        Thread->KernelApcDisable = Thread->KernelApcDisable -               \
-                                   (Object)->ApcDisable;                    \
-                                                                            \
-        /* Check if it's abandoned */                                       \
-        if ((Object)->Abandoned)                                            \
-        {                                                                   \
-            /* Unabandon it */                                              \
-            (Object)->Abandoned = FALSE;                                    \
-                                                                            \
-            /* Return Status */                                             \
-            Thread->WaitStatus = STATUS_ABANDONED;                          \
-        }                                                                   \
-                                                                            \
-        /* Insert it into the Mutant List */                                \
-        InsertHeadList(Thread->MutantListHead.Blink,                        \
-                       &(Object)->MutantListEntry);                         \
-    }                                                                       \
-}
-
-//
-// Satisfies the wait of any nonmutant dispatcher object
-//
-#define KiSatisfyNonMutantWait(Object)                                      \
-{                                                                           \
-    if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) ==                    \
-             EventSynchronizationObject)                                    \
-    {                                                                       \
-        /* Synchronization Timers and Events just get un-signaled */        \
-        (Object)->Header.SignalState = 0;                                   \
-    }                                                                       \
-    else if ((Object)->Header.Type == SemaphoreObject)                      \
-    {                                                                       \
-        /* These ones can have multiple states, so we only decrease it */   \
-        (Object)->Header.SignalState--;                                     \
-    }                                                                       \
-}
-
-//
-// Recalculates the due time
-//
-PLARGE_INTEGER
-FORCEINLINE
-KiRecalculateDueTime(IN PLARGE_INTEGER OriginalDueTime,
-                     IN PLARGE_INTEGER DueTime,
-                     IN OUT PLARGE_INTEGER NewDueTime)
-{
-    /* Don't do anything for absolute waits */
-    if (OriginalDueTime->QuadPart >= 0) return OriginalDueTime;
-
-    /* Otherwise, query the interrupt time and recalculate */
-    NewDueTime->QuadPart = KeQueryInterruptTime();
-    NewDueTime->QuadPart -= DueTime->QuadPart;
-    return NewDueTime;
-}
-
-//
-// Determines whether a thread should be added to the wait list
-//
-FORCEINLINE
-BOOLEAN
-KiCheckThreadStackSwap(IN PKTHREAD Thread,
-                       IN KPROCESSOR_MODE WaitMode)
-{
-    /* Check the required conditions */
-    if ((WaitMode != KernelMode) &&
-        (Thread->EnableStackSwap) &&
-        (Thread->Priority >= (LOW_REALTIME_PRIORITY + 9)))
-    {
-        /* We are go for swap */
-        return TRUE;
-    }
-    else
-    {
-        /* Don't swap the thread */
-        return FALSE;
-    }
-}
-
-//
-// Adds a thread to the wait list
-//
-#define KiAddThreadToWaitList(Thread, Swappable)                            \
-{                                                                           \
-    /* Make sure it's swappable */                                          \
-    if (Swappable)                                                          \
-    {                                                                       \
-        /* Insert it into the PRCB's List */                                \
-        InsertTailList(&KeGetCurrentPrcb()->WaitListHead,                   \
-                       &Thread->WaitListEntry);                             \
-    }                                                                       \
-}
-
-//
-// Checks if a wait in progress should be interrupted by APCs or an alertable
-// state.
-//
-FORCEINLINE
-NTSTATUS
-KiCheckAlertability(IN PKTHREAD Thread,
-                    IN BOOLEAN Alertable,
-                    IN KPROCESSOR_MODE WaitMode)
-{
-    /* Check if the wait is alertable */
-    if (Alertable)
-    {
-        /* It is, first check if the thread is alerted in this mode */
-        if (Thread->Alerted[WaitMode])
-        {
-            /* It is, so bail out of the wait */
-            Thread->Alerted[WaitMode] = FALSE;
-            return STATUS_ALERTED;
-        }
-        else if ((WaitMode != KernelMode) &&
-                (!IsListEmpty(&Thread->ApcState.ApcListHead[UserMode])))
-        {
-            /* It's isn't, but this is a user wait with queued user APCs */
-            Thread->ApcState.UserApcPending = TRUE;
-            return STATUS_USER_APC;
-        }
-        else if (Thread->Alerted[KernelMode])
-        {
-            /* It isn't that either, but we're alered in kernel mode */
-            Thread->Alerted[KernelMode] = FALSE;
-            return STATUS_ALERTED;
-        }
-    }
-    else if ((WaitMode != KernelMode) && (Thread->ApcState.UserApcPending))
-    {
-        /* Not alertable, but this is a user wait with pending user APCs */
-        return STATUS_USER_APC;
+        {
+            /* Let the CPU know that this is a loop */
+            YieldProcessor();
+        } while (Thread->ThreadLock);
     }
-
-    /* Otherwise, we're fine */
-    return STATUS_WAIT_0;
 }
 
 //
-// Called by Wait and Queue code to insert a timer for dispatching.
-// Also called by KeSetTimerEx to insert a timer from the caller.
+// This routine releases the thread lock so that other callers can touch
+// volatile thread data.
+//
+// Since this is a simple optimized spin-lock, it must be be only acquired
+// at dispatcher level or higher!
 //
-VOID
 FORCEINLINE
-KxInsertTimer(IN PKTIMER Timer,
-              IN ULONG Hand)
+VOID
+KiReleaseThreadLock(IN PKTHREAD Thread)
 {
-    PKSPIN_LOCK_QUEUE LockQueue;
-
-    /* Acquire the lock and release the dispatcher lock */
-    LockQueue = KiAcquireTimerLock(Hand);
-    KiReleaseDispatcherLockFromDpcLevel();
-
-    /* Try to insert the timer */
-    if (KiInsertTimerTable(Timer, Hand))
-    {
-        /* Complete it */
-        KiCompleteTimer(Timer, LockQueue);
-    }
-    else
-    {
-        /* Do nothing, just release the lock */
-        KiReleaseTimerLock(LockQueue);
-    }
+    /* Release it */
+    InterlockedAnd(&Thread->ThreadLock, 0);
 }
 
-//
-// Called from Unlink and Queue Insert Code.
-// Also called by timer code when canceling an inserted timer.
-// Removes a timer from it's tree.
-//
-VOID
 FORCEINLINE
-KxRemoveTreeTimer(IN PKTIMER Timer)
+BOOLEAN
+KiTryThreadLock(IN PKTHREAD Thread)
 {
-    ULONG Hand = Timer->Header.Hand;
-    PKSPIN_LOCK_QUEUE LockQueue;
-    PKTIMER_TABLE_ENTRY TimerEntry;
-
-    /* Acquire timer lock */
-    LockQueue = KiAcquireTimerLock(Hand);
+    LONG Value;
 
-    /* Set the timer as non-inserted */
-    Timer->Header.Inserted = FALSE;
+    /* If the lock isn't acquired, return false */
+    if (!Thread->ThreadLock) return FALSE;
 
-    /* Remove it from the timer list */
-    if (RemoveEntryList(&Timer->TimerListEntry))
-    {
-        /* Get the entry and check if it's empty */
-        TimerEntry = &KiTimerTableListHead[Hand];
-        if (IsListEmpty(&TimerEntry->Entry))
-        {
-            /* Clear the time then */
-            TimerEntry->Time.HighPart = 0xFFFFFFFF;
-        }
-    }
+    /* Otherwise, try to acquire it and check the result */
+    Value = 1;
+    Value = InterlockedExchange(&Thread->ThreadLock, &Value);
 
-    /* Release the timer lock */
-    KiReleaseTimerLock(LockQueue);
+    /* Return the lock state */
+    return (Value == TRUE);
 }
 
-VOID
 FORCEINLINE
-KxSetTimerForThreadWait(IN PKTIMER Timer,
-                        IN LARGE_INTEGER Interval,
-                        OUT PULONG Hand)
+VOID
+KiCheckDeferredReadyList(IN PKPRCB Prcb)
 {
-    ULONGLONG DueTime;
-    LARGE_INTEGER InterruptTime, SystemTime, TimeDifference;
+    /* Scan the deferred ready lists if required */
+    if (Prcb->DeferredReadyListHead.Next) KiProcessDeferredReadyList(Prcb);
+}
 
-    /* Check the timer's interval to see if it's absolute */
-    Timer->Header.Absolute = FALSE;
-    if (Interval.HighPart >= 0)
+FORCEINLINE
+VOID
+KiRequestApcInterrupt(IN BOOLEAN NeedApc,
+                      IN UCHAR Processor)
+{
+    /* Check if we need to request APC delivery */
+    if (NeedApc)
     {
-        /* Get the system time and calculate the relative time */
-        KeQuerySystemTime(&SystemTime);
-        TimeDifference.QuadPart = SystemTime.QuadPart - Interval.QuadPart;
-        Timer->Header.Absolute = TRUE;
-
-        /* Check if we've already expired */
-        if (TimeDifference.HighPart >= 0)
+        /* Check if it's on another CPU */
+        if (KeGetPcr()->Number != Cpu)
         {
-            /* Reset everything */
-            Timer->DueTime.QuadPart = 0;
-            *Hand = 0;
-            Timer->Header.Hand = 0;
-            return;
+            /* Send an IPI to request delivery */
+            KiIpiSendRequest(AFFINITY_MASK(Cpu), IPI_DPC);
         }
         else
         {
-            /* Update the interval */
-            Interval = TimeDifference;
+            /* Request a software interrupt */
+            HalRequestSoftwareInterrupt(APC_LEVEL);
         }
     }
-
-    /* Calculate the due time */
-    InterruptTime.QuadPart = KeQueryInterruptTime();
-    DueTime = InterruptTime.QuadPart - Interval.QuadPart;
-    Timer->DueTime.QuadPart = DueTime;
-
-    /* Calculate the timer handle */
-    *Hand = KiComputeTimerTableIndex(DueTime);
-    Timer->Header.Hand = (UCHAR)*Hand;
 }
 
-#define KxDelayThreadWait()                                                 \
-                                                                            \
-    /* Setup the Wait Block */                                              \
-    Thread->WaitBlockList = TimerBlock;                                     \
-                                                                            \
-    /* Setup the timer */                                                   \
-    KxSetTimerForThreadWait(Timer, *Interval, &Hand);                       \
-                                                                            \
-    /* Save the due time for the caller */                                  \
-    DueTime.QuadPart = Timer->DueTime.QuadPart;                             \
-                                                                            \
-    /* Link the timer to this Wait Block */                                 \
-    TimerBlock->NextWaitBlock = TimerBlock;                                 \
-    Timer->Header.WaitListHead.Flink = &TimerBlock->WaitListEntry;          \
-    Timer->Header.WaitListHead.Blink = &TimerBlock->WaitListEntry;          \
-                                                                            \
-    /* Clear wait status */                                                 \
-    Thread->WaitStatus = STATUS_SUCCESS;                                    \
-                                                                            \
-    /* Setup wait fields */                                                 \
-    Thread->Alertable = Alertable;                                          \
-    Thread->WaitReason = DelayExecution;                                    \
-    Thread->WaitMode = WaitMode;                                            \
-                                                                            \
-    /* Check if we can swap the thread's stack */                           \
-    Thread->WaitListEntry.Flink = NULL;                                     \
-    Swappable = KiCheckThreadStackSwap(Thread, WaitMode);                   \
-                                                                            \
-    /* Set the wait time */                                                 \
-    Thread->WaitTime = KeTickCount.LowPart;
+#endif
 
-#define KxMultiThreadWait()                                                 \
-    /* Link wait block array to the thread */                               \
-    Thread->WaitBlockList = WaitBlockArray;                                 \
-                                                                            \
-    /* Reset the index */                                                   \
-    Index = 0;                                                              \
-                                                                            \
-    /* Loop wait blocks */                                                  \
-    do                                                                      \
-    {                                                                       \
-        /* Fill out the wait block */                                       \
-        WaitBlock = &WaitBlockArray[Index];                                 \
-        WaitBlock->Object = Object[Index];                                  \
-        WaitBlock->WaitKey = (USHORT)Index;                                 \
-        WaitBlock->WaitType = WaitType;                                     \
-        WaitBlock->Thread = Thread;                                         \
-                                                                            \
-        /* Link to next block */                                            \
-        WaitBlock->NextWaitBlock = &WaitBlockArray[Index + 1];              \
-        Index++;                                                            \
-    } while (Index < Count);                                                \
-                                                                            \
-    /* Link the last block */                                               \
-    WaitBlock->NextWaitBlock = WaitBlockArray;                              \
-                                                                            \
-    /* Set default wait status */                                           \
-    Thread->WaitStatus = STATUS_WAIT_0;                                     \
-                                                                            \
-    /* Check if we have a timer */                                          \
-    if (Timeout)                                                            \
-    {                                                                       \
-        /* Link to the block */                                             \
-        TimerBlock->NextWaitBlock = WaitBlockArray;                         \
-                                                                            \
-        /* Setup the timer */                                               \
-        KxSetTimerForThreadWait(Timer, *Timeout, &Hand);                    \
-                                                                            \
-        /* Save the due time for the caller */                              \
-        DueTime.QuadPart = Timer->DueTime.QuadPart;                         \
-                                                                            \
-        /* Initialize the list */                                           \
-        InitializeListHead(&Timer->Header.WaitListHead);                    \
-    }                                                                       \
-                                                                            \
-    /* Set wait settings */                                                 \
-    Thread->Alertable = Alertable;                                          \
-    Thread->WaitMode = WaitMode;                                            \
-    Thread->WaitReason = WaitReason;                                        \
-                                                                            \
-    /* Check if we can swap the thread's stack */                           \
-    Thread->WaitListEntry.Flink = NULL;                                     \
-    Swappable = KiCheckThreadStackSwap(Thread, WaitMode);                   \
-                                                                            \
-    /* Set the wait time */                                                 \
-    Thread->WaitTime = KeTickCount.LowPart;
-
-#define KxSingleThreadWait()                                                \
-    /* Setup the Wait Block */                                              \
-    Thread->WaitBlockList = WaitBlock;                                      \
-    WaitBlock->WaitKey = STATUS_SUCCESS;                                    \
-    WaitBlock->Object = Object;                                             \
-    WaitBlock->WaitType = WaitAny;                                          \
-                                                                            \
-    /* Clear wait status */                                                 \
-    Thread->WaitStatus = STATUS_SUCCESS;                                    \
-                                                                            \
-    /* Check if we have a timer */                                          \
-    if (Timeout)                                                            \
-    {                                                                       \
-        /* Setup the timer */                                               \
-        KxSetTimerForThreadWait(Timer, *Timeout, &Hand);                    \
-                                                                            \
-        /* Save the due time for the caller */                              \
-        DueTime.QuadPart = Timer->DueTime.QuadPart;                         \
-                                                                            \
-        /* Pointer to timer block */                                        \
-        WaitBlock->NextWaitBlock = TimerBlock;                              \
-        TimerBlock->NextWaitBlock = WaitBlock;                              \
-                                                                            \
-        /* Link the timer to this Wait Block */                             \
-        Timer->Header.WaitListHead.Flink = &TimerBlock->WaitListEntry;      \
-        Timer->Header.WaitListHead.Blink = &TimerBlock->WaitListEntry;      \
-    }                                                                       \
-    else                                                                    \
-    {                                                                       \
-        /* No timer block, just ourselves */                                \
-        WaitBlock->NextWaitBlock = WaitBlock;                               \
-    }                                                                       \
-                                                                            \
-    /* Set wait settings */                                                 \
-    Thread->Alertable = Alertable;                                          \
-    Thread->WaitMode = WaitMode;                                            \
-    Thread->WaitReason = WaitReason;                                        \
-                                                                            \
-    /* Check if we can swap the thread's stack */                           \
-    Thread->WaitListEntry.Flink = NULL;                                     \
-    Swappable = KiCheckThreadStackSwap(Thread, WaitMode);                   \
-                                                                            \
-    /* Set the wait time */                                                 \
-    Thread->WaitTime = KeTickCount.LowPart;
-
-#define KxQueueThreadWait()                                                 \
-    /* Setup the Wait Block */                                              \
-    Thread->WaitBlockList = WaitBlock;                                      \
-    WaitBlock->WaitKey = STATUS_SUCCESS;                                    \
-    WaitBlock->Object = Queue;                                              \
-    WaitBlock->WaitType = WaitAny;                                          \
-    WaitBlock->Thread = Thread;                                             \
-                                                                            \
-    /* Clear wait status */                                                 \
-    Thread->WaitStatus = STATUS_SUCCESS;                                    \
-                                                                            \
-    /* Check if we have a timer */                                          \
-    if (Timeout)                                                            \
-    {                                                                       \
-        /* Setup the timer */                                               \
-        KxSetTimerForThreadWait(Timer, *Timeout, &Hand);                    \
-                                                                            \
-        /* Save the due time for the caller */                              \
-        DueTime.QuadPart = Timer->DueTime.QuadPart;                         \
-                                                                            \
-        /* Pointer to timer block */                                        \
-        WaitBlock->NextWaitBlock = TimerBlock;                              \
-        TimerBlock->NextWaitBlock = WaitBlock;                              \
-                                                                            \
-        /* Link the timer to this Wait Block */                             \
-        Timer->Header.WaitListHead.Flink = &TimerBlock->WaitListEntry;      \
-        Timer->Header.WaitListHead.Blink = &TimerBlock->WaitListEntry;      \
-    }                                                                       \
-    else                                                                    \
-    {                                                                       \
-        /* No timer block, just ourselves */                                \
-        WaitBlock->NextWaitBlock = WaitBlock;                               \
-    }                                                                       \
-                                                                            \
-    /* Set wait settings */                                                 \
-    Thread->Alertable = FALSE;                                              \
-    Thread->WaitMode = WaitMode;                                            \
-    Thread->WaitReason = WrQueue;                                           \
-                                                                            \
-    /* Check if we can swap the thread's stack */                           \
-    Thread->WaitListEntry.Flink = NULL;                                     \
-    Swappable = KiCheckThreadStackSwap(Thread, WaitMode);                   \
-                                                                            \
-    /* Set the wait time */                                                 \
-    Thread->WaitTime = KeTickCount.LowPart;
+FORCEINLINE
+VOID
+KiAcquireApcLock(IN PKTHREAD Thread,
+                 IN PKLOCK_QUEUE_HANDLE Handle)
+{
+    /* Acquire the lock and raise to synchronization level */
+    KeAcquireInStackQueuedSpinLockRaiseToSynch(&Thread->ApcQueueLock, Handle);
+}
 
-//
-// Unwaits a Thread
-//
 FORCEINLINE
 VOID
-KxUnwaitThread(IN DISPATCHER_HEADER *Object,
-               IN KPRIORITY Increment)
+KiAcquireApcLockAtDpcLevel(IN PKTHREAD Thread,
+                           IN PKLOCK_QUEUE_HANDLE Handle)
 {
-    PLIST_ENTRY WaitEntry, WaitList;
-    PKWAIT_BLOCK WaitBlock;
-    PKTHREAD WaitThread;
-    ULONG WaitKey;
+    /* Acquire the lock */
+    KeAcquireInStackQueuedSpinLockAtDpcLevel(&Thread->ApcQueueLock, Handle);
+}
 
-    /* Loop the Wait Entries */
-    WaitList = &Object->WaitListHead;
-    ASSERT(IsListEmpty(&Object->WaitListHead) == FALSE);
-    WaitEntry = WaitList->Flink;
-    do
-    {
-        /* Get the current wait block */
-        WaitBlock = CONTAINING_RECORD(WaitEntry, KWAIT_BLOCK, WaitListEntry);
+FORCEINLINE
+VOID
+KiAcquireApcLockAtApcLevel(IN PKTHREAD Thread,
+                           IN PKLOCK_QUEUE_HANDLE Handle)
+{
+    /* Acquire the lock */
+    KeAcquireInStackQueuedSpinLock(&Thread->ApcQueueLock, Handle);
+}
 
-        /* Get the waiting thread */
-        WaitThread = WaitBlock->Thread;
+FORCEINLINE
+VOID
+KiReleaseApcLock(IN PKLOCK_QUEUE_HANDLE Handle)
+{
+    /* Release the lock */
+    KeReleaseInStackQueuedSpinLock(Handle);
+}
 
-        /* Check the current Wait Mode */
-        if (WaitBlock->WaitType == WaitAny)
-        {
-            /* Use the actual wait key */
-            WaitKey = WaitBlock->WaitKey;
-        }
-        else
-        {
-            /* Otherwise, use STATUS_KERNEL_APC */
-            WaitKey = STATUS_KERNEL_APC;
-        }
+FORCEINLINE
+VOID
+KiReleaseApcLockFromDpcLevel(IN PKLOCK_QUEUE_HANDLE Handle)
+{
+    /* Release the lock */
+    KeReleaseInStackQueuedSpinLockFromDpcLevel(Handle);
+}
 
-        /* Unwait the thread */
-        KiUnwaitThread(WaitThread, WaitKey, Increment);
+FORCEINLINE
+VOID
+KiAcquireProcessLock(IN PKPROCESS Process,
+                     IN PKLOCK_QUEUE_HANDLE Handle)
+{
+    /* Acquire the lock and raise to synchronization level */
+    KeAcquireInStackQueuedSpinLockRaiseToSynch(&Process->ProcessLock, Handle);
+}
 
-        /* Next entry */
-        WaitEntry = WaitList->Flink;
-    } while (WaitEntry != WaitList);
+FORCEINLINE
+VOID
+KiReleaseProcessLock(IN PKLOCK_QUEUE_HANDLE Handle)
+{
+    /* Release the lock */
+    KeReleaseInStackQueuedSpinLock(Handle);
 }
 
-//
-// Unwaits a Thread waiting on an event
-//
 FORCEINLINE
 VOID
-KxUnwaitThreadForEvent(IN PKEVENT Event,
-                       IN KPRIORITY Increment)
+KiReleaseProcessLockFromDpcLevel(IN PKLOCK_QUEUE_HANDLE Handle)
 {
-    PLIST_ENTRY WaitEntry, WaitList;
-    PKWAIT_BLOCK WaitBlock;
-    PKTHREAD WaitThread;
+    /* Release the lock */
+    KeReleaseInStackQueuedSpinLockFromDpcLevel(Handle);
+}
 
-    /* Loop the Wait Entries */
-    WaitList = &Event->Header.WaitListHead;
-    ASSERT(IsListEmpty(&Event->Header.WaitListHead) == FALSE);
-    WaitEntry = WaitList->Flink;
-    do
+FORCEINLINE
+VOID
+KiAcquireDeviceQueueLock(IN PKDEVICE_QUEUE DeviceQueue,
+                         IN PKLOCK_QUEUE_HANDLE DeviceLock)
+{
+    /* Check if we were called from a threaded DPC */
+    if (KeGetCurrentPrcb()->DpcThreadActive)
     {
-        /* Get the current wait block */
-        WaitBlock = CONTAINING_RECORD(WaitEntry, KWAIT_BLOCK, WaitListEntry);
-
-        /* Get the waiting thread */
-        WaitThread = WaitBlock->Thread;
-
-        /* Check the current Wait Mode */
-        if (WaitBlock->WaitType == WaitAny)
-        {
-            /* Un-signal it */
-            Event->Header.SignalState = 0;
-
-            /* Un-signal the event and unwait the thread */
-            KiUnwaitThread(WaitThread, WaitBlock->WaitKey, Increment);
-            break;
-        }
-
-        /* Unwait the thread with STATUS_KERNEL_APC */
-        KiUnwaitThread(WaitThread, STATUS_KERNEL_APC, Increment);
+        /* Lock the Queue, we're not at DPC level */
+        KeAcquireInStackQueuedSpinLock(&DeviceQueue->Lock, DeviceLock);
+    }
+    else
+    {
+        /* We must be at DPC level, acquire the lock safely */
+        ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+        KeAcquireInStackQueuedSpinLockAtDpcLevel(&DeviceQueue->Lock,
+                                                 DeviceLock);
+    }
+}
 
-        /* Next entry */
-        WaitEntry = WaitList->Flink;
-    } while (WaitEntry != WaitList);
+FORCEINLINE
+VOID
+KiReleaseDeviceQueueLock(IN PKLOCK_QUEUE_HANDLE DeviceLock)
+{
+    /* Check if we were called from a threaded DPC */
+    if (KeGetCurrentPrcb()->DpcThreadActive)
+    {
+        /* Unlock the Queue, we're not at DPC level */
+        KeReleaseInStackQueuedSpinLock(DeviceLock);
+    }
+    else
+    {
+        /* We must be at DPC level, release the lock safely */
+        ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+        KeReleaseInStackQueuedSpinLockFromDpcLevel(DeviceLock);
+    }
 }
 
 //
@@ -1444,24 +1261,25 @@ PKTHREAD
 KiSelectReadyThread(IN KPRIORITY Priority,
                     IN PKPRCB Prcb)
 {
-    ULONG PrioritySet, HighPriority;
+    LONG PriorityMask, PrioritySet, HighPriority;
     PLIST_ENTRY ListEntry;
-    PKTHREAD Thread = NULL;
+    PKTHREAD Thread;
 
     /* Save the current mask and get the priority set for the CPU */
-    PrioritySet = Prcb->ReadySummary >> Priority;
-    if (!PrioritySet) goto Quickie;
+    PriorityMask = Priority;
+    PrioritySet = Prcb->ReadySummary >> (UCHAR)Priority;
+    if (!PrioritySet) return NULL;
 
-    /* Get the highest priority possible */
+    /*  Get the highest priority possible */
     BitScanReverse((PULONG)&HighPriority, PrioritySet);
     ASSERT((PrioritySet & PRIORITY_MASK(HighPriority)) != 0);
-    HighPriority += Priority;
+    HighPriority += PriorityMask;
 
-    /* Make sure the list isn't empty at the highest priority */
+    /* Make sure the list isn't at highest priority */
     ASSERT(IsListEmpty(&Prcb->DispatcherReadyListHead[HighPriority]) == FALSE);
 
     /* Get the first thread on the list */
-    ListEntry = Prcb->DispatcherReadyListHead[HighPriority].Flink;
+    ListEntry = &Prcb->DispatcherReadyListHead[HighPriority];
     Thread = CONTAINING_RECORD(ListEntry, KTHREAD, WaitListEntry);
 
     /* Make sure this thread is here for a reason */
@@ -1470,14 +1288,14 @@ KiSelectReadyThread(IN KPRIORITY Priority,
     ASSERT(Thread->NextProcessor == Prcb->Number);
 
     /* Remove it from the list */
-    if (RemoveEntryList(&Thread->WaitListEntry))
+    RemoveEntryList(&Thread->WaitListEntry);
+    if (IsListEmpty(&Thread->WaitListEntry))
     {
         /* The list is empty now, reset the ready summary */
         Prcb->ReadySummary ^= PRIORITY_MASK(HighPriority);
     }
 
     /* Sanity check and return the thread */
-Quickie:
     ASSERT((Thread == NULL) ||
            (Thread->BasePriority == 0) ||
            (Thread->Priority != 0));
@@ -1490,8 +1308,7 @@ Quickie:
 //
 SCHAR
 FORCEINLINE
-KiComputeNewPriority(IN PKTHREAD Thread,
-                     IN SCHAR Adjustment)
+KiComputeNewPriority(IN PKTHREAD Thread)
 {
     SCHAR Priority;
 
@@ -1506,7 +1323,7 @@ KiComputeNewPriority(IN PKTHREAD Thread,
     if (Priority < LOW_REALTIME_PRIORITY)
     {
         /* Decrease priority by the priority decrement */
-        Priority -= (Thread->PriorityDecrement + Adjustment);
+        Priority -= (Thread->PriorityDecrement + 1);
 
         /* Don't go out of bounds */
         if (Priority < Thread->BasePriority) Priority = Thread->BasePriority;
@@ -1537,4 +1354,3 @@ KeGetPreviousMode(VOID)
     /* Return the current mode */
     return KeGetCurrentThread()->PreviousMode;
 }
-
index ad94502..8803f81 100644 (file)
@@ -1,64 +1,91 @@
-/*
-* PROJECT:         ReactOS Kernel
-* LICENSE:         GPL - See COPYING in the top level directory
-* FILE:            ntoskrnl/include/lpc.h
-* PURPOSE:         Internal header for the Local Procedure Call
-* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
-*/
-
-//
-// Define this if you want debugging support
-//
-#define _LPC_DEBUG_                                         0x01
-
-//
-// These define the Debug Masks Supported
-//
-#define LPC_CREATE_DEBUG                                    0x01
-#define LPC_CLOSE_DEBUG                                     0x02
-#define LPC_CONNECT_DEBUG                                   0x04
-#define LPC_LISTEN_DEBUG                                    0x08
-#define LPC_REPLY_DEBUG                                     0x10
-#define LPC_COMPLETE_DEBUG                                  0x20
-#define LPC_SEND_DEBUG                                      0x40
-
-//
-// Debug/Tracing support
-//
-#if _LPC_DEBUG_
-#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
-#define LPCTRACE(x, ...)                                    \
-    {                                                       \
-        DbgPrintEx("%s [%.16s] - ",                         \
-                   __FUNCTION__,                            \
-                   PsGetCurrentProcess()->ImageFileName);   \
-        DbgPrintEx(__VA_ARGS__);                            \
-    }
-#else
-#define LPCTRACE(x, ...)                                    \
-    if (x & LpcpTraceLevel)                                 \
-    {                                                       \
-        DbgPrint("%s [%.16s:%lx] - ",                       \
-                 __FUNCTION__,                              \
-                 PsGetCurrentProcess()->ImageFileName,      \
-                 PsGetCurrentThreadId());                   \
-        DbgPrint(__VA_ARGS__);                              \
-    }
-#endif
+#ifndef __INCLUDE_INTERNAL_PORT_H
+#define __INCLUDE_INTERNAL_PORT_H
+
+/* EPORT.Type */
+
+#define EPORT_TYPE_SERVER_RQST_PORT   (0)
+#define EPORT_TYPE_SERVER_COMM_PORT   (1)
+#define EPORT_TYPE_CLIENT_COMM_PORT   (2)
+
+/* EPORT.State */
+
+#define EPORT_INACTIVE                (0)
+#define EPORT_WAIT_FOR_CONNECT        (1)
+#define EPORT_WAIT_FOR_ACCEPT         (2)
+#define EPORT_WAIT_FOR_COMPLETE_SRV   (3)
+#define EPORT_WAIT_FOR_COMPLETE_CLT   (4)
+#define EPORT_CONNECTED_CLIENT        (5)
+#define EPORT_CONNECTED_SERVER        (6)
+#define EPORT_DISCONNECTED            (7)
+
+extern POBJECT_TYPE LpcPortObjectType;
+extern ULONG        LpcpNextMessageId;
+#ifndef NTLPC
+extern FAST_MUTEX   LpcpLock;
 #endif
 
-//
-// LPC Port/Message Flags
-//
-#define LPCP_THREAD_FLAG_IS_PORT                            1
-#define LPCP_THREAD_FLAG_NO_IMPERSONATION                   2
-#define LPCP_THREAD_FLAGS                                   (LPCP_THREAD_FLAG_IS_PORT | \
-                                                             LPCP_THREAD_FLAG_NO_IMPERSONATION)
-
-//
-// Internal Port Management
-//
-VOID
+typedef struct _EPORT_LISTENER
+{
+    HANDLE ListenerPid;
+    LIST_ENTRY ListenerListEntry;
+} EPORT_LISTENER, *PEPORT_LISTENER;
+
+typedef struct _EPORT
+{
+    KSPIN_LOCK Lock;
+    KSEMAPHORE Semaphore;
+    USHORT Type;
+    USHORT State;
+    struct _EPORT *RequestPort;
+    struct _EPORT *OtherPort;
+    ULONG QueueLength;
+    LIST_ENTRY QueueListHead;
+    ULONG ConnectQueueLength;
+    LIST_ENTRY ConnectQueueListHead;
+    ULONG MaxDataLength;
+    ULONG MaxConnectInfoLength;
+    ULONG MaxPoolUsage; /* size of NP zone */
+} EPORT, *PEPORT;
+
+typedef struct _EPORT_CONNECT_REQUEST_MESSAGE
+{
+    PORT_MESSAGE MessageHeader;
+    PEPROCESS ConnectingProcess;
+    struct _SECTION_OBJECT* SendSectionObject;
+    LARGE_INTEGER SendSectionOffset;
+    ULONG SendViewSize;
+    ULONG ConnectDataLength;
+    UCHAR ConnectData[0];
+} EPORT_CONNECT_REQUEST_MESSAGE, *PEPORT_CONNECT_REQUEST_MESSAGE;
+
+typedef struct _EPORT_CONNECT_REPLY_MESSAGE
+{
+    PORT_MESSAGE MessageHeader;
+    PVOID SendServerViewBase;
+    ULONG ReceiveClientViewSize;
+    PVOID ReceiveClientViewBase;
+    ULONG MaximumMessageSize;
+    ULONG ConnectDataLength;
+    UCHAR ConnectData[0];
+} EPORT_CONNECT_REPLY_MESSAGE, *PEPORT_CONNECT_REPLY_MESSAGE;
+
+typedef struct _QUEUEDMESSAGE
+{
+    PEPORT Sender;
+    LIST_ENTRY QueueListEntry;
+    PORT_MESSAGE Message;
+} QUEUEDMESSAGE, *PQUEUEDMESSAGE;
+
+NTSTATUS
+NTAPI
+LpcSendTerminationPort(
+    PEPORT Port,
+    LARGE_INTEGER CreationTime
+);
+
+/* Code in ntoskrnl/lpc/close.c */
+
+VOID 
 NTAPI
 LpcpClosePort(
     IN PEPROCESS Process OPTIONAL,
@@ -70,70 +97,66 @@ LpcpClosePort(
 
 VOID
 NTAPI
-LpcpDeletePort(
-    IN PVOID ObjectBody
-);
+LpcpDeletePort(IN PVOID ObjectBody);
 
-NTSTATUS
+VOID
 NTAPI
-LpcpInitializePortQueue(
-    IN PLPCP_PORT_OBJECT Port
-);
+LpcExitThread(IN PETHREAD Thread);
+
+/* Code in ntoskrnl/lpc/queue.c */
 
 VOID
 NTAPI
-LpcpFreeToPortZone(
-    IN PLPCP_MESSAGE Message,
-    IN ULONG Flags
+EiEnqueueConnectMessagePort(
+    IN OUT PEPORT Port,
+    IN PQUEUEDMESSAGE Message
 );
 
 VOID
 NTAPI
-LpcpMoveMessage(
-    IN PPORT_MESSAGE Destination,
-    IN PPORT_MESSAGE Origin,
-    IN PVOID Data,
-    IN ULONG MessageType,
-    IN PCLIENT_ID ClientId
+EiEnqueueMessagePort(
+    IN OUT PEPORT Port,
+    IN PQUEUEDMESSAGE Message
 );
 
 VOID
 NTAPI
-LpcpSaveDataInfoMessage(
-    IN PLPCP_PORT_OBJECT Port,
-    IN PLPCP_MESSAGE Message,
-    IN ULONG LockHeld
+EiEnqueueMessageAtHeadPort(
+    IN OUT PEPORT Port,
+    IN PQUEUEDMESSAGE Message
 );
 
-//
-// Module-external utlity functions
-//
-VOID
+PQUEUEDMESSAGE
+NTAPI
+EiDequeueConnectMessagePort(IN OUT PEPORT Port);
+
+PQUEUEDMESSAGE
 NTAPI
-LpcExitThread(
-    IN PETHREAD Thread
+EiDequeueMessagePort(IN OUT PEPORT Port);
+
+/* Code in ntoskrnl/lpc/port.c */
+
+NTSTATUS
+NTAPI
+LpcpInitializePort(
+    IN OUT PEPORT Port,
+    IN USHORT Type,
+    IN PEPORT Parent OPTIONAL
 );
 
-//
-// Initialization functions
-//
-BOOLEAN
+NTSTATUS
 NTAPI
-LpcInitSystem(
-    VOID
+LpcpInitSystem (VOID);
+
+/* Code in ntoskrnl/lpc/reply.c */
+
+NTSTATUS
+NTAPI
+EiReplyOrRequestPort(
+    IN PEPORT Port,
+    IN PPORT_MESSAGE LpcReply,
+    IN ULONG MessageType,
+    IN PEPORT Sender
 );
 
-//
-// Global data inside the Process Manager
-//
-extern POBJECT_TYPE LpcPortObjectType;
-extern ULONG LpcpNextMessageId, LpcpNextCallbackId;
-extern KGUARDED_MUTEX LpcpLock;
-extern PAGED_LOOKASIDE_LIST LpcpMessagesLookaside;
-extern ULONG LpcpMaxMessageSize;
-extern ULONG LpcpTraceLevel;
-
-//
-// Inlined Functions
-//
-#include "lpc_x.h"
+#endif /* __INCLUDE_INTERNAL_PORT_H */
index 2c5f3e7..e63bdec 100644 (file)
@@ -550,10 +550,13 @@ MmInit1(
     ULONG MaxMemInMeg
 );
 
-BOOLEAN
+VOID
+NTAPI
+MmInit2(VOID);
+
+VOID
 NTAPI
-MmInitSystem(IN ULONG Phase,
-             IN PLOADER_PARAMETER_BLOCK LoaderBlock);
+MmInit3(VOID);
 
 VOID
 NTAPI
@@ -1400,10 +1403,6 @@ NTSTATUS
 NTAPI
 MmInitMpwThread(VOID);
 
-NTSTATUS
-NTAPI
-MmInitBsmThread(VOID);
-
 /* pager.c *******************************************************************/
 
 BOOLEAN
index a05ba07..a26fbf0 100644 (file)
@@ -66,6 +66,7 @@ typedef struct __DESCRIPTOR
 /*
  * Initalization functions (called once by main())
  */
+VOID MmInitSystem(ULONG Phase, PLOADER_PARAMETER_BLOCK LoaderBlock, ULONG LastKernelAddress);
 BOOLEAN NTAPI ObInit(VOID);
 BOOLEAN NTAPI CmInitSystem1(VOID);
 VOID CmShutdownRegistry(VOID);
index a4e7fa9..2762164 100644 (file)
      GENERIC_EXECUTE |                                  \
      GENERIC_ALL)
 
-//
-// Handle Bit Flags
-//
-#define OBJ_PROTECT_CLOSE                               0x01
-//#define OBJ_INHERIT                                   0x02
-#define OBJ_AUDIT_OBJECT_CLOSE                          0x04
-#define OBJ_HANDLE_ATTRIBUTES                           (OBJ_PROTECT_CLOSE |\
-                                                         OBJ_INHERIT |      \
-                                                         OBJ_AUDIT_OBJECT_CLOSE)
-
 //
 // Identifies a Kernel Handle
 //
 #define ObpGetHandleCountByHandleTable(HandleTable)     \
     ((PHANDLE_TABLE)HandleTable)->HandleCount
 
-//
-// Converts from an EXHANDLE object to a POBJECT_HEADER
-//
-#define ObpGetHandleObject(x)                           \
-    ((POBJECT_HEADER)((ULONG_PTR)x->Object & ~OBJ_HANDLE_ATTRIBUTES))
-
 //
 // Context Structures for Ex*Handle Callbacks
 //
@@ -95,33 +79,6 @@ typedef struct _OBP_CLOSE_HANDLE_CONTEXT
     PHANDLE_TABLE HandleTable;
     KPROCESSOR_MODE AccessMode;
 } OBP_CLOSE_HANDLE_CONTEXT, *POBP_CLOSE_HANDLE_CONTEXT;
-typedef struct _OBP_FIND_HANDLE_DATA
-{
-    POBJECT_HEADER ObjectHeader;
-    POBJECT_TYPE ObjectType;
-    POBJECT_HANDLE_INFORMATION HandleInformation;
-} OBP_FIND_HANDLE_DATA, *POBP_FIND_HANDLE_DATA;
-
-//
-// Structure for quick-compare of a DOS Device path
-//
-typedef union
-{
-    WCHAR Name[sizeof(ULARGE_INTEGER) / sizeof(WCHAR)];
-    ULARGE_INTEGER Alignment;
-} ALIGNEDNAME;
-
-//
-// Private Temporary Buffer for Lookup Routines
-//
-#define TAG_OB_TEMP_STORAGE TAG('O', 'b', 'S', 't')
-typedef struct _OB_TEMP_BUFFER
-{
-    ACCESS_STATE LocalAccessState;
-    OBJECT_CREATE_INFORMATION ObjectCreateInfo;
-    OBP_LOOKUP_CONTEXT LookupContext;
-    AUX_DATA AuxData;
-} OB_TEMP_BUFFER, *POB_TEMP_BUFFER;
 
 //
 // Directory Namespace Functions
@@ -174,18 +131,6 @@ ObpParseSymbolicLink(
     OUT PVOID *NextObject
 );
 
-VOID
-NTAPI
-ObpCreateSymbolicLinkName(
-    IN POBJECT_SYMBOLIC_LINK SymbolicLink
-);
-
-VOID
-NTAPI
-ObpDeleteSymbolicLinkName(
-    IN POBJECT_SYMBOLIC_LINK SymbolicLink
-);
-
 //
 // Process/Handle Table Init/Rundown
 //
@@ -196,18 +141,6 @@ ObpCreateHandleTable(
     IN PEPROCESS Process
 );
 
-PHANDLE_TABLE
-NTAPI
-ObReferenceProcessHandleTable(
-    IN PEPROCESS Process
-);
-
-VOID
-NTAPI
-ObDereferenceProcessHandleTable(
-    IN PEPROCESS Process
-);
-
 VOID
 NTAPI
 ObKillProcess(
@@ -219,18 +152,18 @@ ObKillProcess(
 //
 NTSTATUS
 NTAPI
-ObpLookupObjectName(
+ObFindObject(
     IN HANDLE RootHandle,
     IN PUNICODE_STRING ObjectName,
     IN ULONG Attributes,
+    IN KPROCESSOR_MODE PreviousMode,
+    IN PVOID *ReturnedObject,
     IN POBJECT_TYPE ObjectType,
-    IN KPROCESSOR_MODE AccessMode,
-    IN OUT PVOID ParseContext,
-    IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
-    IN PVOID InsertObject,
+    IN POBP_LOOKUP_CONTEXT Context,
     IN PACCESS_STATE AccessState,
-    IN POBP_LOOKUP_CONTEXT LookupContext,
-    OUT PVOID *FoundObject
+    IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
+    IN PVOID ParseContext,
+    IN PVOID Insert
 );
 
 //
@@ -239,8 +172,9 @@ ObpLookupObjectName(
 BOOLEAN
 NTAPI
 ObpSetHandleAttributes(
+    IN PHANDLE_TABLE HandleTable,
     IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry,
-    IN ULONG_PTR Context
+    IN PVOID Context
 );
 
 VOID
@@ -324,12 +258,6 @@ ObFreeObjectCreateInfoBuffer(
     IN POBJECT_CREATE_INFORMATION ObjectCreateInfo
 );
 
-VOID
-NTAPI
-ObpFreeObjectNameBuffer(
-    IN PUNICODE_STRING Name
-);
-
 //
 // DOS Devices Functions
 //
@@ -339,12 +267,6 @@ ObDereferenceDeviceMap(
     IN PEPROCESS Process
 );
 
-VOID
-FASTCALL
-ObfDereferenceDeviceMap(
-    IN PVOID DeviceMap
-);
-
 VOID
 NTAPI
 ObInheritDeviceMap(
@@ -392,52 +314,16 @@ ObpDereferenceCachedSecurityDescriptor(
     IN PSECURITY_DESCRIPTOR SecurityDescriptor
 );
 
-//
-// Object Security Routines
-//
 BOOLEAN
 NTAPI
 ObCheckObjectAccess(
     IN PVOID Object,
     IN OUT PACCESS_STATE AccessState,
-    IN BOOLEAN LockHeld,
+    IN BOOLEAN Unknown,
     IN KPROCESSOR_MODE AccessMode,
     OUT PNTSTATUS ReturnedStatus
 );
 
-BOOLEAN
-NTAPI
-ObCheckCreateObjectAccess(
-    IN PVOID Object,
-    IN ACCESS_MASK CreateAccess,
-    IN PACCESS_STATE AccessState,
-    IN PUNICODE_STRING ComponentName,
-    IN BOOLEAN LockHeld,
-    IN KPROCESSOR_MODE AccessMode,
-    OUT PNTSTATUS AccessStatus
-);
-
-BOOLEAN
-NTAPI
-ObpCheckTraverseAccess(
-    IN PVOID Object,
-    IN ACCESS_MASK TraverseAccess,
-    IN PACCESS_STATE AccessState OPTIONAL,
-    IN BOOLEAN LockHeld,
-    IN KPROCESSOR_MODE AccessMode,
-    OUT PNTSTATUS AccessStatus
-);
-
-BOOLEAN
-NTAPI
-ObpCheckObjectReference(
-    IN PVOID Object,
-    IN OUT PACCESS_STATE AccessState,
-    IN BOOLEAN LockHeld,
-    IN KPROCESSOR_MODE AccessMode,
-    OUT PNTSTATUS AccessStatus
-);
-
 //
 // Executive Fast Referencing Functions
 //
@@ -511,9 +397,6 @@ extern WORK_QUEUE_ITEM ObpReaperWorkItem;
 extern volatile PVOID ObpReaperList;
 extern NPAGED_LOOKASIDE_LIST ObpNmLookasideList, ObpCiLookasideList;
 extern BOOLEAN IoCountOperations;
-extern ALIGNEDNAME ObpDosDevicesShortNamePrefix;
-extern ALIGNEDNAME ObpDosDevicesShortNameRoot;
-extern UNICODE_STRING ObpDosDevicesShortName;
 
 //
 // Inlined Functions
index bd56667..c09fb5e 100644 (file)
 * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
 */
 
-#include "ex.h"
-
-#define OBP_LOCK_STATE_PRE_ACQUISITION_EXCLUSIVE    0xAAAA1234
-#define OBP_LOCK_STATE_PRE_ACQUISITION_SHARED       0xBBBB1234
-#define OBP_LOCK_STATE_POST_ACQUISITION_EXCLUSIVE   0xCCCC1234
-#define OBP_LOCK_STATE_POST_ACQUISITION_SHARED      0xDDDD1234
-#define OBP_LOCK_STATE_RELEASED                     0xEEEE1234
-#define OBP_LOCK_STATE_INITIALIZED                  0xFFFF1234
-
-POBJECT_HEADER_NAME_INFO
+#if DBG
+VOID
 FORCEINLINE
-ObpAcquireNameInformation(IN POBJECT_HEADER ObjectHeader)
+ObpCalloutStart(IN PKIRQL CalloutIrql)
 {
-    POBJECT_HEADER_NAME_INFO ObjectNameInfo;
-    ULONG NewValue, References;
-
-    /* Make sure we have name information at all */
-    ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
-    if (!ObjectNameInfo) return NULL;
-
-    /* Get the number of references */
-    References = ObjectNameInfo->QueryReferences;
-    for (;;)
-    {
-        /* Check if the count is 0 and fail if so */
-        if (!References) return NULL;
-
-        /* Increment the number of references */
-        NewValue = InterlockedCompareExchange((PLONG)&ObjectNameInfo->
-                                              QueryReferences,
-                                              References + 1,
-                                              References);
-        if (NewValue == References) break;
-
-        /* We failed, try again */
-        References = NewValue;
-    }
-
-    /* Check for magic flag */
-    if (ObjectNameInfo->QueryReferences & 0x80000000)
-    {
-        /* FIXME: Unhandled*/
-        DbgPrint("OB: Unhandled path\n");
-        KEBUGCHECK(0);
-    }
-
-    /* Return the name information */
-    return ObjectNameInfo;
+    /* Save the callout IRQL */
+    *CalloutIrql = KeGetCurrentIrql();
 }
 
 VOID
 FORCEINLINE
-ObpReleaseNameInformation(IN POBJECT_HEADER_NAME_INFO HeaderNameInfo)
+ObpCalloutEnd(IN KIRQL CalloutIrql,
+              IN PCHAR Procedure,
+              IN POBJECT_TYPE ObjectType,
+              IN PVOID Object)
 {
-    POBJECT_DIRECTORY Directory;
-
-    /* Bail out if there's no info at all */
-    if (!HeaderNameInfo) return;
-
-    /* Remove a query reference and check if it was the last one */
-    if (!InterlockedDecrement((PLONG)&HeaderNameInfo->QueryReferences))
+    /* Detect IRQL change */
+    if (CalloutIrql != KeGetCurrentIrql())
     {
-        /* Check if we have a name */
-        if (HeaderNameInfo->Name.Buffer)
-        {
-            /* We can get rid of the object name now */
-            ExFreePool(HeaderNameInfo->Name.Buffer);
-            RtlInitEmptyUnicodeString(&HeaderNameInfo->Name, NULL, 0);
-        }
-
-        /* Check if the object has a directory associated to it */
-        Directory = HeaderNameInfo->Directory;
-        if (Directory)
-        {
-            /* Delete the directory */
-            HeaderNameInfo->Directory = NULL;
-            ObDereferenceObjectDeferDelete(Directory);
-        }
+        /* Print error */
+        DbgPrint("OB: ObjectType: %wZ  Procedure: %s  Object: %08x\n",
+                 &ObjectType->Name, Procedure, Object);
+        DbgPrint("    Returned at %x IRQL, but was called at %x IRQL\n",
+                 KeGetCurrentIrql(), CalloutIrql);
+        DbgBreakPoint();
     }
 }
-
-VOID
-FORCEINLINE
-ObpAcquireDirectoryLockShared(IN POBJECT_DIRECTORY Directory,
-                               IN POBP_LOOKUP_CONTEXT Context)
-{
-    /* It's not, set lock flag */
-    Context->LockStateSignature = OBP_LOCK_STATE_PRE_ACQUISITION_SHARED;
-
-    /* Lock it */
-    KeEnterCriticalRegion();
-    ExAcquirePushLockShared(&Directory->Lock);
-
-    /* Update lock flag */
-    Context->LockStateSignature = OBP_LOCK_STATE_POST_ACQUISITION_SHARED;
-}
-
-VOID
-FORCEINLINE
-ObpAcquireDirectoryLockExclusive(IN POBJECT_DIRECTORY Directory,
-                                  IN POBP_LOOKUP_CONTEXT Context)
-{
-    /* Update lock flag */
-    Context->LockStateSignature = OBP_LOCK_STATE_PRE_ACQUISITION_EXCLUSIVE;
-
-    /* Acquire an exclusive directory lock */
-    KeEnterCriticalRegion();
-    ExAcquirePushLockExclusive(&Directory->Lock);
-
-    /* Set the directory */
-    Context->Directory = Directory;
-
-    /* Update lock settings */
-    Context->LockStateSignature = OBP_LOCK_STATE_POST_ACQUISITION_EXCLUSIVE;
-    Context->DirectoryLocked = TRUE;
-}
-
-VOID
-FORCEINLINE
-ObpReleaseDirectoryLock(IN POBJECT_DIRECTORY Directory,
-                         IN POBP_LOOKUP_CONTEXT Context)
-{
-    /* Release the lock */
-    ExReleasePushLock(&Directory->Lock);
-    Context->LockStateSignature = OBP_LOCK_STATE_RELEASED;
-    KeLeaveCriticalRegion();
-}
-
-VOID
-FORCEINLINE
-ObpInitializeDirectoryLookup(IN POBP_LOOKUP_CONTEXT Context)
-{
-    /* Initialize a null context */
-    Context->Object = NULL;
-    Context->Directory = NULL;
-    Context->DirectoryLocked = FALSE;
-    Context->LockStateSignature = OBP_LOCK_STATE_INITIALIZED;
-}
-
+#else
 VOID
 FORCEINLINE
-ObpReleaseLookupContextObject(IN POBP_LOOKUP_CONTEXT Context)
+ObpCalloutStart(IN PKIRQL CalloutIrql)
 {
-    POBJECT_HEADER ObjectHeader;
-    POBJECT_HEADER_NAME_INFO HeaderNameInfo;
-
-    /* Check if we had found an object */
-    if (Context->Object)
-    {
-        /* Get the object name information */
-        ObjectHeader = OBJECT_TO_OBJECT_HEADER(Context->Object);
-        HeaderNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
-
-        /* release the name information */
-        ObpReleaseNameInformation(HeaderNameInfo);
-
-        /* Dereference the object */
-        ObDereferenceObject(Context->Object);
-        Context->Object = NULL;
-    }
+    /* No-op */
+    UNREFERENCED_PARAMETER(CalloutIrql);
 }
 
 VOID
 FORCEINLINE
-ObpCleanupDirectoryLookup(IN POBP_LOOKUP_CONTEXT Context)
+ObpCalloutEnd(IN KIRQL CalloutIrql,
+              IN PCHAR Procedure,
+              IN POBJECT_TYPE ObjectType,
+              IN PVOID Object)
 {
-    /* Check if we came back with the directory locked */
-    if (Context->DirectoryLocked)
-    {
-        /* Release the lock */
-        ObpReleaseDirectoryLock(Context->Directory, Context);
-        Context->Directory = NULL;
-        Context->DirectoryLocked = FALSE;
-    }
-
-    /* Clear the context  */
-    ObpReleaseLookupContextObject(Context);
+    UNREFERENCED_PARAMETER(CalloutIrql);
 }
+#endif
 
 VOID
 FORCEINLINE
@@ -262,7 +130,7 @@ ObpAllocateCapturedAttributes(IN PP_NPAGED_LOOKASIDE_NUMBER Type)
 }
 
 VOID
-FORCEINLINE
+static __inline
 ObpFreeCapturedAttributes(IN PVOID Buffer,
                           IN PP_NPAGED_LOOKASIDE_NUMBER Type)
 {
@@ -300,57 +168,27 @@ ObpFreeCapturedAttributes(IN PVOID Buffer,
 }
 
 VOID
-FORCEINLINE
-ObpFreeAndReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo)
+static __inline
+ObpReleaseCapturedName(IN PUNICODE_STRING Name)
 {
-    /* First release the attributes, then free them from the lookaside list */
-    ObpReleaseCapturedAttributes(ObjectCreateInfo);
-    ObpFreeCapturedAttributes(ObjectCreateInfo, LookasideCreateInfoList);
-}
-
-#if DBG
-VOID
-FORCEINLINE
-ObpCalloutStart(IN PKIRQL CalloutIrql)
-{
-    /* Save the callout IRQL */
-    *CalloutIrql = KeGetCurrentIrql();
-}
-
-VOID
-FORCEINLINE
-ObpCalloutEnd(IN KIRQL CalloutIrql,
-              IN PCHAR Procedure,
-              IN POBJECT_TYPE ObjectType,
-              IN PVOID Object)
-{
-    /* Detect IRQL change */
-    if (CalloutIrql != KeGetCurrentIrql())
+    /* We know this is a pool-allocation if the size doesn't match */
+    if (Name->MaximumLength != 248)
     {
-        /* Print error */
-        DbgPrint("OB: ObjectType: %wZ  Procedure: %s  Object: %08x\n",
-                 &ObjectType->Name, Procedure, Object);
-        DbgPrint("    Returned at %x IRQL, but was called at %x IRQL\n",
-                 KeGetCurrentIrql(), CalloutIrql);
-        DbgBreakPoint();
+        ExFreePool(Name->Buffer);
+    }
+    else
+    {
+        /* Otherwise, free from the lookaside */
+        ObpFreeCapturedAttributes(Name, LookasideNameBufferList);
     }
-}
-#else
-VOID
-FORCEINLINE
-ObpCalloutStart(IN PKIRQL CalloutIrql)
-{
-    /* No-op */
-    UNREFERENCED_PARAMETER(CalloutIrql);
 }
 
 VOID
-FORCEINLINE
-ObpCalloutEnd(IN KIRQL CalloutIrql,
-              IN PCHAR Procedure,
-              IN POBJECT_TYPE ObjectType,
-              IN PVOID Object)
+static __inline
+ObpFreeAndReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo)
 {
-    UNREFERENCED_PARAMETER(CalloutIrql);
+    /* First release the attributes, then free them from the lookaside list */
+    ObpReleaseCapturedAttributes(ObjectCreateInfo);
+    ObpFreeCapturedAttributes(ObjectCreateInfo, LookasideCreateInfoList);
 }
-#endif
+
index c627dfb..7db0f12 100644 (file)
@@ -35,9 +35,9 @@
 //
 // Initialization routines
 //
-BOOLEAN
+VOID
 NTAPI
-PoInitSystem(
+PoInit(
     IN ULONG BootPhase,
     IN BOOLEAN HaveAcpiTable
 );
index 79c7f7a..68732b4 100644 (file)
@@ -82,7 +82,7 @@ PspShutdownProcessManager(
 BOOLEAN
 NTAPI
 PsInitSystem(
-    IN PLOADER_PARAMETER_BLOCK LoaderBlock
+    VOID
 );
 
 //
@@ -175,7 +175,7 @@ NTAPI
 PspSetPrimaryToken(
     IN PEPROCESS Process,
     IN HANDLE TokenHandle OPTIONAL,
-    IN PACCESS_TOKEN Token OPTIONAL
+    IN PTOKEN Token OPTIONAL
 );
 
 NTSTATUS
@@ -365,11 +365,14 @@ extern KGUARDED_MUTEX PspActiveProcessMutex;
 extern LARGE_INTEGER ShortPsLockDelay;
 extern EPROCESS_QUOTA_BLOCK PspDefaultQuotaBlock;
 extern PHANDLE_TABLE PspCidTable;
-extern EX_CALLBACK PspThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
-extern EX_CALLBACK PspProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
-extern EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
+extern PCREATE_THREAD_NOTIFY_ROUTINE
+PspThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
+extern PCREATE_PROCESS_NOTIFY_ROUTINE
+PspProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
+extern PLOAD_IMAGE_NOTIFY_ROUTINE
+PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
 extern PLEGO_NOTIFY_ROUTINE PspLegoNotifyRoutine;
-extern ULONG PspThreadNotifyRoutineCount, PspProcessNotifyRoutineCount;
+extern ULONG PspThreadNotifyRoutineCount;
 extern BOOLEAN PsImageNotifyEnabled;
 extern PKWIN32_PROCESS_CALLOUT PspW32ProcessCallout;
 extern PKWIN32_THREAD_CALLOUT PspW32ThreadCallout;
index 0431c45..ea26b35 100644 (file)
@@ -33,19 +33,13 @@ PspRunCreateThreadNotifyRoutines(IN PETHREAD CurrentThread,
                                  IN BOOLEAN Create)
 {
     ULONG i;
+    CLIENT_ID Cid = CurrentThread->Cid;
 
-    /* Check if we have registered routines */
-    if (PspThreadNotifyRoutineCount)
+    /* Loop the notify routines */
+    for (i = 0; i < PspThreadNotifyRoutineCount; i++)
     {
-        /* Loop callbacks */
-        for (i = 0; i < PSP_MAX_CREATE_THREAD_NOTIFY; i++)
-        {
-            /* Do the callback */
-            ExDoCallBack(&PspThreadNotifyRoutine[i],
-                         CurrentThread->Cid.UniqueProcess,
-                         CurrentThread->Cid.UniqueThread,
-                         (PVOID)(ULONG_PTR)Create);
-        }
+        /* Call it */
+        PspThreadNotifyRoutine[i](Cid.UniqueProcess, Cid.UniqueThread, Create);
     }
 }
 
@@ -55,18 +49,17 @@ PspRunCreateProcessNotifyRoutines(IN PEPROCESS CurrentProcess,
                                   IN BOOLEAN Create)
 {
     ULONG i;
+    HANDLE ProcessId = (HANDLE)CurrentProcess->UniqueProcessId;
+    HANDLE ParentId = CurrentProcess->InheritedFromUniqueProcessId;
 
-    /* Check if we have registered routines */
-    if (PspProcessNotifyRoutineCount)
+    /* Loop the notify routines */
+    for(i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; ++i)
     {
-        /* Loop callbacks */
-        for (i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++)
+        /* Make sure it exists */
+        if(PspProcessNotifyRoutine[i])
         {
-            /* Do the callback */
-            ExDoCallBack(&PspProcessNotifyRoutine[i],
-                         CurrentProcess->InheritedFromUniqueProcessId,
-                         (PVOID)(ULONG_PTR)Create,
-                         NULL);
+            /* Call it */
+            PspProcessNotifyRoutine[i](ParentId, ProcessId, Create);
         }
     }
 }
@@ -82,11 +75,12 @@ PspRunLoadImageNotifyRoutines(PUNICODE_STRING FullImageName,
     /* Loop the notify routines */
     for (i = 0; i < PSP_MAX_LOAD_IMAGE_NOTIFY; ++ i)
     {
-        /* Do the callback */
-        ExDoCallBack(&PspLoadImageNotifyRoutine[i],
-                     FullImageName,
-                     ProcessId,
-                     ImageInfo);
+        /* Make sure it exists */
+        if (PspLoadImageNotifyRoutine[i])
+        {
+            /* Call it */
+            PspLoadImageNotifyRoutine[i](FullImageName, ProcessId, ImageInfo);
+        }
     }
 }
 
index f43dba3..ddddc6d 100644 (file)
@@ -8,9 +8,7 @@
 
 /* INCLUDES ******************************************************************/
 
-/* Always target Windows 2003 Service Pack 1 */
-#define _WIN32_WINNT _WIN32_WINNT_WS03
-#define NTDDI_VERSION NTDDI_WS03SP1
+/* Tells the WDK that we don't want to import */
 #define NTKERNELAPI
 
 /* DDK/IFS/NDK Headers */
index 52922c6..93d3b9b 100644 (file)
@@ -28,7 +28,7 @@ IoAllocateController(IN PCONTROLLER_OBJECT ControllerObject,
                      IN PVOID Context)
 {
     IO_ALLOCATION_ACTION Result;
-    ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
+    ASSERT_IRQL(DISPATCH_LEVEL);
 
     /* Initialize the Wait Context Block */
     DeviceObject->Queue.Wcb.DeviceContext = Context;
index 31f4ba3..15d73e8 100644 (file)
@@ -632,7 +632,7 @@ IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject,
     NTSTATUS Status;
     PEXTENDED_DEVOBJ_EXTENSION DeviceObjectExtension;
 
-    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+    ASSERT_IRQL(PASSIVE_LEVEL);
 
     DPRINT("IoRegisterDeviceInterface(): PDO %p, RefString: %wZ\n",
         PhysicalDeviceObject, ReferenceString);
index e959c05..a3ebe19 100644 (file)
@@ -30,6 +30,7 @@ UNICODE_STRING IopHardwareDatabaseKey =
 POBJECT_TYPE IoDriverObjectType = NULL;
 
 extern BOOLEAN ExpInTextModeSetup;
+extern BOOLEAN NoGuiBoot;
 
 /* DECLARATIONS ***************************************************************/
 
@@ -262,6 +263,18 @@ IopCreateDriverObject(
          ExFreePool(Buffer);
    }
 
+
+   Status = ObInsertObject(Object,
+                           NULL,
+                           FILE_ALL_ACCESS,
+                           0,
+                           NULL,
+                           NULL);
+   if (!NT_SUCCESS(Status))
+   {
+      return Status;
+   }  
+
    *DriverObject = Object;
 
    return STATUS_SUCCESS;
@@ -280,30 +293,14 @@ IopDisplayLoadingMessage(PVOID ServiceName,
                          BOOLEAN Unicode)
 {
     CHAR TextBuffer[256];
-    PCHAR Extra = ".sys";
-
-    if (ExpInTextModeSetup) return;
-    if (Unicode)
+    if (ExpInTextModeSetup || !NoGuiBoot) return;
+    if (Unicode) 
     {
-        if (wcsstr(ServiceName, L".sys")) Extra = "";
-        sprintf(TextBuffer,
-                "%s%s%s\\%S%s\n",
-                KeLoaderBlock->ArcBootDeviceName,
-                KeLoaderBlock->NtBootPathName,
-                "System32\\Drivers",
-                (PWCHAR)ServiceName,
-                Extra);
+        sprintf(TextBuffer, "Loading %S...\n", (PWCHAR)ServiceName);
     }
     else
     {
-        if (strstr(ServiceName, ".sys")) Extra = "";
-        sprintf(TextBuffer,
-                "%s%s%s\\%s%s\n",
-                KeLoaderBlock->ArcBootDeviceName,
-                KeLoaderBlock->NtBootPathName,
-                "System32\\Drivers",
-                (PCHAR)ServiceName,
-                Extra);
+        sprintf(TextBuffer, "Loading %s...\n", (PCHAR)ServiceName);
     }
     HalDisplayString(TextBuffer);
 }
index 6c0d4f5..b74e0ae 100644 (file)
@@ -1396,9 +1396,6 @@ IopCloseFile(IN PEPROCESS Process OPTIONAL,
     KIRQL OldIrql;
     IOTRACE(IO_FILE_DEBUG, "ObjectBody: %p\n", ObjectBody);
 
-    /* If this isn't the last handle for the current process, quit */
-    if (HandleCount != 1) return;
-
     /* Check if the file is locked and has more then one handle opened */
     if ((FileObject->LockOperation) && (SystemHandleCount != 1))
     {
index ca310a1..77a470d 100644 (file)
 
 PDEVICE_NODE IopRootDeviceNode;
 KSPIN_LOCK IopDeviceTreeLock;
-ERESOURCE PpRegistryDeviceResource;
-KGUARDED_MUTEX PpDeviceReferenceTableLock;
-RTL_AVL_TABLE PpDeviceReferenceTable;
-
-extern ULONG ExpInitializationPhase;
 
 /* DATA **********************************************************************/
 
@@ -3322,91 +3317,5 @@ PnpInit(VOID)
     }
 }
 
-RTL_GENERIC_COMPARE_RESULTS
-NTAPI
-PiCompareInstancePath(IN PRTL_AVL_TABLE Table,
-                      IN PVOID FirstStruct,
-                      IN PVOID SecondStruct)
-{
-    /* FIXME: TODO */
-    KEBUGCHECK(0);
-    return 0;
-}
-
-//
-//  The allocation function is called by the generic table package whenever
-//  it needs to allocate memory for the table.
-//
-
-PVOID
-NTAPI
-PiAllocateGenericTableEntry(IN PRTL_AVL_TABLE Table,
-                            IN CLONG ByteSize)
-{
-    /* FIXME: TODO */
-    KEBUGCHECK(0);
-    return NULL;
-}
-
-VOID
-NTAPI
-PiFreeGenericTableEntry(IN PRTL_AVL_TABLE Table,
-                        IN PVOID Buffer)
-{
-    /* FIXME: TODO */
-    KEBUGCHECK(0);
-}
-
-VOID
-NTAPI
-PpInitializeDeviceReferenceTable(VOID)
-{
-    /* Setup the guarded mutex and AVL table */
-    KeInitializeGuardedMutex(&PpDeviceReferenceTableLock);
-    RtlInitializeGenericTableAvl(
-        &PpDeviceReferenceTable,
-        (PRTL_AVL_COMPARE_ROUTINE)PiCompareInstancePath,
-        (PRTL_AVL_ALLOCATE_ROUTINE)PiAllocateGenericTableEntry,
-        (PRTL_AVL_FREE_ROUTINE)PiFreeGenericTableEntry,
-        NULL);
-}
-
-BOOLEAN
-NTAPI
-PiInitPhase0(VOID)
-{
-    /* Initialize the resource when accessing device registry data */
-    ExInitializeResourceLite(&PpRegistryDeviceResource);
-
-    /* Setup the device reference AVL table */
-    PpInitializeDeviceReferenceTable();
-    return TRUE;
-}
-
-BOOLEAN
-NTAPI
-PpInitSystem(VOID)
-{
-    /* Check the initialization phase */
-    switch (ExpInitializationPhase)
-    {
-    case 0:
-
-        /* Do Phase 0 */
-        return PiInitPhase0();
-
-    case 1:
-
-        /* Do Phase 1 */
-        return TRUE;
-        //return PiInitPhase1();
-
-    default:
-
-        /* Don't know any other phase! Bugcheck! */
-        KeBugCheck(UNEXPECTED_INITIALIZATION_CALL);
-        return FALSE;
-    }
-}
 
 /* EOF */
index f781f18..f993426 100644 (file)
@@ -17,7 +17,6 @@ BOOLEAN KdDebuggerEnabled = FALSE;
 BOOLEAN KdEnteredDebugger = FALSE;
 BOOLEAN KdDebuggerNotPresent = TRUE;
 BOOLEAN KiEnableTimerWatchdog = FALSE;
-BOOLEAN KdBreakAfterSymbolLoad = FALSE;
 ULONG KiBugCheckData;
 BOOLEAN KdpBreakPending;
 VOID STDCALL PspDumpThreads(BOOLEAN SystemThreads);
index 03ce65a..6f19804 100644 (file)
@@ -89,7 +89,7 @@ KiInsertQueueApc(IN PKAPC Apc,
     PLIST_ENTRY ListHead, NextEntry;
     PKAPC QueuedApc;
     NTSTATUS Status;
-    BOOLEAN RequestInterrupt = FALSE;
+    BOOLEAN RequestInterrupt;
 
     /*
      * Check if the caller wanted this APC to use the thread's environment at
@@ -137,8 +137,8 @@ KiInsertQueueApc(IN PKAPC Apc,
     {
         /* Special APC, find the first Normal APC in the list */
         ListHead = &ApcState->ApcListHead[ApcMode];
-        NextEntry = ListHead->Blink;
-        while (NextEntry != ListHead)
+        NextEntry = ListHead->Flink;
+        while(NextEntry != ListHead)
         {
             /* Get the APC */
             QueuedApc = CONTAINING_RECORD(NextEntry, KAPC, ApcListEntry);
@@ -147,9 +147,12 @@ KiInsertQueueApc(IN PKAPC Apc,
             if (QueuedApc->NormalRoutine) break;
 
             /* Move to the next APC in the Queue */
-            NextEntry = NextEntry->Blink;
+            NextEntry = NextEntry->Flink;
         }
 
+        /* Move to the APC before this one (ie: the last Special APC) */
+        NextEntry = NextEntry->Blink;
+
         /* Insert us here */
         InsertHeadList(NextEntry, &Apc->ApcListEntry);
     }
@@ -182,8 +185,23 @@ KiInsertQueueApc(IN PKAPC Apc,
             /* Acquire the dispatcher lock */
             KiAcquireDispatcherLock();
 
-            /* Check if this is a kernel-mode APC */
-            if (ApcMode == KernelMode)
+            /* Check if this is a non-kernel mode APC */
+            if (ApcMode != KernelMode)
+            {
+                /*
+                 * Not a Kernel-Mode APC. Are we waiting in user-mode?
+                 * If so, then are we alertable or already have an APC pending?
+                 */
+                if (((Thread->State == Waiting) && (Thread->WaitMode == UserMode)) &&
+                    ((Thread->Alertable) || (Thread->ApcState.UserApcPending)))
+                {
+                    /* Set user-mode APC pending */
+                    Thread->ApcState.UserApcPending = TRUE;
+                    Status = STATUS_USER_APC;
+                    goto Unwait;
+                }
+            }
+            else
             {
                 /* Kernel-mode APC, set us pending */
                 Thread->ApcState.KernelApcPending = TRUE;
@@ -193,37 +211,45 @@ KiInsertQueueApc(IN PKAPC Apc,
                 {
                     /* The thread is running, so remember to send a request */
                     RequestInterrupt = TRUE;
+#ifndef CONFIG_SMP
+                    /* On UP systems, request it immediately */
+                    HalRequestSoftwareInterrupt(APC_LEVEL);
+#endif
                 }
-                else if ((Thread->State == Waiting) &&
-                         (Thread->WaitIrql == PASSIVE_LEVEL) &&
-                         !(Thread->SpecialApcDisable) &&
-                         (!(Apc->NormalRoutine) ||
-                          (!(Thread->KernelApcDisable) &&
-                           !(Thread->ApcState.KernelApcInProgress))))
+                else
                 {
-                    /* We'll unwait with this status */
-                    Status = STATUS_KERNEL_APC;
-
-                    /* Wake up the thread */
+                    /*
+                     * If the thread is Waiting at PASSIVE_LEVEL AND
+                     *      Special APCs are not disabled AND
+                     *          He is a Normal APC AND
+                     *              Kernel APCs are not disabled AND
+                     *                  Kernel APC is not pending OR
+                     *          He is a Special APC THEN
+                     *              Unwait thread with STATUS_KERNEL_APC
+                     */
+                    if ((Thread->State == Waiting) &&
+                        (Thread->WaitIrql == PASSIVE_LEVEL) &&
+                        !(Thread->SpecialApcDisable) &&
+                        (!(Apc->NormalRoutine) ||
+                         (!(Thread->KernelApcDisable) &&
+                          !(Thread->ApcState.KernelApcInProgress))))
+                    {
+                        /* We'll unwait with this status */
+                        Status = STATUS_KERNEL_APC;
+
+                        /* Wake up the thread */
 Unwait:
-                    KiUnwaitThread(Thread, Status, PriorityBoost);
+                        KiUnwaitThread(Thread, Status, PriorityBoost);
+                    }
+                    else
+                    {
+                        /* Check if the thread is in a deferred ready state */
+                        if (Thread->State == DeferredReady)
+                        {
+                            /* FIXME: TODO in new scheduler */
+                        }
+                    }
                 }
-                else if (Thread->State == GateWait)
-                {
-                    /* We were in a gate wait. FIXME: Handle this */
-                    DPRINT1("Not yet supported -- Report this to Alex\n");
-                    while (TRUE);
-                }
-            }
-            else if ((Thread->State == Waiting) &&
-                     (Thread->WaitMode == UserMode) &&
-                     ((Thread->Alertable) ||
-                      (Thread->ApcState.UserApcPending)))
-            {
-                /* Set user-mode APC pending */
-                Thread->ApcState.UserApcPending = TRUE;
-                Status = STATUS_USER_APC;
-                goto Unwait;
             }
 
             /* Release dispatcher lock */
@@ -724,7 +750,7 @@ KeInsertQueueApc(IN PKAPC Apc,
     }
 
     /* Release the APC lock and return success */
-    KiReleaseApcLockFromDpcLevel(&ApcLock);
+    KiReleaseApcLock(&ApcLock);
     KiExitDispatcher(ApcLock.OldIrql);
     return State;
 }
@@ -865,7 +891,10 @@ KeRemoveQueueApc(IN PKAPC Apc)
 
         /* Acquire the dispatcher lock and remove it from the list */
         KiAcquireDispatcherLockAtDpcLevel();
-        if (RemoveEntryList(&ApcState->ApcListHead[Apc->ApcMode]))
+        RemoveEntryList(&Apc->ApcListEntry);
+
+        /* If the Queue is completely empty, then no more APCs are pending */
+        if (IsListEmpty(&ApcState->ApcListHead[Apc->ApcMode]))
         {
             /* Set the correct state based on the APC Mode */
             if (Apc->ApcMode == KernelMode)
@@ -950,5 +979,3 @@ KeAreAllApcsDisabled(VOID)
 }
 
 
-
-
diff --git a/reactos/ntoskrnl/ke/balmgr.c b/reactos/ntoskrnl/ke/balmgr.c
deleted file mode 100644 (file)
index 79b2a7e..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-/*\r
-* PROJECT:         ReactOS Kernel\r
-* LICENSE:         GPL - See COPYING in the top level directory\r
-* FILE:            ntoskrnl/ke/balmgr.c\r
-* PURPOSE:         Balance Set Manager\r
-* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)\r
-*/\r
-\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/* GLOBALS *******************************************************************/\r
-\r
-#define THREAD_BOOST_PRIORITY (LOW_REALTIME_PRIORITY - 1)\r
-ULONG KiReadyScanLast;\r
-\r
-/* PRIVATE FUNCTIONS *********************************************************/\r
-\r
-VOID\r
-NTAPI\r
-KiScanReadyQueues(IN PKDPC Dpc,\r
-                  IN PVOID DeferredContext,\r
-                  IN PVOID SystemArgument1,\r
-                  IN PVOID SystemArgument2)\r
-{\r
-    PULONG ScanLast = DeferredContext;\r
-    ULONG ScanIndex = *ScanLast;\r
-    ULONG Count = 10, Number = 16;\r
-    PKPRCB Prcb = KiProcessorBlock[ScanIndex];\r
-    ULONG Index = Prcb->QueueIndex;\r
-    ULONG WaitLimit = KeTickCount.LowPart - 300;\r
-    ULONG Summary;\r
-    KIRQL OldIrql;\r
-    PLIST_ENTRY ListHead, NextEntry;\r
-    PKTHREAD Thread;\r
-\r
-    /* Lock the dispatcher and PRCB */\r
-    OldIrql = KiAcquireDispatcherLock();\r
-    KiAcquirePrcbLock(Prcb);\r
-#ifndef NEW_SCHEDULER\r
-    goto OldSched;\r
-#endif\r
-\r
-    /* Check if there's any thread that need help */\r
-    Summary = Prcb->ReadySummary & ((1 << THREAD_BOOST_PRIORITY) - 2);\r
-    if (Summary)\r
-    {\r
-        /* Start scan loop */\r
-        do\r
-        {\r
-            /* Normalize the index */\r
-            if (Index > (THREAD_BOOST_PRIORITY - 1)) Index = 1;\r
-\r
-            /* Loop for ready threads */\r
-            if (Summary & PRIORITY_MASK(Index))\r
-            {\r
-                /* Sanity check */\r
-                ASSERT(!IsListEmpty(&Prcb->DispatcherReadyListHead[Index]));\r
-\r
-                /* Update summary and select list */\r
-                Summary ^= PRIORITY_MASK(Index);\r
-                ListHead = &Prcb->DispatcherReadyListHead[Index];\r
-                NextEntry = ListHead->Flink;\r
-                do\r
-                {\r
-                    /* Select a thread */\r
-                    Thread = CONTAINING_RECORD(NextEntry,\r
-                                               KTHREAD,\r
-                                               WaitListEntry);\r
-                    ASSERT(Thread->Priority == Index);\r
-\r
-                    /* Check if the thread has been waiting too long */\r
-                    if (WaitLimit >= Thread->WaitTime)\r
-                    {\r
-                        /* Remove the thread from the queue */\r
-                        DPRINT1("Thread: %p\n", Thread);\r
-                        NextEntry = NextEntry->Blink;\r
-                        ASSERT((Prcb->ReadySummary & PRIORITY_MASK(Index)));\r
-                        if (RemoveEntryList(NextEntry->Flink))\r
-                        {\r
-                            /* The list is empty now */\r
-                            Prcb->ReadySummary ^= PRIORITY_MASK(Index);\r
-                        }\r
-\r
-                        /* Verify priority decrement and set the new one */\r
-                        ASSERT((Thread->PriorityDecrement >= 0) &&\r
-                               (Thread->PriorityDecrement <=\r
-                                Thread->Priority));\r
-                        Thread->PriorityDecrement += (THREAD_BOOST_PRIORITY -\r
-                                                      Thread->Priority);\r
-                        ASSERT((Thread->PriorityDecrement >= 0) &&\r
-                               (Thread->PriorityDecrement <=\r
-                                THREAD_BOOST_PRIORITY));\r
-\r
-                        /* Update priority and insert into ready list */\r
-                        Thread->Priority = THREAD_BOOST_PRIORITY;\r
-                        Thread->Quantum = WAIT_QUANTUM_DECREMENT * 4;\r
-                        KiInsertDeferredReadyList(Thread);\r
-                        Count --;\r
-                    }\r
-\r
-                    /* Go to the next entry */\r
-                    NextEntry = NextEntry->Flink;\r
-                    Number--;\r
-                } while((NextEntry != ListHead) && (Number) && (Count));\r
-            }\r
-\r
-            /* Increase index */\r
-            Index++;\r
-        } while ((Summary) && (Number) && (Count));\r
-    }\r
-\r
-    /* Release the locks and dispatcher */\r
-#ifndef NEW_SCHEDULER\r
-OldSched:\r
-#endif\r
-    KiReleasePrcbLock(Prcb);\r
-    KiReleaseDispatcherLock(OldIrql);\r
-\r
-    /* Update the queue index for next time */\r
-    if ((Count) && (Number))\r
-    {\r
-        /* Reset the queue at index 1 */\r
-        Prcb->QueueIndex = 1;\r
-    }\r
-    else\r
-    {\r
-        /* Set the index we're in now */\r
-        Prcb->QueueIndex = 0;\r
-    }\r
-\r
-    /* Increment the CPU number for next time and normalize to CPU count */\r
-    ScanIndex++;\r
-    if (ScanIndex == KeNumberProcessors) ScanIndex = 0;\r
-\r
-    /* Return the index */\r
-    *ScanLast = ScanIndex;\r
-}\r
-\r
-VOID\r
-NTAPI\r
-KeBalanceSetManager(IN PVOID Context)\r
-{\r
-    KDPC ScanDpc;\r
-    KTIMER PeriodTimer;\r
-    LARGE_INTEGER DueTime;\r
-    KWAIT_BLOCK WaitBlockArray[1];\r
-    PVOID WaitObjects[1];\r
-    NTSTATUS Status;\r
-\r
-    /* Set us at a low real-time priority level */\r
-    KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY);\r
-\r
-    /* Setup the timer and scanner DPC */\r
-    KeInitializeTimerEx(&PeriodTimer, SynchronizationTimer);\r
-    KeInitializeDpc(&ScanDpc, KiScanReadyQueues, &KiReadyScanLast);\r
-\r
-    /* Setup the periodic timer */\r
-    DueTime.QuadPart = -1 * 10 * 1000 * 1000;\r
-    KeSetTimerEx(&PeriodTimer, DueTime, 1000, &ScanDpc);\r
-\r
-    /* Setup the wait objects */\r
-    WaitObjects[0] = &PeriodTimer;\r
-    //WaitObjects[1] = MmWorkingSetManagerEvent; // NO WS Management Yet!\r
-\r
-    /* Start wait loop */\r
-    do\r
-    {\r
-        /* Wait on our objects */\r
-        Status = KeWaitForMultipleObjects(1,\r
-                                          WaitObjects,\r
-                                          WaitAny,\r
-                                          Executive,\r
-                                          KernelMode,\r
-                                          FALSE,\r
-                                          NULL,\r
-                                          WaitBlockArray);\r
-        switch (Status)\r
-        {\r
-            /* Check if our timer expired */\r
-            case STATUS_WAIT_0:\r
-\r
-                /* Adjust lookaside lists */\r
-                //ExAdjustLookasideDepth();\r
-\r
-                /* Call the working set manager */\r
-                //MmWorkingSetManager();\r
-\r
-                /* FIXME: Outswap stacks */\r
-\r
-                /* Done */\r
-                break;\r
-\r
-            /* Check if the working set manager notified us */\r
-            case STATUS_WAIT_1:\r
-\r
-                /* Call the working set manager */\r
-                //MmWorkingSetManager();\r
-                break;\r
-\r
-            /* Anything else */\r
-            default:\r
-                DPRINT1("BALMGR: Illegal wait status, %lx =\n", Status);\r
-                break;\r
-        }\r
-    } while (TRUE);\r
-}\r
index 7f67a5e..ee73992 100644 (file)
 /*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/ke/clock.c
- * PURPOSE:         System Clock Support
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PURPOSE:         Handle System Clock
+ *
+ * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net) - Created
+ *                  David Welch & Phillip Susi - Implementation (?)
  */
 
-/* INCLUDES ******************************************************************/
+ /* NOTES ******************************************************************/
+/*
+ * System time units are 100-nanosecond intervals
+ */
+
+/* INCLUDES ***************************************************************/
 
 #include <ntoskrnl.h>
+
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
-/* GLOBALS *******************************************************************/
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, KiInitializeSystemClock)
+#endif
 
-LARGE_INTEGER KeBootTime;
-ULONGLONG KeBootTimeBias;
+/* GLOBALS ****************************************************************/
+
+LARGE_INTEGER KeBootTime, KeBootTimeBias;
+KDPC KiExpireTimerDpc;
+BOOLEAN KiClockSetupComplete = FALSE;
+ULONG KiTimeLimitIsrMicroseconds;
+
+/*
+ * Number of timer interrupts since initialisation
+ */
 volatile KSYSTEM_TIME KeTickCount = {0};
 volatile ULONG KiRawTicks = 0;
-ULONG KeMaximumIncrement;
-ULONG KeMinimumIncrement;
-ULONG KeTimeAdjustment;
-ULONG KeTimeIncrement;
 LONG KiTickOffset = 0;
+extern LIST_ENTRY KiTimerListHead;
 
-/* PRIVATE FUNCTIONS *********************************************************/
-
-VOID
-NTAPI
-KeSetSystemTime(IN PLARGE_INTEGER NewTime,
-                OUT PLARGE_INTEGER OldTime,
-                IN BOOLEAN FixInterruptTime,
-                IN PLARGE_INTEGER HalTime OPTIONAL)
-{
-    TIME_FIELDS TimeFields;
-    KIRQL OldIrql, OldIrql2;
-    LARGE_INTEGER DeltaTime;
-    PLIST_ENTRY ListHead, NextEntry;
-    PKTIMER Timer;
-    PKSPIN_LOCK_QUEUE LockQueue;
-    LIST_ENTRY TempList, TempList2;
-    ULONG Hand, i;
-    PKTIMER_TABLE_ENTRY TimerEntry;
-
-    /* Sanity checks */
-    ASSERT((NewTime->HighPart & 0xF0000000) == 0);
-    ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
-
-    /* Check if this is for the HAL */
-    if (HalTime) RtlTimeToTimeFields(HalTime, &TimeFields);
-
-    /* Set affinity to this CPU, lock the dispatcher, and raise IRQL */
-    KeSetSystemAffinityThread(1);
-    OldIrql = KiAcquireDispatcherLock();
-    KeRaiseIrql(HIGH_LEVEL, &OldIrql2);
-
-    /* Query the system time now */
-    KeQuerySystemTime(OldTime);
-
-    /* Set the new system time */
-    SharedUserData->SystemTime.LowPart = NewTime->LowPart;
-    SharedUserData->SystemTime.High1Time = NewTime->HighPart;
-    SharedUserData->SystemTime.High2Time = NewTime->HighPart;
+/*
+ * The increment in the system clock every timer tick (in system time units)
+ *
+ * = (1/18.2)*10^9
+ *
+ * RJJ was 54945055
+ */
+#define CLOCK_INCREMENT (100000)
 
-    /* Check if this was for the HAL and set the RTC time */
-    if (HalTime) ExCmosClockIsSane = HalSetRealTimeClock(&TimeFields);
+ULONG KeMaximumIncrement = 100000;
+ULONG KeMinimumIncrement = 100000;
+ULONG KeTimeAdjustment   = 100000;
 
-    /* Calculate the difference between the new and the old time */
-    DeltaTime.QuadPart = NewTime->QuadPart - OldTime->QuadPart;
+#define MICROSECONDS_PER_TICK (10000)
+#define TICKS_TO_CALIBRATE (1)
+#define CALIBRATE_PERIOD (MICROSECONDS_PER_TICK * TICKS_TO_CALIBRATE)
 
-    /* Update system boot time */
-    KeBootTime.QuadPart += DeltaTime.QuadPart;
-    KeBootTimeBias = KeBootTimeBias + DeltaTime.QuadPart;
+/* FUNCTIONS **************************************************************/
 
-    /* Lower IRQL back */
-    KeLowerIrql(OldIrql2);
+VOID
+NTAPI
+KiSetSystemTime(PLARGE_INTEGER NewSystemTime)
+{
+  LARGE_INTEGER OldSystemTime;
+  LARGE_INTEGER DeltaTime;
+  KIRQL OldIrql;
 
-    /* Check if we need to adjust interrupt time */
-    if (FixInterruptTime) KEBUGCHECK(0);
+  ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
 
-    /* Setup a temporary list of absolute timers */
-    InitializeListHead(&TempList);
+  OldIrql = KiAcquireDispatcherLock();
 
-    /* Loop current timers */
-    for (i = 0; i < TIMER_TABLE_SIZE; i++)
+  do
     {
-        /* Loop the entries in this table and lock the timers */
-        ListHead = &KiTimerTableListHead[i].Entry;
-        LockQueue = KiAcquireTimerLock(i);
-        NextEntry = ListHead->Flink;
-        while (NextEntry != ListHead)
-        {
-            /* Get the timer */
-            Timer = CONTAINING_RECORD(NextEntry, KTIMER, TimerListEntry);
-            NextEntry = NextEntry->Flink;
-
-            /* Is is absolute? */
-            if (Timer->Header.Absolute)
-            {
-                /* Remove it from the timer list */
-                if (RemoveEntryList(&Timer->TimerListEntry))
-                {
-                    /* Get the entry and check if it's empty */
-                    TimerEntry = &KiTimerTableListHead[Timer->Header.Hand];
-                    if (IsListEmpty(&TimerEntry->Entry))
-                    {
-                        /* Clear the time then */
-                        TimerEntry->Time.HighPart = 0xFFFFFFFF;
-                    }
-                }
-
-                /* Insert it into our temporary list */
-                DPRINT1("Adding a timer!\n");
-                InsertTailList(&TempList, &Timer->TimerListEntry);
-            }
-        }
-
-        /* Release the lock */
-        KiReleaseTimerLock(LockQueue);
+      OldSystemTime.u.HighPart = SharedUserData->SystemTime.High1Time;
+      OldSystemTime.u.LowPart = SharedUserData->SystemTime.LowPart;
     }
+  while (OldSystemTime.u.HighPart != SharedUserData->SystemTime.High2Time);
 
-    /* Setup a temporary list of expired timers */
-    InitializeListHead(&TempList2);
+  /* Set the new system time */
+  SharedUserData->SystemTime.LowPart = NewSystemTime->u.LowPart;
+  SharedUserData->SystemTime.High1Time = NewSystemTime->u.HighPart;
+  SharedUserData->SystemTime.High2Time = NewSystemTime->u.HighPart;
 
-    /* Loop absolute timers */
-    while (TempList.Flink != &TempList)
-    {
-        /* Get the timer */
-        Timer = CONTAINING_RECORD(TempList.Flink, KTIMER, TimerListEntry);
-        RemoveEntryList(&Timer->TimerListEntry);
-
-        /* Update the due time and handle */
-        Timer->DueTime.QuadPart -= DeltaTime.QuadPart;
-        Hand = KiComputeTimerTableIndex(Timer->DueTime.QuadPart);
-        Timer->Header.Hand = (UCHAR)Hand;
-
-        /* Lock the timer and re-insert it */
-        LockQueue = KiAcquireTimerLock(Hand);
-        if (KiInsertTimerTable(Timer, Hand))
-        {
-            /* Remove it from the timer list */
-            if (RemoveEntryList(&Timer->TimerListEntry))
-            {
-                /* Get the entry and check if it's empty */
-                TimerEntry = &KiTimerTableListHead[Timer->Header.Hand];
-                if (IsListEmpty(&TimerEntry->Entry))
-                {
-                    /* Clear the time then */
-                    TimerEntry->Time.HighPart = 0xFFFFFFFF;
-                }
-            }
-
-            /* Insert it into our temporary list */
-            DPRINT1("Adding a timer 2!\n");
-            InsertTailList(&TempList2, &Timer->TimerListEntry);
-        }
-
-        /* Release the lock */
-        KiReleaseTimerLock(LockQueue);
-    }
+  /* Calculate the difference between the new and the old time */
+  DeltaTime.QuadPart = NewSystemTime->QuadPart - OldSystemTime.QuadPart;
 
-    /* FIXME: Process expired timers! */
-    KiReleaseDispatcherLock(OldIrql);
+  /* Update system boot time */
+  KeBootTime.QuadPart += DeltaTime.QuadPart;
 
-    /* Revert affinity */
-    KeRevertToUserAffinityThread();
-}
+  /* Update absolute timers */
+  DPRINT1("FIXME: TIMER UPDATE NOT DONE!!!\n");
 
-/* PUBLIC FUNCTIONS **********************************************************/
+  KiReleaseDispatcherLock(OldIrql);
+
+  /*
+   * NOTE: Expired timers will be processed at the next clock tick!
+   */
+}
 
 /*
  * @implemented
  */
 ULONG
-NTAPI
+STDCALL
 KeQueryTimeIncrement(VOID)
+/*
+ * FUNCTION: Gets the increment (in 100-nanosecond units) that is added to
+ * the system clock every time the clock interrupts
+ * RETURNS: The increment
+ */
 {
-    /* Return the increment */
     return KeMaximumIncrement;
 }
 
@@ -185,60 +118,47 @@ KeQueryTimeIncrement(VOID)
  */
 #undef KeQueryTickCount
 VOID
-NTAPI
-KeQueryTickCount(IN PLARGE_INTEGER TickCount)
+STDCALL
+KeQueryTickCount(PLARGE_INTEGER TickCount)
+/*
+ * FUNCTION: Returns the number of ticks since the system was booted
+ * ARGUMENTS:
+ *         TickCount (OUT) = Points to storage for the number of ticks
+ */
 {
-    /* Loop until we get a perfect match */
-    for (;;)
-    {
-        /* Read the tick count value */
-        TickCount->HighPart = KeTickCount.High1Time;
-        TickCount->LowPart = KeTickCount.LowPart;
-        if (TickCount->HighPart == KeTickCount.High2Time) break;
-        YieldProcessor();
-    }
+    TickCount->QuadPart = *(PULONGLONG)&KeTickCount;
 }
 
 /*
+ * FUNCTION: Gets the current system time
+ * ARGUMENTS:
+ *          CurrentTime (OUT) = The routine stores the current time here
+ * NOTE: The time is the number of 100-nanosecond intervals since the
+ * 1st of January, 1601.
+ *
  * @implemented
  */
 VOID
-NTAPI
-KeQuerySystemTime(OUT PLARGE_INTEGER CurrentTime)
+STDCALL
+KeQuerySystemTime(PLARGE_INTEGER CurrentTime)
 {
-    /* Loop until we get a perfect match */
-    for (;;)
-    {
-        /* Read the time value */
-        CurrentTime->HighPart = SharedUserData->SystemTime.High1Time;
-        CurrentTime->LowPart = SharedUserData->SystemTime.LowPart;
-        if (CurrentTime->HighPart ==
-            SharedUserData->SystemTime.High2Time) break;
-        YieldProcessor();
-    }
+    do {
+        CurrentTime->u.HighPart = SharedUserData->SystemTime.High1Time;
+        CurrentTime->u.LowPart = SharedUserData->SystemTime.LowPart;
+    } while (CurrentTime->u.HighPart != SharedUserData->SystemTime.High2Time);
 }
 
-/*
- * @implemented
- */
 ULONGLONG
-NTAPI
+STDCALL
 KeQueryInterruptTime(VOID)
 {
     LARGE_INTEGER CurrentTime;
 
-    /* Loop until we get a perfect match */
-    for (;;)
-    {
-        /* Read the time value */
-        CurrentTime.HighPart = SharedUserData->InterruptTime.High1Time;
-        CurrentTime.LowPart = SharedUserData->InterruptTime.LowPart;
-        if (CurrentTime.HighPart ==
-            SharedUserData->InterruptTime.High2Time) break;
-        YieldProcessor();
-    }
+    do {
+        CurrentTime.u.HighPart = SharedUserData->InterruptTime.High1Time;
+        CurrentTime.u.LowPart = SharedUserData->InterruptTime.LowPart;
+    } while (CurrentTime.u.HighPart != SharedUserData->InterruptTime.High2Time);
 
-    /* Return the time value */
     return CurrentTime.QuadPart;
 }
 
@@ -246,20 +166,32 @@ KeQueryInterruptTime(VOID)
  * @implemented
  */
 VOID
-NTAPI
-KeSetTimeIncrement(IN ULONG MaxIncrement,
-                   IN ULONG MinIncrement)
+STDCALL
+KeSetTimeIncrement(
+    IN ULONG MaxIncrement,
+    IN ULONG MinIncrement)
 {
     /* Set some Internal Variables */
+    /* FIXME: We use a harcoded CLOCK_INCREMENT. That *must* be changed */
     KeMaximumIncrement = MaxIncrement;
-    KeMinimumIncrement = max(MinIncrement, 10000);
-    KeTimeAdjustment = MaxIncrement;
-    KeTimeIncrement = MaxIncrement;
-    KiTickOffset = MaxIncrement;
+    KeMinimumIncrement = MinIncrement;
+}
+
+/*
+ * @implemented
+ */
+ULONG
+STDCALL
+NtGetTickCount(VOID)
+{
+    LARGE_INTEGER TickCount;
+
+    KeQueryTickCount(&TickCount);
+    return TickCount.u.LowPart;
 }
 
 NTSTATUS
-NTAPI
+STDCALL
 NtQueryTimerResolution(OUT PULONG MinimumResolution,
                        OUT PULONG MaximumResolution,
                        OUT PULONG ActualResolution)
@@ -269,7 +201,7 @@ NtQueryTimerResolution(OUT PULONG MinimumResolution,
 }
 
 NTSTATUS
-NTAPI
+STDCALL
 NtSetTimerResolution(IN ULONG DesiredResolution,
                      IN BOOLEAN SetResolution,
                      OUT PULONG CurrentResolution)
index 0835f62..7a263d5 100644 (file)
@@ -2,7 +2,7 @@
  * PROJECT:         ReactOS Kernel
  * LICENSE:         GPL - See COPYING in the top level directory
  * FILE:            ntoskrnl/ke/dpc.c
- * PURPOSE:         Deferred Procedure Call (DPC) Support
+ * PURPOSE:         Routines for CPU-level support
  * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
  *                  Philip Susi (phreak@iag.net)
  *                  Eric Kohl (ekohl@abo.rhein-zeitung.de)
@@ -10,6 +10,8 @@
 
 /* INCLUDES ******************************************************************/
 
+#define NTDDI_VERSION NTDDI_WS03
+
 #include <ntoskrnl.h>
 #define NDEBUG
 #include <debug.h>
@@ -21,241 +23,23 @@ ULONG KiMinimumDpcRate = 3;
 ULONG KiAdjustDpcThreshold = 20;
 ULONG KiIdealDpcRate = 20;
 BOOLEAN KeThreadDpcEnable;
-FAST_MUTEX KiGenericCallDpcMutex;
-KDPC KiTimerExpireDpc;
-ULONG KiTimeLimitIsrMicroseconds;
+KMUTEX KiGenericCallDpcMutex;
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
-VOID
-NTAPI
-KiTimerExpiration(IN PKDPC Dpc,
-                  IN PVOID DeferredContext,
-                  IN PVOID SystemArgument1,
-                  IN PVOID SystemArgument2)
-{
-    LARGE_INTEGER SystemTime, InterruptTime, Interval;
-    LONG Limit, Index, i;
-    ULONG Timers, ActiveTimers, DpcCalls;
-    PLIST_ENTRY ListHead, NextEntry;
-    PKTIMER_TABLE_ENTRY TimerEntry;
-    KIRQL OldIrql;
-    PKTIMER Timer;
-    PKDPC TimerDpc;
-    ULONG Period;
-    DPC_QUEUE_ENTRY DpcEntry[MAX_TIMER_DPCS];
-    PKSPIN_LOCK_QUEUE LockQueue;
-
-    /* Disable interrupts */
-    _disable();
-
-    /* Query system and interrupt time */
-    KeQuerySystemTime(&SystemTime);
-    InterruptTime.QuadPart = KeQueryInterruptTime();
-    Limit = KeTickCount.LowPart;
-
-    /* Bring interrupts back */
-    _enable();
-
-    /* Get the index of the timer and normalize it */
-    Index = PtrToLong(SystemArgument1);
-    if ((Limit - Index) >= TIMER_TABLE_SIZE)
-    {
-        /* Normalize it */
-        Limit = Index + TIMER_TABLE_SIZE - 1;
-    }
-
-    /* Setup index and actual limit */
-    Index--;
-    Limit &= (TIMER_TABLE_SIZE - 1);
-
-    /* Setup accounting data */
-    DpcCalls = 0;
-    Timers = 24;
-    ActiveTimers = 4;
-
-    /* Lock the Database and Raise IRQL */
-    OldIrql = KiAcquireDispatcherLock();
-
-    /* Start expiration loop */
-    do
-    {
-        /* Get the current index */
-        Index = (Index + 1) & (TIMER_TABLE_SIZE - 1);
-
-        /* Get list pointers and loop the list */
-        ListHead = &KiTimerTableListHead[Index].Entry;
-        while (ListHead != ListHead->Flink)
-        {
-            /* Lock the timer and go to the next entry */
-            LockQueue = KiAcquireTimerLock(Index);
-            NextEntry = ListHead->Flink;
-
-            /* Get the current timer and check its due time */
-            Timers--;
-            Timer = CONTAINING_RECORD(NextEntry, KTIMER, TimerListEntry);
-            if ((NextEntry != ListHead) &&
-                (Timer->DueTime.QuadPart <= InterruptTime.QuadPart))
-            {
-                /* It's expired, remove it */
-                ActiveTimers--;
-                if (RemoveEntryList(&Timer->TimerListEntry))
-                {
-                    /* Get the entry and check if it's empty */
-                    TimerEntry = &KiTimerTableListHead[Timer->Header.Hand];
-                    if (IsListEmpty(&TimerEntry->Entry))
-                    {
-                        /* Clear the time then */
-                        TimerEntry->Time.HighPart = 0xFFFFFFFF;
-                    }
-                }
-
-                /* Make it non-inserted, unlock it, and signal it */
-                Timer->Header.Inserted = FALSE;
-                KiReleaseTimerLock(LockQueue);
-                Timer->Header.SignalState = 1;
-
-                /* Get the DPC and period */
-                TimerDpc = Timer->Dpc;
-                Period = Timer->Period;
-
-                /* Check if there's any waiters */
-                if (!IsListEmpty(&Timer->Header.WaitListHead))
-                {
-                    /* Check the type of event */
-                    if (Timer->Header.Type == TimerNotificationObject)
-                    {
-                        /* Unwait the thread */
-                        KxUnwaitThread(&Timer->Header, IO_NO_INCREMENT);
-                    }
-                    else
-                    {
-                        /* Otherwise unwait the thread and signal the timer */
-                        KxUnwaitThreadForEvent((PKEVENT)Timer, IO_NO_INCREMENT);
-                    }
-                }
-
-                /* Check if we have a period */
-                if (Period)
-                {
-                    /* Calculate the interval and insert the timer */
-                    Interval.QuadPart = Int32x32To64(Period, -10000);
-                    while (!KiInsertTreeTimer(Timer, Interval));
-                }
-
-                /* Check if we have a DPC */
-                if (TimerDpc)
-                {
-                    /* Setup the DPC Entry */
-                    DpcEntry[DpcCalls].Dpc = TimerDpc;
-                    DpcEntry[DpcCalls].Routine = TimerDpc->DeferredRoutine;
-                    DpcEntry[DpcCalls].Context = TimerDpc->DeferredContext;
-                    DpcCalls++;
-                }
-
-                /* Check if we're done processing */
-                if (!(ActiveTimers) || !(Timers))
-                {
-                    /* Release the dispatcher while doing DPCs */
-                    KiReleaseDispatcherLock(DISPATCH_LEVEL);
-
-                    /* Start looping all DPC Entries */
-                    for (i = 0; DpcCalls; DpcCalls--, i++)
-                    {
-                        /* Call the DPC */
-                        DpcEntry[i].Routine(DpcEntry[i].Dpc,
-                                            DpcEntry[i].Context,
-                                            UlongToPtr(SystemTime.LowPart),
-                                            UlongToPtr(SystemTime.HighPart));
-                    }
-
-                    /* Reset accounting */
-                    Timers = 24;
-                    ActiveTimers = 4;
-
-                    /* Lock the dispatcher database */
-                    KiAcquireDispatcherLock();
-                }
-            }
-            else
-            {
-                /* Check if the timer list is empty */
-                if (NextEntry != ListHead)
-                {
-                    /* Sanity check */
-                    ASSERT(KiTimerTableListHead[Index].Time.QuadPart <=
-                           Timer->DueTime.QuadPart);
-
-                    /* Update the time */
-                    _disable();
-                    KiTimerTableListHead[Index].Time.QuadPart =
-                        Timer->DueTime.QuadPart;
-                    _enable();
-                }
-
-                /* Release the lock */
-                KiReleaseTimerLock(LockQueue);
-
-                /* Check if we've scanned all the timers we could */
-                if (!Timers)
-                {
-                    /* Release the dispatcher while doing DPCs */
-                    KiReleaseDispatcherLock(DISPATCH_LEVEL);
-
-                    /* Start looping all DPC Entries */
-                    for (i = 0; DpcCalls; DpcCalls--, i++)
-                    {
-                        /* Call the DPC */
-                        DpcEntry[i].Routine(DpcEntry[i].Dpc,
-                                            DpcEntry[i].Context,
-                                            UlongToPtr(SystemTime.LowPart),
-                                            UlongToPtr(SystemTime.HighPart));
-                    }
-
-                    /* Reset accounting */
-                    Timers = 24;
-                    ActiveTimers = 4;
-
-                    /* Lock the dispatcher database */
-                    KiAcquireDispatcherLock();
-                }
-
-                /* Done looping */
-                break;
-            }
-        }
-    } while (Index != Limit);
-
-    /* Check if we still have DPC entries */
-    if (DpcCalls)
-    {
-        /* Release the dispatcher while doing DPCs */
-        KiReleaseDispatcherLock(DISPATCH_LEVEL);
-
-        /* Start looping all DPC Entries */
-        for (i = 0; DpcCalls; DpcCalls--, i++)
-        {
-            /* Call the DPC */
-            DpcEntry[i].Routine(DpcEntry[i].Dpc,
-                                DpcEntry[i].Context,
-                                UlongToPtr(SystemTime.LowPart),
-                                UlongToPtr(SystemTime.HighPart));
-        }
-
-        /* Lower IRQL if we need to */
-        if (OldIrql != DISPATCH_LEVEL) KeLowerIrql(OldIrql);
-    }
-    else
-    {
-        /* Unlock the dispatcher */
-        KiReleaseDispatcherLock(OldIrql);
-    }
-}
-
+//
+// This routine executes at the end of a thread's quantum.
+// If the thread's quantum has expired, then a new thread is attempted
+// to be scheduled.
+//
+// If no candidate thread has been found, the routine will return, otherwise
+// it will swap contexts to the next scheduled thread.
+//
 VOID
 NTAPI
 KiQuantumEnd(VOID)
 {
+    KPRIORITY Priority;
     PKPRCB Prcb = KeGetCurrentPrcb();
     PKTHREAD NextThread, Thread = Prcb->CurrentThread;
 
@@ -282,27 +66,12 @@ KiQuantumEnd(VOID)
             Thread->Quantum = Thread->QuantumReset;
 
             /* Calculate new priority */
-            Thread->Priority = KiComputeNewPriority(Thread, 1);
+            Priority = Thread->Priority = KiComputeNewPriority(Thread);
 
             /* Check if a new thread is scheduled */
             if (!Prcb->NextThread)
             {
-#ifdef NEW_SCHEDULER
-                /* Get a new ready thread */
-                NextThread = KiSelectReadyThread(Thread->Priority, Prcb);
-                if (NextThread)
-                {
-                    /* Found one, set it on standby */
-                    NextThread->State = Standby;
-                    Prcb->NextThread = NextThread;
-                }
-#else
-                /* Just leave now */
-                KiReleasePrcbLock(Prcb);
-                KeLowerIrql(DISPATCH_LEVEL);
-                KiDispatchThread(Ready);
-                return;
-#endif
+                /* FIXME: TODO. Add code from new scheduler */
             }
             else
             {
@@ -326,9 +95,14 @@ KiQuantumEnd(VOID)
         /* Just leave now */
         KiReleasePrcbLock(Prcb);
         KeLowerIrql(DISPATCH_LEVEL);
+        KiDispatchThread(Ready); // FIXME: ROS
         return;
     }
 
+    /* This shouldn't happen on ROS yet */
+    DPRINT1("The impossible happened - Tell Alex\n");
+    ASSERT(FALSE);
+
     /* Get the next thread now */
     NextThread = Prcb->NextThread;
 
@@ -365,7 +139,6 @@ KiRetireDpcList(IN PKPRCB Prcb)
     PKDPC Dpc;
     PKDEFERRED_ROUTINE DeferredRoutine;
     PVOID DeferredContext, SystemArgument1, SystemArgument2;
-    ULONG_PTR TimerHand;
 
     /* Main outer loop */
     do
@@ -376,11 +149,8 @@ KiRetireDpcList(IN PKPRCB Prcb)
         /* Check if this is a timer expiration request */
         if (Prcb->TimerRequest)
         {
-            TimerHand = Prcb->TimerHand;
-            Prcb->TimerRequest = 0;
-            _enable();
-            KiTimerExpiration(NULL, NULL, (PVOID) TimerHand, NULL);
-            _disable();
+            /* FIXME: Not yet implemented */
+            ASSERT(FALSE);
         }
 
         /* Loop while we have entries in the queue */
@@ -420,7 +190,7 @@ KiRetireDpcList(IN PKPRCB Prcb)
                                 DeferredContext,
                                 SystemArgument1,
                                 SystemArgument2);
-                ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+                ASSERT_IRQL(DISPATCH_LEVEL);
 
                 /* Disable interrupts and keep looping */
                 _disable();
@@ -527,7 +297,7 @@ KeInsertQueueDpc(IN PKDPC Dpc,
     }
 
     /* Check if this is a threaded DPC and threaded DPCs are enabled */
-    if ((Dpc->Type == ThreadedDpcObject) && (Prcb->ThreadDpcEnable))
+    if ((Dpc->Type = ThreadedDpcObject) && (Prcb->ThreadDpcEnable))
     {
         /* Then use the threaded data */
         DpcData = &Prcb->DpcData[DPC_THREADED];
@@ -567,7 +337,7 @@ KeInsertQueueDpc(IN PKDPC Dpc,
         if (&Prcb->DpcData[DPC_THREADED].DpcListHead == &DpcData->DpcListHead)
         {
             /* Make sure a threaded DPC isn't already active */
-            if (!(Prcb->DpcThreadActive) && !(Prcb->DpcThreadRequested))
+            if (!(Prcb->DpcThreadActive) && (!Prcb->DpcThreadRequested))
             {
                 /* FIXME: Setup Threaded DPC */
                 ASSERT(FALSE);
@@ -576,7 +346,7 @@ KeInsertQueueDpc(IN PKDPC Dpc,
         else
         {
             /* Make sure a DPC isn't executing already */
-            if (!(Prcb->DpcRoutineActive) && !(Prcb->DpcInterruptRequested))
+            if ((!Prcb->DpcRoutineActive) && (!Prcb->DpcInterruptRequested))
             {
                 /* Check if this is the same CPU */
                 if (Prcb != CurrentPrcb)
index ab3c116..23b3b33 100644 (file)
@@ -237,7 +237,7 @@ KeSetEventBoostPriority(IN PKEVENT Event,
     KIRQL OldIrql;
     PKWAIT_BLOCK WaitBlock;
     PKTHREAD Thread = KeGetCurrentThread(), WaitThread;
-    ASSERT(Event->Header.Type == SynchronizationEvent);
+    ASSERT_EVENT(Event);
     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
     /* Acquire Dispatcher Database Lock */
@@ -275,14 +275,14 @@ KeSetEventBoostPriority(IN PKEVENT Event,
         if (WaitingThread) *WaitingThread = WaitThread;
 
         /* Calculate new priority */
-        Thread->Priority = KiComputeNewPriority(Thread, 0);
+        Thread->Priority = KiComputeNewPriority(Thread);
 
         /* Unlink the waiting thread */
-        KiUnlinkThread(WaitThread, STATUS_SUCCESS);
+        KiUnlinkThread(WaitThread, STATUS_WAIT_0);
 
         /* Request priority boosting */
         WaitThread->AdjustIncrement = Thread->Priority;
-        WaitThread->AdjustReason = AdjustBoost;
+        WaitThread->AdjustReason = 2;
 
         /* Ready the thread */
         KiReadyThread(WaitThread);
index f45dc75..f6ace42 100644 (file)
@@ -8,6 +8,7 @@
 
 /* INCLUDES *****************************************************************/
 
+#define NTDDI_VERSION NTDDI_WS03
 #include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
@@ -136,6 +137,7 @@ KeSignalGateBoostPriority(IN PKGATE Gate)
     KIRQL OldIrql;
     ASSERT_GATE(Gate);
     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
+    ASSERT(FALSE);
 
     /* Start entry loop */
     for (;;)
index fb7dadb..bf3d477 100644 (file)
@@ -9,6 +9,7 @@
 
 /* INCLUDES ******************************************************************/
 
+#define NTDDI_VERSION NTDDI_WS03SP1
 #include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
index a2c54e9..298d23c 100644 (file)
 
 /* FUNCTIONS ******************************************************************/
 
-.globl _KiComputeTimerTableIndex@8
-.func KiComputeTimerTableIndex@8
-_KiComputeTimerTableIndex@8:
-
-    /* Save registers */
-    push ebx
-
-    /* Make the first multiplication */
-    mov eax, [esp+8]
-    mul dword ptr [_KiTimeIncrementReciprocal+4]
-    mov ebx, eax
-    mov ecx, edx
-
-    /* Make the second multiplication */
-    mov eax, [esp+12]
-    mul dword ptr [_KiTimeIncrementReciprocal]
-    add ebx, eax
-    adc ecx, edx
-
-    /* Multiply by the reciprocal */
-    mov eax, [esp+8]
-    mul dword ptr [_KiTimeIncrementReciprocal]
-    mov eax, [esp+12]
-    push edx
-    mul dword ptr [_KiTimeIncrementReciprocal+4]
-    pop edx
-    add edx, ebx
-    adc eax, ecx
-
-    /* Shift the result and generate the index */
-    mov cl, [_KiTimeIncrementShiftCount]
-    shr eax, cl
-    and eax, TIMER_TABLE_SIZE - 1
-
-    /* Return */
-    pop ebx
-    ret 8
-.endfunc
-
 .globl _KeUpdateRunTime@4
 .func KeUpdateRunTime@4
 _KeUpdateRunTime@4:
@@ -253,50 +214,13 @@ _KeUpdateSystemTime@0:
     /* FIXME: HACK */
     mov ds:[USER_SHARED_DATA], ecx
 
-    /* Get hand index and entry into the table */
-    and eax, TIMER_TABLE_SIZE - 1
-    shl eax, 4
-
-    /* Compare the due time */
-    cmp esi, [eax+_KiTimerTableListHead+KTIMER_TABLE_TIME+4]
-    jb NextHand
-    ja TimerExpired
-    cmp edi, [eax+_KiTimerTableListHead+KTIMER_TABLE_TIME]
-    jnb TimerExpired
-
-NextHand:
-    /* Move to the next hand */
-    inc ebx
-    mov eax, ebx
-
 IncompleteTick:
 
-    /* Get hand index and entry into the table */
-    and eax, TIMER_TABLE_SIZE - 1
-    shl eax, 4
-
-    /* Compare the due time */
-    cmp esi, [eax+_KiTimerTableListHead+KTIMER_TABLE_TIME+4]
-    jb DebugCheck
-    ja TimerExpired
-    cmp edi, [eax+_KiTimerTableListHead+KTIMER_TABLE_TIME]
-    jb DebugCheck
-
-TimerExpired:
-
-    /* Check if expiration is active */
-    mov ecx, [fs:KPCR_PRCB]
-    cmp dword ptr [ecx+KPRCB_TIMER_REQUEST], 0
-    jne DebugCheck
-
-    /* It's not, register it */
-    mov [ecx+KPRCB_TIMER_REQUEST], esp
-    mov [ecx+KPRCB_TIMER_HAND], ebx
-    mov ecx, DISPATCH_LEVEL
-    call @HalRequestSoftwareInterrupt@4
-
-DebugCheck:
-    /* FIXME: Check for KdDebuggerEnabled */
+    /* FIXME: NASTY Queue DPC to handle registered timers */
+    push 0
+    push [esp+KTRAP_FRAME_EIP]
+    push offset _KiExpireTimerDpc
+    call _KeInsertQueueDpc@12
 
     /* Check if this was a full tick */
     cmp dword ptr _KiTickOffset, 0
index 67702c3..b9e8cf1 100644 (file)
@@ -340,14 +340,6 @@ KiGetFeatureBits(VOID)
             FeatureBits &= ~KF_WORKING_PTE;
         }
 
-        /* Check if the CPU is too old to support SYSENTER */
-        if ((Prcb->CpuType < 6) ||
-            ((Prcb->CpuType == 6) && (Prcb->CpuStep < 0x0303)))
-        {
-            /* Disable it */
-            Reg[3] &= ~0x800;
-        }
-
         /* Set the current features */
         CpuFeatures = Reg[3];
     }
@@ -362,7 +354,6 @@ KiGetFeatureBits(VOID)
     if (CpuFeatures & 0x00002000) FeatureBits |= KF_GLOBAL_PAGE | KF_CR4;
     if (CpuFeatures & 0x00008000) FeatureBits |= KF_CMOV;
     if (CpuFeatures & 0x00010000) FeatureBits |= KF_PAT;
-    if (CpuFeatures & 0x00200000) FeatureBits |= KF_DTS;
     if (CpuFeatures & 0x00800000) FeatureBits |= KF_MMX;
     if (CpuFeatures & 0x01000000) FeatureBits |= KF_FXSR;
     if (CpuFeatures & 0x02000000) FeatureBits |= KF_XMMI;
@@ -398,9 +389,6 @@ KiGetFeatureBits(VOID)
                 /* Check which extended features are available. */
                 CPUID(Reg, 0x80000001);
 
-                /* Check if NX-bit is supported */
-                if (Reg[3] & 0x00100000) FeatureBits |= KF_NX_BIT;
-
                 /* Now handle each features for each CPU Vendor */
                 switch (Vendor)
                 {
@@ -544,7 +532,7 @@ KiInitializeTSS2(IN PKTSS Tss,
     {
         /* Set the Limit */
         TssEntry->LimitLow = sizeof(KTSS) - 1;
-        TssEntry->HighWord.Bits.LimitHi 0;
+        TssEntry->HighWord.Bits.LimitHi &= 0xF0;
     }
 
     /* Now clear the I/O Map */
@@ -667,7 +655,7 @@ NTAPI
 KeFlushCurrentTb(VOID)
 {
     /* Flush the TLB by resetting CR3 */
-    __writecr3((ULONGLONG)__readcr3());
+    __writecr3((ULONGLONG)__readcr3);
 }
 
 VOID
@@ -753,23 +741,8 @@ ULONG_PTR
 NTAPI
 Ki386EnableXMMIExceptions(IN ULONG_PTR Context)
 {
-#if 0 // needs kitrap13
-    PKIDTENTRY IdtEntry;
-
-    /* Get the IDT Entry for Interrupt 19 */
-    IdtEntry = ((PKIPCR)KeGetPcr())->IDT[19];
-
-    /* Set it up */
-    IdtEntry->Selector = KGDT_R0_CODE;
-    IdtEntry->Offset = (KiTrap13 & 0xFFFF);
-    IdtEntry->ExtendedOffset = (KiTrap13 >> 16) & 0xFFFF;
-    ((PKIDT_ACCESS)&IdtEntry->Access)->Dpl = 0;
-    ((PKIDT_ACCESS)&IdtEntry->Access)->Present = 1;
-    ((PKIDT_ACCESS)&IdtEntry->Access)->SegmentType = I386_INTERRUPT_GATE;
-#endif
-
-    /* Enable XMMI exceptions */
-    __writecr4(__readcr4() | CR4_XMMEXCPT);
+    /* FIXME: Support this */
+    DPRINT1("Your machine supports XMMI exceptions but ReactOS doesn't\n");
     return 0;
 }
 
@@ -777,34 +750,8 @@ VOID
 NTAPI
 KiI386PentiumLockErrataFixup(VOID)
 {
-    KDESCRIPTOR IdtDescriptor;
-    PKIDTENTRY NewIdt, NewIdt2;
-
-    /* Allocate memory for a new IDT */
-    NewIdt = ExAllocatePool(NonPagedPool, 2 * PAGE_SIZE);
-
-    /* Put everything after the first 7 entries on a new page */
-    NewIdt2 = (PVOID)((ULONG_PTR)NewIdt + PAGE_SIZE - (7 * sizeof(KIDTENTRY)));
-
-    /* Disable interrupts */
-    _disable();
-
-    /* Get the current IDT and copy it */
-    Ke386GetInterruptDescriptorTable(IdtDescriptor);
-    RtlCopyMemory(NewIdt2,
-                  (PVOID)IdtDescriptor.Base,
-                  IdtDescriptor.Limit + 1);
-    IdtDescriptor.Base = (ULONG)NewIdt2;
-
-    /* Set the new IDT */
-    Ke386SetInterruptDescriptorTable(IdtDescriptor);
-    ((PKIPCR)KeGetPcr())->IDT = NewIdt2;
-
-    /* Restore interrupts */
-    _enable();
-
-    /* Set the first 7 entries as read-only to produce a fault */
-    MmSetPageProtect(NULL, NewIdt, PAGE_READONLY);
+    /* FIXME: Support this */
+    DPRINT1("WARNING: Your machine has a CPU bug that ReactOS can't bypass!\n");
 }
 
 /* PUBLIC FUNCTIONS **********************************************************/
@@ -817,7 +764,7 @@ NTAPI
 KeSaveFloatingPointState(OUT PKFLOATING_SAVE Save)
 {
     PFNSAVE_FORMAT FpState;
-    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+    ASSERT_IRQL(DISPATCH_LEVEL);
     DPRINT1("%s is not really implemented\n", __FUNCTION__);
 
     /* check if we are doing software emulation */
index 680f1dd..45256cf 100644 (file)
 /* INCLUDES ******************************************************************/
 
 #include <roscfg.h>
+#include <internal/i386/ke.h>
 #include <ndk/asm.h>
 .intel_syntax noprefix
 
 #define Running 2
-#define WrDispatchInt 0x1F
-
-Dividend: .float 4195835.0
-Divisor:  .float 3145727.0
-Result1:  .float 0
-Result2:  .float 0
 
 /* FUNCTIONS ****************************************************************/
 
-.globl _KiIsNpxErrataPresent@0
-.func KiIsNpxErrataPresent@0
-_KiIsNpxErrataPresent@0:
-
-    /* Disable interrupts */
-    cli
-
-    /* Get CR0 and mask out FPU flags */
-    mov eax, cr0
-    mov ecx, eax
-    and eax, ~(CR0_MP + CR0_TS + CR0_EM)
-    mov cr0, eax
-
-    /* Initialize the FPU */
-    fninit
-
-    /* Do the divison and inverse multiplication */
-    fld qword ptr Dividend
-    fstp qword ptr Result1
-    fld qword ptr Divisor
-    fstp qword ptr Result2
-    fld qword ptr Result1
-    fdiv qword ptr Result2
-    fmul qword ptr Result2
-
-    /* Do the compare and check flags */
-    fcomp qword ptr Result1
-    fstsw ax
-    sahf
-
-    /* Restore CR0 and interrupts */
-    mov cr0, ecx
-    sti
-
-    /* Return errata status */
-    xor eax, eax
-    jz NoErrata
-    inc eax
-
-NoErrata:
-    ret
-.endfunc
-
 .globl _KiIsNpxPresent@0
 .func KiIsNpxPresent@0
 _KiIsNpxPresent@0:
@@ -337,7 +289,6 @@ BadThread:
  *     Absolutely all registers except ESP can be trampled here for maximum code flexibility.
  *
  *--*/
-.globl @KiSwapContextInternal@0
 .func @KiSwapContextInternal@0, @KiSwapContextInternal@0
 @KiSwapContextInternal@0:
 
@@ -462,7 +413,7 @@ SameProcess:
     sub eax, NPX_FRAME_LENGTH
 
     /* Check if this isn't V86 Mode, so we can bias the Esp0 */
-    test dword ptr [eax - KTRAP_FRAME_SIZE + KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
+    test dword ptr [eax - KTRAP_FRAME_SIZE + KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
     jnz NoAdjust
 
     /* Bias esp */
@@ -611,6 +562,7 @@ WrongCpu:
 .globl @KiSwapContext@8
 .func @KiSwapContext@8, @KiSwapContext@8
 @KiSwapContext@8:
+    /* Note, we CANNOT touch ebp */
 
     /* Save 4 registers */
     sub esp, 4 * 4
@@ -677,15 +629,22 @@ MainLoop:
 #endif
     jz CheckSchedule
 
+    /* Raise to DISPATCH_LEVEL */
+    mov ecx, DISPATCH_LEVEL
+    call @KfRaiseIrql@4
+    mov edi, eax
+
     /* Handle the above */
     lea ecx, [ebx+KPCR_PRCB_DATA]
     call @KiRetireDpcList@4
 
+    /* Lower IRQL */
+    mov ecx, edi
+    call @KfLowerIrql@4
+
 CheckSchedule:
-#ifndef NEW_SCHEDULER
     /* FIXME: ROS HACK */
     call _NtYieldExecution@0
-#endif
 
     /* Check if a next thread is queued */
     cmp dword ptr [ebx+KPCR_PRCB_NEXT_THREAD], 0
@@ -705,7 +664,7 @@ CheckSchedule:
     /* Set the current thread to ready */
     mov edi, [ebx+KPCR_CURRENT_THREAD]
 #ifdef CONFIG_SMP
-    mov byte ptr [edi+KTHREAD_SWAP_BUSY], 1
+    mov [edi+KTHREAD_STATE], Ready
 
     /* Acquire the PRCB Lock */
     lock bts [ebx+KPCR_PRCB_PRCB_LOCK], 0
index 032a6b3..3d57fa9 100644 (file)
@@ -8,6 +8,7 @@
 
 /* INCLUDES *****************************************************************/
 
+#define NTDDI_VERSION NTDDI_WS03SP1
 #include <ntoskrnl.h>
 #define NDEBUG
 #include <debug.h>
@@ -29,18 +30,15 @@ KiInitMachineDependent(VOID)
     BOOLEAN FbCaching = FALSE;
     NTSTATUS Status;
     ULONG ReturnLength;
-    ULONG i, Affinity, Sample = 0;
+    ULONG i, Affinity;
     PFX_SAVE_AREA FxSaveArea;
-    ULONG MXCsrMask = 0xFFBF;
-    ULONG Dummy[4];
-    KI_SAMPLE_MAP Samples[4];
-    PKI_SAMPLE_MAP CurrentSample = Samples;
+    ULONG MXCsrMask = 0xFFBF, NewMask;
 
     /* Check for large page support */
     if (KeFeatureBits & KF_LARGE_PAGE)
     {
         /* FIXME: Support this */
-        DPRINT1("Large Page support detected but not yet taken advantage of!\n");
+        DPRINT1("Your machine supports PGE but ReactOS doesn't yet.\n");
     }
 
     /* Check for global page support */
@@ -72,34 +70,6 @@ KiInitMachineDependent(VOID)
     /* Assume no errata for now */
     SharedUserData->ProcessorFeatures[PF_FLOATING_POINT_PRECISION_ERRATA] = 0;
 
-    /* Check if we have an NPX */
-    if (KeI386NpxPresent)
-    {
-        /* Loop every CPU */
-        i = KeActiveProcessors;
-        for (Affinity = 1; i; Affinity <<= 1)
-        {
-            /* Check if this is part of the set */
-            if (i & Affinity)
-            {
-                /* Run on this CPU */
-                i &= ~Affinity;
-                KeSetSystemAffinityThread(Affinity);
-
-                /* Detect FPU errata */
-                if (KiIsNpxErrataPresent())
-                {
-                    /* Disable NPX support */
-                    KeI386NpxPresent = FALSE;
-                    SharedUserData->
-                        ProcessorFeatures[PF_FLOATING_POINT_PRECISION_ERRATA] =
-                        TRUE;
-                    break;
-                }
-            }
-        }
-    }
-
     /* If there's no NPX, then we're emulating the FPU */
     SharedUserData->ProcessorFeatures[PF_FLOATING_POINT_EMULATED] =
         !KeI386NpxPresent;
@@ -178,66 +148,18 @@ KiInitMachineDependent(VOID)
                 /* Start sampling loop */
                 for (;;)
                 {
-                    /* Do a dummy CPUID to start the sample */
-                    CPUID(Dummy, 0);
-
-                    /* Fill out the starting data */
-                    CurrentSample->PerfStart = KeQueryPerformanceCounter(NULL);
-                    CurrentSample->TSCStart = __rdtsc();
-                    CurrentSample->PerfFreq.QuadPart = -50000;
-
-                    /* Sleep for this sample */
-                    KeDelayExecutionThread(KernelMode,
-                                           FALSE,
-                                           &CurrentSample->PerfFreq);
-
-                    /* Do another dummy CPUID */
-                    CPUID(Dummy, 0);
-
-                    /* Fill out the ending data */
-                    CurrentSample->PerfEnd =
-                        KeQueryPerformanceCounter(&CurrentSample->PerfFreq);
-                    CurrentSample->TSCEnd = __rdtsc();
-
-                    /* Calculate the differences */
-                    CurrentSample->PerfDelta = CurrentSample->PerfEnd.QuadPart -
-                                               CurrentSample->PerfStart.QuadPart;
-                    CurrentSample->TSCDelta = CurrentSample->TSCEnd -
-                                              CurrentSample->TSCStart;
-
-                    /* Compute CPU Speed */
-                    CurrentSample->MHz = ((CurrentSample->TSCDelta *
-                                           CurrentSample->PerfFreq.QuadPart +
-                                           500000) /
-                                          (CurrentSample->PerfDelta * 1000000));
-
-                    /* Check if this isn't the first sample */
-                    if (Sample)
-                    {
-                        /* Check if we got a good precision within 1MHz */
-                        if ((CurrentSample->MHz == CurrentSample[-1].MHz) ||
-                            (CurrentSample->MHz == CurrentSample[-1].MHz + 1) ||
-                            (CurrentSample->MHz == CurrentSample[-1].MHz - 1))
-                        {
-                            /* We did, stop sampling */
-                            break;
-                        }
-                    }
-
-                    /* Move on */
-                    CurrentSample++;
-                    Sample++;
+                    //
+                    // FIXME: TODO
+                    //
+                    break;
                 }
-
-                /* Save the CPU Speed */
-                KeGetCurrentPrcb()->MHz = CurrentSample[-1].MHz;
             }
 
-            /* Check if we have MTRR */
-            if (KeFeatureBits & KF_MTRR)
+            /* Check if we have MTRR without PAT */
+            if (!(KeFeatureBits & KF_PAT) && (KeFeatureBits & KF_MTRR))
             {
                 /* Then manually initialize MTRR for the CPU */
-                KiInitializeMTRR((BOOLEAN)i ? FALSE : TRUE);
+                KiInitializeMTRR((BOOLEAN)i);
             }
 
             /* Check if we have AMD MTRR and initialize it for the CPU */
@@ -246,53 +168,52 @@ KiInitMachineDependent(VOID)
             /* Check if this is a buggy Pentium and apply the fixup if so */
             if (KiI386PentiumLockErrataPresent) KiI386PentiumLockErrataFixup();
 
-            /* Check if the CPU supports FXSR */
-            if (KeFeatureBits & KF_FXSR)
-            {
-                /* Get the current thread NPX state */
-                FxSaveArea = (PVOID)
-                             ((ULONG_PTR)KeGetCurrentThread()->InitialStack -
-                             NPX_FRAME_LENGTH);
+            /* Get the current thread NPX state */
+            FxSaveArea = (PVOID)
+                         ((ULONG_PTR)KeGetCurrentThread()->InitialStack -
+                         NPX_FRAME_LENGTH);
 
-                /* Clear initial MXCsr mask */
-                FxSaveArea->U.FxArea.MXCsrMask = 0;
+            /* Clear initial MXCsr mask */
+            FxSaveArea->U.FxArea.MXCsrMask = 0;
 
-                /* Save the current NPX State */
+            /* Save the current NPX State */
 #ifdef __GNUC__
-                asm volatile("fxsave %0\n\t" : "=m" (*FxSaveArea));
+            asm volatile("fxsave %0\n\t" : "=m" (*FxSaveArea));
 #else
-                __asm fxsave [FxSaveArea]
+            __asm fxsave [FxSaveArea]
 #endif
-                /* Check if the current mask doesn't match the reserved bits */
-                if (FxSaveArea->U.FxArea.MXCsrMask != 0)
-                {
-                    /* Then use whatever it's holding */
-                    MXCsrMask = FxSaveArea->U.FxArea.MXCsrMask;
-                }
+            /* Check if the current mask doesn't match the reserved bits */
+            if (FxSaveArea->U.FxArea.MXCsrMask != MXCsrMask)
+            {
+                /* Then use whatever it's holding */
+                MXCsrMask = FxSaveArea->U.FxArea.MXCsrMask;
+            }
 
-                /* Check if nobody set the kernel-wide mask */
-                if (!KiMXCsrMask)
-                {
-                    /* Then use the one we calculated above */
-                    KiMXCsrMask = MXCsrMask;
-                }
-                else
+            /* Check if nobody set the kernel-wide mask */
+            if (!KiMXCsrMask)
+            {
+                /* Then use the one we calculated above */
+                NewMask = MXCsrMask;
+            }
+            else
+            {
+                /* Use the existing mask */
+                NewMask = KiMXCsrMask;
+
+                /* Was it set to the same value we found now? */
+                if (NewMask != MXCsrMask)
                 {
-                    /* Was it set to the same value we found now? */
-                    if (KiMXCsrMask != MXCsrMask)
-                    {
-                        /* No, something is definitely wrong */
-                        KEBUGCHECKEX(MULTIPROCESSOR_CONFIGURATION_NOT_SUPPORTED,
-                                     KF_FXSR,
-                                     KiMXCsrMask,
-                                     MXCsrMask,
-                                     0);
-                    }
+                    /* No, something is definitely wrong */
+                    KEBUGCHECKEX(MULTIPROCESSOR_CONFIGURATION_NOT_SUPPORTED,
+                                 KF_FXSR,
+                                 NewMask,
+                                 MXCsrMask,
+                                 0);
                 }
-
-                /* Now set the kernel mask */
-                KiMXCsrMask &= MXCsrMask;
             }
+
+            /* Now set the kernel mask */
+            KiMXCsrMask = NewMask & MXCsrMask;
         }
     }
 
@@ -321,7 +242,7 @@ KiInitializePcr(IN ULONG ProcessorNumber,
     Pcr->NtTib.ExceptionList = EXCEPTION_CHAIN_END;
     Pcr->NtTib.StackBase = 0;
     Pcr->NtTib.StackLimit = 0;
-    Pcr->NtTib.Self = NULL;
+    Pcr->NtTib.Self = 0;
 
     /* Set the Current Thread */
     Pcr->PrcbData.CurrentThread = IdleThread;
@@ -361,11 +282,7 @@ KiInitializePcr(IN ULONG ProcessorNumber,
     Pcr->GDT = (PVOID)Gdt;
     Pcr->IDT = Idt;
     Pcr->TSS = Tss;
-    Pcr->TssCopy = Tss;
     Pcr->PrcbData.DpcStack = DpcStack;
-
-    /* Setup the processor set */
-    Pcr->PrcbData.MultiThreadProcessorSet = Pcr->PrcbData.SetMember;
 }
 
 VOID
@@ -382,7 +299,6 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
     LARGE_INTEGER PageDirectory;
     PVOID DpcStack;
     ULONG NXSupportPolicy;
-    ULONG Vendor[3];
 
     /* Detect and set the CPU Type */
     KiSetProcessorType();
@@ -403,19 +319,19 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
     FeatureBits = KiGetFeatureBits();
 
     /* Set the default NX policy (opt-in) */
-    NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN;
+    NXSupportPolicy = 2;
 
     /* Check if NPX is always on */
     if (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=ALWAYSON"))
     {
         /* Set it always on */
-        NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSON;
+        NXSupportPolicy = 1;
         FeatureBits |= KF_NX_ENABLED;
     }
     else if (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=OPTOUT"))
     {
         /* Set it in opt-out mode */
-        NXSupportPolicy = NX_SUPPORT_POLICY_OPTOUT;
+        NXSupportPolicy = 3;
         FeatureBits |= KF_NX_ENABLED;
     }
     else if ((strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=OPTIN")) ||
@@ -428,7 +344,7 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
              (strstr(KeLoaderBlock->LoadOptions, "EXECUTE")))
     {
         /* Set disabled mode */
-        NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSOFF;
+        NXSupportPolicy = 0;
         FeatureBits |= KF_NX_DISABLED;
     }
 
@@ -456,32 +372,18 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
         KeI386NpxPresent = NpxPresent;
         KeI386CpuType = Prcb->CpuType;
         KeI386CpuStep = Prcb->CpuStep;
-        KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL;
+        KeProcessorArchitecture = 0;
         KeProcessorLevel = (USHORT)Prcb->CpuType;
         if (Prcb->CpuID) KeProcessorRevision = Prcb->CpuStep;
         KeFeatureBits = FeatureBits;
         KeI386FxsrPresent = (KeFeatureBits & KF_FXSR) ? TRUE : FALSE;
         KeI386XMMIPresent = (KeFeatureBits & KF_XMMI) ? TRUE : FALSE;
 
-        /* Detect 8-byte compare exchange support */
-        if (!(KeFeatureBits & KF_CMPXCHG8B))
-        {
-            /* Copy the vendor string */
-            RtlCopyMemory(Vendor, Prcb->VendorString, sizeof(Vendor));
-
-            /* Bugcheck the system. Windows *requires* this */
-            KeBugCheckEx(0x5D,
-                         (1 << 24 ) | (Prcb->CpuType << 16) | Prcb->CpuStep,
-                         Vendor[0],
-                         Vendor[1],
-                         Vendor[2]);
-        }
-
         /* Set the current MP Master KPRCB to the Boot PRCB */
         Prcb->MultiThreadSetMaster = Prcb;
 
         /* Lower to APC_LEVEL */
-        KeLowerIrql(APC_LEVEL);
+        KfLowerIrql(APC_LEVEL);
 
         /* Initialize some spinlocks */
         KeInitializeSpinLock(&KiFreezeExecutionLock);
@@ -597,9 +499,7 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
     KeSetPriorityThread(InitThread, 0);
 
     /* If there's no thread scheduled, put this CPU in the Idle summary */
-    KiAcquirePrcbLock(Prcb);
     if (!Prcb->NextThread) KiIdleSummary |= 1 << Number;
-    KiReleasePrcbLock(Prcb);
 
     /* Raise back to HIGH_LEVEL and clear the PRCB for the loader block */
     KfRaiseIrql(HIGH_LEVEL);
@@ -783,8 +683,12 @@ AppCpuInit:
     /* Set the right wait IRQL */
     KeGetCurrentThread()->WaitIrql = DISPATCH_LEVEL;
 
+    /* Set idle thread as running on UP builds */
+#ifndef CONFIG_SMP
+    KeGetCurrentThread()->State = Running;
+#endif
+
     /* Jump into the idle loop */
     KiIdleLoop();
 }
 
-
index 95e2307..f571c71 100644 (file)
@@ -59,5 +59,5 @@ NTAPI
 KiInitializePAT(VOID)
 {
     /* FIXME: Support this */
-    DPRINT1("Advanced Memory features detected but not yet taken advantage of.\n");
+    DPRINT1("Your machine supports PAT but ReactOS doesn't yet.\n");
 }
index 6d8ff2f..8072a40 100644 (file)
@@ -6,18 +6,18 @@
  * PROGRAMMER:      Alex Ionescu (alex@relsoft.net)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES ****************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
-typedef struct _KSWITCHFRAME
+typedef struct _KSHARED_CTXSWITCH_FRAME
 {
     PVOID ExceptionList;
-    BOOLEAN ApcBypassDisable;
-    PVOID RetAddr;
-} KSWITCHFRAME, *PKSWITCHFRAME;
+    KIRQL WaitIrql;
+    PVOID RetEip;
+} KSHARED_CTXSWITCH_FRAME, *PKSHARED_CTXSWITCH_FRAME;
 
 typedef struct _KSTART_FRAME
 {
@@ -27,47 +27,65 @@ typedef struct _KSTART_FRAME
     BOOLEAN UserThread;
 } KSTART_FRAME, *PKSTART_FRAME;
 
-typedef struct _KUINIT_FRAME
-{
-    KSWITCHFRAME CtxSwitchFrame;
-    KSTART_FRAME StartFrame;
-    KTRAP_FRAME TrapFrame;
-    FX_SAVE_AREA FxSaveArea;
+/*
+ * This is the Initial Thread Stack Frame on i386.
+ *
+ * It is composed of :
+ *
+ *     - A shared Thread Switching frame so that we can use
+ *       the context-switching code when initializing the thread.
+ *
+ *     - The Stack Frame for KiThreadStartup, which are the parameters
+ *       that it will receive (System/Start Routines & Context)
+ *
+ *     - A Trap Frame with the Initial Context *IF AND ONLY IF THE THREAD IS USER*
+ *
+ *     - The FPU Save Area, theoretically part of the Trap Frame's "ExtendedRegisters"
+ *
+ * This Initial Thread Stack Frame starts at Thread->InitialStack and it spans
+ * a total size of 0x2B8 bytes.
+ */
+typedef struct _KUINIT_FRAME {
+    KSHARED_CTXSWITCH_FRAME CtxSwitchFrame;    /* -0x2B8 */
+    KSTART_FRAME StartFrame;                   /* -0x2AC */
+    KTRAP_FRAME TrapFrame;                     /* -0x29C */
+    FX_SAVE_AREA FxSaveArea;                   /* -0x210 */
 } KUINIT_FRAME, *PKUINIT_FRAME;
 
-typedef struct _KKINIT_FRAME
-{
-    KSWITCHFRAME CtxSwitchFrame;
-    KSTART_FRAME StartFrame;
-    FX_SAVE_AREA FxSaveArea;
+typedef struct _KKINIT_FRAME {
+    KSHARED_CTXSWITCH_FRAME CtxSwitchFrame;    /* -0x22C */
+    KSTART_FRAME StartFrame;                   /* -0x220 */
+    FX_SAVE_AREA FxSaveArea;                   /* -0x210 */
 } KKINIT_FRAME, *PKKINIT_FRAME;
 
 /* FUNCTIONS *****************************************************************/
 
 VOID
-NTAPI
-Ke386InitThreadWithContext(IN PKTHREAD Thread,
-                           IN PKSYSTEM_ROUTINE SystemRoutine,
-                           IN PKSTART_ROUTINE StartRoutine,
-                           IN PVOID StartContext,
-                           IN PCONTEXT ContextPointer)
+STDCALL
+Ke386InitThreadWithContext(PKTHREAD Thread,
+                           PKSYSTEM_ROUTINE SystemRoutine,
+                           PKSTART_ROUTINE StartRoutine,
+                           PVOID StartContext,
+                           PCONTEXT ContextPointer)
 {
     PFX_SAVE_AREA FxSaveArea;
     PFXSAVE_FORMAT FxSaveFormat;
     PKSTART_FRAME StartFrame;
-    PKSWITCHFRAME CtxSwitchFrame;
+    PKSHARED_CTXSWITCH_FRAME CtxSwitchFrame;
     PKTRAP_FRAME TrapFrame;
     CONTEXT LocalContext;
     PCONTEXT Context = NULL;
     ULONG ContextFlags;
 
     /* Check if this is a With-Context Thread */
+    DPRINT("Ke386InitThreadContext\n");
     if (ContextPointer)
     {
         /* Set up the Initial Frame */
         PKUINIT_FRAME InitFrame;
         InitFrame = (PKUINIT_FRAME)((ULONG_PTR)Thread->InitialStack -
                                     sizeof(KUINIT_FRAME));
+        DPRINT("Setting up a user-mode thread. InitFrame at: %p\n", InitFrame);
 
         /* Copy over the context we got */
         RtlCopyMemory(&LocalContext, ContextPointer, sizeof(CONTEXT));
@@ -172,6 +190,7 @@ Ke386InitThreadWithContext(IN PKTHREAD Thread,
         PKKINIT_FRAME InitFrame;
         InitFrame = (PKKINIT_FRAME)((ULONG_PTR)Thread->InitialStack -
                                     sizeof(KKINIT_FRAME));
+        DPRINT("Setting up a kernel thread. InitFrame at: %p\n", InitFrame);
 
         /* Setup the Fx Area */
         FxSaveArea = &InitFrame->FxSaveArea;
@@ -211,14 +230,15 @@ Ke386InitThreadWithContext(IN PKTHREAD Thread,
     StartFrame->SystemRoutine = SystemRoutine;
 
     /* And set up the Context Switch Frame */
-    CtxSwitchFrame->RetAddr = KiThreadStartup;
-    CtxSwitchFrame->ApcBypassDisable = TRUE;
-    CtxSwitchFrame->ExceptionList = EXCEPTION_CHAIN_END;;
+    CtxSwitchFrame->RetEip = KiThreadStartup;
+    CtxSwitchFrame->WaitIrql = APC_LEVEL;
+    CtxSwitchFrame->ExceptionList = (PVOID)0xFFFFFFFF;
 
     /* Save back the new value of the kernel stack. */
+    DPRINT("Final Kernel Stack: %x \n", CtxSwitchFrame);
     Thread->KernelStack = (PVOID)CtxSwitchFrame;
+    return;
 }
 
 /* EOF */
 
-
index 174fc19..c3457bb 100644 (file)
@@ -12,9 +12,6 @@
 #include <internal/i386/asmmacro.S>
 .intel_syntax noprefix
 
-#define Running 2
-#define WrDispatchInt 0x1F
-
 /* GLOBALS *******************************************************************/
 
 .data
@@ -2230,7 +2227,7 @@ _KiDispatchInterrupt@0:
 
     /* Restore stack and exception list */
     pop esp
-    pop dword ptr [ebx+KPCR_EXCEPTION_LIST]
+    pop dword ptr [ebx]
     pop ebp
 
 CheckQuantum:
@@ -2244,44 +2241,10 @@ CheckQuantum:
 
     /* Check if we have a thread to swap to */
     cmp byte ptr [ebx+KPCR_PRCB_NEXT_THREAD], 0
-    je Return
-
-    /* Make space on the stack to save registers */
-    sub esp, 3 * 4
-    mov [esp+8], esi
-    mov [esp+4], edi
-    mov [esp+0], ebp
-
-    /* Get the current thread */
-    mov edi, [ebx+KPCR_CURRENT_THREAD]
-
-#ifdef CONFIG_SMP
-    #error SMP Interrupt not handled!
-#endif
+    jz Return
 
-    /* Get the next thread and clear it */
-    mov esi, [ebx+KPCR_PRCB_NEXT_THREAD]
-    and dword ptr [ebx+KPCR_PRCB_NEXT_THREAD], 0
-
-    /* Set us as the current running thread */
-    mov [ebx+KPCR_CURRENT_THREAD], esi
-    mov byte ptr [esi+KTHREAD_STATE], Running
-    mov byte ptr [edi+KTHREAD_WAIT_REASON], WrDispatchInt
-
-    /* Put thread in ECX and get the PRCB in EDX */
-    mov ecx, edi
-    lea edx, [ebx+KPCR_PRCB_DATA]
-    call @KiQueueReadyThread@8
-
-    /* Set APC_LEVEL and do the swap */
-    mov cl, APC_LEVEL
-    call @KiSwapContextInternal@0
-
-    /* Restore registers */
-    mov ebp, [esp+0]
-    mov edi, [esp+4]
-    mov esi, [esp+8]
-    add esp, 3*4
+    /* FIXME: Schedule new thread */
+    UNHANDLED_PATH
 
 Return:
     /* All done */
index 4a35240..05188c4 100644 (file)
@@ -67,8 +67,8 @@ KiInitSystem(VOID)
     KeInitializeSpinLock(&BugCheckCallbackLock);
 
     /* Initialize the Timer Expiration DPC */
-    KeInitializeDpc(&KiTimerExpireDpc, KiTimerExpiration, NULL);
-    KeSetTargetProcessorDpc(&KiTimerExpireDpc, 0);
+    KeInitializeDpc(&KiExpireTimerDpc, KiExpireTimers, NULL);
+    KeSetTargetProcessorDpc(&KiExpireTimerDpc, 0);
 
     /* Initialize Profiling data */
     KeInitializeSpinLock(&KiProfileLock);
@@ -84,6 +84,9 @@ KiInitSystem(VOID)
         KiTimerTableListHead[i].Time.LowPart = 0;
     }
 
+    /* Initialize old-style list */
+    InitializeListHead(&KiTimerListHead);
+
     /* Initialize the Swap event and all swap lists */
     KeInitializeEvent(&KiSwapEvent, SynchronizationEvent, FALSE);
     InitializeListHead(&KiProcessInSwapListHead);
@@ -91,7 +94,7 @@ KiInitSystem(VOID)
     InitializeListHead(&KiStackInSwapListHead);
 
     /* Initialize the mutex for generic DPC calls */
-    ExInitializeFastMutex(&KiGenericCallDpcMutex);
+    KeInitializeMutex(&KiGenericCallDpcMutex, 0);
 
     /* Initialize the syscall table */
     KeServiceDescriptorTable[0].Base = MainSSDT;
@@ -180,7 +183,7 @@ KiInitSpinLocks(IN PKPRCB Prcb,
     Prcb->QueueIndex = 1;
     Prcb->ReadySummary = 0;
     Prcb->DeferredReadyListHead.Next = NULL;
-    for (i = 0; i < MAXIMUM_PRIORITY; i++)
+    for (i = 0; i < 32; i++)
     {
         /* Initialize the ready list */
         InitializeListHead(&Prcb->DispatcherReadyListHead[i]);
@@ -243,14 +246,10 @@ KiInitSpinLocks(IN PKPRCB Prcb,
     {
         /* Initialize the lock and setup the Queued Spinlock */
         KeInitializeSpinLock(&KiTimerTableLock[i]);
-        Prcb->LockQueue[LockQueueTimerTableLock + i].Next = NULL;
-        Prcb->LockQueue[LockQueueTimerTableLock + i].Lock =
-            &KiTimerTableLock[i];
+        Prcb->LockQueue[i].Next = NULL;
+        Prcb->LockQueue[i].Lock = &KiTimerTableLock[i];
     }
 
-    /* Initialize the PRCB lock */
-    KeInitializeSpinLock(&Prcb->PrcbLock);
-
     /* Check if this is the boot CPU */
     if (!Number)
     {
@@ -290,5 +289,3 @@ KeInitSystem(VOID)
     return TRUE;
 }
 
-
-
index 64e2d0d..b6280e3 100644 (file)
@@ -289,6 +289,7 @@ KeSetPriorityAndQuantumProcess(IN PKPROCESS Process,
     PLIST_ENTRY NextEntry, ListHead;
     KPRIORITY NewPriority, OldPriority;
     PKTHREAD Thread;
+    BOOLEAN Released;
     ASSERT_PROCESS(Process);
     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
@@ -367,7 +368,7 @@ KeSetPriorityAndQuantumProcess(IN PKPROCESS Process,
 
                 /* Disable decrements and update priority */
                 Thread->PriorityDecrement = 0;
-                KiSetPriorityThread(Thread, NewPriority);
+                KiSetPriorityThread(Thread, NewPriority, &Released);
             }
 
             /* Release the thread lock */
@@ -429,7 +430,7 @@ KeSetPriorityAndQuantumProcess(IN PKPROCESS Process,
 
                 /* Disable decrements and update priority */
                 Thread->PriorityDecrement = 0;
-                KiSetPriorityThread(Thread, NewPriority);
+                KiSetPriorityThread(Thread, NewPriority, &Released);
             }
 
             /* Release the thread lock */
@@ -441,7 +442,7 @@ KeSetPriorityAndQuantumProcess(IN PKPROCESS Process,
     }
 
     /* Release Dispatcher Database */
-    KiReleaseDispatcherLockFromDpcLevel();
+    if (!Released) KiReleaseDispatcherLockFromDpcLevel();
 
     /* Release the process lock */
     KiReleaseProcessLockFromDpcLevel(&ProcessLock);
index a2bddee..57e83f2 100644 (file)
@@ -75,7 +75,6 @@ KiInsertQueue(IN PKQUEUE Queue,
     PKTHREAD Thread = KeGetCurrentThread();
     PKWAIT_BLOCK WaitBlock;
     PLIST_ENTRY WaitEntry;
-    PKTIMER Timer;
     ASSERT_QUEUE(Queue);
 
     /* Save the old state */
@@ -110,8 +109,12 @@ KiInsertQueue(IN PKQUEUE Queue,
         Thread->WaitReason = 0;
 
         /* Check if there's a Thread Timer */
-        Timer = &Thread->Timer;
-        if (Timer->Header.Inserted) KxRemoveTreeTimer(Timer);
+        if (Thread->Timer.Header.Inserted)
+        {
+            /* Cancel the Thread Timer with the no-lock fastpath */
+            Thread->Timer.Header.Inserted = FALSE;
+            RemoveEntryList(&Thread->Timer.TimerListEntry);
+        }
 
         /* Reschedule the Thread */
         KiReadyThread(Thread);
@@ -241,14 +244,13 @@ KeRemoveQueue(IN PKQUEUE Queue,
     PLIST_ENTRY QueueEntry;
     NTSTATUS Status;
     PKTHREAD Thread = KeGetCurrentThread();
+    KIRQL OldIrql;
     PKQUEUE PreviousQueue;
-    PKWAIT_BLOCK WaitBlock = &Thread->WaitBlock[0];
-    PKWAIT_BLOCK TimerBlock = &Thread->WaitBlock[TIMER_WAIT_BLOCK];
-    PKTIMER Timer = &Thread->Timer;
+    PKWAIT_BLOCK WaitBlock;
+    PKTIMER Timer;
     BOOLEAN Swappable;
     PLARGE_INTEGER OriginalDueTime = Timeout;
-    LARGE_INTEGER DueTime, NewDueTime, InterruptTime;
-    ULONG Hand = 0;
+    LARGE_INTEGER DueTime, NewDueTime;
     ASSERT_QUEUE(Queue);
     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
@@ -257,14 +259,12 @@ KeRemoveQueue(IN PKQUEUE Queue,
     {
         /* It is, so next time don't do expect this */
         Thread->WaitNext = FALSE;
-        KxQueueThreadWait();
     }
     else
     {
-        /* Raise IRQL to synch, prepare the wait, then lock the database */
-        Thread->WaitIrql = KeRaiseIrqlToSynchLevel();
-        KxQueueThreadWait();
-        KiAcquireDispatcherLockAtDpcLevel();
+        /* Lock the Dispatcher Database */
+        OldIrql = KiAcquireDispatcherLock();
+        Thread->WaitIrql = OldIrql;
     }
 
     /*
@@ -314,13 +314,7 @@ KeRemoveQueue(IN PKQUEUE Queue,
             /* Check if the entry is valid. If not, bugcheck */
             if (!(QueueEntry->Flink) || !(QueueEntry->Blink))
             {
-                /* Invalid item */
-                KeBugCheckEx(INVALID_WORK_QUEUE_ITEM,
-                             (ULONG_PTR)QueueEntry,
-                             (ULONG_PTR)Queue,
-                             (ULONG_PTR)NULL,
-                             (ULONG_PTR)((PWORK_QUEUE_ITEM)QueueEntry)->
-                                         WorkerRoutine);
+                KEBUGCHECK(INVALID_WORK_QUEUE_ITEM);
             }
 
             /* Remove the Entry */
@@ -332,14 +326,16 @@ KeRemoveQueue(IN PKQUEUE Queue,
         }
         else
         {
+            /* Use the Thread's Wait Block, it's big enough */
+            Thread->WaitBlockList = &Thread->WaitBlock[0];
+
             /* Check if a kernel APC is pending and we're below APC_LEVEL */
             if ((Thread->ApcState.KernelApcPending) &&
                 !(Thread->SpecialApcDisable) && (Thread->WaitIrql < APC_LEVEL))
             {
                 /* Increment the count and unlock the dispatcher */
                 Queue->CurrentCount++;
-                KiReleaseDispatcherLockFromDpcLevel();
-                KiExitDispatcher(Thread->WaitIrql);
+                KiReleaseDispatcherLock(Thread->WaitIrql);
             }
             else
             {
@@ -353,57 +349,94 @@ KeRemoveQueue(IN PKQUEUE Queue,
                     break;
                 }
 
-                /* Enable the Timeout Timer if there was any specified */
+                /* Build the Wait Block */
+                WaitBlock = &Thread->WaitBlock[0];
+                WaitBlock->Object = (PVOID)Queue;
+                WaitBlock->WaitKey = STATUS_SUCCESS;
+                WaitBlock->WaitType = WaitAny;
+                WaitBlock->Thread = Thread;
+                Thread->WaitStatus = STATUS_WAIT_0;
+
+                /* Check if we can swap the thread's stack */
+                Thread->WaitListEntry.Flink = NULL;
+                Swappable = KiCheckThreadStackSwap(Thread, WaitMode);
+
+                /* We need to wait for the object... check for a timeout */
                 if (Timeout)
                 {
-                    /* Check if the timer expired */
-                    InterruptTime.QuadPart = KeQueryInterruptTime();
-                    if (InterruptTime.QuadPart >= Timer->DueTime.QuadPart)
+                    /* Check if it's zero */
+                    if (!Timeout->QuadPart)
                     {
-                        /* It did, so we don't need to wait */
+                        /* Don't wait. Return and increase pending threads */
                         QueueEntry = (PLIST_ENTRY)STATUS_TIMEOUT;
                         Queue->CurrentCount++;
                         break;
                     }
 
-                    /* It didn't, so activate it */
-                    Timer->Header.Inserted = TRUE;
+                    /*
+                     * Set up the Timer. We'll use the internal function so
+                     * that we can hold on to the dispatcher lock.
+                     */
+                    Timer = &Thread->Timer;
+                    WaitBlock->NextWaitBlock = &Thread->WaitBlock[1];
+                    WaitBlock = &Thread->WaitBlock[1];
+
+                    /* Set up the Timer Wait Block */
+                    WaitBlock->Object = (PVOID)Timer;
+                    WaitBlock->Thread = Thread;
+                    WaitBlock->WaitKey = STATUS_TIMEOUT;
+                    WaitBlock->WaitType = WaitAny;
+
+                    /* Link the timer to this Wait Block */
+                    Timer->Header.WaitListHead.Flink =
+                        &WaitBlock->WaitListEntry;
+                    Timer->Header.WaitListHead.Blink =
+                        &WaitBlock->WaitListEntry;
+                    WaitBlock->WaitListEntry.Flink =
+                        &Timer->Header.WaitListHead;
+                    WaitBlock->WaitListEntry.Blink =
+                        &Timer->Header.WaitListHead;
+
+                    /* Create Timer */
+                    if (!KiInsertTimer(Timer, *Timeout))
+                    {
+                        /* FIXME */
+                        DPRINT1("If you see this message contact Alex ASAP\n");
+                        KEBUGCHECK(0);
+                    }
+
+                    /* Set timer due time */
+                    DueTime.QuadPart = Timer->DueTime.QuadPart;
                 }
 
-                /* Insert the wait block in the list */
+                /* Close the loop */
+                WaitBlock->NextWaitBlock = &Thread->WaitBlock[0];
+
+                /* Insert the wait block into the Queues's wait list */
+                WaitBlock = &Thread->WaitBlock[0];
                 InsertTailList(&Queue->Header.WaitListHead,
                                &WaitBlock->WaitListEntry);
 
                 /* Setup the wait information */
+                Thread->WaitMode = WaitMode;
+                Thread->WaitReason = WrQueue;
+                Thread->Alertable = FALSE;
+                Thread->WaitTime = ((PLARGE_INTEGER)&KeTickCount)->LowPart;
                 Thread->State = Waiting;
 
-                /* Add the thread to the wait list */
+                /* Find a new thread to run */
                 KiAddThreadToWaitList(Thread, Swappable);
-
-                /* Activate thread swap */
-                ASSERT(Thread->WaitIrql <= DISPATCH_LEVEL);
-                KiSetThreadSwapBusy(Thread);
-
-                /* Check if we have a timer */
-                if (Timeout)
-                {
-                    /* Insert it */
-                    KxInsertTimer(Timer, Hand);
-                }
-                else
-                {
-                    /* Otherwise, unlock the dispatcher */
-                    KiReleaseDispatcherLockFromDpcLevel();
-                }
-
-                /* Do the actual swap */
                 Status = KiSwapThread(Thread, KeGetCurrentPrcb());
 
                 /* Reset the wait reason */
                 Thread->WaitReason = 0;
 
                 /* Check if we were executing an APC */
-                if (Status != STATUS_KERNEL_APC) return (PLIST_ENTRY)Status;
+                if (Status != STATUS_KERNEL_APC)
+                {
+                    /* Done Waiting  */
+                    return (PLIST_ENTRY)Status;
+                }
 
                 /* Check if we had a timeout */
                 if (Timeout)
@@ -415,17 +448,17 @@ KeRemoveQueue(IN PKQUEUE Queue,
                 }
             }
 
-            /* Start another wait */
-            Thread->WaitIrql = KeRaiseIrqlToSynchLevel();
-            KxQueueThreadWait();
-            KiAcquireDispatcherLockAtDpcLevel();
+            /* Reacquire the lock */
+            OldIrql = KiAcquireDispatcherLock();
+
+            /* Save the new IRQL and decrease number of waiting threads */
+            Thread->WaitIrql = OldIrql;
             Queue->CurrentCount--;
         }
     }
 
     /* Unlock Database and return */
-    KiReleaseDispatcherLockFromDpcLevel();
-    KiExitDispatcher(Thread->WaitIrql);
+    KiReleaseDispatcherLock(Thread->WaitIrql);
     return QueueEntry;
 }
 
index f6278d7..dc76ea8 100644 (file)
@@ -46,17 +46,6 @@ KeFindNextRightSetAffinity(IN UCHAR Number,
     return (UCHAR)Result;
 }
 
-
-BOOLEAN
-NTAPI
-KeReadStateThread(IN PKTHREAD Thread)
-{
-    ASSERT_THREAD(Thread);
-
-    /* Return signal state */
-    return (BOOLEAN)Thread->DispatcherHeader.SignalState;
-}
-
 KPRIORITY
 NTAPI
 KeQueryBasePriorityThread(IN PKTHREAD Thread)
@@ -91,26 +80,6 @@ KeQueryBasePriorityThread(IN PKTHREAD Thread)
     return BaseIncrement;
 }
 
-BOOLEAN
-NTAPI
-KeSetDisableBoostThread(IN OUT PKTHREAD Thread,
-                        IN BOOLEAN Disable)
-{
-    ASSERT_THREAD(Thread);
-
-    /* Check if we're enabling or disabling */
-    if (Disable != FALSE)
-    {
-        /* Set the bit */
-        return InterlockedBitTestAndSet(&Thread->ThreadFlags, 1);
-    }
-    else
-    {
-        /* Remove the bit */
-        return InterlockedBitTestAndReset(&Thread->ThreadFlags, 1);
-    }
-}
-
 VOID
 NTAPI
 KeReadyThread(IN PKTHREAD Thread)
@@ -165,8 +134,7 @@ KeAlertResumeThread(IN PKTHREAD Thread)
     if (PreviousCount)
     {
         /* Decrease count. If we are now zero, unwait it completely */
-        Thread->SuspendCount--;
-        if (!(Thread->SuspendCount) && !(Thread->FreezeCount))
+        if (--Thread->SuspendCount)
         {
             /* Signal and satisfy */
             Thread->SuspendSemaphore.Header.SignalState++;
@@ -203,8 +171,8 @@ KeAlertThread(IN PKTHREAD Thread,
     {
         /* Check if the thread is alertable, and blocked in the given mode */
         if ((Thread->State == Waiting) &&
-            (Thread->Alertable) &&
-            (AlertMode <= Thread->WaitMode))
+            ((AlertMode == KernelMode) || (Thread->WaitMode == AlertMode)) &&
+            (Thread->Alertable))
         {
             /* Abort the wait to alert the thread */
             KiUnwaitThread(Thread, STATUS_ALERTED, THREAD_ALERT_INCREMENT);
@@ -292,7 +260,7 @@ KeFreezeAllThreads(VOID)
     /* Loop the Process's Threads */
     ListHead = &Process->ThreadListHead;
     NextEntry = ListHead->Flink;
-    do
+    while (NextEntry != ListHead)
     {
         /* Get the current thread */
         Current = CONTAINING_RECORD(NextEntry, KTHREAD, ThreadListEntry);
@@ -339,11 +307,14 @@ KeFreezeAllThreads(VOID)
 
         /* Move to the next thread */
         NextEntry = NextEntry->Flink;
-    } while (NextEntry != ListHead);
+    }
 
     /* Release the process lock and exit the dispatcher */
-    KiReleaseProcessLockFromDpcLevel(&LockHandle);
+    KiReleaseProcessLock(&LockHandle);
     KiExitDispatcher(LockHandle.OldIrql);
+
+    /* Leave the critical region */
+    KeLeaveCriticalRegion();
 }
 
 ULONG
@@ -396,7 +367,6 @@ KeRundownThread(VOID)
     PKTHREAD Thread = KeGetCurrentThread();
     PLIST_ENTRY NextEntry, ListHead;
     PKMUTANT Mutant;
-    ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
     /* Optimized path if nothing is on the list at the moment */
     if (IsListEmpty(&Thread->MutantListHead)) return;
@@ -460,7 +430,6 @@ KeStartThread(IN OUT PKTHREAD Thread)
     PKPROCESS Process = Thread->ApcState.Process;
 
     /* Setup static fields from parent */
-    Thread->DisableBoost = Process->DisableBoost;
     Thread->Iopl = Process->Iopl;
     Thread->Quantum = Process->QuantumReset;
     Thread->QuantumReset = Process->QuantumReset;
@@ -551,7 +520,7 @@ KiSuspendThread(IN PVOID NormalContext,
                           NULL);
 }
 
-ULONG
+NTSTATUS
 NTAPI
 KeSuspendThread(PKTHREAD Thread)
 {
@@ -624,10 +593,13 @@ KeThawAllThreads(VOID)
     /* Lock the process */
     KiAcquireProcessLock(Process, &LockHandle);
 
+    /* Enter a critical region */
+    KeEnterCriticalRegion();
+
     /* Loop the Process's Threads */
     ListHead = &Process->ThreadListHead;
     NextEntry = ListHead->Flink;
-    do
+    while (NextEntry != ListHead)
     {
         /* Get the current thread */
         Current = CONTAINING_RECORD(NextEntry, KTHREAD, ThreadListEntry);
@@ -662,10 +634,10 @@ KeThawAllThreads(VOID)
 
         /* Go to the next one */
         NextEntry = NextEntry->Flink;
-    } while (NextEntry != ListHead);
+    }
 
     /* Release the process lock and exit the dispatcher */
-    KiReleaseProcessLockFromDpcLevel(&LockHandle);
+    KiReleaseProcessLock(&LockHandle);
     KiExitDispatcher(LockHandle.OldIrql);
 
     /* Leave the critical region */
@@ -684,6 +656,7 @@ KeTestAlertThread(IN KPROCESSOR_MODE AlertMode)
 
     /* Lock the Dispatcher Database and the APC Queue */
     KiAcquireApcLock(Thread, &ApcLock);
+    KiAcquireDispatcherLockAtDpcLevel();
 
     /* Save the old State */
     OldState = Thread->Alerted[AlertMode];
@@ -702,7 +675,9 @@ KeTestAlertThread(IN KPROCESSOR_MODE AlertMode)
     }
 
     /* Release Locks and return the Old State */
-    KiReleaseApcLock(&ApcLock);
+    KiReleaseDispatcherLockFromDpcLevel();
+    KiReleaseApcLockFromDpcLevel(&ApcLock);
+    KiExitDispatcher(ApcLock.OldIrql);
     return OldState;
 }
 
@@ -743,8 +718,7 @@ KeInitThread(IN OUT PKTHREAD Thread,
     Thread->EnableStackSwap = FALSE;//TRUE;
     Thread->IdealProcessor = 1;
     Thread->SwapBusy = FALSE;
-    Thread->KernelStackResident = TRUE;
-    Thread->AdjustReason = AdjustNone;
+    Thread->AdjustReason = 0;
 
     /* Initialize the lock */
     KeInitializeSpinLock(&Thread->ThreadLock);
@@ -1046,10 +1020,10 @@ KeSetIdealProcessorThread(IN PKTHREAD Thread,
     OldIdealProcessor = Thread->UserIdealProcessor;
 
     /* Make sure a valid CPU was given */
-    if (Processor < KeNumberProcessors)
+    if (Processor < MAXIMUM_PROCESSORS)
     {
         /* Check if the user ideal CPU is in the affinity */
-        if (Thread->Affinity & AFFINITY_MASK(Processor))
+        if (Thread->UserIdealProcessor & AFFINITY_MASK(Processor))
         {
             /* Set the ideal processor */
             Thread->IdealProcessor = Processor;
@@ -1157,6 +1131,7 @@ KeSetBasePriorityThread(IN PKTHREAD Thread,
     KPRIORITY OldBasePriority, Priority, BasePriority;
     LONG OldIncrement;
     PKPROCESS Process;
+    BOOLEAN Released = FALSE;
     ASSERT_THREAD(Thread);
     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
@@ -1222,8 +1197,7 @@ KeSetBasePriorityThread(IN PKTHREAD Thread,
         else
         {
             /* Otherwise, calculate the new priority */
-            Priority = KiComputeNewPriority(Thread, 0);
-            Priority += (BasePriority - OldBasePriority);
+            Priority = KiComputeNewPriority(Thread);
 
             /* Check if it entered the real-time range */
             if (Priority >= LOW_REALTIME_PRIORITY)
@@ -1231,11 +1205,6 @@ KeSetBasePriorityThread(IN PKTHREAD Thread,
                 /* Normalize it down to the highest dynamic priority */
                 Priority = LOW_REALTIME_PRIORITY - 1;
             }
-            else if (Priority <= LOW_PRIORITY)
-            {
-                /* It went too low, normalize it */
-                Priority = 1;
-            }
         }
     }
 
@@ -1250,14 +1219,25 @@ KeSetBasePriorityThread(IN PKTHREAD Thread,
     {
         /* Reset the quantum and do the actual priority modification */
         Thread->Quantum = Thread->QuantumReset;
-        KiSetPriorityThread(Thread, Priority);
+        KiSetPriorityThread(Thread, Priority, &Released);
     }
 
     /* Release thread lock */
     KiReleaseThreadLock(Thread);
 
-    /* Release the dispatcher database and return old increment */
-    KiReleaseDispatcherLock(OldIrql);
+    /* Check if lock was released */
+    if (!Released)
+    {
+        /* Release the dispatcher database */
+        KiReleaseDispatcherLock(OldIrql);
+    }
+    else
+    {
+        /* Lower IRQL only */
+        KeLowerIrql(OldIrql);
+    }
+
+    /* Return old increment */
     return OldIncrement;
 }
 
@@ -1271,6 +1251,7 @@ KeSetAffinityThread(IN PKTHREAD Thread,
 {
     KIRQL OldIrql;
     KAFFINITY OldAffinity;
+    BOOLEAN Released;
     ASSERT_THREAD(Thread);
     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
@@ -1278,10 +1259,21 @@ KeSetAffinityThread(IN PKTHREAD Thread,
     OldIrql = KiAcquireDispatcherLock();
 
     /* Call the internal function */
-    OldAffinity = KiSetAffinityThread(Thread, Affinity);
+    OldAffinity = KiSetAffinityThread(Thread, Affinity, &Released);
 
-    /* Release the dispatcher database and return old affinity */
-    KiReleaseDispatcherLock(OldIrql);
+    /* Check if lock was released */
+    if (!Released)
+    {
+        /* Release the dispatcher database */
+        KiReleaseDispatcherLock(OldIrql);
+    }
+    else
+    {
+        /* Lower IRQL only */
+        KeLowerIrql(OldIrql);
+    }
+
+    /* Return old affinity */
     return OldAffinity;
 }
 
@@ -1295,10 +1287,10 @@ KeSetPriorityThread(IN PKTHREAD Thread,
 {
     KIRQL OldIrql;
     KPRIORITY OldPriority;
+    BOOLEAN Released = FALSE;
     ASSERT_THREAD(Thread);
     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
     ASSERT((Priority <= HIGH_PRIORITY) && (Priority >= LOW_PRIORITY));
-    ASSERT(KeIsExecutingDpc() == FALSE);
 
     /* Lock the Dispatcher Database */
     OldIrql = KiAcquireDispatcherLock();
@@ -1306,28 +1298,34 @@ KeSetPriorityThread(IN PKTHREAD Thread,
     /* Lock the thread */
     KiAcquireThreadLock(Thread);
 
-    /* Save the old Priority and reset decrement */
+    /* Save the old Priority */
     OldPriority = Thread->Priority;
-    Thread->PriorityDecrement = 0;
 
     /* Make sure that an actual change is being done */
-    if (Priority != Thread->Priority)
+    if (OldPriority != Priority)
     {
-        /* Reset the quantum */
+        /* Reset the Quantum and Decrements */
         Thread->Quantum = Thread->QuantumReset;
-
-        /* Check if priority is being set too low and normalize if so */
-        if ((Thread->BasePriority != 0) && !(Priority)) Priority = 1;
+        Thread->PriorityDecrement = 0;
 
         /* Set the new Priority */
-        KiSetPriorityThread(Thread, Priority);
+        KiSetPriorityThread(Thread, Priority, &Released);
     }
 
     /* Release thread lock */
     KiReleaseThreadLock(Thread);
 
-    /* Release the dispatcher database */
-    KiReleaseDispatcherLock(OldIrql);
+    /* Check if lock was released */
+    if (!Released)
+    {
+        /* Release the dispatcher database */
+        KiReleaseDispatcherLock(OldIrql);
+    }
+    else
+    {
+        /* Lower IRQL only */
+        KeLowerIrql(OldIrql);
+    }
 
     /* Return Old Priority */
     return OldPriority;
@@ -1419,7 +1417,7 @@ KeTerminateThread(IN KPRIORITY Increment)
     ASSERT(Process->StackCount != 0);
     ASSERT(Process->State == ProcessInMemory);
     Process->StackCount--;
-    if (!(Process->StackCount) && !(IsListEmpty(&Process->ThreadListHead)))
+    if (!Process->StackCount)
     {
         /* FIXME: Swap stacks */
     }
index 025bc23..be092ce 100644 (file)
 
 /* GLOBALS *******************************************************************/
 
+LIST_ENTRY PriorityListHead[MAXIMUM_PRIORITY];
+ULONG PriorityListMask = 0;
 ULONG KiIdleSummary;
 ULONG KiIdleSMTSummary;
 
 /* FUNCTIONS *****************************************************************/
 
+static
 VOID
-FASTCALL
-KiQueueReadyThread(IN PKTHREAD Thread,
-                   IN PKPRCB Prcb)
+KiRequestReschedule(CCHAR Processor)
 {
-    /* Call the macro. We keep the API for compatibility with ASM code */
-    KxQueueReadyThread(Thread, Prcb);
-}
-
-VOID
-NTAPI
-KiDeferredReadyThread(IN PKTHREAD Thread)
-{
-    PKPRCB Prcb;
-    BOOLEAN Preempted;
-    ULONG Processor = 0;
-    KPRIORITY OldPriority;
-    PKTHREAD NextThread;
-
-    /* Sanity checks */
-    ASSERT(Thread->State == DeferredReady);
-    ASSERT((Thread->Priority >= 0) && (Thread->Priority <= HIGH_PRIORITY));
-
-    /* Check if we have any adjusts to do */
-    if (Thread->AdjustReason == AdjustBoost)
-    {
-        /* Lock the thread */
-        KiAcquireThreadLock(Thread);
-
-        /* Check if the priority is low enough to qualify for boosting */
-        if ((Thread->Priority <= Thread->AdjustIncrement) &&
-            (Thread->Priority < (LOW_REALTIME_PRIORITY - 3)) &&
-            !(Thread->DisableBoost))
-        {
-            /* Calculate the new priority based on the adjust increment */
-            OldPriority = min(Thread->AdjustIncrement + 1,
-                              LOW_REALTIME_PRIORITY - 1);
-
-            /* Make sure we're not decreasing outside of the priority range */
-            ASSERT((Thread->PriorityDecrement >= 0) &&
-                   (Thread->PriorityDecrement <= Thread->Priority));
-
-            /* Calculate the new priority decrement based on the boost */
-            Thread->PriorityDecrement += ((SCHAR)OldPriority - Thread->Priority);
-
-            /* Again verify that this decrement is valid */
-            ASSERT((Thread->PriorityDecrement >= 0) &&
-                   (Thread->PriorityDecrement <= OldPriority));
-
-            /* Set the new priority */
-            Thread->Priority = (SCHAR)OldPriority;
-        }
-
-        /* We need 4 quanta, make sure we have them, then decrease by one */
-        if (Thread->Quantum < 4) Thread->Quantum = 4;
-        Thread->Quantum--;
-
-        /* Make sure the priority is still valid */
-        ASSERT((Thread->Priority >= 0) && (Thread->Priority <= HIGH_PRIORITY));
-
-        /* Release the lock and clear the adjust reason */
-        KiReleaseThreadLock(Thread);
-        Thread->AdjustReason = AdjustNone;
-    }
-    else if (Thread->AdjustReason == AdjustUnwait)
-    {
-        /* Acquire the thread lock and check if this is a real-time thread */
-        KiAcquireThreadLock(Thread);
-        if (Thread->Priority < LOW_REALTIME_PRIORITY)
-        {
-            /* It's not real time, but is it time critical? */
-            if (Thread->BasePriority >= (LOW_REALTIME_PRIORITY - 2))
-            {
-                /* It is, so simply reset its quantum */
-                Thread->Quantum = Thread->QuantumReset;
-            }
-            else
-            {
-                /* Has the priority been adjusted previously? */
-                if (!(Thread->PriorityDecrement) && (Thread->AdjustIncrement))
-                {
-                    /* Yes, reset its quantum */
-                    Thread->Quantum = Thread->QuantumReset;
-                }
-
-                /* Wait code already handles quantum adjustment during APCs */
-                if (Thread->WaitStatus != STATUS_KERNEL_APC)
-                {
-                    /* Decrease the quantum by one and check if we're out */
-                    if (--Thread->Quantum <= 0)
-                    {
-                        /* We are, reset the quantum and get a new priority */
-                        Thread->Quantum = Thread->QuantumReset;
-                        Thread->Priority = KiComputeNewPriority(Thread, 1);
-                    }
-                }
-            }
-
-            /* Now check if we have no decrement and boosts are enabled */
-            if (!(Thread->PriorityDecrement) && !(Thread->DisableBoost))
-            {
-                /* Make sure we have an increment */
-                ASSERT(Thread->AdjustIncrement >= 0);
-
-                /* Calculate the new priority after the increment */
-                OldPriority = Thread->BasePriority + Thread->AdjustIncrement;
-
-                /* Check if this new priority is higher */
-                if (OldPriority > Thread->Priority)
-                {
-                    /* Make sure we don't go into the real time range */
-                    if (OldPriority >= LOW_REALTIME_PRIORITY)
-                    {
-                        /* Normalize it back down one notch */
-                        OldPriority = LOW_REALTIME_PRIORITY - 1;
-                    }
-
-                    /* Check if the priority is higher then the boosted base */
-                    if (OldPriority > (Thread->BasePriority +
-                                       Thread->AdjustIncrement))
-                    {
-                        /* Setup a priority decrement to nullify the boost  */
-                        Thread->PriorityDecrement = ((SCHAR)OldPriority -
-                                                    Thread->BasePriority -
-                                                    Thread->AdjustIncrement);
-                    }
-
-                    /* Make sure that the priority decrement is valid */
-                    ASSERT((Thread->PriorityDecrement >= 0) &&
-                           (Thread->PriorityDecrement <= OldPriority));
-
-                    /* Set this new priority */
-                    Thread->Priority = (SCHAR)OldPriority;
-                }
-            }
-        }
-        else
-        {
-            /* It's a real-time thread, so just reset its quantum */
-            Thread->Quantum = Thread->QuantumReset;
-        }
-
-        /* Make sure the priority makes sense */
-        ASSERT((Thread->Priority >= 0) && (Thread->Priority <= HIGH_PRIORITY));
-
-        /* Release the thread lock and reset the adjust reason */
-        KiReleaseThreadLock(Thread);
-        Thread->AdjustReason = AdjustNone;
-    }
-
-    /* Clear thread preemption status and save current values */
-    Preempted = Thread->Preempted;
-    OldPriority = Thread->Priority;
-    Thread->Preempted = FALSE;
-
-    /* Queue the thread on CPU 0 and get the PRCB */
-    Thread->NextProcessor = 0;
-    Prcb = KiProcessorBlock[0];
-
-    /* Check if we have an idle summary */
-    if (KiIdleSummary)
-    {
-        /* Clear it and set this thread as the next one */
-        KiIdleSummary = 0;
-        Thread->State = Standby;
-        Prcb->NextThread = Thread;
-        return;
-    }
-
-    /* Set the CPU number */
-    Thread->NextProcessor = (UCHAR)Processor;
-
-    /* Get the next scheduled thread */
-    NextThread = Prcb->NextThread;
-    if (NextThread)
-    {
-        /* Sanity check */
-        ASSERT(NextThread->State == Standby);
-
-        /* Check if priority changed */
-        if (OldPriority > NextThread->Priority)
-        {
-            /* Preempt the thread */
-            NextThread->Preempted = TRUE;
-
-            /* Put this one as the next one */
-            Thread->State = Standby;
-            Prcb->NextThread = Thread;
-
-            /* Set it in deferred ready mode */
-            NextThread->State = DeferredReady;
-            NextThread->DeferredProcessor = Prcb->Number;
-            KiReleasePrcbLock(Prcb);
-            KiDeferredReadyThread(NextThread);
-            return;
-        }
-    }
-    else
-    {
-        /* Set the next thread as the current thread */
-        NextThread = Prcb->CurrentThread;
-        if (OldPriority > NextThread->Priority)
-        {
-            /* Preempt it if it's already running */
-            if (NextThread->State == Running) NextThread->Preempted = TRUE;
-
-            /* Set the thread on standby and as the next thread */
-            Thread->State = Standby;
-            Prcb->NextThread = Thread;
+    PKPCR Pcr;
 
-            /* Release the lock */
-            KiReleasePrcbLock(Prcb);
-
-            /* Check if we're running on another CPU */
-            if (KeGetCurrentProcessorNumber() != Thread->NextProcessor)
-            {
-                /* We are, send an IPI */
-                KiIpiSendRequest(AFFINITY_MASK(Thread->NextProcessor), IPI_DPC);
-            }
-            return;
-        }
-    }
-
-    /* Sanity check */
-    ASSERT((OldPriority >= 0) && (OldPriority <= HIGH_PRIORITY));
-
-    /* Set this thread as ready */
-    Thread->State = Ready;
-    Thread->WaitTime = KeTickCount.LowPart;
-
-    /* Insert this thread in the appropriate order */
-    Preempted ? InsertHeadList(&Prcb->DispatcherReadyListHead[OldPriority],
-                               &Thread->WaitListEntry) :
-                InsertTailList(&Prcb->DispatcherReadyListHead[OldPriority],
-                               &Thread->WaitListEntry);
-
-    /* Update the ready summary */
-    Prcb->ReadySummary |= PRIORITY_MASK(OldPriority);
-
-    /* Sanity check */
-    ASSERT(OldPriority == Thread->Priority);
-
-    /* Release the lock */
-    KiReleasePrcbLock(Prcb);
+    Pcr = (PKPCR)(KPCR_BASE + Processor * PAGE_SIZE);
+    Pcr->Prcb->QuantumEnd = TRUE;
+    KiIpiSendRequest(1 << Processor, IPI_DPC);
 }
 
+static
 VOID
 KiInsertIntoThreadList(KPRIORITY Priority,
                        PKTHREAD Thread)
@@ -278,21 +46,23 @@ KiInsertIntoThreadList(KPRIORITY Priority,
         KEBUGCHECK(0);
     }
 
-    InsertTailList(&KeGetCurrentPrcb()->DispatcherReadyListHead[Priority], &Thread->WaitListEntry);
-    KeGetCurrentPrcb()->ReadySummary |= (1 << Priority);
+    InsertTailList(&PriorityListHead[Priority], &Thread->WaitListEntry);
+    PriorityListMask |= (1 << Priority);
 }
 
+static
 VOID
 KiRemoveFromThreadList(PKTHREAD Thread)
 {
     ASSERT(Ready == Thread->State);
     RemoveEntryList(&Thread->WaitListEntry);
-    if (IsListEmpty(&KeGetCurrentPrcb()->DispatcherReadyListHead[Thread->Priority])) {
+    if (IsListEmpty(&PriorityListHead[(ULONG)Thread->Priority])) {
 
-        KeGetCurrentPrcb()->ReadySummary &= ~(1 << Thread->Priority);
+        PriorityListMask &= ~(1 << Thread->Priority);
     }
 }
 
+static
 PKTHREAD
 KiScanThreadList(KPRIORITY Priority,
                  KAFFINITY Affinity)
@@ -302,9 +72,9 @@ KiScanThreadList(KPRIORITY Priority,
 
     Mask = (1 << Priority);
 
-    if (KeGetCurrentPrcb()->ReadySummary & Mask) {
+    if (PriorityListMask & Mask) {
 
-        LIST_FOR_EACH(current, &KeGetCurrentPrcb()->DispatcherReadyListHead[Priority], KTHREAD, WaitListEntry) {
+        LIST_FOR_EACH(current, &PriorityListHead[Priority], KTHREAD, WaitListEntry) {
 
             if (current->State != Ready) {
 
@@ -396,117 +166,16 @@ KiDispatchThreadNoLock(ULONG NewThreadStatus)
     return FALSE;
 }
 
-VOID
-STDCALL
-KiDispatchThread(ULONG NewThreadStatus)
-{
-    KIRQL OldIrql;
-
-    if (KeGetCurrentPrcb()->IdleThread == NULL) {
-        return;
-    }
-
-    OldIrql = KiAcquireDispatcherLock();
-    KiDispatchThreadNoLock(NewThreadStatus);
-    KeLowerIrql(OldIrql);
-}
-
-PKTHREAD
-FASTCALL
-KiSelectNextThread(IN PKPRCB Prcb)
-{
-    PKTHREAD Thread;
-
-    /* Select a ready thread */
-    Thread = KiSelectReadyThread(0, Prcb);
-    if (!Thread)
-    {
-        /* Didn't find any, get the current idle thread */
-        Thread = Prcb->IdleThread;
-
-        /* Enable idle scheduling */
-        InterlockedOr((PLONG) &KiIdleSummary, Prcb->SetMember);
-        Prcb->IdleSchedule = TRUE;
-
-        /* FIXME: SMT support */
-    }
-
-    /* Sanity checks and return the thread */
-    ASSERT(Thread != NULL);
-    ASSERT((Thread->BasePriority == 0) || (Thread->Priority != 0));
-    return Thread;
-}
-
 NTSTATUS
 FASTCALL
 KiSwapThread(IN PKTHREAD CurrentThread,
              IN PKPRCB Prcb)
 {
-    BOOLEAN ApcState = FALSE;
-    KIRQL WaitIrql;
-    LONG_PTR WaitStatus;
-    PKTHREAD NextThread;
-#ifdef NEW_SCHEDULER
-    PEPROCESS HackOfDoom = PsGetCurrentProcess();
-#endif
+    BOOLEAN ApcState;
     ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
 
-    /* Acquire the PRCB lock */
-    KiAcquirePrcbLock(Prcb);
-
-    /* Get the next thread */
-    NextThread = Prcb->NextThread;
-    if (NextThread)
-    {
-        /* Already got a thread, set it up */
-        Prcb->NextThread = NULL;
-        Prcb->CurrentThread = NextThread;
-        NextThread->State = Running;
-    }
-    else
-    {
-#ifdef NEW_SCHEDULER
-        /* Try to find a ready thread */
-        NextThread = KiSelectReadyThread(0, Prcb);
-        if (NextThread)
-        {
-            /* Switch to it */
-            Prcb->CurrentThread = NextThread;
-            NextThread->State = Running;
-        }
-        else
-        {
-            /* Set the idle summary */
-            InterlockedOr((PLONG)&KiIdleSummary, Prcb->SetMember);
-
-            /* Schedule the idle thread */
-            NextThread = Prcb->IdleThread;
-            Prcb->CurrentThread = NextThread;
-            NextThread->State = Running;
-        }
-#else
-        /* Find a new thread to run */
-        ApcState = KiDispatchThreadNoLock(Waiting);
-#endif
-    }
-
-    /* Sanity check and release the PRCB */
-    ASSERT(CurrentThread != Prcb->IdleThread);
-    KiReleasePrcbLock(Prcb);
-
-    /* Save the wait IRQL */
-    WaitIrql = CurrentThread->WaitIrql;
-
-#ifdef NEW_SCHEDULER
-    /* REACTOS Mm Hack of Doom */
-    MmUpdatePageDir(HackOfDoom,((PETHREAD)NextThread)->ThreadsProcess, sizeof(EPROCESS));
-
-    /* Swap contexts */
-    ApcState = KiSwapContext(CurrentThread, NextThread);
-#endif
-
-    /* Get the wait status */
-    WaitStatus = CurrentThread->WaitStatus;
+    /* Find a new thread to run */
+    ApcState = KiDispatchThreadNoLock(Waiting);
 
     /* Check if we need to deliver APCs */
     if (ApcState)
@@ -516,12 +185,29 @@ KiSwapThread(IN PKTHREAD CurrentThread,
 
         /* Deliver APCs */
         KiDeliverApc(KernelMode, NULL, NULL);
-        ASSERT(WaitIrql == 0);
+        ASSERT(CurrentThread->WaitIrql == 0);
     }
 
-    /* Lower IRQL back to what it was and return the wait status */
-    KeLowerIrql(WaitIrql);
-    return WaitStatus;
+    /* Lower IRQL back to what it was */
+    KfLowerIrql(CurrentThread->WaitIrql);
+
+    /* Return the wait status */
+    return CurrentThread->WaitStatus;
+}
+
+VOID
+STDCALL
+KiDispatchThread(ULONG NewThreadStatus)
+{
+    KIRQL OldIrql;
+
+    if (KeGetCurrentPrcb()->IdleThread == NULL) {
+        return;
+    }
+
+    OldIrql = KiAcquireDispatcherLock();
+    KiDispatchThreadNoLock(NewThreadStatus);
+    KeLowerIrql(OldIrql);
 }
 
 VOID
@@ -534,7 +220,7 @@ KiReadyThread(IN PKTHREAD Thread)
     if (Process->State != ProcessInMemory)
     {
         /* We don't page out processes in ROS */
-        KEBUGCHECK(0);
+        ASSERT(FALSE);
     }
     else if (!Thread->KernelStackResident)
     {
@@ -547,12 +233,12 @@ KiReadyThread(IN PKTHREAD Thread)
         Thread->State = Transition;
 
         /* The stack is always resident in ROS */
-        KEBUGCHECK(0);
+        ASSERT(FALSE);
     }
     else
     {
         /* Insert the thread on the deferred ready list */
-#ifdef NEW_SCHEDULER
+#if 0
         KiInsertDeferredReadyList(Thread);
 #else
         /* Insert the thread into the thread list */
@@ -563,19 +249,14 @@ KiReadyThread(IN PKTHREAD Thread)
 }
 
 VOID
-NTAPI
+STDCALL
 KiAdjustQuantumThread(IN PKTHREAD Thread)
 {
-    PKPRCB Prcb = KeGetCurrentPrcb();
-    PKTHREAD NextThread;
-
-    /* Acquire thread and PRCB lock */
-    KiAcquireThreadLock(Thread);
-    KiAcquirePrcbLock(Prcb);
+    KPRIORITY Priority;
 
     /* Don't adjust for RT threads */
     if ((Thread->Priority < LOW_REALTIME_PRIORITY) &&
-        (Thread->BasePriority < (LOW_REALTIME_PRIORITY - 2)))
+        Thread->BasePriority < LOW_REALTIME_PRIORITY - 2)
     {
         /* Decrease Quantum by one and see if we've ran out */
         if (--Thread->Quantum <= 0)
@@ -584,246 +265,126 @@ KiAdjustQuantumThread(IN PKTHREAD Thread)
             Thread->Quantum = Thread->QuantumReset;
 
             /* Calculate new Priority */
-            Thread->Priority = KiComputeNewPriority(Thread, 1);
+            Priority = Thread->Priority - (Thread->PriorityDecrement + 1);
+
+            /* Normalize it if we've gone too low */
+            if (Priority < Thread->BasePriority) Priority = Thread->BasePriority;
+
+            /* Reset the priority decrement, we've done it */
+            Thread->PriorityDecrement = 0;
 
-#ifdef NEW_SCHEDULER
-            /* Check if there's no next thread scheduled */
-            if (!Prcb->NextThread)
+            /* Set the new priority, if needed */
+            if (Priority != Thread->Priority)
             {
-                /* Select a ready thread and check if we found one */
-                NextThread = KiSelectReadyThread(Thread->Priority, Prcb);
-                if (NextThread)
-                {
-                    /* Set it on standby and switch to it */
-                    NextThread->State = Standby;
-                    Prcb->NextThread = NextThread;
-                }
+                /* 
+                 * FIXME: This should be a call to KiSetPriorityThread but
+                 * due to the current ""scheduler"" in ROS, it can't be done
+                 * cleanly since it actualyl dispatches threads instead.
+                 */
+                Thread->Priority = (SCHAR)Priority;
             }
             else
             {
-                /* This thread can be preempted again */
-                Thread->Preempted = FALSE;
+                /* FIXME: Priority hasn't changed, find a new thread */
             }
-#else
-            /* We need to dispatch a new thread */
-            NextThread = NULL;
-            KiDispatchThread(Ready);
-#endif
         }
     }
 
-    /* Release locks */
-    KiReleasePrcbLock(Prcb);
-    KiReleaseThreadLock(Thread);
-    KiExitDispatcher(Thread->WaitIrql);
+    /* Nothing to do... */
+    return;
 }
 
 VOID
-FASTCALL
-KiSetPriorityThread(IN PKTHREAD Thread,
-                    IN KPRIORITY Priority)
+STDCALL
+KiSetPriorityThread(PKTHREAD Thread,
+                    KPRIORITY Priority,
+                    PBOOLEAN Released)
 {
-    PKPRCB Prcb;
-    ULONG Processor;
-    BOOLEAN RequestInterrupt = FALSE;
-    KPRIORITY OldPriority;
-    PKTHREAD NewThread;
-    ASSERT((Priority >= 0) && (Priority <= HIGH_PRIORITY));
+    KPRIORITY OldPriority = Thread->Priority;
+    ULONG Mask;
+    int i;
+    PKPCR Pcr;
+    DPRINT("Changing prio to : %lx\n", Priority);
 
     /* Check if priority changed */
-    if (Thread->Priority != Priority)
+    if (OldPriority != Priority)
     {
-        /* Loop priority setting in case we need to start over */
-        for (;;)
+        /* Set it */
+        Thread->Priority = (SCHAR)Priority;
+
+        /* Choose action based on thread's state */
+        if (Thread->State == Ready)
         {
-            /* Choose action based on thread's state */
-            if (Thread->State == Ready)
+            /* Remove it from the current queue */
+            KiRemoveFromThreadList(Thread);
+            
+            /* Re-insert it at its current priority */
+            KiInsertIntoThreadList(Priority, Thread);
+
+            /* Check if the old priority was lower */
+            if (KeGetCurrentThread()->Priority < Priority)
             {
-                /* Make sure we're not on the ready queue */
-                if (!Thread->ProcessReadyQueue)
-                {
-                    /* Get the PRCB for the thread and lock it */
-                    Processor = Thread->NextProcessor;
-                    Prcb = KiProcessorBlock[Processor];
-                    KiAcquirePrcbLock(Prcb);
-
-                    /* Make sure the thread is still ready and on this CPU */
-                    if ((Thread->State == Ready) &&
-                        (Thread->NextProcessor == Prcb->Number))
-                    {
-#ifdef NEW_SCHEDULER
-                        /* Sanity check */
-                        ASSERT((Prcb->ReadySummary &
-                                PRIORITY_MASK(Thread->Priority)));
-
-                        /* Remove it from the current queue */
-                        if (RemoveEntryList(&Thread->WaitListEntry))
-                        {
-                            /* Update the ready summary */
-                            Prcb->ReadySummary ^= PRIORITY_MASK(Thread->
-                                                                Priority);
-                        }
-#else
-                        KiRemoveFromThreadList(Thread);
-#endif
-
-                        /* Update priority */
-                        Thread->Priority = (SCHAR)Priority;
-
-                        /* Re-insert it at its current priority */
-#ifndef NEW_SCHEDULER
-                        KiInsertIntoThreadList(Priority, Thread);
-                        //KiDispatchThreadNoLock(Ready);
-#else
-                        KiInsertDeferredReadyList(Thread);
-#endif
-
-                        /* Release the PRCB Lock */
-                        KiReleasePrcbLock(Prcb);
-                    }
-                    else
-                    {
-                        /* Release the lock and loop again */
-                        KiReleasePrcbLock(Prcb);
-                        continue;
-                    }
-                }
-                else
-                {
-                    /* It's already on the ready queue, just update priority */
-                    Thread->Priority = (SCHAR)Priority;
-                }
+                /* Dispatch it immediately */
+                KiDispatchThreadNoLock(Ready);
+                *Released = TRUE;
+                return;
             }
-            else if (Thread->State == Standby)
+        }
+        else if (Thread->State == Running)
+        {
+            /* Check if the new priority is lower */
+            if (Priority < OldPriority)
             {
-                /* Get the PRCB for the thread and lock it */
-                Processor = Thread->NextProcessor;
-                Prcb = KiProcessorBlock[Processor];
-                KiAcquirePrcbLock(Prcb);
-
-                /* Check if we're still the next thread to run */
-                if (Thread == Prcb->NextThread)
+                /* Check for threads with a higher priority */
+                Mask = ~((1 << (Priority + 1)) - 1);
+                if (PriorityListMask & Mask)
                 {
-                    /* Get the old priority and update ours */
-                    OldPriority = Thread->Priority;
-                    Thread->Priority = (SCHAR)Priority;
-
-                    /* Check if there was a change */
-                    if (Priority < OldPriority)
+                    /* Found a thread, is it us? */
+                    if (Thread == KeGetCurrentThread())
                     {
-                        /* Find a new thread */
-                        NewThread = KiSelectReadyThread(Priority + 1, Prcb);
-                        if (NewThread)
-                        {
-                            /* Found a new one, set it on standby */
-                            NewThread->State = Standby;
-                            Prcb->NextThread = NewThread;
-
-                            /* Dispatch our thread */
-                            KiInsertDeferredReadyList(Thread);
-                        }
-                    }
-
-                    /* Release the PRCB lock */
-                    KiReleasePrcbLock(Prcb);
-                }
-                else
-                {
-                    /* Release the lock and try again */
-                    KiReleasePrcbLock(Prcb);
-                    continue;
-                }
-            }
-            else if (Thread->State == Running)
-            {
-                /* Get the PRCB for the thread and lock it */
-                Processor = Thread->NextProcessor;
-                Prcb = KiProcessorBlock[Processor];
-                KiAcquirePrcbLock(Prcb);
-
-                /* Check if we're still the current thread running */
-                if (Thread == Prcb->CurrentThread)
-                {
-                    /* Get the old priority and update ours */
-                    OldPriority = Thread->Priority;
-                    Thread->Priority = (SCHAR)Priority;
-
-                    /* Check if there was a change and there's no new thread */
-                    if ((Priority < OldPriority) && !(Prcb->NextThread))
+                        /* Dispatch us */
+                        KiDispatchThreadNoLock(Ready);
+                        *Released = TRUE;
+                        return;
+                    } 
+                    else
                     {
-#ifdef NEW_SCHEDULER
-                        /* Find a new thread */
-                        NewThread = KiSelectReadyThread(Priority + 1, Prcb);
-                        if (NewThread)
+                        /* Loop every CPU */
+                        for (i = 0; i < KeNumberProcessors; i++)
                         {
-                            /* Found a new one, set it on standby */
-                            NewThread->State = Standby;
-                            Prcb->NextThread = NewThread;
+                            /* Get the PCR for this CPU */
+                            Pcr = (PKPCR)(KPCR_BASE + i * PAGE_SIZE);
 
-                            /* Request an interrupt */
-                            RequestInterrupt = TRUE;
-                        }
-#else
-                        /* Check for threads with a higher priority */
-                        if (KeGetCurrentPrcb()->ReadySummary & ~((1 << (Priority + 1)) - 1))
-                        {
-                            /* Found a thread, is it us? */
-                            if (Thread == KeGetCurrentThread())
+                            /* Reschedule if the new one is already on a CPU */
+                            if (Pcr->Prcb->CurrentThread == Thread)
                             {
-                                /* Dispatch us */
-                                //KiDispatchThreadNoLock(Ready);
+                                KiReleaseDispatcherLockFromDpcLevel();
+                                KiRequestReschedule(i);
+                                *Released = TRUE;
                                 return;
                             }
                         }
-#endif
-                    }
-
-                    /* Release the lock and check if we need an interrupt */
-                    KiReleasePrcbLock(Prcb);
-                    if (RequestInterrupt)
-                    {
-                        /* Check if we're running on another CPU */
-                        if (KeGetCurrentProcessorNumber() != Processor)
-                        {
-                            /* We are, send an IPI */
-                            KiIpiSendRequest(AFFINITY_MASK(Processor), IPI_DPC);
-                        }
                     }
                 }
-                else
-                {
-                    /* Thread changed, release lock and restart */
-                    KiReleasePrcbLock(Prcb);
-                    continue;
-                }
-            }
-            else if (Thread->State == DeferredReady)
-            {
-                /* FIXME: TODO */
-                DPRINT1("Deferred state not yet supported\n");
-                KEBUGCHECK(0);
-            }
-            else
-            {
-                /* Any other state, just change priority */
-                Thread->Priority = (SCHAR)Priority;
             }
-
-            /* If we got here, then thread state was consistent, so bail out */
-            break;
         }
     }
+
+    /* Return to caller */
+    *Released = FALSE;
+    return;
 }
 
 KAFFINITY
-FASTCALL
+NTAPI
 KiSetAffinityThread(IN PKTHREAD Thread,
-                    IN KAFFINITY Affinity)
+                    IN KAFFINITY Affinity,
+                    PBOOLEAN Released)
 {
     KAFFINITY OldAffinity;
-
-    /* Get the current affinity */
-    OldAffinity = Thread->UserAffinity;
+    ULONG ProcessorMask;
+    CCHAR i;
+    PKPCR Pcr;
 
     /* Make sure that the affinity is valid */
     if (((Affinity & Thread->ApcState.Process->Affinity) != (Affinity)) ||
@@ -833,96 +394,68 @@ KiSetAffinityThread(IN PKTHREAD Thread,
         KeBugCheck(INVALID_AFFINITY_SET);
     }
 
-    /* Update the new affinity */
-    Thread->UserAffinity = Affinity;
-
-    /* Check if system affinity is disabled */
-    if (!Thread->SystemAffinityActive)
-    {
-        /* FIXME: TODO */
-        DPRINT1("Affinity support disabled!\n");
-    }
+    /* Get the old affinity */
+    OldAffinity = Thread->UserAffinity;
 
-    /* Return the old affinity */
-    return OldAffinity;
-}
+    Thread->UserAffinity = Affinity;
 
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-NtYieldExecution(VOID)
-{
-#ifdef NEW_SCHEDULER
-    NTSTATUS Status = STATUS_NO_YIELD_PERFORMED;
-    KIRQL OldIrql;
-    PKPRCB Prcb = KeGetCurrentPrcb();
-    PKTHREAD Thread = KeGetCurrentThread(), NextThread;
+    if (Thread->SystemAffinityActive == FALSE) {
 
-    /* Fail if there's no ready summary */
-    if (!Prcb->ReadySummary) return Status;
+        Thread->Affinity = Affinity;
 
-    /* Raise IRQL to synch */
-    OldIrql = KeRaiseIrqlToSynchLevel();
+        if (Thread->State == Running) {
 
-    /* Now check if there's still a ready summary */
-    if (Prcb->ReadySummary)
-    {
-        /* Acquire thread and PRCB lock */
-        KiAcquireThreadLock(Thread);
-        KiAcquirePrcbLock(Prcb);
+            ProcessorMask = 1 << KeGetCurrentProcessorNumber();
+            if (Thread == KeGetCurrentThread()) {
 
-        /* Find a new thread to run if none was selected */
-        if (!Prcb->NextThread) Prcb->NextThread = KiSelectReadyThread(1, Prcb);
+                if (!(Affinity & ProcessorMask)) {
 
-        /* Make sure we still have a next thread to schedule */
-        NextThread = Prcb->NextThread;
-        if (NextThread)
-        {
-            /* Reset quantum and recalculate priority */
-            Thread->Quantum = Thread->QuantumReset;
-            Thread->Priority = KiComputeNewPriority(Thread, 1);
+                    KiDispatchThreadNoLock(Ready);
+                    *Released = TRUE;
+                    return OldAffinity;
+                }
 
-            /* Release the thread lock */
-            KiReleaseThreadLock(Thread);
+            } else {
 
-            /* Set context swap busy */
-            KiSetThreadSwapBusy(Thread);
+                for (i = 0; i < KeNumberProcessors; i++) {
 
-            /* Set the new thread as running */
-            Prcb->NextThread = NULL;
-            Prcb->CurrentThread = NextThread;
-            NextThread->State = Running;
+                    Pcr = (PKPCR)(KPCR_BASE + i * PAGE_SIZE);
+                    if (Pcr->Prcb->CurrentThread == Thread) {
 
-            /* Setup a yield wait and queue the thread */
-            Thread->WaitReason = WrYieldExecution;
-            KxQueueReadyThread(Thread, Prcb);
+                        if (!(Affinity & ProcessorMask)) {
 
-            /* Make it wait at APC_LEVEL */
-            Thread->WaitIrql = APC_LEVEL;
+                            KiReleaseDispatcherLockFromDpcLevel();
+                            KiRequestReschedule(i);
+                            *Released = TRUE;
+                            return OldAffinity;
+                        }
 
-            /* Sanity check */
-            ASSERT(OldIrql <= DISPATCH_LEVEL);
+                        break;
+                    }
+                }
 
-            /* Swap to new thread */
-            KiSwapContext(Thread, NextThread);
-            Status = STATUS_SUCCESS;
-        }
-        else
-        {
-            /* Release the PRCB and thread lock */
-            KiReleasePrcbLock(Prcb);
-            KiReleaseThreadLock(Thread);
+                ASSERT (i < KeNumberProcessors);
+            }
         }
     }
 
-    /* Lower IRQL and return */
-    KeLowerIrql(OldIrql);
-    return Status;
-#else
+    *Released = FALSE;
+    return OldAffinity;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtYieldExecution(VOID)
+{
+    //
+    // TODO (nothing too hard, just want to test out other code)
+    //
+    //DPRINT1("NO YIELD PERFORMED! If you see this, contact Alex\n");
+    //return STATUS_NO_YIELD_PERFORMED;
     KiDispatchThread(Ready);
     return STATUS_SUCCESS;
-#endif
 }
 
index cd32d9d..160f869 100644 (file)
  * FILE:            ntoskrnl/ke/timer.c
  * PURPOSE:         Handle Kernel Timers (Kernel-part of Executive Timers)
  * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ *                  David Welch (welch@mcmail.com)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES ***************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
-/* GLOBALS *******************************************************************/
+/* GLOBALS ****************************************************************/
 
-KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE];
 LARGE_INTEGER KiTimeIncrementReciprocal;
 UCHAR KiTimeIncrementShiftCount;
+LIST_ENTRY KiTimerListHead;
+KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE];
+#define SYSTEM_TIME_UNITS_PER_MSEC (10000)
 
-/* PRIVATE FUNCTIONS *********************************************************/
+/* PRIVATE FUNCTIONS ******************************************************/
+
+VOID
+NTAPI
+KiRemoveTimer(IN PKTIMER Timer)
+{
+    /* Remove the timer */
+    Timer->Header.Inserted = FALSE;
+    RemoveEntryList(&Timer->TimerListEntry);
+}
 
+/*
+ * Note: This function is called with the Dispatcher Lock held.
+ */
 BOOLEAN
-FASTCALL
-KiInsertTreeTimer(IN PKTIMER Timer,
-                  IN LARGE_INTEGER Interval)
+NTAPI
+KiInsertTimer(IN PKTIMER Timer,
+              IN LARGE_INTEGER DueTime)
 {
-    BOOLEAN Inserted = FALSE;
-    ULONG Hand = 0;
-    PKSPIN_LOCK_QUEUE LockQueue;
-    LONGLONG DueTime;
-    LARGE_INTEGER InterruptTime, SystemTime, DifferenceTime;
-    PKTIMER_TABLE_ENTRY TimerEntry;
+    LARGE_INTEGER SystemTime;
+    LARGE_INTEGER DifferenceTime;
+    ULONGLONG InterruptTime;
 
-    /* Convert to relative time if needed */
+    /* Set default data */
+    Timer->Header.Inserted = TRUE;
     Timer->Header.Absolute = FALSE;
-    if (Interval.HighPart >= 0)
+    if (!Timer->Period) Timer->Header.SignalState = FALSE;
+
+    /* Convert to relative time if needed */
+    if (DueTime.HighPart >= 0)
     {
         /* Get System Time */
         KeQuerySystemTime(&SystemTime);
 
         /* Do the conversion */
-        DifferenceTime.QuadPart = SystemTime.QuadPart - Interval.QuadPart;
+        DifferenceTime.QuadPart = SystemTime.QuadPart - DueTime.QuadPart;
 
         /* Make sure it hasn't already expired */
-        Timer->Header.Absolute = TRUE;
         if (DifferenceTime.HighPart >= 0)
         {
             /* Cancel everything */
             Timer->Header.SignalState = TRUE;
-            Timer->Header.Hand = 0;
-            Timer->DueTime.QuadPart = 0;
+            Timer->Header.Inserted = FALSE;
             return FALSE;
         }
 
         /* Set the time as Absolute */
-        Interval = DifferenceTime;
+        Timer->Header.Absolute = TRUE;
+        DueTime = DifferenceTime;
     }
 
     /* Get the Interrupt Time */
-    InterruptTime.QuadPart = KeQueryInterruptTime();
-
-    /* Recalculate due time */
-    DueTime = InterruptTime.QuadPart - Interval.QuadPart;
-    Timer->DueTime.QuadPart = DueTime;
-
-    /* Get the handle */
-    Hand = KiComputeTimerTableIndex(DueTime);
-    Timer->Header.Hand = (UCHAR)Hand;
-    Timer->Header.Inserted = TRUE;
-
-    /* Acquire the lock */
-    LockQueue = KiAcquireTimerLock(Hand);
-
-    /* Insert the timer */
-    if (KiInsertTimerTable(Timer, Hand))
-    {
-        /* It was already there, remove it */
-        if (RemoveEntryList(&Timer->TimerListEntry))
-        {
-            /* Get the entry and check if it's empty */
-            TimerEntry = &KiTimerTableListHead[Hand];
-            if (IsListEmpty(&TimerEntry->Entry))
-            {
-                /* Clear the time then */
-                TimerEntry->Time.HighPart = 0xFFFFFFFF;
-            }
-        }
-    }
-    else
-    {
-        /* Otherwise, we're now inserted */
-        Inserted = TRUE;
-    }
-
-    /* Release the lock and return insert status */
-    return Inserted;
-}
-
-BOOLEAN
-FASTCALL
-KiInsertTimerTable(IN PKTIMER Timer,
-                   IN ULONG Hand)
-{
-    LARGE_INTEGER InterruptTime;
-    LONGLONG DueTime = Timer->DueTime.QuadPart;
-    BOOLEAN Expired = FALSE;
-    PLIST_ENTRY ListHead, NextEntry;
-    PKTIMER CurrentTimer;
-
-    /* Check if the period is zero */
-    if (!Timer->Period) Timer->Header.SignalState = FALSE;
-
-    /* Sanity check */
-    ASSERT(Hand == KiComputeTimerTableIndex(DueTime));
-
-    /* Loop the timer list backwards */
-    ListHead = &KiTimerTableListHead[Hand].Entry;
-    NextEntry = ListHead->Blink;
-    while (NextEntry != ListHead)
-    {
-        /* Get the timer */
-        CurrentTimer = CONTAINING_RECORD(NextEntry, KTIMER, TimerListEntry);
-
-        /* Now check if we can fit it before */
-        if ((ULONGLONG)DueTime >= CurrentTimer->DueTime.QuadPart) break;
-
-        /* Keep looping */
-        NextEntry = NextEntry->Blink;
-    }
-
-    /* Looped all the list, insert it here and get the interrupt time again */
-    InsertHeadList(NextEntry, &Timer->TimerListEntry);
-
-    /* Check if we didn't find it in the list */
-    if (NextEntry == ListHead)
-    {
-        /* Set the time */
-        KiTimerTableListHead[Hand].Time.QuadPart = DueTime;
-
-        /* Make sure it hasn't expired already */
-        InterruptTime.QuadPart = KeQueryInterruptTime();
-        if (DueTime <= InterruptTime.QuadPart) Expired = TRUE;
-    }
-
-    /* Return expired state */
-    return Expired;
+    InterruptTime = KeQueryInterruptTime();
+
+    /* Set the Final Due Time */
+    Timer->DueTime.QuadPart = InterruptTime - DueTime.QuadPart;
+
+    /* Now insert it into the Timer List */
+    InsertAscendingList(&KiTimerListHead,
+                        Timer,
+                        KTIMER,
+                        TimerListEntry,
+                        DueTime.QuadPart);
+    return TRUE;
 }
 
-BOOLEAN
-FASTCALL
-KiSignalTimer(IN PKTIMER Timer)
+/*
+ * We enter this function at IRQL DISPATCH_LEVEL, and with the
+ * Dispatcher Lock held!
+ */
+VOID
+NTAPI
+KiHandleExpiredTimer(IN PKTIMER Timer)
 {
-    BOOLEAN RequestInterrupt = FALSE;
-    PKDPC Dpc = Timer->Dpc;
-    ULONG Period = Timer->Period;
-    LARGE_INTEGER Interval, SystemTime;
+    LARGE_INTEGER DueTime;
 
-    /* Set default values */
-    Timer->Header.Inserted = FALSE;
+    /* Set it as Signaled */
     Timer->Header.SignalState = TRUE;
 
-    /* Check if the timer has waiters */
+    /* Check if it has any waiters */
     if (!IsListEmpty(&Timer->Header.WaitListHead))
     {
-        /* Check the type of event */
-        if (Timer->Header.Type == TimerNotificationObject)
-        {
-            /* Unwait the thread */
-            KxUnwaitThread(&Timer->Header, IO_NO_INCREMENT);
-        }
-        else
-        {
-            /* Otherwise unwait the thread and signal the timer */
-            KxUnwaitThreadForEvent((PKEVENT)Timer, IO_NO_INCREMENT);
-        }
+        /* Wake them */
+        KiWaitTest(Timer, IO_NO_INCREMENT);
     }
 
-    /* Check if we have a period */
-    if (Period)
+    /* If the Timer is periodic, reinsert the timer with the new due time */
+    if (Timer->Period)
     {
-        /* Calculate the interval and insert the timer */
-        Interval.QuadPart = Int32x32To64(Period, -10000);
-        while (!KiInsertTreeTimer(Timer, Interval));
+        /* Reinsert the Timer */
+        DueTime.QuadPart = Timer->Period * -SYSTEM_TIME_UNITS_PER_MSEC;
+        while (!KiInsertTimer(Timer, DueTime));
     }
 
-    /* Check if we have a DPC */
-    if (Dpc)
+    /* Check if the Timer has a DPC */
+    if (Timer->Dpc)
     {
-        /* Insert it in the queue */
-        KeQuerySystemTime(&SystemTime);
-        KeInsertQueueDpc(Dpc,
-                         ULongToPtr(SystemTime.LowPart),
-                         ULongToPtr(SystemTime.HighPart));
-        RequestInterrupt = TRUE;
+        /* Insert the DPC */
+        KeInsertQueueDpc(Timer->Dpc,
+                         NULL,
+                         NULL);
     }
-
-    /* Return whether we need to request a DPC interrupt or not */
-    return RequestInterrupt;
 }
 
 VOID
-FASTCALL
-KiCompleteTimer(IN PKTIMER Timer,
-                IN PKSPIN_LOCK_QUEUE LockQueue)
+NTAPI
+KiExpireTimers(IN PKDPC Dpc,
+               IN PVOID DeferredContext,
+               IN PVOID SystemArgument1,
+               IN PVOID SystemArgument2)
 {
-    LIST_ENTRY ListHead;
-    PKTIMER_TABLE_ENTRY TimerEntry;
-    BOOLEAN RequestInterrupt = FALSE;
+    PKTIMER Timer;
+    ULONGLONG InterruptTime;
+    LIST_ENTRY ExpiredTimerList;
+    PLIST_ENTRY ListHead, NextEntry;
+    KIRQL OldIrql;
 
-    /* Remove it from the timer list */
-    if (RemoveEntryList(&Timer->TimerListEntry))
-    {
-        /* Get the entry and check if it's empty */
-        TimerEntry = &KiTimerTableListHead[Timer->Header.Hand];
-        if (IsListEmpty(&TimerEntry->Entry))
-        {
-            /* Clear the time then */
-            TimerEntry->Time.HighPart = 0xFFFFFFFF;
-        }
-    }
+    /* Initialize the Expired Timer List */
+    InitializeListHead(&ExpiredTimerList);
+
+    /* Lock the Database and Raise IRQL */
+    OldIrql = KiAcquireDispatcherLock();
 
-    /* Link the timer list to our stack */
-    ListHead.Flink = &Timer->TimerListEntry;
-    ListHead.Blink = &Timer->TimerListEntry;
-    Timer->TimerListEntry.Flink = &ListHead;
-    Timer->TimerListEntry.Blink = &ListHead;
+    /* Query Interrupt Times */
+    InterruptTime = KeQueryInterruptTime();
 
-    /* Release the timer lock */
-    KiReleaseTimerLock(LockQueue);
+    /* Loop through the Timer List */
+    ListHead = &KiTimerListHead;
+    NextEntry = ListHead->Flink;
+    while (NextEntry != ListHead)
+    {
+        /* Get the timer */
+        Timer = CONTAINING_RECORD(NextEntry, KTIMER, TimerListEntry);
 
-    /* Acquire dispatcher lock */
-    KiAcquireDispatcherLockAtDpcLevel();
+        /* Check if we have to Expire it */
+        if (InterruptTime < Timer->DueTime.QuadPart) break;
 
-    /* Signal the timer if it's still on our list */
-    if (!IsListEmpty(&ListHead)) RequestInterrupt = KiSignalTimer(Timer);
+        /* Remove it from the Timer List, add it to the Expired List */
+        RemoveEntryList(&Timer->TimerListEntry);
+        InsertTailList(&ExpiredTimerList, &Timer->TimerListEntry);
+        NextEntry = ListHead->Flink;
+    }
 
-    /* Release the dispatcher lock */
-    KiReleaseDispatcherLockFromDpcLevel();
+    /* Expire the Timers */
+    while (ExpiredTimerList.Flink != &ExpiredTimerList)
+    {
+        /* Get the Timer */
+        Timer = CONTAINING_RECORD(ExpiredTimerList.Flink,
+                                  KTIMER,
+                                  TimerListEntry);
+
+        /* Remove it */
+        ///
+        // GCC IS A BRAINDEAD PIECE OF SHIT. WILL GIVE 5$ FOR EACH DEV KILLED.
+        ///
+        Timer->Header.Inserted = FALSE;
+        RemoveEntryList(&Timer->TimerListEntry);
+        //KiRemoveTimer(Timer);
+
+        /* Expire it */
+        KiHandleExpiredTimer(Timer);
+    }
 
-    /* Request a DPC if needed */
-    if (RequestInterrupt) HalRequestSoftwareInterrupt(DISPATCH_LEVEL);
+    /* Release Dispatcher Lock */
+    KiReleaseDispatcherLock(OldIrql);
 }
 
 /* PUBLIC FUNCTIONS **********************************************************/
@@ -254,19 +200,25 @@ KeCancelTimer(IN OUT PKTIMER Timer)
     KIRQL OldIrql;
     BOOLEAN Inserted;
     ASSERT_TIMER(Timer);
-    ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
+    ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
     /* Lock the Database and Raise IRQL */
     OldIrql = KiAcquireDispatcherLock();
 
     /* Check if it's inserted, and remove it if it is */
     Inserted = Timer->Header.Inserted;
-    if (Inserted) KxRemoveTreeTimer(Timer);
+    if (Inserted)
+    {
+        ///
+        // GCC IS A BRAINDEAD PIECE OF SHIT. WILL GIVE 5$ FOR EACH DEV KILLED.
+        ///
+        Timer->Header.Inserted = FALSE;
+        RemoveEntryList(&Timer->TimerListEntry);
+        //KiRemoveTimer(Timer);
+    }
 
     /* Release Dispatcher Lock */
     KiReleaseDispatcherLock(OldIrql);
-
-    /* Return the old state */
     return Inserted;
 }
 
@@ -337,75 +289,62 @@ KeSetTimerEx(IN OUT PKTIMER Timer,
 {
     KIRQL OldIrql;
     BOOLEAN Inserted;
-    ULONG Hand = 0;
-    LARGE_INTEGER InterruptTime, SystemTime, DifferenceTime;
-    BOOLEAN RequestInterrupt = FALSE;
     ASSERT_TIMER(Timer);
-    ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
+    ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
 
     /* Lock the Database and Raise IRQL */
     OldIrql = KiAcquireDispatcherLock();
 
     /* Check if it's inserted, and remove it if it is */
     Inserted = Timer->Header.Inserted;
-    if (Inserted) KxRemoveTreeTimer(Timer);
+    if (Inserted)
+    {
+        ///
+        // GCC IS A BRAINDEAD PIECE OF SHIT. WILL GIVE 5$ FOR EACH DEV KILLED.
+        ///
+        Timer->Header.Inserted = FALSE;
+        RemoveEntryList(&Timer->TimerListEntry);
+        //KiRemoveTimer(Timer);
+    }
 
     /* Set Default Timer Data */
     Timer->Dpc = Dpc;
     Timer->Period = Period;
+    Timer->Header.SignalState = FALSE;
 
-    /* Convert to relative time if needed */
-    Timer->Header.Absolute = FALSE;
-    if (DueTime.HighPart >= 0)
+    /* Insert it */
+    if (!KiInsertTimer(Timer, DueTime))
     {
-        /* Get System Time */
-        KeQuerySystemTime(&SystemTime);
-
-        /* Do the conversion */
-        DifferenceTime.QuadPart = SystemTime.QuadPart - DueTime.QuadPart;
-
-        /* Make sure it hasn't already expired */
-        Timer->Header.Absolute = TRUE;
-        if (DifferenceTime.HighPart >= 0)
+        /* Check if it has any waiters */
+        if (!IsListEmpty(&Timer->Header.WaitListHead))
         {
-            /* Cancel everything */
-            Timer->Header.SignalState = TRUE;
-            Timer->Header.Hand = 0;
-            Timer->DueTime.QuadPart = 0;
-
-            /* Signal the timer */
-            RequestInterrupt = KiSignalTimer(Timer);
-
-            /* Release the dispatcher lock */
-            KiReleaseDispatcherLockFromDpcLevel();
+            /* Wake them */
+            KiWaitTest(Timer, IO_NO_INCREMENT);
+        }
 
-            /* Check if we need to do an interrupt */
-            if (RequestInterrupt) HalRequestSoftwareInterrupt(DISPATCH_LEVEL);
+        /* Check if the Timer has a DPC */
+        if (Dpc)
+        {
+            /* Insert the DPC */
+            KeInsertQueueDpc(Timer->Dpc,
+                             NULL,
+                             NULL);
         }
 
-        /* Set the time as Absolute */
-        DueTime = DifferenceTime;
+        /* Check if the Timer is periodic */
+        if (Timer->Period)
+        {
+            /* Reinsert the Timer */
+            DueTime.QuadPart = Timer->Period * -SYSTEM_TIME_UNITS_PER_MSEC;
+            while (!KiInsertTimer(Timer, DueTime));
+        }
     }
 
-    /* Get the Interrupt Time */
-    InterruptTime.QuadPart = KeQueryInterruptTime();
-
-    /* Recalculate due time */
-    Timer->DueTime.QuadPart = InterruptTime.QuadPart - DueTime.QuadPart;
-
-    /* Get the handle */
-    Hand = KiComputeTimerTableIndex(Timer->DueTime.QuadPart);
-    Timer->Header.Hand = (UCHAR)Hand;
-    Timer->Header.Inserted = TRUE;
-
-    /* Insert the timer */
-    Timer->Header.SignalState = FALSE;
-    KxInsertTimer(Timer, Hand);
-
     /* Release Dispatcher Lock */
-    KiExitDispatcher(OldIrql);
+    KiReleaseDispatcherLock(OldIrql);
 
     /* Return old state */
     return Inserted;
 }
 
+/* EOF */
index dabe787..2f35b05 100644 (file)
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
+VOID
+FASTCALL
+KiWaitSatisfyAll(PKWAIT_BLOCK FirstBlock)
+{
+    PKWAIT_BLOCK WaitBlock = FirstBlock;
+    PKTHREAD WaitThread = WaitBlock->Thread;
+
+    /* Loop through all the Wait Blocks, and wake each Object */
+    do
+    {
+        /* Make sure it hasn't timed out */
+        if (WaitBlock->WaitKey != STATUS_TIMEOUT)
+        {
+            /* Wake the Object */
+            KiSatisfyObjectWait((PKMUTANT)WaitBlock->Object, WaitThread);
+        }
+
+        /* Move to the next block */
+        WaitBlock = WaitBlock->NextWaitBlock;
+    } while (WaitBlock != FirstBlock);
+}
+
 VOID
 FASTCALL
 KiWaitTest(IN PVOID ObjectPointer,
            IN KPRIORITY Increment)
 {
-    PLIST_ENTRY WaitEntry, WaitList;
-    PKWAIT_BLOCK WaitBlock;
+    PLIST_ENTRY WaitEntry;
+    PLIST_ENTRY WaitList;
+    PKWAIT_BLOCK CurrentWaitBlock;
+    PKWAIT_BLOCK NextWaitBlock;
     PKTHREAD WaitThread;
-    PKMUTANT FirstObject = ObjectPointer;
-    NTSTATUS WaitStatus;
+    PKMUTANT FirstObject = ObjectPointer, Object;
 
     /* Loop the Wait Entries */
     WaitList = &FirstObject->Header.WaitListHead;
     WaitEntry = WaitList->Flink;
-    while ((FirstObject->Header.SignalState > 0) && (WaitEntry != WaitList))
+    while ((FirstObject->Header.SignalState > 0) &&
+           (WaitEntry != WaitList))
     {
         /* Get the current wait block */
-        WaitBlock = CONTAINING_RECORD(WaitEntry, KWAIT_BLOCK, WaitListEntry);
-        WaitThread = WaitBlock->Thread;
-        WaitStatus = STATUS_KERNEL_APC;
+        CurrentWaitBlock = CONTAINING_RECORD(WaitEntry,
+                                             KWAIT_BLOCK,
+                                             WaitListEntry);
+        WaitThread = CurrentWaitBlock->Thread;
 
         /* Check the current Wait Mode */
-        if (WaitBlock->WaitType == WaitAny)
+        if (CurrentWaitBlock->WaitType == WaitAny)
         {
             /* Easy case, satisfy only this wait */
-            WaitStatus = (NTSTATUS)WaitBlock->WaitKey;
+            WaitEntry = WaitEntry->Blink;
             KiSatisfyObjectWait(FirstObject, WaitThread);
         }
+        else
+        {
+            /* Everything must be satisfied */
+            NextWaitBlock = CurrentWaitBlock->NextWaitBlock;
+
+            /* Loop first to make sure they are valid */
+            while (NextWaitBlock != CurrentWaitBlock)
+            {
+                /* Make sure this isn't a timeout block */
+                if (NextWaitBlock->WaitKey != STATUS_TIMEOUT)
+                {
+                    /* Get the object */
+                    Object = NextWaitBlock->Object;
+
+                    /* Check if this is a mutant */
+                    if ((Object->Header.Type == MutantObject) &&
+                        (Object->Header.SignalState <= 0) &&
+                        (WaitThread == Object->OwnerThread))
+                    {
+                        /* It's a signaled mutant */
+                    }
+                    else if (Object->Header.SignalState <= 0)
+                    {
+                        /* Skip the unwaiting */
+                        goto SkipUnwait;
+                    }
+                }
+
+                /* Go to the next Wait block */
+                NextWaitBlock = NextWaitBlock->NextWaitBlock;
+            }
+
+            /* All the objects are signaled, we can satisfy */
+            WaitEntry = WaitEntry->Blink;
+            KiWaitSatisfyAll(CurrentWaitBlock);
+        }
+
+        /* All waits satisfied, unwait the thread */
+        KiUnwaitThread(WaitThread, CurrentWaitBlock->WaitKey, Increment);
 
-        /* Now do the rest of the unwait */
-        KiUnwaitThread(WaitThread, WaitStatus, Increment);
-        WaitEntry = WaitList->Flink;
+SkipUnwait:
+        /* Next entry */
+        WaitEntry = WaitEntry->Flink;
     }
 }
 
@@ -77,7 +141,13 @@ KiUnlinkThread(IN PKTHREAD Thread,
 
     /* Check if there's a Thread Timer */
     Timer = &Thread->Timer;
-    if (Timer->Header.Inserted) KxRemoveTreeTimer(Timer);
+    if (Timer->Header.Inserted)
+    {
+        /* Remove the timer */
+        Timer->Header.Inserted = FALSE;
+        RemoveEntryList(&Timer->TimerListEntry);
+        //KiRemoveTimer(Timer);
+    }
 
     /* Increment the Queue's active threads */
     if (Thread->Queue) Thread->Queue->CurrentCount++;
@@ -96,7 +166,7 @@ KiUnwaitThread(IN PKTHREAD Thread,
     /* Tell the scheduler do to the increment when it readies the thread */
     ASSERT(Increment >= 0);
     Thread->AdjustIncrement = (SCHAR)Increment;
-    Thread->AdjustReason = AdjustUnwait;
+    Thread->AdjustReason = 1;
 
     /* Reschedule the Thread */
     KiReadyThread(Thread);
@@ -133,7 +203,7 @@ KiExitDispatcher(IN KIRQL OldIrql)
     BOOLEAN PendingApc;
 
     /* Make sure we're at synchronization level */
-    ASSERT(KeGetCurrentIrql() == SYNCH_LEVEL);
+    ASSERT_IRQL(SYNCH_LEVEL);
 
     /* Check if we have deferred threads */
     KiCheckDeferredReadyList(Prcb);
@@ -155,6 +225,10 @@ KiExitDispatcher(IN KIRQL OldIrql)
     /* Make sure there's a new thread scheduled */
     if (!Prcb->NextThread) goto Quickie;
 
+    /* This shouldn't happen on ROS yet */
+    DPRINT1("The impossible happened - Tell Alex\n");
+    ASSERT(FALSE);
+
     /* Lock the PRCB */
     KiAcquirePrcbLock(Prcb);
 
@@ -206,123 +280,89 @@ KeDelayExecutionThread(IN KPROCESSOR_MODE WaitMode,
                        IN BOOLEAN Alertable,
                        IN PLARGE_INTEGER Interval OPTIONAL)
 {
-    PKTIMER Timer;
-    PKWAIT_BLOCK TimerBlock;
+    PKTIMER ThreadTimer;
     PKTHREAD Thread = KeGetCurrentThread();
     NTSTATUS WaitStatus;
     BOOLEAN Swappable;
-    PLARGE_INTEGER OriginalDueTime;
-    LARGE_INTEGER DueTime, NewDueTime, InterruptTime;
-    ULONG Hand = 0;
+    PLARGE_INTEGER OriginalDueTime = Interval;
+    LARGE_INTEGER DueTime, NewDueTime;
 
-    /* If this is a user-mode wait of 0 seconds, yield execution */
-    if (!(Interval->QuadPart) && (WaitMode != KernelMode))
+    /* Check if the lock is already held */
+    if (Thread->WaitNext)
     {
-        /* Make sure the wait isn't alertable or interrupting an APC */
-        if (!(Alertable) && !(Thread->ApcState.UserApcPending))
-        {
-            /* Yield execution */
-            NtYieldExecution();
-        }
+        /* Lock is held, disable Wait Next */
+        Thread->WaitNext = FALSE;
+        Swappable = KxDelayThreadWait(Thread, Alertable, WaitMode);
     }
-
-    /* Setup the original time and timer/wait blocks */
-    OriginalDueTime = Interval;
-    Timer = &Thread->Timer;
-    TimerBlock = &Thread->WaitBlock[TIMER_WAIT_BLOCK];
-
-    /* Check if the lock is already held */
-    if (!Thread->WaitNext) goto WaitStart;
-
-    /*  Otherwise, we already have the lock, so initialize the wait */
-    Thread->WaitNext = FALSE;
-    KxDelayThreadWait();
-
-    /* Start wait loop */
-    for (;;)
+    else
     {
-        /* Disable pre-emption */
-        Thread->Preempted = FALSE;
-
-        /* Check if a kernel APC is pending and we're below APC_LEVEL */
-        if ((Thread->ApcState.KernelApcPending) && !(Thread->SpecialApcDisable) &&
-            (Thread->WaitIrql < APC_LEVEL))
-        {
-            /* Unlock the dispatcher */
-            KiReleaseDispatcherLock(Thread->WaitIrql);
-        }
-        else
-        {
-            /* Check if we have to bail out due to an alerted state */
-            WaitStatus = KiCheckAlertability(Thread, Alertable, WaitMode);
-            if (WaitStatus != STATUS_WAIT_0) break;
-
-            /* Check if the timer expired */
-            InterruptTime.QuadPart = KeQueryInterruptTime();
-            if ((ULONGLONG)InterruptTime.QuadPart >= Timer->DueTime.QuadPart)
-            {
-                /* It did, so we don't need to wait */
-                goto NoWait;
-            }
-
-            /* It didn't, so activate it */
-            Timer->Header.Inserted = TRUE;
+        /* Lock not held, acquire it */
+WaitStart:
+        Thread->WaitIrql = KiAcquireDispatcherLock();
+        Swappable = KxDelayThreadWait(Thread, Alertable, WaitMode);
+    }
 
-            /* Handle Kernel Queues */
-            if (Thread->Queue) KiActivateWaiterQueue(Thread->Queue);
+    /* Check if a kernel APC is pending and we're below APC_LEVEL */
+    if ((Thread->ApcState.KernelApcPending) && !(Thread->SpecialApcDisable) &&
+        (Thread->WaitIrql < APC_LEVEL))
+    {
+        /* Unlock the dispatcher */
+        KiReleaseDispatcherLock(Thread->WaitIrql);
+        goto WaitStart;
+    }
 
-            /* Setup the wait information */
-            Thread->State = Waiting;
+    /* Check if we have to bail out due to an alerted state */
+    WaitStatus = KiCheckAlertability(Thread, Alertable, WaitMode);
+    if (WaitStatus != STATUS_WAIT_0)
+    {
+        /* Unlock the dispatcher and return */
+        KiReleaseDispatcherLock(Thread->WaitIrql);
+        return WaitStatus;
+    }
 
-            /* Add the thread to the wait list */
-            KiAddThreadToWaitList(Thread, Swappable);
+    /* Set Timer */
+    ThreadTimer = &Thread->Timer;
 
-            /* Insert the timer and swap the thread */
-            ASSERT(Thread->WaitIrql <= DISPATCH_LEVEL);
-            KiSetThreadSwapBusy(Thread);
-            KxInsertTimer(Timer, Hand);
-            WaitStatus = KiSwapThread(Thread, KeGetCurrentPrcb());
+    /* Insert the Timer into the Timer Lists and enable it */
+    if (!KiInsertTimer(ThreadTimer, *Interval))
+    {
+        /* FIXME: We should find a new ready thread */
+        KiReleaseDispatcherLock(Thread->WaitIrql);
+        return STATUS_WAIT_0;
+    }
 
-            /* Check if were swapped ok */
-            if (WaitStatus != STATUS_KERNEL_APC)
-            {
-                /* This is a good thing */
-                if (WaitStatus == STATUS_TIMEOUT) WaitStatus = STATUS_SUCCESS;
+    /* Save due time */
+    DueTime.QuadPart = ThreadTimer->DueTime.QuadPart;
 
-                /* Return Status */
-                return WaitStatus;
-            }
+    /* Handle Kernel Queues */
+    if (Thread->Queue) KiActivateWaiterQueue(Thread->Queue);
 
-            /* Recalculate due times */
-            Interval = KiRecalculateDueTime(OriginalDueTime,
-                                            &DueTime,
-                                            &NewDueTime);
-        }
+    /* Setup the wait information */
+    Thread->State = Waiting;
 
-WaitStart:
-        /* Setup a new wait */
-        Thread->WaitIrql = KeRaiseIrqlToSynchLevel();
-        KxDelayThreadWait();
-        KiAcquireDispatcherLockAtDpcLevel();
-    }
+    /* Add the thread to the wait list */
+    KiAddThreadToWaitList(Thread, Swappable);
 
-    /* We're done! */
-    KiReleaseDispatcherLock(Thread->WaitIrql);
-    return WaitStatus;
+    /* Swap the thread */
+    ASSERT(Thread->WaitIrql <= DISPATCH_LEVEL);
+    KiSetThreadSwapBusy(Thread);
+    WaitStatus = KiSwapThread(Thread, KeGetCurrentPrcb());
 
-NoWait:
-    /* There was nothing to wait for. Did we have a wait interval? */
-    if (!Interval->QuadPart)
+    /* Check if we were executing an APC or if we timed out */
+    if (WaitStatus == STATUS_KERNEL_APC)
     {
-        /* Unlock the dispatcher and do a yield */
-        KiReleaseDispatcherLock(Thread->WaitIrql);
-        return NtYieldExecution();
+        /* Recalculate due times */
+        Interval = KiRecalculateDueTime(OriginalDueTime,
+                                        &DueTime,
+                                        &NewDueTime);
+        goto WaitStart;
     }
 
-    /* Unlock the dispatcher and adjust the quantum for a no-wait */
-    KiReleaseDispatcherLockFromDpcLevel();
-    KiAdjustQuantumThread(Thread);
-    return STATUS_SUCCESS;
+    /* This is a good thing */
+    if (WaitStatus == STATUS_TIMEOUT) WaitStatus = STATUS_SUCCESS;
+
+    /* Return Status */
+    return WaitStatus;
 }
 
 /*
@@ -336,155 +376,165 @@ KeWaitForSingleObject(IN PVOID Object,
                       IN BOOLEAN Alertable,
                       IN PLARGE_INTEGER Timeout OPTIONAL)
 {
+    PKMUTANT CurrentObject;
+    PKWAIT_BLOCK WaitBlock;
+    PKTIMER ThreadTimer;
     PKTHREAD Thread = KeGetCurrentThread();
-    PKMUTANT CurrentObject = (PKMUTANT)Object;
-    PKWAIT_BLOCK WaitBlock = &Thread->WaitBlock[0];
-    PKWAIT_BLOCK TimerBlock = &Thread->WaitBlock[TIMER_WAIT_BLOCK];
-    PKTIMER Timer = &Thread->Timer;
     NTSTATUS WaitStatus;
     BOOLEAN Swappable;
-    LARGE_INTEGER DueTime, NewDueTime, InterruptTime;
+    LARGE_INTEGER DueTime, NewDueTime;
     PLARGE_INTEGER OriginalDueTime = Timeout;
-    ULONG Hand = 0;
 
-    /* Check if the lock is already held */
-    if (!Thread->WaitNext) goto WaitStart;
+    /* Get wait block */
+    WaitBlock = &Thread->WaitBlock[0];
 
-    /*  Otherwise, we already have the lock, so initialize the wait */
-    Thread->WaitNext = FALSE;
-    KxSingleThreadWait();
+    /* Check if the lock is already held */
+    if (Thread->WaitNext)
+    {
+        /* Lock is held, disable Wait Next */
+        Thread->WaitNext = FALSE;
+        Swappable = KxSingleThreadWait(Thread,
+                                       WaitBlock,
+                                       Object,
+                                       Timeout,
+                                       Alertable,
+                                       WaitReason,
+                                       WaitMode);
+    }
+    else
+    {
+StartWait:
+        /* Lock not held, acquire it */
+        Thread->WaitIrql = KiAcquireDispatcherLock();
+        Swappable = KxSingleThreadWait(Thread,
+                                       WaitBlock,
+                                       Object,
+                                       Timeout,
+                                       WaitReason,
+                                       WaitMode,
+                                       Alertable);
+    }
 
-    /* Start wait loop */
-    for (;;)
+    /* Check if a kernel APC is pending and we're below APC_LEVEL */
+    if ((Thread->ApcState.KernelApcPending) && !(Thread->SpecialApcDisable) &&
+        (Thread->WaitIrql < APC_LEVEL))
     {
-        /* Disable pre-emption */
-        Thread->Preempted = FALSE;
+        /* Unlock the dispatcher and wait again */
+        KiReleaseDispatcherLock(Thread->WaitIrql);
+        goto StartWait;
+    }
 
-        /* Check if a kernel APC is pending and we're below APC_LEVEL */
-        if ((Thread->ApcState.KernelApcPending) && !(Thread->SpecialApcDisable) &&
-            (Thread->WaitIrql < APC_LEVEL))
-        {
-            /* Unlock the dispatcher */
-            KiReleaseDispatcherLock(Thread->WaitIrql);
-        }
-        else
-        {
-            /* Sanity check */
-            ASSERT(CurrentObject->Header.Type != QueueObject);
+    /* Get the Current Object */
+    CurrentObject = (PKMUTANT)Object;
+    ASSERT(CurrentObject->Header.Type != QueueObject);
 
-            /* Check if it's a mutant */
-            if (CurrentObject->Header.Type == MutantObject)
-            {
-                /* Check its signal state or if we own it */
-                if ((CurrentObject->Header.SignalState > 0) ||
-                    (Thread == CurrentObject->OwnerThread))
-                {
-                    /* Just unwait this guy and exit */
-                    if (CurrentObject->Header.SignalState != (LONG)MINLONG)
-                    {
-                        /* It has a normal signal state. Unwait and return */
-                        KiSatisfyMutantWait(CurrentObject, Thread);
-                        WaitStatus = Thread->WaitStatus;
-                        goto DontWait;
-                    }
-                    else
-                    {
-                        /* Raise an exception */
-                        KiReleaseDispatcherLock(Thread->WaitIrql);
-                        ExRaiseStatus(STATUS_MUTANT_LIMIT_EXCEEDED);
-                   }
-                }
-            }
-            else if (CurrentObject->Header.SignalState > 0)
+    /* Check if it's a mutant */
+    if (CurrentObject->Header.Type == MutantObject)
+    {
+        /* Check its signal state or if we own it */
+        if ((CurrentObject->Header.SignalState > 0) ||
+            (Thread == CurrentObject->OwnerThread))
+        {
+            /* Just unwait this guy and exit */
+            if (CurrentObject->Header.SignalState != (LONG)MINLONG)
             {
-                /* Another satisfied object */
-                KiSatisfyNonMutantWait(CurrentObject);
-                WaitStatus = STATUS_WAIT_0;
+                /* It has a normal signal state. Unwait and return */
+                KiSatisfyMutantWait(CurrentObject, Thread);
+                WaitStatus = Thread->WaitStatus;
                 goto DontWait;
             }
-
-            /* Make sure we can satisfy the Alertable request */
-            WaitStatus = KiCheckAlertability(Thread, Alertable, WaitMode);
-            if (WaitStatus != STATUS_WAIT_0) break;
-
-            /* Enable the Timeout Timer if there was any specified */
-            if (Timeout)
+            else
             {
-                /* Check if the timer expired */
-                InterruptTime.QuadPart = KeQueryInterruptTime();
-                if ((ULONGLONG)InterruptTime.QuadPart >=
-                    Timer->DueTime.QuadPart)
-                {
-                    /* It did, so we don't need to wait */
-                    WaitStatus = STATUS_TIMEOUT;
-                    goto DontWait;
-                }
+                /* Raise an exception */
+                KiReleaseDispatcherLock(Thread->WaitIrql);
+                ExRaiseStatus(STATUS_MUTANT_LIMIT_EXCEEDED);
+           }
+        }
+    }
+    else if (CurrentObject->Header.SignalState > 0)
+    {
+        /* Another satisfied object */
+        KiSatisfyNonMutantWait(CurrentObject, Thread);
+        WaitStatus = STATUS_WAIT_0;
+        goto DontWait;
+    }
 
-                /* It didn't, so activate it */
-                Timer->Header.Inserted = TRUE;
-            }
+    /* Make sure we can satisfy the Alertable request */
+    WaitStatus = KiCheckAlertability(Thread, Alertable, WaitMode);
+    if (WaitStatus != STATUS_WAIT_0)
+    {
+        /* Unlock the dispatcher and return */
+        KiReleaseDispatcherLock(Thread->WaitIrql);
+        return WaitStatus;
+    }
 
-            /* Link the Object to this Wait Block */
-            InsertTailList(&CurrentObject->Header.WaitListHead,
-                           &WaitBlock->WaitListEntry);
+    /* Enable the Timeout Timer if there was any specified */
+    if (Timeout)
+    {
+        /* Fail if the timeout interval is actually 0 */
+        if (!Timeout->QuadPart)
+        {
+            /* Return a timeout */
+            WaitStatus = STATUS_TIMEOUT;
+            goto DontWait;
+        }
 
-            /* Handle Kernel Queues */
-            if (Thread->Queue) KiActivateWaiterQueue(Thread->Queue);
+        /* Insert the Timer into the Timer Lists and enable it */
+        ThreadTimer = &Thread->Timer;
+        if (!KiInsertTimer(ThreadTimer, *Timeout))
+        {
+            /* Return a timeout if we couldn't insert the timer */
+            WaitStatus = STATUS_TIMEOUT;
+            goto DontWait;
+        }
 
-            /* Setup the wait information */
-            Thread->State = Waiting;
+        /* Set the current due time */
+        DueTime.QuadPart = ThreadTimer->DueTime.QuadPart;
+    }
 
-            /* Add the thread to the wait list */
-            KiAddThreadToWaitList(Thread, Swappable);
+    /* Link the Object to this Wait Block */
+    InsertTailList(&CurrentObject->Header.WaitListHead,
+                   &WaitBlock->WaitListEntry);
 
-            /* Activate thread swap */
-            ASSERT(Thread->WaitIrql <= DISPATCH_LEVEL);
-            KiSetThreadSwapBusy(Thread);
+    /* Handle Kernel Queues */
+    if (Thread->Queue) KiActivateWaiterQueue(Thread->Queue);
 
-            /* Check if we have a timer */
-            if (Timeout)
-            {
-                /* Insert it */
-                KxInsertTimer(Timer, Hand);
-            }
-            else
-            {
-                /* Otherwise, unlock the dispatcher */
-                KiReleaseDispatcherLockFromDpcLevel();
-            }
+    /* Setup the wait information */
+    Thread->State = Waiting;
 
-            /* Do the actual swap */
-            WaitStatus = KiSwapThread(Thread, KeGetCurrentPrcb());
+    /* Add the thread to the wait list */
+    KiAddThreadToWaitList(Thread, Swappable);
 
-            /* Check if we were executing an APC */
-            if (WaitStatus != STATUS_KERNEL_APC) return WaitStatus;
+    /* Swap the thread */
+    ASSERT(Thread->WaitIrql <= DISPATCH_LEVEL);
+    KiSetThreadSwapBusy(Thread);
+    WaitStatus = KiSwapThread(Thread, KeGetCurrentPrcb());
 
-            /* Check if we had a timeout */
-            if (Timeout)
-            {
-                /* Recalculate due times */
-                Timeout = KiRecalculateDueTime(OriginalDueTime,
-                                               &DueTime,
-                                               &NewDueTime);
-            }
+    /* Check if we were executing an APC */
+    if (WaitStatus == STATUS_KERNEL_APC)
+    {
+        /* Check if we had a timeout */
+        if (Timeout)
+        {
+            /* Recalculate due times */
+            Timeout = KiRecalculateDueTime(OriginalDueTime,
+                                           &DueTime,
+                                           &NewDueTime);
         }
-WaitStart:
-        /* Setup a new wait */
-        Thread->WaitIrql = KeRaiseIrqlToSynchLevel();
-        KxSingleThreadWait();
-        KiAcquireDispatcherLockAtDpcLevel();
+
+        /* Wait again */
+        goto StartWait;
     }
 
     /* Wait complete */
-    KiReleaseDispatcherLock(Thread->WaitIrql);
     return WaitStatus;
 
 DontWait:
-    /* Release dispatcher lock but maintain high IRQL */
-    KiReleaseDispatcherLockFromDpcLevel();
-
-    /* Adjust the Quantum and return the wait status */
+    /* Adjust the Quantum */
     KiAdjustQuantumThread(Thread);
+
+    /* Release & Return */
+    KiReleaseDispatcherLock(Thread->WaitIrql);
     return WaitStatus;
 }
 
@@ -504,14 +554,15 @@ KeWaitForMultipleObjects(IN ULONG Count,
 {
     PKMUTANT CurrentObject;
     PKWAIT_BLOCK WaitBlock;
+    PKWAIT_BLOCK TimerWaitBlock;
+    PKTIMER ThreadTimer;
     PKTHREAD Thread = KeGetCurrentThread();
-    PKWAIT_BLOCK TimerBlock = &Thread->WaitBlock[TIMER_WAIT_BLOCK];
-    PKTIMER Timer = &Thread->Timer;
+    ULONG AllObjectsSignaled;
+    ULONG WaitIndex;
     NTSTATUS WaitStatus = STATUS_SUCCESS;
     BOOLEAN Swappable;
     PLARGE_INTEGER OriginalDueTime = Timeout;
-    LARGE_INTEGER DueTime, NewDueTime, InterruptTime;
-    ULONG Index, Hand = 0;
+    LARGE_INTEGER DueTime, NewDueTime;
 
     /* Make sure the Wait Count is valid */
     if (!WaitBlockArray)
@@ -540,229 +591,227 @@ KeWaitForMultipleObjects(IN ULONG Count,
     ASSERT(Count != 0);
 
     /* Check if the lock is already held */
-    if (!Thread->WaitNext) goto WaitStart;
+    if (Thread->WaitNext)
+    {
+        /* Lock is held, disable Wait Next */
+        Thread->WaitNext = FALSE;
+    }
+    else
+    {
+        /* Lock not held, acquire it */
+StartWait:
+        Thread->WaitIrql = KiAcquireDispatcherLock();
+    }
 
-    /*  Otherwise, we already have the lock, so initialize the wait */
-    Thread->WaitNext = FALSE;
-    KxMultiThreadWait();
+    /* Prepare for the wait */
+    Swappable = KxMultiThreadWait(Thread,
+                                  WaitBlockArray,
+                                  Alertable,
+                                  WaitReason,
+                                  WaitMode);
 
-    /* Start wait loop */
-    for (;;)
+    /* Check if a kernel APC is pending and we're below APC_LEVEL */
+    if ((Thread->ApcState.KernelApcPending) && !(Thread->SpecialApcDisable) &&
+        (Thread->WaitIrql < APC_LEVEL))
     {
-        /* Disable pre-emption */
-        Thread->Preempted = FALSE;
+        /* Unlock the dispatcher */
+        KiReleaseDispatcherLock(Thread->WaitIrql);
+        goto StartWait;
+    }
 
-        /* Check if a kernel APC is pending and we're below APC_LEVEL */
-        if ((Thread->ApcState.KernelApcPending) && !(Thread->SpecialApcDisable) &&
-            (Thread->WaitIrql < APC_LEVEL))
-        {
-            /* Unlock the dispatcher */
-            KiReleaseDispatcherLock(Thread->WaitIrql);
-        }
-        else
+    /* Append wait block to the KTHREAD wait block list */
+    WaitBlock = WaitBlockArray;
+
+    /* Check if the wait is (already) satisfied */
+    AllObjectsSignaled = TRUE;
+
+    /* First, we'll try to satisfy the wait directly */
+    for (WaitIndex = 0; WaitIndex < Count; WaitIndex++)
+    {
+        /* Get the Current Object */
+        CurrentObject = (PKMUTANT)Object[WaitIndex];
+        ASSERT(CurrentObject->Header.Type != QueueObject);
+
+        /* Check the type of wait */
+        if (WaitType == WaitAny)
         {
-            /* Check what kind of wait this is */
-            Index = 0;
-            if (WaitType == WaitAny)
+            /* Check if the Object is a mutant */
+            if (CurrentObject->Header.Type == MutantObject)
             {
-                /* Loop blocks */
-                do
+                /* Check if it's signaled */
+                if ((CurrentObject->Header.SignalState > 0) ||
+                    (Thread == CurrentObject->OwnerThread))
                 {
-                    /* Get the Current Object */
-                    CurrentObject = (PKMUTANT)Object[Index];
-                    ASSERT(CurrentObject->Header.Type != QueueObject);
-
-                    /* Check if the Object is a mutant */
-                    if (CurrentObject->Header.Type == MutantObject)
+                    /* This is a Wait Any, so unwait this and exit */
+                    if (CurrentObject->Header.SignalState !=
+                        (LONG)MINLONG)
                     {
-                        /* Check if it's signaled */
-                        if ((CurrentObject->Header.SignalState > 0) ||
-                            (Thread == CurrentObject->OwnerThread))
-                        {
-                            /* This is a Wait Any, so unwait this and exit */
-                            if (CurrentObject->Header.SignalState !=
-                                (LONG)MINLONG)
-                            {
-                                /* Normal signal state, unwait it and return */
-                                KiSatisfyMutantWait(CurrentObject, Thread);
-                                WaitStatus = Thread->WaitStatus | Index;
-                                goto DontWait;
-                            }
-                            else
-                            {
-                                /* Raise an exception (see wasm.ru) */
-                                KiReleaseDispatcherLock(Thread->WaitIrql);
-                                ExRaiseStatus(STATUS_MUTANT_LIMIT_EXCEEDED);
-                            }
-                        }
+                        /* Normal signal state, unwait it and return */
+                        KiSatisfyMutantWait(CurrentObject, Thread);
+                        WaitStatus = Thread->WaitStatus | WaitIndex;
+                        goto DontWait;
                     }
-                    else if (CurrentObject->Header.SignalState > 0)
+                    else
                     {
-                        /* Another signaled object, unwait and return */
-                        KiSatisfyNonMutantWait(CurrentObject);
-                        WaitStatus = Index;
-                        goto DontWait;
+                        /* Raise an exception (see wasm.ru) */
+                        KiReleaseDispatcherLock(Thread->WaitIrql);
+                        ExRaiseStatus(STATUS_MUTANT_LIMIT_EXCEEDED);
                     }
-
-                    /* Go to the next block */
-                    Index++;
-                } while (Index < Count);
+                }
             }
-            else
+            else if (CurrentObject->Header.SignalState > 0)
             {
-                /* Loop blocks */
-                do
+                /* Another signaled object, unwait and return */
+                KiSatisfyNonMutantWait(CurrentObject, Thread);
+                WaitStatus = WaitIndex;
+                goto DontWait;
+            }
+        }
+        else
+        {
+            /* Check if we're dealing with a mutant again */
+            if (CurrentObject->Header.Type == MutantObject)
+            {
+                /* Check if it has an invalid count */
+                if ((Thread == CurrentObject->OwnerThread) &&
+                    (CurrentObject->Header.SignalState == MINLONG))
                 {
-                    /* Get the Current Object */
-                    CurrentObject = (PKMUTANT)Object[Index];
-                    ASSERT(CurrentObject->Header.Type != QueueObject);
-
-                    /* Check if we're dealing with a mutant again */
-                    if (CurrentObject->Header.Type == MutantObject)
-                    {
-                        /* Check if it has an invalid count */
-                        if ((Thread == CurrentObject->OwnerThread) &&
-                            (CurrentObject->Header.SignalState == MINLONG))
-                        {
-                            /* Raise an exception */
-                            KiReleaseDispatcherLock(Thread->WaitIrql);
-                            ExRaiseStatus(STATUS_MUTANT_LIMIT_EXCEEDED);
-                        }
-                        else if ((CurrentObject->Header.SignalState <= 0) &&
-                                 (Thread != CurrentObject->OwnerThread))
-                        {
-                            /* We don't own it, can't satisfy the wait */
-                            break;
-                        }
-                    }
-                    else if (CurrentObject->Header.SignalState <= 0)
-                    {
-                        /* Not signaled, can't satisfy */
-                        break;
-                    }
-
-                    /* Go to the next block */
-                    Index++;
-                } while (Index < Count);
-
-                /* Check if we've went through all the objects */
-                if (Index == Count)
+                    /* Raise an exception */
+                    KiReleaseDispatcherLock(Thread->WaitIrql);
+                    ExRaiseStatus(STATUS_MUTANT_LIMIT_EXCEEDED);
+                }
+                else if ((CurrentObject->Header.SignalState <= 0) &&
+                         (Thread != CurrentObject->OwnerThread))
                 {
-                    /* Loop wait blocks */
-                    WaitBlock = WaitBlockArray;
-                    do
-                    {
-                        /* Get the object and satisfy it */
-                        CurrentObject = (PKMUTANT)WaitBlock->Object;
-                        KiSatisfyObjectWait(CurrentObject, Thread);
-
-                        /* Go to the next block */
-                        WaitBlock = WaitBlock->NextWaitBlock;
-                    } while(WaitBlock != WaitBlockArray);
-
-                    /* Set the wait status and get out */
-                    WaitStatus = Thread->WaitStatus;
-                    goto DontWait;
+                    /* We don't own it, can't satisfy the wait */
+                    AllObjectsSignaled = FALSE;
                 }
             }
+            else if (CurrentObject->Header.SignalState <= 0)
+            {
+                /* Not signaled, can't satisfy */
+                AllObjectsSignaled = FALSE;
+            }
+        }
 
-            /* Make sure we can satisfy the Alertable request */
-            WaitStatus = KiCheckAlertability(Thread, Alertable, WaitMode);
-            if (WaitStatus != STATUS_WAIT_0) break;
+        /* Set up a Wait Block for this Object */
+        WaitBlock = &WaitBlockArray[WaitIndex];
+        WaitBlock->Object = CurrentObject;
+        WaitBlock->Thread = Thread;
+        WaitBlock->WaitKey = (USHORT)WaitIndex;
+        WaitBlock->WaitType = (UCHAR)WaitType;
+        WaitBlock->NextWaitBlock = &WaitBlockArray[WaitIndex + 1];
+    }
 
-            /* Enable the Timeout Timer if there was any specified */
-            if (Timeout)
-            {
-                /* Check if the timer expired */
-                InterruptTime.QuadPart = KeQueryInterruptTime();
-                if ((ULONGLONG)InterruptTime.QuadPart >=
-                    Timer->DueTime.QuadPart)
-                {
-                    /* It did, so we don't need to wait */
-                    WaitStatus = STATUS_TIMEOUT;
-                    goto DontWait;
-                }
+    /* Check if this is a Wait All and all the objects are signaled */
+    if ((WaitType == WaitAll) && (AllObjectsSignaled))
+    {
+        /* Return to the Root Wait Block */
+        WaitBlock->NextWaitBlock = &WaitBlockArray[0];
 
-                /* It didn't, so activate it */
-                Timer->Header.Inserted = TRUE;
+        /* Satisfy their Waits and return to the caller */
+        KiWaitSatisfyAll(WaitBlock);
+        WaitStatus = Thread->WaitStatus;
+        goto DontWait;
+    }
 
-                /* Link the wait blocks */
-                WaitBlock->NextWaitBlock = TimerBlock;
-            }
+    /* Make sure we can satisfy the Alertable request */
+    WaitStatus = KiCheckAlertability(Thread, Alertable, WaitMode);
+    if (WaitStatus != STATUS_WAIT_0)
+    {
+        /* Unlock the dispatcher and return */
+        KiReleaseDispatcherLock(Thread->WaitIrql);
+        return WaitStatus;
+    }
 
-            /* Insert into Object's Wait List*/
-            WaitBlock = WaitBlockArray;
-            do
-            {
-                /* Get the Current Object */
-                CurrentObject = WaitBlock->Object;
+    /* Enable the Timeout Timer if there was any specified */
+    if (Timeout)
+    {
+        /* Make sure the timeout interval isn't actually 0 */
+        if (!Timeout->QuadPart)
+        {
+            /* Return a timeout */
+            WaitStatus = STATUS_TIMEOUT;
+            goto DontWait;
+        }
 
-                /* Link the Object to this Wait Block */
-                InsertTailList(&CurrentObject->Header.WaitListHead,
-                               &WaitBlock->WaitListEntry);
+        /* Link timer wait block */
+        TimerWaitBlock = &Thread->WaitBlock[TIMER_WAIT_BLOCK];
+        WaitBlock->NextWaitBlock = TimerWaitBlock;
 
-                /* Move to the next Wait Block */
-                WaitBlock = WaitBlock->NextWaitBlock;
-            } while (WaitBlock != WaitBlockArray);
+        /* Use this the timer block for linking below */
+        WaitBlock = TimerWaitBlock;
 
-            /* Handle Kernel Queues */
-            if (Thread->Queue) KiActivateWaiterQueue(Thread->Queue);
+        /* Insert the Timer into the Timer Lists and enable it */
+        ThreadTimer = &Thread->Timer;
+        if (!KiInsertTimer(ThreadTimer, *Timeout))
+        {
+            /* Return a timeout if we couldn't insert the timer */
+            WaitStatus = STATUS_TIMEOUT;
+            goto DontWait;
+        }
 
-            /* Setup the wait information */
-            Thread->State = Waiting;
+        /* Set the current due time */
+        DueTime.QuadPart = ThreadTimer->DueTime.QuadPart;
+    }
 
-            /* Add the thread to the wait list */
-            KiAddThreadToWaitList(Thread, Swappable);
+    /* Link to the Root Wait Block */
+    WaitBlock->NextWaitBlock = &WaitBlockArray[0];
 
-            /* Activate thread swap */
-            ASSERT(Thread->WaitIrql <= DISPATCH_LEVEL);
-            KiSetThreadSwapBusy(Thread);
+    /* Insert into Object's Wait List*/
+    WaitBlock = &WaitBlockArray[0];
+    do
+    {
+        /* Get the Current Object */
+        CurrentObject = WaitBlock->Object;
 
-            /* Check if we have a timer */
-            if (Timeout)
-            {
-                /* Insert it */
-                KxInsertTimer(Timer, Hand);
-            }
-            else
-            {
-                /* Otherwise, unlock the dispatcher */
-                KiReleaseDispatcherLockFromDpcLevel();
-            }
+        /* Link the Object to this Wait Block */
+        InsertTailList(&CurrentObject->Header.WaitListHead,
+                       &WaitBlock->WaitListEntry);
 
-            /* Swap the thread */
-            WaitStatus = KiSwapThread(Thread, KeGetCurrentPrcb());
+        /* Move to the next Wait Block */
+        WaitBlock = WaitBlock->NextWaitBlock;
+    } while (WaitBlock != WaitBlockArray);
 
-            /* Check if we were executing an APC */
-            if (WaitStatus != STATUS_KERNEL_APC) return WaitStatus;
+    /* Handle Kernel Queues */
+    if (Thread->Queue) KiActivateWaiterQueue(Thread->Queue);
 
-            /* Check if we had a timeout */
-            if (Timeout)
-            {
-                /* Recalculate due times */
-                Timeout = KiRecalculateDueTime(OriginalDueTime,
-                                               &DueTime,
-                                               &NewDueTime);
-            }
+    /* Setup the wait information */
+    Thread->State = Waiting;
+
+    /* Add the thread to the wait list */
+    KiAddThreadToWaitList(Thread, Swappable);
+
+    /* Swap the thread */
+    ASSERT(Thread->WaitIrql <= DISPATCH_LEVEL);
+    KiSetThreadSwapBusy(Thread);
+    WaitStatus = KiSwapThread(Thread, KeGetCurrentPrcb());
+
+    /* Check if we were executing an APC */
+    if (WaitStatus == STATUS_KERNEL_APC)
+    {
+        /* Check if we had a timeout */
+        if (Timeout)
+        {
+            /* Recalculate due times */
+            Timeout = KiRecalculateDueTime(OriginalDueTime,
+                                           &DueTime,
+                                           &NewDueTime);
         }
 
-WaitStart:
-        /* Setup a new wait */
-        Thread->WaitIrql = KeRaiseIrqlToSynchLevel();
-        KxMultiThreadWait();
-        KiAcquireDispatcherLockAtDpcLevel();
+        /* Wait again */
+        goto StartWait;
     }
 
     /* We are done */
-    KiReleaseDispatcherLock(Thread->WaitIrql);
     return WaitStatus;
 
 DontWait:
-    /* Release dispatcher lock but maintain high IRQL */
-    KiReleaseDispatcherLockFromDpcLevel();
-
-    /* Adjust the Quantum and return the wait status */
+    /* Adjust the Quantum */
     KiAdjustQuantumThread(Thread);
+
+    /* Release & Return */
+    KiReleaseDispatcherLock(Thread->WaitIrql);
     return WaitStatus;
 }
 
index d142d0f..cf569dc 100644 (file)
@@ -1,29 +1,25 @@
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/close.c
- * PURPOSE:         Local Procedure Call: Rundown, Cleanup, Deletion
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
-/* PRIVATE FUNCTIONS *********************************************************/
+/* FUNCTIONS *****************************************************************/
 
 VOID
 NTAPI
 LpcExitThread(IN PETHREAD Thread)
 {
-    PLPCP_MESSAGE Message;
-    ASSERT(Thread == PsGetCurrentThread());
-
-    /* Acquire the lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
     /* Make sure that the Reply Chain is empty */
     if (!IsListEmpty(&Thread->LpcReplyChain))
     {
@@ -35,418 +31,104 @@ LpcExitThread(IN PETHREAD Thread)
     Thread->LpcExitThreadCalled = TRUE;
     Thread->LpcReplyMessageId = 0;
 
-    /* Check if there's a reply message */
-    Message = LpcpGetMessageFromThread(Thread);
-    if (Message)
-    {
-        /* FIXME: TODO */
-        KEBUGCHECK(0);
-    }
-
-    /* Release the lock */
-    KeReleaseGuardedMutex(&LpcpLock);
-}
-
-VOID
-NTAPI
-LpcpFreeToPortZone(IN PLPCP_MESSAGE Message,
-                   IN ULONG Flags)
-{
-    PLPCP_CONNECTION_MESSAGE ConnectMessage;
-    PLPCP_PORT_OBJECT ClientPort = NULL;
-    PETHREAD Thread = NULL;
-    BOOLEAN LockHeld = Flags & 1, ReleaseLock = Flags & 2;
-    PAGED_CODE();
-    LPCTRACE(LPC_CLOSE_DEBUG, "Message: %p. Flags: %lx\n", Message, Flags);
-
-    /* Acquire the lock if not already */
-    if (!LockHeld) KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Check if the queue list is empty */
-    if (!IsListEmpty(&Message->Entry))
-    {
-        /* Remove and re-initialize */
-        RemoveEntryList(&Message->Entry);
-        InitializeListHead(&Message->Entry);
-    }
-
-    /* Check if we've already replied */
-    if (Message->RepliedToThread)
-    {
-        /* Set thread to dereference and clean up */
-        Thread = Message->RepliedToThread;
-        Message->RepliedToThread = NULL;
-    }
-
-    /* Check if this is a connection request */
-    if (Message->Request.u2.s2.Type == LPC_CONNECTION_REQUEST)
-    {
-        /* Get the connection message */
-        ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
-
-        /* Clear the client port */
-        ClientPort = ConnectMessage->ClientPort;
-        if (ClientPort) ConnectMessage->ClientPort = NULL;
-    }
-
-    /* Release the lock */
-    KeReleaseGuardedMutex(&LpcpLock);
-
-    /* Check if we had anything to dereference */
-    if (Thread) ObDereferenceObject(Thread);
-    if (ClientPort) ObDereferenceObject(ClientPort);
-
-    /* Free the entry */
-    ExFreeToPagedLookasideList(&LpcpMessagesLookaside, Message);
-
-    /* Reacquire the lock if needed */
-    if ((LockHeld) && !(ReleaseLock)) KeAcquireGuardedMutex(&LpcpLock);
+    /* FIXME: Reply to the LpcReplyMessage */
 }
 
-VOID
-NTAPI
-LpcpDestroyPortQueue(IN PLPCP_PORT_OBJECT Port,
-                     IN BOOLEAN Destroy)
+/**********************************************************************
+ * NAME
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ */
+VOID STDCALL
+LpcpClosePort (IN PEPROCESS Process OPTIONAL,
+               IN PVOID ObjectBody,
+               IN ACCESS_MASK GrantedAccess,
+               IN ULONG HandleCount,
+               IN ULONG SystemHandleCount)
 {
-    PLIST_ENTRY ListHead, NextEntry;
-    PETHREAD Thread;
-    PLPCP_MESSAGE Message;
-    PLPCP_PORT_OBJECT ConnectionPort = NULL;
-    PLPCP_CONNECTION_MESSAGE ConnectMessage;
-    PAGED_CODE();
-    LPCTRACE(LPC_CLOSE_DEBUG, "Port: %p. Flags: %lx\n", Port, Port->Flags);
-
-    /* Hold the lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Check if we have a connected port */
-    if (((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_UNCONNECTED_PORT) &&
-        (Port->ConnectedPort))
-    {
-        /* Disconnect it */
-        Port->ConnectedPort->ConnectedPort = NULL;
-        ConnectionPort = Port->ConnectedPort->ConnectionPort;
-        if (ConnectionPort)
-        {
-            /* Clear connection port */
-            Port->ConnectedPort->ConnectionPort = NULL;
-        }
-    }
-
-    /* Check if this is a connection port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CONNECTION_PORT)
-    {
-        /* Delete the name */
-        Port->Flags |= LPCP_NAME_DELETED;
-    }
-
-    /* Walk all the threads waiting and signal them */
-    ListHead = &Port->LpcReplyChainHead;
-    NextEntry = ListHead->Flink;
-    while ((NextEntry) && (NextEntry != ListHead))
-    {
-        /* Get the Thread */
-        Thread = CONTAINING_RECORD(NextEntry, ETHREAD, LpcReplyChain);
-
-        /* Make sure we're not in exit */
-        if (Thread->LpcExitThreadCalled) break;
-
-        /* Move to the next entry */
-        NextEntry = NextEntry->Flink;
-
-        /* Remove and reinitialize the List */
-        RemoveEntryList(&Thread->LpcReplyChain);
-        InitializeListHead(&Thread->LpcReplyChain);
-
-        /* Check if someone is waiting */
-        if (!KeReadStateSemaphore(&Thread->LpcReplySemaphore))
-        {
-            /* Get the message */
-            Message = LpcpGetMessageFromThread(Thread);
-            if (Message)
-            {
-                /* Check if it's a connection request */
-                if (Message->Request.u2.s2.Type == LPC_CONNECTION_REQUEST)
-                {
-                    /* Get the connection message */
-                    ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
-
-                    /* Check if it had a section */
-                    if (ConnectMessage->SectionToMap)
-                    {
-                        /* Dereference it */
-                        ObDereferenceObject(ConnectMessage->SectionToMap);
-                    }
-                }
-
-                /* Clear the reply message */
-                Thread->LpcReplyMessage = NULL;
-
-                /* And remove the message from the port zone */
-                LpcpFreeToPortZone(Message, 1);
-                NextEntry = Port->LpcReplyChainHead.Flink;
-            }
-
-            /* Release the semaphore and reset message id count */
-            Thread->LpcReplyMessageId = 0;
-            KeReleaseSemaphore(&Thread->LpcReplySemaphore, 0, 1, FALSE);
-        }
-    }
-
-    /* Reinitialize the list head */
-    InitializeListHead(&Port->LpcReplyChainHead);
-
-    /* Loop queued messages */
-    while ((Port->MsgQueue.ReceiveHead.Flink) &&
-           !(IsListEmpty(&Port->MsgQueue.ReceiveHead)))
-    {
-        /* Get the message */
-        Message = CONTAINING_RECORD(Port->MsgQueue.ReceiveHead.Flink,
-                                    LPCP_MESSAGE,
-                                    Entry);
-
-        /* Free and reinitialize it's list head */
-        RemoveEntryList(&Message->Entry);
-        InitializeListHead(&Message->Entry);
-
-        /* Remove it from the port zone */
-        LpcpFreeToPortZone(Message, 1);
-    }
-
-    /* Release the lock */
-    KeReleaseGuardedMutex(&LpcpLock);
-
-    /* Dereference the connection port */
-    if (ConnectionPort) ObDereferenceObject(ConnectionPort);
-
-    /* Check if we have to free the port entirely */
-    if (Destroy)
-    {
-        /* Check if the semaphore exists */
-        if (Port->MsgQueue.Semaphore)
-        {
-            /* Use the semaphore to find the port queue and free it */
-            ExFreePool(CONTAINING_RECORD(Port->MsgQueue.Semaphore,
-                                         LPCP_NONPAGED_PORT_QUEUE,
-                                         Semaphore));
-        }
-    }
+  PEPORT Port = (PEPORT)ObjectBody;
+  PORT_MESSAGE Message;
+
+  /* FIXME Race conditions here! */
+
+  /*
+   * If the client has just closed its handle then tell the server what
+   * happened and disconnect this port.
+   */
+  if (!(HandleCount)&& (Port->State == EPORT_CONNECTED_CLIENT))
+    {
+      DPRINT("Informing server\n");
+      Message.u1.s1.TotalLength = sizeof(PORT_MESSAGE);
+      Message.u1.s1.DataLength = 0;
+      EiReplyOrRequestPort (Port->OtherPort,
+                           &Message,
+                           LPC_PORT_CLOSED,
+                           Port);
+      Port->OtherPort->OtherPort = NULL;
+      Port->OtherPort->State = EPORT_DISCONNECTED;
+      KeReleaseSemaphore( &Port->OtherPort->Semaphore,
+                         IO_NO_INCREMENT,
+                         1,
+                         FALSE );
+      ObDereferenceObject (Port);
+    }
+
+  /*
+   * If the server has closed all of its handles then disconnect the port,
+   * don't actually notify the client until it attempts an operation.
+   */
+  if (!(HandleCount)&& (Port->State == EPORT_CONNECTED_SERVER))
+    {
+        DPRINT("Cleaning up server\n");
+       Port->OtherPort->OtherPort = NULL;
+       Port->OtherPort->State = EPORT_DISCONNECTED;
+       ObDereferenceObject(Port->OtherPort);
+     }
 }
 
-VOID
-NTAPI
-LpcpClosePort(IN PEPROCESS Process OPTIONAL,
-              IN PVOID Object,
-              IN ACCESS_MASK GrantedAccess,
-              IN ULONG ProcessHandleCount,
-              IN ULONG SystemHandleCount)
-{
-    PLPCP_PORT_OBJECT Port = (PLPCP_PORT_OBJECT)Object;
-    LPCTRACE(LPC_CLOSE_DEBUG, "Port: %p. Flags: %lx\n", Port, Port->Flags);
-
-    /* Only Server-side Connection Ports need clean up*/
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CONNECTION_PORT)
-    {
-        /* Check the handle count */
-        switch (SystemHandleCount)
-        {
-            /* No handles left */
-            case 0:
-
-                /* Destroy the port queue */
-                LpcpDestroyPortQueue(Port, TRUE);
-                break;
-
-            /* Last handle remaining */
-            case 1:
-
-                /* Reset the queue only */
-                LpcpDestroyPortQueue(Port, FALSE);
-
-            /* More handles remain, do nothing */
-            default:
-                break;
-        }
-    }
-}
 
-VOID
-NTAPI
-LpcpFreePortClientSecurity(IN PLPCP_PORT_OBJECT Port)
+/**********************************************************************
+ * NAME
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ */
+VOID STDCALL
+LpcpDeletePort (PVOID  ObjectBody)
 {
-    /* Check if this is a client port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CLIENT_PORT)
-    {
-        /* Check if security is static */
-        if (!(Port->Flags & LPCP_SECURITY_DYNAMIC))
-        {
-            /* Check if we have a token */
-            if (Port->StaticSecurity.ClientToken)
-            {
-                /* Free security */
-                SeDeleteClientSecurity(&Port->StaticSecurity);
-            }
-        }
-    }
+   PLIST_ENTRY Entry;
+   PQUEUEDMESSAGE      Message;
+
+   PEPORT Port = (PEPORT)ObjectBody;
+
+   DPRINT("Deleting port %x\n", Port);
+
+   /* Free all waiting messages */
+   while (!IsListEmpty(&Port->QueueListHead))
+     {
+       Entry = RemoveHeadList(&Port->QueueListHead);
+       Message = CONTAINING_RECORD (Entry, QUEUEDMESSAGE, QueueListEntry);
+       ExFreePool(Message);
+     }
+
+   while (!IsListEmpty(&Port->ConnectQueueListHead))
+     {
+       Entry = RemoveHeadList(&Port->ConnectQueueListHead);
+       Message = CONTAINING_RECORD (Entry, QUEUEDMESSAGE, QueueListEntry);
+       ExFreePool(Message);
+     }
 }
 
-VOID
-NTAPI
-LpcpDeletePort(IN PVOID ObjectBody)
-{
-    LARGE_INTEGER Timeout;
-    PETHREAD Thread;
-    PLPCP_PORT_OBJECT Port = (PLPCP_PORT_OBJECT)ObjectBody;
-    PLPCP_PORT_OBJECT ConnectionPort;
-    PLPCP_MESSAGE Message;
-    PLIST_ENTRY ListHead, NextEntry;
-    HANDLE Pid;
-    CLIENT_DIED_MSG ClientDiedMsg;
-    Timeout.QuadPart = -1000000;
-    PAGED_CODE();
-    LPCTRACE(LPC_CLOSE_DEBUG, "Port: %p. Flags: %lx\n", Port, Port->Flags);
-
-    /* Check if this is a communication port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_COMMUNICATION_PORT)
-    {
-        /* Acquire the lock */
-        KeAcquireGuardedMutex(&LpcpLock);
-
-        /* Get the thread */
-        Thread = Port->ClientThread;
-        if (Thread)
-        {
-            /* Clear it */
-            Port->ClientThread = NULL;
-
-            /* Release the lock and dereference */
-            KeReleaseGuardedMutex(&LpcpLock);
-            ObDereferenceObject(Thread);
-        }
-        else
-        {
-            /* Release the lock */
-            KeReleaseGuardedMutex(&LpcpLock);
-        }
-    }
-
-    /* Check if this is a client-side port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CLIENT_PORT)
-    {
-        /* Setup the client died message */
-        ClientDiedMsg.h.u1.s1.TotalLength = sizeof(ClientDiedMsg);
-        ClientDiedMsg.h.u1.s1.DataLength = sizeof(ClientDiedMsg.CreateTime);
-        ClientDiedMsg.h.u2.ZeroInit = LPC_PORT_CLOSED;
-        ClientDiedMsg.CreateTime = PsGetCurrentProcess()->CreateTime;
-
-        /* Send it */
-        for (;;)
-        {
-            /* Send the message */
-            if (LpcRequestPort(Port,
-                               &ClientDiedMsg.h) != STATUS_NO_MEMORY) break;
-
-            /* Wait until trying again */
-            KeDelayExecutionThread(KernelMode, FALSE, &Timeout);
-        }
-    }
-
-    /* Destroy the port queue */
-    LpcpDestroyPortQueue(Port, TRUE);
-
-    /* Check if we had views */
-    if ((Port->ClientSectionBase) || (Port->ServerSectionBase))
-    {
-        /* Check if we had a client view */
-        if (Port->ClientSectionBase)
-        {
-            /* Unmap it */
-            MmUnmapViewOfSection(Port->MappingProcess,
-                                 Port->ClientSectionBase);
-        }
-
-        /* Check for a server view */
-        if (Port->ServerSectionBase)
-        {
-            /* Unmap it */
-            MmUnmapViewOfSection(Port->MappingProcess,
-                                 Port->ServerSectionBase);
-        }
-
-        /* Dereference the mapping process */
-        ObDereferenceObject(Port->MappingProcess);
-        Port->MappingProcess = NULL;
-    }
-
-    /* Acquire the lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Get the connection port */
-    ConnectionPort = Port->ConnectionPort;
-    if (ConnectionPort)
-    {
-        /* Get the PID */
-        Pid = PsGetCurrentProcessId();
-
-        /* Loop the data lists */
-        ListHead = &ConnectionPort->LpcDataInfoChainHead;
-        NextEntry = ListHead->Flink;
-        while (NextEntry != ListHead)
-        {
-            /* Get the message */
-            Message = CONTAINING_RECORD(NextEntry, LPCP_MESSAGE, Entry);
-            NextEntry = NextEntry->Flink;
-
-            /* Check if this is the connection port */
-            if (Port == ConnectionPort)
-            {
-                /* Free queued messages */
-                RemoveEntryList(&Message->Entry);
-                InitializeListHead(&Message->Entry);
-                LpcpFreeToPortZone(Message, 1);
-
-                /* Restart at the head */
-                NextEntry = ListHead->Flink;
-            }
-            else if ((Message->Request.ClientId.UniqueProcess == Pid) &&
-                     ((Message->SenderPort == Port) ||
-                      (Message->SenderPort == Port->ConnectedPort) ||
-                      (Message->SenderPort == ConnectionPort)))
-            {
-                /* Remove it */
-                RemoveEntryList(&Message->Entry);
-                InitializeListHead(&Message->Entry);
-                LpcpFreeToPortZone(Message, 1);
-
-                /* Restart at the head */
-                NextEntry = ListHead->Flink;
-            }
-        }
-
-        /* Release the lock */
-        KeReleaseGuardedMutex(&LpcpLock);
-
-        /* Dereference the object unless it's the same port */
-        if (ConnectionPort != Port) ObDereferenceObject(ConnectionPort);
-    }
-    else
-    {
-        /* Release the lock */
-        KeReleaseGuardedMutex(&LpcpLock);
-    }
-
-    /* Check if this is a connection port with a server process*/
-    if (((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CONNECTION_PORT) &&
-        (ConnectionPort->ServerProcess))
-    {
-        /* Dereference the server process */
-        ObDereferenceObject(ConnectionPort->ServerProcess);
-        ConnectionPort->ServerProcess = NULL;
-    }
-
-    /* Free client security */
-    LpcpFreePortClientSecurity(Port);
-    LPCTRACE(LPC_CLOSE_DEBUG, "Port: %p deleted\n", Port);
-}
 
 /* EOF */
index 6acbd2f..e14350d 100644 (file)
-/*
-* PROJECT:         ReactOS Kernel
-* LICENSE:         GPL - See COPYING in the top level directory
-* FILE:            ntoskrnl/lpc/complete.c
-* PURPOSE:         Local Procedure Call: Connection Completion
-* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
-*/
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/lpc/complete.c
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
+ */
 
 /* INCLUDES ******************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
-
-/* PRIVATE FUNCTIONS *********************************************************/
-
-VOID
-NTAPI
-LpcpPrepareToWakeClient(IN PETHREAD Thread)
-{
-    PAGED_CODE();
-
-    /* Make sure the thread isn't dying and it has a valid chain */
-    if (!(Thread->LpcExitThreadCalled) &&
-        !(IsListEmpty(&Thread->LpcReplyChain)))
-    {
-        /* Remove it from the list and reinitialize it */
-        RemoveEntryList(&Thread->LpcReplyChain);
-        InitializeListHead(&Thread->LpcReplyChain);
-    }
-}
-
-/* PUBLIC FUNCTIONS **********************************************************/
-
-/*
- * @implemented
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/***********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtCompleteConnectPort/1
+ *
+ * DESCRIPTION
+ *     Wake up the client thread that issued the NtConnectPort call
+ *     this server-side port was created for communicating with.
+ *     To be used in LPC servers processes on reply ports only.
+ *
+ * ARGUMENTS
+ *     hServerSideCommPort: a reply port handle returned by
+ *     NtAcceptConnectPort.
+ *
+ * RETURN VALUE
+ *     STATUS_SUCCESS or an error code from Ob.
  */
-NTSTATUS
-NTAPI
-NtAcceptConnectPort(OUT PHANDLE PortHandle,
-                    IN PVOID PortContext OPTIONAL,
-                    IN PPORT_MESSAGE ReplyMessage,
-                    IN BOOLEAN AcceptConnection,
-                    IN PPORT_VIEW ServerView,
-                    IN PREMOTE_PORT_VIEW ClientView)
+NTSTATUS STDCALL
+NtCompleteConnectPort (HANDLE hServerSideCommPort)
 {
-    PLPCP_PORT_OBJECT ConnectionPort, ServerPort, ClientPort;
-    PVOID ClientSectionToMap = NULL;
-    HANDLE Handle;
-    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
-    NTSTATUS Status;
-    ULONG ConnectionInfoLength;
-    PLPCP_MESSAGE Message;
-    PLPCP_CONNECTION_MESSAGE ConnectMessage;
-    PEPROCESS ClientProcess;
-    PETHREAD ClientThread;
-    LARGE_INTEGER SectionOffset;
-    PAGED_CODE();
-    LPCTRACE(LPC_COMPLETE_DEBUG,
-             "Context: %p. Message: %p. Accept: %lx. Views: %p/%p\n",
-             PortContext,
-             ReplyMessage,
-             AcceptConnection,
-             ClientView,
-             ServerView);
-
-    /* Validate the size of the server view */
-    if ((ServerView) && (ServerView->Length != sizeof(PORT_VIEW)))
-    {
-        /* Invalid size */
-        return STATUS_INVALID_PARAMETER;
-    }
-
-    /* Validate the size of the client view */
-    if ((ClientView) && (ClientView->Length != sizeof(REMOTE_PORT_VIEW)))
-    {
-        /* Invalid size */
-        return STATUS_INVALID_PARAMETER;
-    }
-
-    /* Get the client process and thread */
-    Status = PsLookupProcessThreadByCid(&ReplyMessage->ClientId,
-                                        &ClientProcess,
-                                        &ClientThread);
-    if (!NT_SUCCESS(Status)) return Status;
-
-    /* Acquire the LPC Lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Make sure that the client wants a reply, and this is the right one */
-    if (!(LpcpGetMessageFromThread(ClientThread)) ||
-        !(ReplyMessage->MessageId) ||
-        (ClientThread->LpcReplyMessageId != ReplyMessage->MessageId))
-    {
-        /* Not the reply asked for, or no reply wanted, fail */
-        KeReleaseGuardedMutex(&LpcpLock);
-        ObDereferenceObject(ClientProcess);
-        ObDereferenceObject(ClientThread);
-        return STATUS_REPLY_MESSAGE_MISMATCH;
-    }
-
-    /* Now get the message and connection message */
-    Message = LpcpGetMessageFromThread(ClientThread);
-    ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
-
-    /* Get the client and connection port as well */
-    ClientPort = ConnectMessage->ClientPort;
-    ConnectionPort = ClientPort->ConnectionPort;
-
-    /* Make sure that the reply is being sent to the proper server process */
-    if (ConnectionPort->ServerProcess != PsGetCurrentProcess())
+  NTSTATUS     Status;
+  PEPORT       ReplyPort;
+
+  DPRINT("NtCompleteConnectPort(hServerSideCommPort %x)\n", hServerSideCommPort);
+
+  /*
+   * Ask Ob to translate the port handle to EPORT
+   */
+  Status = ObReferenceObjectByHandle (hServerSideCommPort,
+                                     PORT_ALL_ACCESS,
+                                     LpcPortObjectType,
+                                     UserMode,
+                                     (PVOID*)&ReplyPort,
+                                     NULL);
+  if (!NT_SUCCESS(Status))
     {
-        /* It's not, so fail */
-        KeReleaseGuardedMutex(&LpcpLock);
-        ObDereferenceObject(ClientProcess);
-        ObDereferenceObject(ClientThread);
-        return STATUS_REPLY_MESSAGE_MISMATCH;
+      return (Status);
     }
-
-    /* At this point, don't let other accept attempts happen */
-    ClientThread->LpcReplyMessage = NULL;
-    ClientThread->LpcReplyMessageId = 0;
-
-    /* Clear the client port for now as well, then release the lock */
-    ConnectMessage->ClientPort = NULL;
-    KeReleaseGuardedMutex(&LpcpLock);
-
-    /* Get the connection information length */
-    ConnectionInfoLength = ReplyMessage->u1.s1.DataLength;
-    if (ConnectionInfoLength > ConnectionPort->MaxConnectionInfoLength)
+  /*
+   * Verify EPORT type is a server-side reply port;
+   * otherwise tell the caller the port handle is not
+   * valid.
+   */
+  if (ReplyPort->Type != EPORT_TYPE_SERVER_COMM_PORT)
     {
-        /* Normalize it since it's too large */
-        ConnectionInfoLength = ConnectionPort->MaxConnectionInfoLength;
+       ObDereferenceObject (ReplyPort);
+       return STATUS_INVALID_PORT_HANDLE;
     }
 
-    /* Set the sizes of our reply message */
-    Message->Request.u1.s1.DataLength = sizeof(LPCP_CONNECTION_MESSAGE) +
-                                    ConnectionInfoLength;
-    Message->Request.u1.s1.TotalLength = sizeof(LPCP_MESSAGE) +
-                                     Message->Request.u1.s1.DataLength;
-
-    /* Setup the reply message */
-    Message->Request.u2.s2.Type = LPC_REPLY;
-    Message->Request.u2.s2.DataInfoOffset = 0;
-    Message->Request.ClientId = ReplyMessage->ClientId;
-    Message->Request.MessageId = ReplyMessage->MessageId;
-    Message->Request.ClientViewSize = 0;
-    RtlCopyMemory(ConnectMessage + 1, ReplyMessage + 1, ConnectionInfoLength);
-
-    /* At this point, if the caller refused the connection, go to cleanup */
-    if (!AcceptConnection) goto Cleanup;
-
-    /* Otherwise, create the actual port */
-    Status = ObCreateObject(PreviousMode,
-                            LpcPortObjectType,
-                            NULL,
-                            PreviousMode,
-                            NULL,
-                            sizeof(LPCP_PORT_OBJECT),
-                            0,
-                            0,
-                            (PVOID*)&ServerPort);
-    if (!NT_SUCCESS(Status)) goto Cleanup;
-
-    /* Set it up */
-    RtlZeroMemory(ServerPort, sizeof(LPCP_PORT_OBJECT));
-    ServerPort->PortContext = PortContext;
-    ServerPort->Flags = LPCP_COMMUNICATION_PORT;
-    ServerPort->MaxMessageLength = ConnectionPort->MaxMessageLength;
-    InitializeListHead(&ServerPort->LpcReplyChainHead);
-    InitializeListHead(&ServerPort->LpcDataInfoChainHead);
-
-    /* Reference the connection port until we're fully setup */
-    ObReferenceObject(ConnectionPort);
-
-    /* Link the ports together */
-    ServerPort->ConnectionPort = ConnectionPort;
-    ServerPort->ConnectedPort = ClientPort;
-    ClientPort->ConnectedPort = ServerPort;
-
-    /* Also set the creator CID */
-    ServerPort->Creator = PsGetCurrentThread()->Cid;
-    ClientPort->Creator = Message->Request.ClientId;
-
-    /* Get the section associated and then clear it, while inside the lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-    ClientSectionToMap = ConnectMessage->SectionToMap;
-    ConnectMessage->SectionToMap = NULL;
-    KeReleaseGuardedMutex(&LpcpLock);
-
-    /* Now check if there's a client section */
-    if (ClientSectionToMap)
-    {
-        /* Setup the offset */
-        SectionOffset.QuadPart = ConnectMessage->ClientView.SectionOffset;
-
-        /* Map the section */
-        Status = MmMapViewOfSection(ClientSectionToMap,
-                                    PsGetCurrentProcess(),
-                                    &ServerPort->ClientSectionBase,
-                                    0,
-                                    0,
-                                    &SectionOffset,
-                                    &ConnectMessage->ClientView.ViewSize,
-                                    ViewUnmap,
-                                    0,
-                                    PAGE_READWRITE);
-
-        /* Update the offset and check for mapping status */
-        ConnectMessage->ClientView.SectionOffset = SectionOffset.LowPart;
-        if (NT_SUCCESS(Status))
-        {
-            /* Set the view base */
-            ConnectMessage->ClientView.ViewRemoteBase = ServerPort->
-                                                        ClientSectionBase;
-
-            /* Save and reference the mapping process */
-            ServerPort->MappingProcess = PsGetCurrentProcess();
-            ObReferenceObject(ServerPort->MappingProcess);
-        }
-        else
-        {
-            /* Otherwise, quit */
-            ObDereferenceObject(ServerPort);
-            goto Cleanup;
-        }
-    }
-
-    /* Check if there's a server section */
-    if (ServerView)
-    {
-        /* FIXME: TODO */
-        ASSERT(FALSE);
-    }
-
-    /* Reference the server port until it's fully inserted */
-    ObReferenceObject(ServerPort);
-
-    /* Insert the server port in the namespace */
-    Status = ObInsertObject(ServerPort,
-                            NULL,
-                            PORT_ALL_ACCESS,
-                            0,
-                            NULL,
-                            &Handle);
-    if (!NT_SUCCESS(Status))
-    {
-        /* We failed, remove the extra reference and cleanup */
-        ObDereferenceObject(ServerPort);
-        goto Cleanup;
-    }
-
-    /* Check if the caller gave a client view */
-    if (ClientView)
-    {
-        /* Fill it out */
-        ClientView->ViewBase = ConnectMessage->ClientView.ViewRemoteBase;
-        ClientView->ViewSize = ConnectMessage->ClientView.ViewSize;
-    }
-
-    /* Return the handle to user mode */
-    *PortHandle = Handle;
-    LPCTRACE(LPC_COMPLETE_DEBUG,
-             "Handle: %lx. Messages: %p/%p. Ports: %p/%p/%p\n",
-             Handle,
-             Message,
-             ConnectMessage,
-             ServerPort,
-             ClientPort,
-             ConnectionPort);
-
-    /* If there was no port context, use the handle by default */
-    if (!PortContext) ServerPort->PortContext = Handle;
-    ServerPort->ClientThread = ClientThread;
-
-    /* Set this message as the LPC Reply message while holding the lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-    ClientThread->LpcReplyMessage = Message;
-    KeReleaseGuardedMutex(&LpcpLock);
-
-    /* Clear the thread pointer so it doesn't get cleaned later */
-    ClientThread = NULL;
-
-    /* Remove the extra reference we had added */
-    ObDereferenceObject(ServerPort);
-
-Cleanup:
-    /* If there was a section, dereference it */
-    if (ClientSectionToMap) ObDereferenceObject(ClientSectionToMap);
-
-    /* Check if we got here while still having a client thread */
-    if (ClientThread)
-    {
-        /* FIXME: Complex cleanup code */
-        ASSERT(FALSE);
-    }
-
-    /* Dereference the client port if we have one, and the process */
-    LPCTRACE(LPC_COMPLETE_DEBUG,
-             "Status: %lx. Thread: %p. Process: [%.16s]\n",
-             Status,
-             ClientThread,
-             ClientProcess->ImageFileName);
-    if (ClientPort) ObDereferenceObject(ClientPort);
-    ObDereferenceObject(ClientProcess);
-    return Status;
+  ReplyPort->State = EPORT_CONNECTED_SERVER;
+  /*
+   * Wake up the client thread that issued NtConnectPort.
+   */
+  KeReleaseSemaphore(&ReplyPort->OtherPort->Semaphore, IO_NO_INCREMENT, 1,
+                    FALSE);
+  /*
+   * Tell Ob we are no more interested in ReplyPort
+   */
+  ObDereferenceObject (ReplyPort);
+
+  return (STATUS_SUCCESS);
 }
 
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-NtCompleteConnectPort(IN HANDLE PortHandle)
-{
-    NTSTATUS Status;
-    PLPCP_PORT_OBJECT Port;
-    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
-    PETHREAD Thread;
-    PAGED_CODE();
-    LPCTRACE(LPC_COMPLETE_DEBUG, "Handle: %lx\n", PortHandle);
-
-    /* Get the Port Object */
-    Status = ObReferenceObjectByHandle(PortHandle,
-                                       PORT_ALL_ACCESS,
-                                       LpcPortObjectType,
-                                       PreviousMode,
-                                       (PVOID*)&Port,
-                                       NULL);
-    if (!NT_SUCCESS(Status)) return Status;
-
-    /* Make sure this is a connection port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_COMMUNICATION_PORT)
-    {
-        /* It isn't, fail */
-        ObDereferenceObject(Port);
-        return STATUS_INVALID_PORT_HANDLE;
-    }
-
-    /* Acquire the lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Make sure we have a client thread */
-    if (!Port->ClientThread)
-    {
-        /* We don't, fail */
-        KeReleaseGuardedMutex(&LpcpLock);
-        ObDereferenceObject(Port);
-        return STATUS_INVALID_PARAMETER;
-    }
-
-    /* Get the thread */
-    Thread = Port->ClientThread;
-
-    /* Make sure it has a reply message */
-    if (!LpcpGetMessageFromThread(Thread))
-    {
-        /* It doesn't, quit */
-        KeReleaseGuardedMutex(&LpcpLock);
-        ObDereferenceObject(Port);
-        return STATUS_SUCCESS;
-    }
-
-    /* Clear the client thread and wake it up */
-    Port->ClientThread = NULL;
-    LpcpPrepareToWakeClient(Thread);
-
-    /* Release the lock and wait for an answer */
-    KeReleaseGuardedMutex(&LpcpLock);
-    LpcpCompleteWait(&Thread->LpcReplySemaphore);
-
-    /* Dereference the Thread and Port  and return */
-    ObDereferenceObject(Port);
-    ObDereferenceObject(Thread);
-    LPCTRACE(LPC_COMPLETE_DEBUG, "Port: %p. Thread: %p\n", Port, Thread);
-    return Status;
-}
 
 /* EOF */
index 6031ece..6aa3690 100644 (file)
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/connect.c
- * PURPOSE:         Local Procedure Call: Connection Management
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
-
-/* PRIVATE FUNCTIONS *********************************************************/
-
-PVOID
-NTAPI
-LpcpFreeConMsg(IN OUT PLPCP_MESSAGE *Message,
-               IN OUT PLPCP_CONNECTION_MESSAGE *ConnectMessage,
-               IN PETHREAD CurrentThread)
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     EiConnectPort/12
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ */
+NTSTATUS STDCALL
+EiConnectPort(IN PEPORT* ConnectedPort,
+             IN PEPORT NamedPort,
+             IN PVOID Section,
+             IN LARGE_INTEGER SectionOffset,
+             IN ULONG ViewSize,
+             OUT PVOID* ClientSendViewBase,
+             OUT PVOID* ServerSendViewBase,
+             OUT PULONG ReceiveViewSize,
+             OUT PVOID* ReceiveViewBase,
+             OUT PULONG MaximumMessageSize,
+             IN OUT PVOID ConnectData,
+             IN OUT PULONG ConnectDataLength)
 {
-    PVOID SectionToMap;
-    PLPCP_MESSAGE ReplyMessage;
-
-    /* Acquire the LPC lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Check if the reply chain is not empty */
-    if (!IsListEmpty(&CurrentThread->LpcReplyChain))
+  PEPORT_CONNECT_REQUEST_MESSAGE RequestMessage;
+  ULONG RequestConnectDataLength;
+  PEPORT OurPort;
+  PQUEUEDMESSAGE Reply;
+  PEPORT_CONNECT_REPLY_MESSAGE CReply;
+  NTSTATUS Status;
+  KIRQL oldIrql;
+
+  if (ConnectDataLength == NULL)
     {
-        /* Remove this entry and re-initialize it */
-        RemoveEntryList(&CurrentThread->LpcReplyChain);
-        InitializeListHead(&CurrentThread->LpcReplyChain);
+      RequestConnectDataLength = 0;
+    }
+  else
+    {
+      RequestConnectDataLength = *ConnectDataLength;
     }
 
-    /* Check if there's a reply message */
-    ReplyMessage = LpcpGetMessageFromThread(CurrentThread);
-    if (ReplyMessage)
+  /*
+   * Create a port to represent our side of the connection
+   */
+  Status = ObCreateObject (KernelMode,
+                          LpcPortObjectType,
+                          NULL,
+                          KernelMode,
+                          NULL,
+                          sizeof(EPORT),
+                          0,
+                          0,
+                          (PVOID*)&OurPort);
+  if (!NT_SUCCESS(Status))
     {
-        /* Get the message */
-        *Message = ReplyMessage;
+      return (Status);
+    }
+  LpcpInitializePort(OurPort, EPORT_TYPE_CLIENT_COMM_PORT, NamedPort);
+
+  /*
+   * Allocate a request message.
+   */
+  RequestMessage = ExAllocatePool(NonPagedPool,
+                                 sizeof(EPORT_CONNECT_REQUEST_MESSAGE) +
+                                 RequestConnectDataLength);
+  if (RequestMessage == NULL)
+    {
+      ObDereferenceObject(OurPort);
+      return(STATUS_NO_MEMORY);
+    }
 
-        /* Check if it's got messages */
-        if (!IsListEmpty(&ReplyMessage->Entry))
-        {
-            /* Clear the list */
-            RemoveEntryList(&ReplyMessage->Entry);
-            InitializeListHead(&ReplyMessage->Entry);
-        }
+  /*
+   * Initialize the request message.
+   */
+  RequestMessage->MessageHeader.u1.s1.DataLength =
+    sizeof(EPORT_CONNECT_REQUEST_MESSAGE) + RequestConnectDataLength -
+    sizeof(PORT_MESSAGE);
+  RequestMessage->MessageHeader.u1.s1.TotalLength =
+    sizeof(EPORT_CONNECT_REQUEST_MESSAGE) + RequestConnectDataLength;
+  DPRINT("RequestMessageSize %d\n",
+        RequestMessage->MessageHeader.u1.s1.TotalLength);
+  RequestMessage->MessageHeader.ClientViewSize = 0;
+  RequestMessage->ConnectingProcess = PsGetCurrentProcess();
+  ObReferenceObjectByPointer(RequestMessage->ConnectingProcess,
+                            PROCESS_VM_OPERATION,
+                            NULL,
+                            KernelMode);
+  RequestMessage->SendSectionObject = (struct _SECTION_OBJECT*)Section;
+  RequestMessage->SendSectionOffset = SectionOffset;
+  RequestMessage->SendViewSize = ViewSize;
+  RequestMessage->ConnectDataLength = RequestConnectDataLength;
+  if (RequestConnectDataLength > 0)
+    {
+      memcpy(RequestMessage->ConnectData, ConnectData,
+            RequestConnectDataLength);
+    }
 
-        /* Clear message data */
-        CurrentThread->LpcReceivedMessageId = 0;
-        CurrentThread->LpcReplyMessage = NULL;
+  /*
+   * Queue the message to the named port
+   */
+  EiReplyOrRequestPort(NamedPort,
+                      &RequestMessage->MessageHeader,
+                      LPC_CONNECTION_REQUEST,
+                      OurPort);
+  KeReleaseSemaphore(&NamedPort->Semaphore, IO_NO_INCREMENT, 1, FALSE);
+  ExFreePool(RequestMessage);
+
+  /*
+   * Wait for them to accept our connection
+   */
+  KeWaitForSingleObject(&OurPort->Semaphore,
+                       UserRequest,
+                       UserMode,
+                       FALSE,
+                       NULL);
+
+  /*
+   * Dequeue the response
+   */
+  KeAcquireSpinLock (&OurPort->Lock, &oldIrql);
+  Reply = EiDequeueMessagePort (OurPort);
+  KeReleaseSpinLock (&OurPort->Lock, oldIrql);
+  CReply = (PEPORT_CONNECT_REPLY_MESSAGE)&Reply->Message;
+
+  /*
+   * Do some initial cleanup.
+   */
+  ObDereferenceObject(PsGetCurrentProcess());
+
+  /*
+   * Check for connection refusal.
+   */
+  if (CReply->MessageHeader.u2.s2.Type == LPC_CONNECTION_REFUSED)
+    {
+      ObDereferenceObject(OurPort);
+      ExFreePool(Reply);
+      /*
+       * FIXME: Check what NT does here. Giving the user data back on
+       * connect failure sounds reasonable; it probably wouldn't break
+       * anything anyway.
+       */
+      if (ConnectDataLength != NULL)
+       {
+         *ConnectDataLength = CReply->ConnectDataLength;
+         memcpy(ConnectData, CReply->ConnectData, CReply->ConnectDataLength);
+       }
+      return(STATUS_PORT_CONNECTION_REFUSED);
+    }
 
-        /* Get the connection message and clear the section */
-        *ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(ReplyMessage + 1);
-        SectionToMap = (*ConnectMessage)->SectionToMap;
-        (*ConnectMessage)->SectionToMap = NULL;
+  /*
+   * Otherwise we are connected. Copy data back to the client.
+   */
+  *ServerSendViewBase = CReply->SendServerViewBase;
+  *ReceiveViewSize = CReply->ReceiveClientViewSize;
+  *ReceiveViewBase = CReply->ReceiveClientViewBase;
+  *MaximumMessageSize = CReply->MaximumMessageSize;
+  if (ConnectDataLength != NULL)
+    {
+      *ConnectDataLength = CReply->ConnectDataLength;
+      memcpy(ConnectData, CReply->ConnectData, CReply->ConnectDataLength);
     }
-    else
+
+  /*
+   * Create our view of the send section object.
+   */
+  if (Section != NULL)
     {
-        /* No message to return */
-        *Message = NULL;
-        SectionToMap = NULL;
+      *ClientSendViewBase = 0;
+      Status = MmMapViewOfSection(Section,
+                                 PsGetCurrentProcess(),
+                                 ClientSendViewBase,
+                                 0,
+                                 ViewSize,
+                                 &SectionOffset,
+                                 &ViewSize,
+                                 ViewUnmap,
+                                 0 /* MEM_TOP_DOWN? */,
+                                 PAGE_READWRITE);
+      if (!NT_SUCCESS(Status))
+       {
+         /* FIXME: Cleanup here. */
+         return(Status);
+       }
     }
 
-    /* Release the lock and return the section */
-    KeReleaseGuardedMutex(&LpcpLock);
-    return SectionToMap;
+  /*
+   * Do the final initialization of our port.
+   */
+  OurPort->State = EPORT_CONNECTED_CLIENT;
+
+  /*
+   * Cleanup.
+   */
+  ExFreePool(Reply);
+  *ConnectedPort = OurPort;
+  return(STATUS_SUCCESS);
 }
 
-/* PUBLIC FUNCTIONS **********************************************************/
-
-/*
- * @implemented
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtConnectPort/8
+ *
+ * DESCRIPTION
+ *     Connect to a named port and wait for the other side to
+ *     accept or reject the connection request.
+ *
+ * ARGUMENTS
+ *     ConnectedPort
+ *     PortName
+ *     Qos
+ *     WriteMap
+ *     ReadMap
+ *     MaxMessageSize
+ *     ConnectInfo
+ *     UserConnectInfoLength
+ *
+ * RETURN VALUE
+ *
+ * @unimplemented
  */
-NTSTATUS
-NTAPI
-NtSecureConnectPort(OUT PHANDLE PortHandle,
-                    IN PUNICODE_STRING PortName,
-                    IN PSECURITY_QUALITY_OF_SERVICE Qos,
-                    IN OUT PPORT_VIEW ClientView OPTIONAL,
-                    IN PSID ServerSid OPTIONAL,
-                    IN OUT PREMOTE_PORT_VIEW ServerView OPTIONAL,
-                    OUT PULONG MaxMessageLength OPTIONAL,
-                    IN OUT PVOID ConnectionInformation OPTIONAL,
-                    IN OUT PULONG ConnectionInformationLength OPTIONAL)
+NTSTATUS STDCALL
+NtConnectPort (PHANDLE                         UnsafeConnectedPortHandle,
+              PUNICODE_STRING                  PortName,
+              PSECURITY_QUALITY_OF_SERVICE     Qos,
+              PPORT_VIEW               UnsafeWriteMap,
+              PREMOTE_PORT_VIEW                UnsafeReadMap,
+              PULONG                           UnsafeMaximumMessageSize,
+              PVOID                            UnsafeConnectData,
+              PULONG                           UnsafeConnectDataLength)
 {
-    ULONG ConnectionInfoLength = 0;
-    PLPCP_PORT_OBJECT Port, ClientPort;
-    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
-    NTSTATUS Status = STATUS_SUCCESS;
-    HANDLE Handle;
-    PVOID SectionToMap;
-    PLPCP_MESSAGE Message;
-    PLPCP_CONNECTION_MESSAGE ConnectMessage;
-    PETHREAD Thread = PsGetCurrentThread();
-    ULONG PortMessageLength;
-    LARGE_INTEGER SectionOffset;
-    PTOKEN Token;
-    PTOKEN_USER TokenUserInfo;
-    PAGED_CODE();
-    LPCTRACE(LPC_CONNECT_DEBUG,
-             "Name: %wZ. Qos: %p. Views: %p/%p. Sid: %p\n",
-             PortName,
-             Qos,
-             ClientView,
-             ServerView,
-             ServerSid);
-
-    /* Validate client view */
-    if ((ClientView) && (ClientView->Length != sizeof(PORT_VIEW)))
-    {
-        /* Fail */
-        return STATUS_INVALID_PARAMETER;
-    }
-
-    /* Validate server view */
-    if ((ServerView) && (ServerView->Length != sizeof(REMOTE_PORT_VIEW)))
-    {
-        /* Fail */
-        return STATUS_INVALID_PARAMETER;
-    }
-
-    /* Check if caller sent connection information length */
-    if (ConnectionInformationLength)
-    {
-        /* Retrieve the input length */
-        ConnectionInfoLength = *ConnectionInformationLength;
-    }
-
-    /* Get the port */
-    Status = ObReferenceObjectByName(PortName,
-                                     0,
-                                     NULL,
-                                     PORT_CONNECT,
-                                     LpcPortObjectType,
-                                     PreviousMode,
-                                     NULL,
-                                     (PVOID *)&Port);
-    if (!NT_SUCCESS(Status)) return Status;
-
-    /* This has to be a connection port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_CONNECTION_PORT)
-    {
-        /* It isn't, so fail */
-        ObDereferenceObject(Port);
-        return STATUS_INVALID_PORT_HANDLE;
-    }
-
-    /* Check if we have a SID */
-    if (ServerSid)
-    {
-        /* Make sure that we have a server */
-        if (Port->ServerProcess)
+  HANDLE ConnectedPortHandle;
+  PORT_VIEW WriteMap;
+  REMOTE_PORT_VIEW ReadMap;
+  ULONG MaximumMessageSize;
+  PVOID ConnectData = NULL;
+  ULONG ConnectDataLength = 0;
+  PVOID SectionObject;
+  LARGE_INTEGER SectionOffset;
+  PEPORT ConnectedPort;
+  KPROCESSOR_MODE PreviousMode;
+  NTSTATUS Status = STATUS_SUCCESS;
+  PEPORT NamedPort;
+  
+  PreviousMode = ExGetPreviousMode();
+  
+  if (PreviousMode != KernelMode)
+    {
+      _SEH_TRY
         {
-            /* Get its token and query user information */
-            Token = PsReferencePrimaryToken(Port->ServerProcess);
-            //Status = SeQueryInformationToken(Token, TokenUser, (PVOID*)&TokenUserInfo);
-            // FIXME: Need SeQueryInformationToken
-            Status = STATUS_SUCCESS;
-            TokenUserInfo = ExAllocatePool(PagedPool, sizeof(TOKEN_USER));
-            TokenUserInfo->User.Sid = ServerSid;
-            PsDereferencePrimaryToken(Token);
-
-            /* Check for success */
-            if (NT_SUCCESS(Status))
+          ProbeForWriteHandle(UnsafeConnectedPortHandle);
+          if (UnsafeMaximumMessageSize != NULL)
             {
-                /* Compare the SIDs */
-                if (!RtlEqualSid(ServerSid, TokenUserInfo->User.Sid))
-                {
-                    /* Fail */
-                    Status = STATUS_SERVER_SID_MISMATCH;
-                }
-
-                /* Free token information */
-                ExFreePool(TokenUserInfo);
+              ProbeForWriteUlong(UnsafeMaximumMessageSize);
             }
         }
-        else
+      _SEH_HANDLE
         {
-            /* Invalid SID */
-            Status = STATUS_SERVER_SID_MISMATCH;
+          Status = _SEH_GetExceptionCode();
         }
-
-        /* Check if SID failed */
-        if (!NT_SUCCESS(Status))
+      _SEH_END;
+      
+      if (!NT_SUCCESS(Status))
         {
-            /* Quit */
-            ObDereferenceObject(Port);
-            return Status;
+          return Status;
         }
     }
 
-    /* Create the client port */
-    Status = ObCreateObject(PreviousMode,
-                            LpcPortObjectType,
-                            NULL,
-                            PreviousMode,
-                            NULL,
-                            sizeof(LPCP_PORT_OBJECT),
-                            0,
-                            0,
-                            (PVOID *)&ClientPort);
-    if (!NT_SUCCESS(Status))
-    {
-        /* Failed, dereference the server port and return */
-        ObDereferenceObject(Port);
-        return Status;
-    }
-
-    /* Setup the client port */
-    RtlZeroMemory(ClientPort, sizeof(LPCP_PORT_OBJECT));
-    ClientPort->Flags = LPCP_CLIENT_PORT;
-    ClientPort->ConnectionPort = Port;
-    ClientPort->MaxMessageLength = Port->MaxMessageLength;
-    ClientPort->SecurityQos = *Qos;
-    InitializeListHead(&ClientPort->LpcReplyChainHead);
-    InitializeListHead(&ClientPort->LpcDataInfoChainHead);
-
-    /* Check if we have dynamic security */
-    if (Qos->ContextTrackingMode == SECURITY_DYNAMIC_TRACKING)
-    {
-        /* Remember that */
-        ClientPort->Flags |= LPCP_SECURITY_DYNAMIC;
-    }
-    else
-    {
-        /* Create our own client security */
-        Status = SeCreateClientSecurity(Thread,
-                                        Qos,
-                                        FALSE,
-                                        &ClientPort->StaticSecurity);
-        if (!NT_SUCCESS(Status))
+  /*
+   * Copy in write map and partially validate.
+   */
+  if (UnsafeWriteMap != NULL)
+    {
+      if (PreviousMode != KernelMode)
         {
-            /* Security failed, dereference and return */
-            ObDereferenceObject(ClientPort);
-            return Status;
+          _SEH_TRY
+            {
+              ProbeForWrite(UnsafeWriteMap,
+                            sizeof(PORT_VIEW),
+                            1);
+              RtlCopyMemory(&WriteMap,
+                            UnsafeWriteMap,
+                            sizeof(PORT_VIEW));
+            }
+          _SEH_HANDLE
+            {
+              Status = _SEH_GetExceptionCode();
+            }
+          _SEH_END;
+
+          if (!NT_SUCCESS(Status))
+            {
+              return Status;
+            }
+        }
+      else
+        {
+          RtlCopyMemory(&WriteMap,
+                        UnsafeWriteMap,
+                        sizeof(PORT_VIEW));
         }
-    }
 
-    /* Initialize the port queue */
-    Status = LpcpInitializePortQueue(ClientPort);
-    if (!NT_SUCCESS(Status))
+      if (WriteMap.Length != sizeof(PORT_VIEW))
+       {
+         return(STATUS_INVALID_PARAMETER_4);
+       }
+      SectionOffset.QuadPart = WriteMap.SectionOffset;
+    }
+  else
     {
-        /* Failed */
-        ObDereferenceObject(ClientPort);
-        return Status;
+      WriteMap.SectionHandle = INVALID_HANDLE_VALUE;
     }
 
-    /* Check if we have a client view */
-    if (ClientView)
+  /*
+   * Handle connection data.
+   */
+  if (UnsafeConnectData)
     {
-        /* Get the section handle */
-        Status = ObReferenceObjectByHandle(ClientView->SectionHandle,
-                                           SECTION_MAP_READ |
-                                           SECTION_MAP_WRITE,
-                                           MmSectionObjectType,
-                                           PreviousMode,
-                                           (PVOID*)&SectionToMap,
-                                           NULL);
-        if (!NT_SUCCESS(Status))
+      if (PreviousMode != KernelMode)
         {
-            /* Fail */
-            ObDereferenceObject(Port);
-            return Status;
-        }
-
-        /* Set the section offset */
-        SectionOffset.QuadPart = ClientView->SectionOffset;
-
-        /* Map it */
-        Status = MmMapViewOfSection(SectionToMap,
-                                    PsGetCurrentProcess(),
-                                    &Port->ClientSectionBase,
-                                    0,
-                                    0,
-                                    &SectionOffset,
-                                    &ClientView->ViewSize,
-                                    ViewUnmap,
-                                    0,
-                                    PAGE_READWRITE);
-
-        /* Update the offset */
-        ClientView->SectionOffset = SectionOffset.LowPart;
+          _SEH_TRY
+            {
+              ConnectDataLength = ProbeForReadUlong(UnsafeConnectDataLength);
+            }
+          _SEH_HANDLE
+            {
+              Status = _SEH_GetExceptionCode();
+            }
+          _SEH_END;
 
-        /* Check for failure */
-        if (!NT_SUCCESS(Status))
+          if (!NT_SUCCESS(Status))
+            {
+              return Status;
+            }
+        }
+      else
         {
-            /* Fail */
-            ObDereferenceObject(SectionToMap);
-            ObDereferenceObject(Port);
-            return Status;
+          ConnectDataLength = *UnsafeConnectDataLength;
         }
 
-        /* Update the base */
-        ClientView->ViewBase = Port->ClientSectionBase;
+      if (ConnectDataLength != 0)
+        {
+          ConnectData = ExAllocatePool(NonPagedPool, ConnectDataLength);
+          if (ConnectData == NULL)
+            {
+              return(STATUS_NO_MEMORY);
+            }
 
-        /* Reference and remember the process */
-        ClientPort->MappingProcess = PsGetCurrentProcess();
-        ObReferenceObject(ClientPort->MappingProcess);
-    }
-    else
-    {
-        /* No section */
-        SectionToMap = NULL;
-    }
+          if (PreviousMode != KernelMode)
+            {
+              _SEH_TRY
+                {
+                  ProbeForWriteUlong(UnsafeConnectData);
+                  RtlCopyMemory(ConnectData,
+                                UnsafeConnectData,
+                                ConnectDataLength);
+                }
+              _SEH_HANDLE
+                {
+                  Status = _SEH_GetExceptionCode();
+                }
+              _SEH_END;
 
-    /* Normalize connection information */
-    if (ConnectionInfoLength > Port->MaxConnectionInfoLength)
-    {
-        /* Use the port's maximum allowed value */
-        ConnectionInfoLength = Port->MaxConnectionInfoLength;
+              if (!NT_SUCCESS(Status))
+                {
+                  ExFreePool(ConnectData);
+                  return Status;
+                }
+            }
+          else
+            {
+              RtlCopyMemory(ConnectData,
+                            UnsafeConnectData,
+                            ConnectDataLength);
+            }
+        }
     }
 
-    /* Allocate a message from the port zone */
-    Message = LpcpAllocateFromPortZone();
-    if (!Message)
+  /*
+   * Reference the named port.
+   */
+  Status = ObReferenceObjectByName (PortName,
+                                    0,
+                                    NULL,
+                                    PORT_ALL_ACCESS,  /* DesiredAccess */
+                                    LpcPortObjectType,
+                                    PreviousMode,
+                                    NULL,
+                                    (PVOID*)&NamedPort);
+  if (!NT_SUCCESS(Status))
     {
-        /* Fail if we couldn't allocate a message */
-        if (SectionToMap) ObDereferenceObject(SectionToMap);
-        ObDereferenceObject(ClientPort);
-        return STATUS_NO_MEMORY;
+      if (KeGetPreviousMode() != KernelMode)
+       {
+         ExFreePool(ConnectData);
+       }
+      return(Status);
     }
 
-    /* Set pointer to the connection message and fill in the CID */
-    ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
-    Message->Request.ClientId = Thread->Cid;
-
-    /* Check if we have a client view */
-    if (ClientView)
+  /*
+   * Reference the send section object.
+   */
+  if (WriteMap.SectionHandle != INVALID_HANDLE_VALUE)
     {
-        /* Set the view size */
-        Message->Request.ClientViewSize = ClientView->ViewSize;
-
-        /* Copy the client view and clear the server view */
-        RtlCopyMemory(&ConnectMessage->ClientView,
-                      ClientView,
-                      sizeof(PORT_VIEW));
-        RtlZeroMemory(&ConnectMessage->ServerView, sizeof(REMOTE_PORT_VIEW));
+      Status = ObReferenceObjectByHandle(WriteMap.SectionHandle,
+                                        SECTION_MAP_READ | SECTION_MAP_WRITE,
+                                        MmSectionObjectType,
+                                        PreviousMode,
+                                        (PVOID*)&SectionObject,
+                                        NULL);
+      if (!NT_SUCCESS(Status))
+       {
+         ObDereferenceObject(NamedPort);
+         if (KeGetPreviousMode() != KernelMode)
+           {
+             ExFreePool(ConnectData);
+           }
+         return(Status);
+       }
     }
-    else
+  else
     {
-        /* Set the size to 0 and clear the connect message */
-        Message->Request.ClientViewSize = 0;
-        RtlZeroMemory(ConnectMessage, sizeof(LPCP_CONNECTION_MESSAGE));
+      SectionObject = NULL;
     }
 
-    /* Set the section and client port. Port is NULL for now */
-    ConnectMessage->ClientPort = NULL;
-    ConnectMessage->SectionToMap = SectionToMap;
-
-    /* Set the data for the connection request message */
-    Message->Request.u1.s1.DataLength = sizeof(LPCP_CONNECTION_MESSAGE) +
-                                        ConnectionInfoLength;
-    Message->Request.u1.s1.TotalLength = sizeof(LPCP_MESSAGE) +
-                                         Message->Request.u1.s1.DataLength;
-    Message->Request.u2.s2.Type = LPC_CONNECTION_REQUEST;
-
-    /* Check if we have connection information */
-    if (ConnectionInformation)
+  /*
+   * Do the connection establishment.
+   */
+  Status = EiConnectPort(&ConnectedPort,
+                        NamedPort,
+                        SectionObject,
+                        SectionOffset,
+                        WriteMap.ViewSize,
+                        &WriteMap.ViewBase,
+                        &WriteMap.ViewRemoteBase,
+                        &ReadMap.ViewSize,
+                        &ReadMap.ViewBase,
+                        &MaximumMessageSize,
+                        ConnectData,
+                        &ConnectDataLength);
+  if (!NT_SUCCESS(Status))
     {
-        /* Copy it in */
-        RtlCopyMemory(ConnectMessage + 1,
-                      ConnectionInformation,
-                      ConnectionInfoLength);
+      /* FIXME: Again, check what NT does here. */
+      if (UnsafeConnectDataLength != NULL)
+       {
+         if (PreviousMode != KernelMode)
+           {
+              _SEH_TRY
+                {
+                  RtlCopyMemory(UnsafeConnectData,
+                                ConnectData,
+                                ConnectDataLength);
+                  *UnsafeConnectDataLength = ConnectDataLength;
+                }
+              _SEH_HANDLE
+                {
+                  Status = _SEH_GetExceptionCode();
+                }
+              _SEH_END;
+           }
+         else
+           {
+               RtlCopyMemory(UnsafeConnectData,
+                             ConnectData,
+                             ConnectDataLength);
+               *UnsafeConnectDataLength = ConnectDataLength;
+           }
+
+          ExFreePool(ConnectData);
+       }
+      return(Status);
     }
 
-    /* Acquire the port lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Check if someone already deleted the port name */
-    if (Port->Flags & LPCP_NAME_DELETED)
+  /*
+   * Do some initial cleanup.
+   */
+  if (SectionObject != NULL)
     {
-        /* Fail the request */
-        Status = STATUS_OBJECT_NAME_NOT_FOUND;
+      ObDereferenceObject(SectionObject);
+      SectionObject = NULL;
     }
-    else
-    {
-        /* Associate no thread yet */
-        Message->RepliedToThread = NULL;
+  ObDereferenceObject(NamedPort);
+  NamedPort = NULL;
 
-        /* Generate the Message ID and set it */
-        Message->Request.MessageId =  LpcpNextMessageId++;
-        if (!LpcpNextMessageId) LpcpNextMessageId = 1;
-        Thread->LpcReplyMessageId = Message->Request.MessageId;
+  /*
+   * Copy the data back to the caller.
+   */
 
-        /* Insert the message into the queue and thread chain */
-        InsertTailList(&Port->MsgQueue.ReceiveHead, &Message->Entry);
-        InsertTailList(&Port->LpcReplyChainHead, &Thread->LpcReplyChain);
-        Thread->LpcReplyMessage = Message;
+  if (UnsafeConnectDataLength != NULL)
+    {
+      if (PreviousMode != KernelMode)
+       {
+          _SEH_TRY
+            {
+              *UnsafeConnectDataLength = ConnectDataLength;
+              
+              if (ConnectData != NULL)
+                {
+                  RtlCopyMemory(UnsafeConnectData,
+                                ConnectData,
+                                ConnectDataLength);
+                }
+            }
+          _SEH_HANDLE
+            {
+              Status = _SEH_GetExceptionCode();
+            }
+          _SEH_END;
 
-        /* Now we can finally reference the client port and link it*/
-        ObReferenceObject(ClientPort);
-        ConnectMessage->ClientPort = ClientPort;
+         if (!NT_SUCCESS(Status))
+           {
+              if (ConnectData != NULL)
+                {
+                  ExFreePool(ConnectData);
+                }
+              return(Status);
+           }
+       }
+      else
+        {
+          *UnsafeConnectDataLength = ConnectDataLength;
+          
+          if (ConnectData != NULL)
+            {
+              RtlCopyMemory(UnsafeConnectData,
+                            ConnectData,
+                            ConnectDataLength);
+            }
+        }
 
-        /* Enter a critical region */
-        KeEnterCriticalRegion();
+      if (ConnectData != NULL)
+       {
+         ExFreePool(ConnectData);
+       }
     }
-
-    /* Add another reference to the port */
-    ObReferenceObject(Port);
-
-    /* Release the lock */
-    KeReleaseGuardedMutex(&LpcpLock);
-
-    /* Check for success */
-    if (NT_SUCCESS(Status))
+  Status = ObInsertObject(ConnectedPort,
+                         NULL,
+                         PORT_ALL_ACCESS,
+                         1,
+                         (PVOID*)&ConnectedPort,
+                         &ConnectedPortHandle);
+  if (!NT_SUCCESS(Status))
     {
-        LPCTRACE(LPC_CONNECT_DEBUG,
-                 "Messages: %p/%p. Ports: %p/%p. Status: %lx\n",
-                 Message,
-                 ConnectMessage,
-                 Port,
-                 ClientPort,
-                 Status);
-
-        /* If this is a waitable port, set the event */
-        if (Port->Flags & LPCP_WAITABLE_PORT) KeSetEvent(&Port->WaitEvent,
-                                                         1,
-                                                         FALSE);
-
-        /* Release the queue semaphore and leave the critical region */
-        LpcpCompleteWait(Port->MsgQueue.Semaphore);
-        KeLeaveCriticalRegion();
-
-        /* Now wait for a reply */
-        LpcpConnectWait(&Thread->LpcReplySemaphore, PreviousMode);
+      return(Status);
     }
 
-    /* Check for failure */
-    if (!NT_SUCCESS(Status)) goto Cleanup;
-
-    /* Free the connection message */
-    SectionToMap = LpcpFreeConMsg(&Message, &ConnectMessage, Thread);
-
-    /* Check if we got a message back */
-    if (Message)
+  if (PreviousMode != KernelMode)
     {
-        /* Check for new return length */
-        if ((Message->Request.u1.s1.DataLength -
-             sizeof(LPCP_CONNECTION_MESSAGE)) < ConnectionInfoLength)
+      _SEH_TRY
         {
-            /* Set new normalized connection length */
-            ConnectionInfoLength = Message->Request.u1.s1.DataLength -
-                                   sizeof(LPCP_CONNECTION_MESSAGE);
-        }
+          *UnsafeConnectedPortHandle = ConnectedPortHandle;
+          
+          if (UnsafeWriteMap != NULL)
+            {
+              RtlCopyMemory(UnsafeWriteMap,
+                            &WriteMap,
+                            sizeof(PORT_VIEW));
+            }
 
-        /* Check if we had connection information */
-        if (ConnectionInformation)
-        {
-            /* Check if we had a length pointer */
-            if (ConnectionInformationLength)
+          if (UnsafeReadMap != NULL)
             {
-                /* Return the length */
-                *ConnectionInformationLength = ConnectionInfoLength;
+              RtlCopyMemory(UnsafeReadMap,
+                            &ReadMap,
+                            sizeof(REMOTE_PORT_VIEW));
             }
 
-            /* Return the connection information */
-            RtlCopyMemory(ConnectionInformation,
-                          ConnectMessage + 1,
-                          ConnectionInfoLength );
+          if (UnsafeMaximumMessageSize != NULL)
+            {
+              *UnsafeMaximumMessageSize = MaximumMessageSize;
+            }
         }
-
-        /* Make sure we had a connected port */
-        if (ClientPort->ConnectedPort)
+      _SEH_HANDLE
         {
-            /* Get the message length before the port might get killed */
-            PortMessageLength = Port->MaxMessageLength;
-
-            /* Insert the client port */
-            Status = ObInsertObject(ClientPort,
-                                    NULL,
-                                    PORT_ALL_ACCESS,
-                                    0,
-                                    (PVOID *)NULL,
-                                    &Handle);
-            if (NT_SUCCESS(Status))
-            {
-                /* Return the handle */
-                *PortHandle = Handle;
-                LPCTRACE(LPC_CONNECT_DEBUG,
-                         "Handle: %lx. Length: %lx\n",
-                         Handle,
-                         PortMessageLength);
-
-                /* Check if maximum length was requested */
-                if (MaxMessageLength) *MaxMessageLength = PortMessageLength;
-
-                /* Check if we had a client view */
-                if (ClientView)
-                {
-                    /* Copy it back */
-                    RtlCopyMemory(ClientView,
-                                  &ConnectMessage->ClientView,
-                                  sizeof(PORT_VIEW));
-                }
+          Status = _SEH_GetExceptionCode();
+        }
+      _SEH_END;
+      
+      if (!NT_SUCCESS(Status))
+        {
+          return Status;
+        }
+    }
+  else
+    {
+      *UnsafeConnectedPortHandle = ConnectedPortHandle;
+      
+      if (UnsafeWriteMap != NULL)
+        {
+          RtlCopyMemory(UnsafeWriteMap,
+                        &WriteMap,
+                        sizeof(PORT_VIEW));
+        }
 
-                /* Check if we had a server view */
-                if (ServerView)
-                {
-                    /* Copy it back */
-                    RtlCopyMemory(ServerView,
-                                  &ConnectMessage->ServerView,
-                                  sizeof(REMOTE_PORT_VIEW));
-                }
-            }
+      if (UnsafeReadMap != NULL)
+        {
+          RtlCopyMemory(UnsafeReadMap,
+                        &ReadMap,
+                        sizeof(REMOTE_PORT_VIEW));
         }
-        else
+
+      if (UnsafeMaximumMessageSize != NULL)
         {
-            /* No connection port, we failed */
-            if (SectionToMap) ObDereferenceObject(SectionToMap);
+          *UnsafeMaximumMessageSize = MaximumMessageSize;
+        }
+    }
 
-            /* Acquire the lock */
-            KeAcquireGuardedMutex(&LpcpLock);
+  /*
+   * All done.
+   */
 
-            /* Check if it's because the name got deleted */
-            if (!(ClientPort->ConnectionPort) ||
-                (Port->Flags & LPCP_NAME_DELETED))
-            {
-                /* Set the correct status */
-                Status = STATUS_OBJECT_NAME_NOT_FOUND;
-            }
-            else
-            {
-                /* Otherwise, the caller refused us */
-                Status = STATUS_PORT_CONNECTION_REFUSED;
-            }
+  return(STATUS_SUCCESS);
+}
 
-            /* Release the lock */
-            KeReleaseGuardedMutex(&LpcpLock);
 
-            /* Kill the port */
-            ObDereferenceObject(ClientPort);
-        }
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtAcceptConnectPort/6
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *     ServerPortHandle
+ *     NamedPortHandle
+ *     LpcMessage
+ *     AcceptIt
+ *     WriteMap
+ *     ReadMap
+ *
+ * RETURN VALUE
+ */
+/*EXPORTED*/ NTSTATUS STDCALL
+NtAcceptConnectPort (PHANDLE                   ServerPortHandle,
+                    HANDLE                     NamedPortHandle,
+                    PPORT_MESSAGE              LpcMessage,
+                    BOOLEAN                    AcceptIt,
+                    PPORT_VIEW WriteMap,
+                    PREMOTE_PORT_VIEW  ReadMap)
+{
+  NTSTATUS     Status;
+  PEPORT               NamedPort;
+  PEPORT               OurPort = NULL;
+  PQUEUEDMESSAGE       ConnectionRequest;
+  KIRQL                oldIrql;
+  PEPORT_CONNECT_REQUEST_MESSAGE CRequest;
+  PEPORT_CONNECT_REPLY_MESSAGE CReply;
+  ULONG Size;
+  KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
+
+  Size = sizeof(EPORT_CONNECT_REPLY_MESSAGE);
+  if (LpcMessage)
+  {
+     Size += LpcMessage->u1.s1.DataLength;
+  }
+
+  CReply = ExAllocatePool(NonPagedPool, Size);
+  if (CReply == NULL)
+    {
+      return(STATUS_NO_MEMORY);
+    }
 
-        /* Free the message */
-        LpcpFreeToPortZone(Message, 0);
+  Status = ObReferenceObjectByHandle(NamedPortHandle,
+                                    PORT_ALL_ACCESS,
+                                    LpcPortObjectType,
+                                    PreviousMode,
+                                    (PVOID*)&NamedPort,
+                                    NULL);
+  if (!NT_SUCCESS(Status))
+    {
+      ExFreePool(CReply);
+      return (Status);
     }
-    else
+
+  /*
+   * Create a port object for our side of the connection
+   */
+  if (AcceptIt)
     {
-        /* No reply message, fail */
-        if (SectionToMap) ObDereferenceObject(SectionToMap);
-        ObDereferenceObject(ClientPort);
-        Status = STATUS_PORT_CONNECTION_REFUSED;
+      Status = ObCreateObject(PreviousMode,
+                             LpcPortObjectType,
+                             NULL,
+                             PreviousMode,
+                             NULL,
+                             sizeof(EPORT),
+                             0,
+                             0,
+                             (PVOID*)&OurPort);
+      if (!NT_SUCCESS(Status))
+       {
+         ExFreePool(CReply);
+         ObDereferenceObject(NamedPort);
+         return(Status);
+       }
+
+      Status = ObInsertObject ((PVOID)OurPort,
+                              NULL,
+                              PORT_ALL_ACCESS,
+                              0,
+                              NULL,
+                              ServerPortHandle);
+      if (!NT_SUCCESS(Status))
+       {
+         ObDereferenceObject(OurPort);
+         ExFreePool(CReply);
+         ObDereferenceObject(NamedPort);
+         return(Status);
+       }
+
+      LpcpInitializePort(OurPort, EPORT_TYPE_SERVER_COMM_PORT, NamedPort);
     }
 
-    /* Return status */
-    ObDereferenceObject(Port);
-    return Status;
+  /*
+   * Dequeue the connection request
+   */
+  KeAcquireSpinLock(&NamedPort->Lock, &oldIrql);
+  ConnectionRequest = EiDequeueConnectMessagePort (NamedPort);
+  KeReleaseSpinLock(&NamedPort->Lock, oldIrql);
+  CRequest = (PEPORT_CONNECT_REQUEST_MESSAGE)(&ConnectionRequest->Message);
+
+  /*
+   * Prepare the reply.
+   */
+  if (LpcMessage != NULL)
+    {
+      memcpy(&CReply->MessageHeader, LpcMessage, sizeof(PORT_MESSAGE));
+      memcpy(&CReply->ConnectData, (PVOID)(LpcMessage + 1),
+            LpcMessage->u1.s1.DataLength);
+      CReply->MessageHeader.u1.s1.TotalLength =
+       sizeof(EPORT_CONNECT_REPLY_MESSAGE) + LpcMessage->u1.s1.DataLength;
+      CReply->MessageHeader.u1.s1.DataLength = CReply->MessageHeader.u1.s1.TotalLength -
+       sizeof(PORT_MESSAGE);
+      CReply->ConnectDataLength = LpcMessage->u1.s1.DataLength;
+    }
+  else
+    {
+      CReply->MessageHeader.u1.s1.TotalLength = sizeof(EPORT_CONNECT_REPLY_MESSAGE);
+      CReply->MessageHeader.u1.s1.DataLength = sizeof(EPORT_CONNECT_REPLY_MESSAGE) -
+       sizeof(PORT_MESSAGE);
+      CReply->ConnectDataLength = 0;
+    }
+  if (!AcceptIt)
+    {
+      EiReplyOrRequestPort(ConnectionRequest->Sender,
+                          &CReply->MessageHeader,
+                          LPC_CONNECTION_REFUSED,
+                          NamedPort);
+      KeReleaseSemaphore(&ConnectionRequest->Sender->Semaphore,
+                        IO_NO_INCREMENT,
+                        1,
+                        FALSE);
+      ObDereferenceObject(ConnectionRequest->Sender);
+      ExFreePool(ConnectionRequest);
+      ExFreePool(CReply);
+      ObDereferenceObject(NamedPort);
+      return (STATUS_SUCCESS);
+    }
 
-Cleanup:
-    /* We failed, free the message */
-    SectionToMap = LpcpFreeConMsg(&Message, &ConnectMessage, Thread);
+  /*
+   * Prepare the connection.
+   */
+  if (WriteMap != NULL)
+    {
+      PVOID SectionObject;
+      LARGE_INTEGER SectionOffset;
+
+      Status = ObReferenceObjectByHandle(WriteMap->SectionHandle,
+                                        SECTION_MAP_READ | SECTION_MAP_WRITE,
+                                        MmSectionObjectType,
+                                        PreviousMode,
+                                        (PVOID*)&SectionObject,
+                                        NULL);
+      if (!NT_SUCCESS(Status))
+       {
+         return(Status);
+       }
+
+      SectionOffset.QuadPart = WriteMap->SectionOffset;
+      WriteMap->ViewRemoteBase = 0;
+      CReply->ReceiveClientViewSize = WriteMap->ViewSize;
+      Status = MmMapViewOfSection(SectionObject,
+                                 CRequest->ConnectingProcess,
+                                 &WriteMap->ViewRemoteBase,
+                                 0,
+                                 CReply->ReceiveClientViewSize,
+                                 &SectionOffset,
+                                 &CReply->ReceiveClientViewSize,
+                                 ViewUnmap,
+                                 0 /* MEM_TOP_DOWN? */,
+                                 PAGE_READWRITE);
+      if (!NT_SUCCESS(Status))
+       {
+         return(Status);
+       }
+
+      WriteMap->ViewBase = 0;
+      Status = MmMapViewOfSection(SectionObject,
+                                 PsGetCurrentProcess(),
+                                 &WriteMap->ViewBase,
+                                 0,
+                                 WriteMap->ViewSize,
+                                 &SectionOffset,
+                                 &WriteMap->ViewSize,
+                                 ViewUnmap,
+                                 0 /* MEM_TOP_DOWN? */,
+                                 PAGE_READWRITE);
+      if (!NT_SUCCESS(Status))
+       {
+         return(Status);
+       }
+
+      ObDereferenceObject(SectionObject);
+    }
+  if (ReadMap != NULL && CRequest->SendSectionObject != NULL)
+    {
+      LARGE_INTEGER SectionOffset;
+
+      SectionOffset = CRequest->SendSectionOffset;
+      ReadMap->ViewSize = CRequest->SendViewSize;
+      ReadMap->ViewBase = 0;
+      Status = MmMapViewOfSection(CRequest->SendSectionObject,
+                                 PsGetCurrentProcess(),
+                                 &ReadMap->ViewBase,
+                                 0,
+                                 CRequest->SendViewSize,
+                                 &SectionOffset,
+                                 &CRequest->SendViewSize,
+                                 ViewUnmap,
+                                 0 /* MEM_TOP_DOWN? */,
+                                 PAGE_READWRITE);
+      if (!NT_SUCCESS(Status))
+       {
+         return(Status);
+       }
+    }
 
-    /* Check if the semaphore got signaled */
-    if (KeReadStateSemaphore(&Thread->LpcReplySemaphore))
+  /*
+   * Finish the reply.
+   */
+  if (ReadMap != NULL)
     {
-        /* Wait on it */
-        KeWaitForSingleObject(&Thread->LpcReplySemaphore,
-                              WrExecutive,
-                              KernelMode,
-                              FALSE,
-                              NULL);
+      CReply->SendServerViewBase = ReadMap->ViewBase;
     }
+  else
+    {
+      CReply->SendServerViewBase = 0;
+    }
+  if (WriteMap != NULL)
+    {
+      CReply->ReceiveClientViewBase = WriteMap->ViewRemoteBase;
+    }
+  CReply->MaximumMessageSize = LPC_MAX_MESSAGE_LENGTH;
+
 
-    /* Check if we had a message and free it */
-    if (Message) LpcpFreeToPortZone(Message, 0);
+  /*
+   * Connect the two ports
+   */
+  OurPort->OtherPort = ConnectionRequest->Sender;
+  OurPort->OtherPort->OtherPort = OurPort;
+  EiReplyOrRequestPort(ConnectionRequest->Sender,
+                      (PPORT_MESSAGE)CReply,
+                      LPC_REPLY,
+                      OurPort);
+  ExFreePool(ConnectionRequest);
+  ExFreePool(CReply);
 
-    /* Dereference other objects */
-    if (SectionToMap) ObDereferenceObject(SectionToMap);
-    ObDereferenceObject(ClientPort);
+  //ObDereferenceObject(OurPort);
+  ObDereferenceObject(NamedPort);
 
-    /* Return status */
-    ObDereferenceObject(Port);
-    return Status;
+  return (STATUS_SUCCESS);
 }
 
-/*
- * @implemented
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtSecureConnectPort/9
+ *
+ * DESCRIPTION
+ *     Connect to a named port and wait for the other side to
+ *     accept the connection. Possibly verify that the server
+ *     matches the ServerSid (trusted server).
+ *     Present in w2k+.
+ *
+ * ARGUMENTS
+ *     ConnectedPort
+ *     PortName: fully qualified name in the Ob name space;
+ *     Qos
+ *     WriteMap
+ *     ServerSid
+ *     ReadMap
+ *     MaxMessageSize
+ *     ConnectInfo
+ *     UserConnectInfoLength
+ *
+ * RETURN VALUE
  */
-NTSTATUS
-NTAPI
-NtConnectPort(OUT PHANDLE PortHandle,
-              IN PUNICODE_STRING PortName,
-              IN PSECURITY_QUALITY_OF_SERVICE Qos,
-              IN PPORT_VIEW ClientView,
-              IN PREMOTE_PORT_VIEW ServerView,
-              OUT PULONG MaxMessageLength,
-              IN PVOID ConnectionInformation,
-              OUT PULONG ConnectionInformationLength)
+NTSTATUS STDCALL
+NtSecureConnectPort (OUT    PHANDLE                            ConnectedPort,
+                    IN     PUNICODE_STRING                     PortName,
+                    IN     PSECURITY_QUALITY_OF_SERVICE        Qos,
+                    IN OUT PPORT_VIEW                  WriteMap                OPTIONAL,
+                    IN     PSID                                ServerSid               OPTIONAL,
+                    IN OUT PREMOTE_PORT_VIEW                   ReadMap                 OPTIONAL,
+                    OUT    PULONG                              MaxMessageSize          OPTIONAL,
+                    IN OUT PVOID                               ConnectInfo             OPTIONAL,
+                    IN OUT PULONG                              UserConnectInfoLength   OPTIONAL)
 {
-    /* Call the newer API */
-    return NtSecureConnectPort(PortHandle,
-                               PortName,
-                               Qos,
-                               ClientView,
-                               NULL,
-                               ServerView,
-                               MaxMessageLength,
-                               ConnectionInformation,
-                               ConnectionInformationLength);
+  /* TODO: implement a new object type: WaitablePort */
+  /* TODO: verify the process' SID that hosts the rendez-vous port equals ServerSid */
+  return NtConnectPort (ConnectedPort,
+                       PortName,
+                       Qos,
+                       WriteMap,
+                       ReadMap,
+                       MaxMessageSize,
+                       ConnectInfo,
+                       UserConnectInfoLength);
 }
 
 /* EOF */
index f98df57..1fcefa0 100644 (file)
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/create.c
- * PURPOSE:         Local Procedure Call: Port/Queue/Message Creation
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
-
-/* PRIVATE FUNCTIONS *********************************************************/
-
-NTSTATUS
-NTAPI
-LpcpInitializePortQueue(IN PLPCP_PORT_OBJECT Port)
-{
-    PLPCP_NONPAGED_PORT_QUEUE MessageQueue;
-    PAGED_CODE();
-
-    /* Allocate the queue */
-    MessageQueue = ExAllocatePoolWithTag(NonPagedPool,
-                                         sizeof(LPCP_NONPAGED_PORT_QUEUE),
-                                         TAG('P', 'o', 'r', 't'));
-    if (!MessageQueue) return STATUS_INSUFFICIENT_RESOURCES;
-
-    /* Set it up */
-    KeInitializeSemaphore(&MessageQueue->Semaphore, 0, MAXLONG);
-    MessageQueue->BackPointer = Port;
-
-    /* And link it with the Paged Pool part */
-    Port->MsgQueue.Semaphore = &MessageQueue->Semaphore;
-    InitializeListHead(&Port->MsgQueue.ReceiveHead);
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-LpcpCreatePort(OUT PHANDLE PortHandle,
-               IN POBJECT_ATTRIBUTES ObjectAttributes,
-               IN ULONG MaxConnectionInfoLength,
-               IN ULONG MaxMessageLength,
-               IN ULONG MaxPoolUsage,
-               IN BOOLEAN Waitable)
+#include <internal/debug.h>
+
+/**********************************************************************
+ * NAME
+ *     LpcpVerifyCreateParameters/5
+ *
+ * DESCRIPTION
+ *     Verify user parameters in NtCreatePort and in
+ *     NtCreateWaitablePort.
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ */
+static NTSTATUS STDCALL
+LpcpVerifyCreateParameters (IN PHANDLE                 PortHandle,
+                           IN  POBJECT_ATTRIBUTES      ObjectAttributes,
+                           IN  ULONG                   MaxConnectInfoLength,
+                           IN  ULONG                   MaxDataLength,
+                           IN  ULONG                   MaxPoolUsage)
 {
-    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
-    NTSTATUS Status;
-    PLPCP_PORT_OBJECT Port;
-    PAGED_CODE();
-    LPCTRACE(LPC_CREATE_DEBUG, "Name: %wZ\n", ObjectAttributes->ObjectName);
-
-    /* Create the Object */
-    Status = ObCreateObject(PreviousMode,
-                            LpcPortObjectType,
-                            ObjectAttributes,
-                            PreviousMode,
-                            NULL,
-                            sizeof(LPCP_PORT_OBJECT),
-                            0,
-                            0,
-                            (PVOID*)&Port);
-    if (!NT_SUCCESS(Status)) return Status;
-
-    /* Set up the Object */
-    RtlZeroMemory(Port, sizeof(LPCP_PORT_OBJECT));
-    Port->ConnectionPort = Port;
-    Port->Creator = PsGetCurrentThread()->Cid;
-    InitializeListHead(&Port->LpcDataInfoChainHead);
-    InitializeListHead(&Port->LpcReplyChainHead);
-
-    /* Check if we don't have a name */
-    if (!ObjectAttributes->ObjectName->Buffer)
+  if (NULL == PortHandle)
     {
-        /* Set up for an unconnected port */
-        Port->Flags = LPCP_UNCONNECTED_PORT;
-        Port->ConnectedPort = Port;
-        Port->ServerProcess = NULL;
+      return (STATUS_INVALID_PARAMETER_1);
     }
-    else
+  if (NULL == ObjectAttributes)
     {
-        /* Set up for a named connection port */
-        Port->Flags = LPCP_CONNECTION_PORT;
-        Port->ServerProcess = PsGetCurrentProcess();
-
-        /* Don't let the process die on us */
-        ObReferenceObject(Port->ServerProcess);
+      return (STATUS_INVALID_PARAMETER_2);
     }
-
-    /* Check if this is a waitable port */
-    if (Waitable) Port->Flags |= LPCP_WAITABLE_PORT;
-
-    /* Setup the port queue */
-    Status = LpcpInitializePortQueue(Port);
-    if (!NT_SUCCESS(Status))
+  if ((ObjectAttributes->Attributes    & OBJ_OPENLINK)
+      || (ObjectAttributes->Attributes & OBJ_OPENIF)
+      || (ObjectAttributes->Attributes & OBJ_EXCLUSIVE)
+      || (ObjectAttributes->Attributes & OBJ_PERMANENT)
+      || (ObjectAttributes->Attributes & OBJ_INHERIT))
+  {
+    return (STATUS_INVALID_PORT_ATTRIBUTES);
+  }
+  if (MaxConnectInfoLength > LPC_MAX_DATA_LENGTH)
     {
-        /* Fail */
-        ObDereferenceObject(Port);
-        return Status;
+      return (STATUS_INVALID_PARAMETER_3);
     }
-
-    /* Check if this is a waitable port */
-    if (Port->Flags & LPCP_WAITABLE_PORT)
+  if (MaxDataLength > LPC_MAX_MESSAGE_LENGTH)
     {
-        /* Setup the wait event */
-        KeInitializeEvent(&Port->WaitEvent, NotificationEvent, FALSE);
+      return (STATUS_INVALID_PARAMETER_4);
     }
+  /* TODO: some checking is done also on MaxPoolUsage
+   * to avoid choking the executive */
+  return (STATUS_SUCCESS);
+}
 
-    /* Set the maximum message size allowed */
-    Port->MaxMessageLength = LpcpMaxMessageSize -
-                             FIELD_OFFSET(LPCP_MESSAGE, Request);
-
-    /* Now subtract the actual message structures and get the data size */
-    Port->MaxConnectionInfoLength = Port->MaxMessageLength -
-                                    sizeof(PORT_MESSAGE) -
-                                    sizeof(LPCP_CONNECTION_MESSAGE);
-
-    /* Validate the sizes */
-    if (Port->MaxConnectionInfoLength < MaxConnectionInfoLength)
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtCreatePort/5
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *     PortHandle,
+ *     ObjectAttributes,
+ *     MaxConnectInfoLength,
+ *     MaxDataLength,
+ *     MaxPoolUsage: size of NP zone the NP part of msgs is kept in
+ *
+ * RETURN VALUE
+ */
+/*EXPORTED*/ NTSTATUS STDCALL
+NtCreatePort (PHANDLE                PortHandle,
+             POBJECT_ATTRIBUTES    ObjectAttributes,
+             ULONG            MaxConnectInfoLength,
+             ULONG                     MaxDataLength,
+             ULONG                     MaxPoolUsage)
+{
+  PEPORT               Port;
+  NTSTATUS     Status;
+
+  DPRINT("NtCreatePort() Name %x\n", ObjectAttributes->ObjectName->Buffer);
+
+  /* Verify parameters */
+  Status = LpcpVerifyCreateParameters (PortHandle,
+                                      ObjectAttributes,
+                                      MaxConnectInfoLength,
+                                      MaxDataLength,
+                                      MaxPoolUsage);
+  if (STATUS_SUCCESS != Status)
     {
-        /* Not enough space for your request */
-        ObDereferenceObject(Port);
-        return STATUS_INVALID_PARAMETER_3;
+      return (Status);
     }
-    else if (Port->MaxMessageLength < MaxMessageLength)
+
+  /* Ask Ob to create the object */
+  Status = ObCreateObject (ExGetPreviousMode(),
+                          LpcPortObjectType,
+                          ObjectAttributes,
+                          ExGetPreviousMode(),
+                          NULL,
+                          sizeof(EPORT),
+                          0,
+                          0,
+                          (PVOID*)&Port);
+  if (!NT_SUCCESS(Status))
     {
-        /* Not enough space for your request */
-        ObDereferenceObject(Port);
-        return STATUS_INVALID_PARAMETER_4;
+      return (Status);
     }
 
-    /* Now set the custom setting */
-    Port->MaxMessageLength = MaxMessageLength;
-
-    /* Insert it now */
-    Status = ObInsertObject((PVOID)Port,
-                            NULL,
-                            PORT_ALL_ACCESS,
-                            0,
-                            NULL,
-                            PortHandle);
-
-    /* Return success or the error */
-    LPCTRACE(LPC_CREATE_DEBUG, "Port: %p. Handle: %lx\n", Port, *PortHandle);
-    return Status;
-}
-
-/* PUBLIC FUNCTIONS **********************************************************/
+  Status = ObInsertObject ((PVOID)Port,
+                          NULL,
+                          PORT_ALL_ACCESS,
+                          0,
+                          NULL,
+                          PortHandle);
+  if (!NT_SUCCESS(Status))
+    {
+      ObDereferenceObject (Port);
+      return (Status);
+    }
 
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-NtCreatePort(OUT PHANDLE PortHandle,
-             IN POBJECT_ATTRIBUTES ObjectAttributes,
-             IN ULONG MaxConnectInfoLength,
-             IN ULONG MaxDataLength,
-             IN ULONG MaxPoolUsage)
-{
-    PAGED_CODE();
+  Status = LpcpInitializePort (Port, EPORT_TYPE_SERVER_RQST_PORT, NULL);
+  Port->MaxConnectInfoLength = LPC_MAX_DATA_LENGTH;
+  Port->MaxDataLength = LPC_MAX_MESSAGE_LENGTH;
+  Port->MaxPoolUsage = MaxPoolUsage;
 
-    /* Call the internal API */
-    return LpcpCreatePort(PortHandle,
-                          ObjectAttributes,
-                          MaxConnectInfoLength,
-                          MaxDataLength,
-                          MaxPoolUsage,
-                          FALSE);
+  return (Status);
 }
 
-/*
- * @implemented
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtCreateWaitablePort/5
+ *
+ * DESCRIPTION
+ *     Waitable ports can be connected to with NtSecureConnectPort.
+ *     No port interface can be used with waitable ports but
+ *     NtReplyWaitReceivePort and NtReplyWaitReceivePortEx.
+ *     Present only in w2k+.
+ *
+ * ARGUMENTS
+ *     PortHandle,
+ *     ObjectAttributes,
+ *     MaxConnectInfoLength,
+ *     MaxDataLength,
+ *     MaxPoolUsage
+ *
+ * RETURN VALUE
  */
-NTSTATUS
-NTAPI
-NtCreateWaitablePort(OUT PHANDLE PortHandle,
-                     IN POBJECT_ATTRIBUTES ObjectAttributes,
-                     IN ULONG MaxConnectInfoLength,
-                     IN ULONG MaxDataLength,
-                     IN ULONG MaxPoolUsage)
+/*EXPORTED*/ NTSTATUS STDCALL
+NtCreateWaitablePort (OUT      PHANDLE                 PortHandle,
+                     IN        POBJECT_ATTRIBUTES      ObjectAttributes,
+                     IN        ULONG                   MaxConnectInfoLength,
+                     IN        ULONG                   MaxDataLength,
+                     IN        ULONG                   MaxPoolUsage)
 {
-    PAGED_CODE();
-
-    /* Call the internal API */
-    return LpcpCreatePort(PortHandle,
-                          ObjectAttributes,
-                          MaxConnectInfoLength,
-                          MaxDataLength,
-                          MaxPoolUsage,
-                          TRUE);
+  NTSTATUS Status;
+
+  /* Verify parameters */
+  Status = LpcpVerifyCreateParameters (PortHandle,
+                                      ObjectAttributes,
+                                      MaxConnectInfoLength,
+                                      MaxDataLength,
+                                      MaxPoolUsage);
+  if (STATUS_SUCCESS != Status)
+    {
+      return (Status);
+    }
+  /* TODO */
+  return (STATUS_NOT_IMPLEMENTED);
 }
 
 /* EOF */
index 1d4e94c..901c816 100644 (file)
@@ -1,51 +1,72 @@
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/listen.c
- * PURPOSE:         Local Procedure Call: Listening
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
 /* INCLUDES ******************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
-/* PUBLIC FUNCTIONS **********************************************************/
+/* FUNCTIONS *****************************************************************/
 
-/*
- * @implemented
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtListenPort@8
+ *
+ * DESCRIPTION
+ *     Listen on a named port and wait for a connection attempt.
+ *
+ * ARGUMENTS
+ *     PortHandle      [IN] LPC port to listen on.
+ *
+ *     ConnectMsg      [IN] User provided storage for a
+ *                     possible connection request LPC message.
+ *
+ * RETURN VALUE
+ *     STATUS_SUCCESS if a connection request is received
+ *     successfully; otherwise an error code.
+ *
+ *     The buffer ConnectMessage is filled with the connection
+ *     request message queued by NtConnectPort() in PortHandle.
+ *
+ * NOTE
  */
-NTSTATUS
-NTAPI
-NtListenPort(IN HANDLE PortHandle,
-             OUT PPORT_MESSAGE ConnectMessage)
+/*EXPORTED*/ NTSTATUS STDCALL
+NtListenPort (IN       HANDLE          PortHandle,
+             IN        PPORT_MESSAGE   ConnectMsg)
 {
-    NTSTATUS Status;
-    PAGED_CODE();
-    LPCTRACE(LPC_LISTEN_DEBUG, "Handle: %lx\n", PortHandle);
+  NTSTATUS     Status;
 
-    /* Wait forever for a connection request. */
-    for (;;)
+  /*
+   * Wait forever for a connection request.
+   */
+  for (;;)
     {
-        /* Do the wait */
-        Status = NtReplyWaitReceivePort(PortHandle,
-                                        NULL,
-                                        NULL,
-                                        ConnectMessage);
-
-        /* Accept only LPC_CONNECTION_REQUEST requests. */
-        if ((Status != STATUS_SUCCESS) ||
-            (LpcpGetMessageType(ConnectMessage) == LPC_CONNECTION_REQUEST))
-        {
-            /* Break out */
-            break;
-        }
+      Status = NtReplyWaitReceivePort(PortHandle,
+                                     NULL,
+                                     NULL,
+                                     ConnectMsg);
+      /*
+       * Accept only LPC_CONNECTION_REQUEST requests.
+       * Drop any other message.
+       */
+      if (!NT_SUCCESS(Status) ||
+         LPC_CONNECTION_REQUEST == ConnectMsg->u2.s2.Type)
+       {
+         DPRINT("Got message (type %x)\n", LPC_CONNECTION_REQUEST);
+         break;
+       }
+      DPRINT("Got message (type %x)\n", ConnectMsg->u2.s2.Type);
     }
 
-    /* Return status */
-    return Status;
+  return (Status);
 }
 
 
diff --git a/reactos/ntoskrnl/lpc/ntlpc/close.c b/reactos/ntoskrnl/lpc/ntlpc/close.c
new file mode 100644 (file)
index 0000000..af9803d
--- /dev/null
@@ -0,0 +1,395 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/lpc/close.c
+ * PURPOSE:         Local Procedure Call: Rundown, Cleanup, Deletion
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#include "lpc.h"
+#define NDEBUG
+#include <internal/debug.h>
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+VOID
+NTAPI
+LpcExitThread(IN PETHREAD Thread)
+{
+    PLPCP_MESSAGE Message;
+
+    /* Acquire the lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Make sure that the Reply Chain is empty */
+    if (!IsListEmpty(&Thread->LpcReplyChain))
+    {
+        /* It's not, remove the entry */
+        RemoveEntryList(&Thread->LpcReplyChain);
+    }
+
+    /* Set the thread in exit mode */
+    Thread->LpcExitThreadCalled = TRUE;
+    Thread->LpcReplyMessageId = 0;
+
+    /* Check if there's a reply message */
+    Message = Thread->LpcReplyMessage;
+    if (Message)
+    {
+        /* FIXME: TODO */
+        KEBUGCHECK(0);
+    }
+
+    /* Release the lock */
+    KeReleaseGuardedMutex(&LpcpLock);
+}
+
+VOID
+NTAPI
+LpcpFreeToPortZone(IN PLPCP_MESSAGE Message,
+                   IN ULONG Flags)
+{
+    PLPCP_CONNECTION_MESSAGE ConnectMessage;
+    PLPCP_PORT_OBJECT ClientPort = NULL;
+    PETHREAD Thread = NULL;
+    BOOLEAN LockHeld = Flags & 1;
+    PAGED_CODE();
+    LPCTRACE(LPC_CLOSE_DEBUG, "Message: %p. Flags: %lx\n", Message, Flags);
+
+    /* Acquire the lock if not already */
+    if (!LockHeld) KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Check if the queue list is empty */
+    if (!IsListEmpty(&Message->Entry))
+    {
+        /* Remove and re-initialize */
+        RemoveEntryList(&Message->Entry);
+        InitializeListHead(&Message->Entry);
+    }
+
+    /* Check if we've already replied */
+    if (Message->RepliedToThread)
+    {
+        /* Set thread to dereference and clean up */
+        Thread = Message->RepliedToThread;
+        Message->RepliedToThread = NULL;
+    }
+
+    /* Check if this is a connection request */
+    if (Message->Request.u2.s2.Type == LPC_CONNECTION_REQUEST)
+    {
+        /* Get the connection message */
+        ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
+
+        /* Clear the client port */
+        ClientPort = ConnectMessage->ClientPort;
+        if (ClientPort) ConnectMessage->ClientPort = NULL;
+    }
+
+    /* Release the lock */
+    KeReleaseGuardedMutex(&LpcpLock);
+
+    /* Check if we had anything to dereference */
+    if (Thread) ObDereferenceObject(Thread);
+    if (ClientPort) ObDereferenceObject(ClientPort);
+
+    /* Free the entry */
+    ExFreeToPagedLookasideList(&LpcpMessagesLookaside, Message);
+
+    /* Reacquire the lock if needed */
+    if ((LockHeld) && !(Flags & 2)) KeAcquireGuardedMutex(&LpcpLock);
+}
+
+VOID
+NTAPI
+LpcpDestroyPortQueue(IN PLPCP_PORT_OBJECT Port,
+                     IN BOOLEAN Destroy)
+{
+    PLIST_ENTRY ListHead, NextEntry;
+    PETHREAD Thread;
+    PLPCP_MESSAGE Message;
+    PLPCP_CONNECTION_MESSAGE ConnectMessage;
+    LPCTRACE(LPC_CLOSE_DEBUG, "Port: %p. Flags: %lx\n", Port, Port->Flags);
+
+    /* Hold the lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Disconnect the port to which this port is connected */
+    if (Port->ConnectedPort) Port->ConnectedPort->ConnectedPort = NULL;
+
+    /* Check if this is a connection port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CONNECTION_PORT)
+    {
+        /* Delete the name */
+        Port->Flags |= LPCP_NAME_DELETED;
+    }
+
+    /* Walk all the threads waiting and signal them */
+    ListHead = &Port->LpcReplyChainHead;
+    NextEntry = ListHead->Flink;
+    while (NextEntry != ListHead)
+    {
+        /* Get the Thread */
+        Thread = CONTAINING_RECORD(NextEntry, ETHREAD, LpcReplyChain);
+
+        /* Make sure we're not in exit */
+        if (Thread->LpcExitThreadCalled) break;
+
+        /* Move to the next entry */
+        NextEntry = NextEntry->Flink;
+
+        /* Remove and reinitialize the List */
+        RemoveEntryList(&Thread->LpcReplyChain);
+        InitializeListHead(&Thread->LpcReplyChain);
+
+        /* Check if someone is waiting */
+        if (!KeReadStateSemaphore(&Thread->LpcReplySemaphore))
+        {
+            /* Get the message and check if it's a connection request */
+            Message = Thread->LpcReplyMessage;
+            if (Message->Request.u2.s2.Type == LPC_CONNECTION_REQUEST)
+            {
+                /* Get the connection message */
+                ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
+
+                /* Check if it had a section */
+                if (ConnectMessage->SectionToMap)
+                {
+                    /* Dereference it */
+                    ObDereferenceObject(ConnectMessage->SectionToMap);
+                }
+            }
+
+            /* Clear the reply message */
+            Thread->LpcReplyMessage = NULL;
+
+            /* And remove the message from the port zone */
+            LpcpFreeToPortZone(Message, TRUE);
+        }
+
+        /* Release the semaphore and reset message id count */
+        Thread->LpcReplyMessageId = 0;
+        LpcpCompleteWait(&Thread->LpcReplySemaphore);
+    }
+
+    /* Reinitialize the list head */
+    InitializeListHead(&Port->LpcReplyChainHead);
+
+    /* Loop queued messages */
+    ListHead = &Port->MsgQueue.ReceiveHead;
+    NextEntry =  ListHead->Flink;
+    while (ListHead != NextEntry)
+    {
+        /* Get the message */
+        Message = CONTAINING_RECORD(NextEntry, LPCP_MESSAGE, Entry);
+        NextEntry = NextEntry->Flink;
+
+        /* Free and reinitialize it's list head */
+        InitializeListHead(&Message->Entry);
+
+        /* Remove it from the port zone */
+        LpcpFreeToPortZone(Message, TRUE);
+    }
+
+    /* Reinitialize the message queue list head */
+    InitializeListHead(&Port->MsgQueue.ReceiveHead);
+
+    /* Release the lock */
+    KeReleaseGuardedMutex(&LpcpLock);
+
+    /* Check if we have to free the port entirely */
+    if (Destroy)
+    {
+        /* Check if the semaphore exists */
+        if (Port->MsgQueue.Semaphore)
+        {
+            /* Use the semaphore to find the port queue and free it */
+            ExFreePool(CONTAINING_RECORD(Port->MsgQueue.Semaphore,
+                                         LPCP_NONPAGED_PORT_QUEUE,
+                                         Semaphore));
+        }
+    }
+}
+
+VOID
+NTAPI
+LpcpClosePort(IN PEPROCESS Process OPTIONAL,
+              IN PVOID Object,
+              IN ACCESS_MASK GrantedAccess,
+              IN ULONG ProcessHandleCount,
+              IN ULONG SystemHandleCount)
+{
+    PLPCP_PORT_OBJECT Port = (PLPCP_PORT_OBJECT)Object;
+    LPCTRACE(LPC_CLOSE_DEBUG, "Port: %p. Flags: %lx\n", Port, Port->Flags);
+
+    /* Only Server-side Connection Ports need clean up*/
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CONNECTION_PORT)
+    {
+        /* Check the handle count */
+        switch (SystemHandleCount)
+        {
+            /* No handles left */
+            case 0:
+
+                /* Destroy the port queue */
+                LpcpDestroyPortQueue(Port, TRUE);
+                break;
+
+            /* Last handle remaining */
+            case 1:
+
+                /* Reset the queue only */
+                LpcpDestroyPortQueue(Port, FALSE);
+
+            /* More handles remain, do nothing */
+            default:
+                break;
+        }
+    }
+}
+
+VOID
+NTAPI
+LpcpFreePortClientSecurity(IN PLPCP_PORT_OBJECT Port)
+{
+    /* Check if this is a client port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CLIENT_PORT)
+    {
+        /* Check if security is static */
+        if (!(Port->Flags & LPCP_SECURITY_DYNAMIC))
+        {
+            /* Check if we have a token */
+            if (Port->StaticSecurity.ClientToken)
+            {
+                /* Free security */
+                SeDeleteClientSecurity(&Port->StaticSecurity);
+            }
+        }
+    }
+}
+
+VOID
+NTAPI
+LpcpDeletePort(IN PVOID ObjectBody)
+{
+    LARGE_INTEGER Timeout;
+    PETHREAD Thread;
+    PLPCP_PORT_OBJECT Port = (PLPCP_PORT_OBJECT)ObjectBody;
+    PLPCP_PORT_OBJECT ConnectionPort;
+    PLPCP_MESSAGE Message;
+    PLIST_ENTRY ListHead, NextEntry;
+    HANDLE Pid;
+    CLIENT_DIED_MSG ClientDiedMsg;
+    Timeout.QuadPart = -1000000;
+    PAGED_CODE();
+    LPCTRACE(LPC_CLOSE_DEBUG, "Port: %p. Flags: %lx\n", Port, Port->Flags);
+
+    /* Check if this is a communication port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_COMMUNICATION_PORT)
+    {
+        /* Acquire the lock */
+        KeAcquireGuardedMutex(&LpcpLock);
+
+        /* Get the thread */
+        Thread = Port->ClientThread;
+        if (Thread)
+        {
+            /* Clear it */
+            Port->ClientThread = NULL;
+
+            /* Release the lock and dereference */
+            KeReleaseGuardedMutex(&LpcpLock);
+            ObDereferenceObject(Thread);
+        }
+        else
+        {
+            /* Release the lock */
+            KeReleaseGuardedMutex(&LpcpLock);
+        }
+    }
+
+    /* Check if this is a client-side port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CLIENT_PORT)
+    {
+        /* Setup the client died message */
+        ClientDiedMsg.h.u1.s1.TotalLength = sizeof(ClientDiedMsg);
+        ClientDiedMsg.h.u1.s1.DataLength = sizeof(ClientDiedMsg.CreateTime);
+        ClientDiedMsg.h.u2.ZeroInit = LPC_PORT_CLOSED;
+        ClientDiedMsg.CreateTime = PsGetCurrentProcess()->CreateTime;
+
+        /* Send it */
+        for (;;)
+        {
+            /* Send the message */
+            if (LpcRequestPort(Port,
+                               &ClientDiedMsg.h) != STATUS_NO_MEMORY) break;
+
+            /* Wait until trying again */
+            KeDelayExecutionThread(KernelMode, FALSE, &Timeout);
+        }
+    }
+
+    /* Destroy the port queue */
+    LpcpDestroyPortQueue(Port, TRUE);
+
+    /* Check if we had a client view */
+    if (Port->ClientSectionBase) MmUnmapViewOfSection(PsGetCurrentProcess(),
+                                                      Port->ClientSectionBase);
+
+    /* Check for a server view */
+    if (Port->ServerSectionBase) MmUnmapViewOfSection(PsGetCurrentProcess(),
+                                                      Port->ServerSectionBase);
+
+    /* Get the connection port */
+    ConnectionPort = Port->ConnectionPort;
+    if (ConnectionPort)
+    {
+        /* Get the PID */
+        Pid = PsGetCurrentProcessId();
+
+        /* Acquire the lock */
+        KeAcquireGuardedMutex(&LpcpLock);
+
+        /* Loop the data lists */
+        ListHead = &ConnectionPort->LpcDataInfoChainHead;
+        NextEntry = ListHead->Flink;
+        while (NextEntry != ListHead)
+        {
+            /* Get the message */
+            Message = CONTAINING_RECORD(NextEntry, LPCP_MESSAGE, Entry);
+            NextEntry = NextEntry->Flink;
+
+            /* Check if the PID matches */
+            if (Message->Request.ClientId.UniqueProcess == Pid)
+            {
+                /* Remove it */
+                RemoveEntryList(&Message->Entry);
+                LpcpFreeToPortZone(Message, TRUE);
+            }
+        }
+
+        /* Release the lock */
+        KeReleaseGuardedMutex(&LpcpLock);
+
+        /* Dereference the object unless it's the same port */
+        if (ConnectionPort != Port) ObDereferenceObject(ConnectionPort);
+    }
+
+    /* Check if this is a connection port with a server process*/
+    if (((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CONNECTION_PORT) &&
+        (ConnectionPort->ServerProcess))
+    {
+        /* Dereference the server process */
+        ObDereferenceObject(ConnectionPort->ServerProcess);
+        ConnectionPort->ServerProcess = NULL;
+    }
+
+    /* Free client security */
+    LpcpFreePortClientSecurity(Port);
+    LPCTRACE(LPC_CLOSE_DEBUG, "Port: %p deleted\n", Port);
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/lpc/ntlpc/complete.c b/reactos/ntoskrnl/lpc/ntlpc/complete.c
new file mode 100644 (file)
index 0000000..b5e4e19
--- /dev/null
@@ -0,0 +1,376 @@
+/*
+* PROJECT:         ReactOS Kernel
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            ntoskrnl/lpc/complete.c
+* PURPOSE:         Local Procedure Call: Connection Completion
+* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+*/
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#include "lpc.h"
+#define NDEBUG
+#include <internal/debug.h>
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+VOID
+NTAPI
+LpcpPrepareToWakeClient(IN PETHREAD Thread)
+{
+    PAGED_CODE();
+
+    /* Make sure the thread isn't dying and it has a valid chain */
+    if (!(Thread->LpcExitThreadCalled) &&
+        !(IsListEmpty(&Thread->LpcReplyChain)))
+    {
+        /* Remove it from the list and reinitialize it */
+        RemoveEntryList(&Thread->LpcReplyChain);
+        InitializeListHead(&Thread->LpcReplyChain);
+    }
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtAcceptConnectPort(OUT PHANDLE PortHandle,
+                    IN PVOID PortContext OPTIONAL,
+                    IN PPORT_MESSAGE ReplyMessage,
+                    IN BOOLEAN AcceptConnection,
+                    IN PPORT_VIEW ServerView,
+                    IN PREMOTE_PORT_VIEW ClientView)
+{
+    PLPCP_PORT_OBJECT ConnectionPort, ServerPort, ClientPort;
+    PVOID ClientSectionToMap = NULL;
+    HANDLE Handle;
+    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
+    NTSTATUS Status;
+    ULONG ConnectionInfoLength;
+    PLPCP_MESSAGE Message;
+    PLPCP_CONNECTION_MESSAGE ConnectMessage;
+    PEPROCESS ClientProcess;
+    PETHREAD ClientThread;
+    LARGE_INTEGER SectionOffset;
+    PAGED_CODE();
+    LPCTRACE(LPC_COMPLETE_DEBUG,
+             "Context: %p. Message: %p. Accept: %lx. Views: %p/%p\n",
+             PortContext,
+             ReplyMessage,
+             AcceptConnection,
+             ClientView,
+             ServerView);
+
+    /* Validate the size of the server view */
+    if ((ServerView) && (ServerView->Length != sizeof(PORT_VIEW)))
+    {
+        /* Invalid size */
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Validate the size of the client view */
+    if ((ClientView) && (ClientView->Length != sizeof(REMOTE_PORT_VIEW)))
+    {
+        /* Invalid size */
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Get the client process and thread */
+    Status = PsLookupProcessThreadByCid(&ReplyMessage->ClientId,
+                                        &ClientProcess,
+                                        &ClientThread);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Acquire the LPC Lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Make sure that the client wants a reply, and this is the right one */
+    if (!(ClientThread->LpcReplyMessage) ||
+        !(ReplyMessage->MessageId) ||
+        (ClientThread->LpcReplyMessageId != ReplyMessage->MessageId))
+    {
+        /* Not the reply asked for, or no reply wanted, fail */
+        KeReleaseGuardedMutex(&LpcpLock);
+        ObDereferenceObject(ClientProcess);
+        ObDereferenceObject(ClientThread);
+        return STATUS_REPLY_MESSAGE_MISMATCH;
+    }
+
+    /* Now get the message and connection message */
+    Message = ClientThread->LpcReplyMessage;
+    ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
+
+    /* Get the client and connection port as well */
+    ClientPort = ConnectMessage->ClientPort;
+    ConnectionPort = ClientPort->ConnectionPort;
+
+    /* Make sure that the reply is being sent to the proper server process */
+    if (ConnectionPort->ServerProcess != PsGetCurrentProcess())
+    {
+        /* It's not, so fail */
+        KeReleaseGuardedMutex(&LpcpLock);
+        ObDereferenceObject(ClientProcess);
+        ObDereferenceObject(ClientThread);
+        return STATUS_REPLY_MESSAGE_MISMATCH;
+    }
+
+    /* At this point, don't let other accept attempts happen */
+    ClientThread->LpcReplyMessage = NULL;
+    ClientThread->LpcReplyMessageId = 0;
+
+    /* Clear the client port for now as well, then release the lock */
+    ConnectMessage->ClientPort = NULL;
+    KeReleaseGuardedMutex(&LpcpLock);
+
+    /* Get the connection information length */
+    ConnectionInfoLength = ReplyMessage->u1.s1.DataLength;
+    if (ConnectionInfoLength > ConnectionPort->MaxConnectionInfoLength)
+    {
+        /* Normalize it since it's too large */
+        ConnectionInfoLength = ConnectionPort->MaxConnectionInfoLength;
+    }
+
+    /* Set the sizes of our reply message */
+    Message->Request.u1.s1.DataLength = sizeof(LPCP_CONNECTION_MESSAGE) +
+                                    ConnectionInfoLength;
+    Message->Request.u1.s1.TotalLength = sizeof(LPCP_MESSAGE) +
+                                     Message->Request.u1.s1.DataLength;
+
+    /* Setup the reply message */
+    Message->Request.u2.s2.Type = LPC_REPLY;
+    Message->Request.u2.s2.DataInfoOffset = 0;
+    Message->Request.ClientId = ReplyMessage->ClientId;
+    Message->Request.MessageId = ReplyMessage->MessageId;
+    Message->Request.ClientViewSize = 0;
+    RtlMoveMemory(ConnectMessage + 1, ReplyMessage + 1, ConnectionInfoLength);
+
+    /* At this point, if the caller refused the connection, go to cleanup */
+    if (!AcceptConnection) goto Cleanup;
+
+    /* Otherwise, create the actual port */
+    Status = ObCreateObject(PreviousMode,
+                            LpcPortObjectType,
+                            NULL,
+                            PreviousMode,
+                            NULL,
+                            sizeof(LPCP_PORT_OBJECT),
+                            0,
+                            0,
+                            (PVOID*)&ServerPort);
+    if (!NT_SUCCESS(Status)) goto Cleanup;
+
+    /* Set it up */
+    RtlZeroMemory(ServerPort, sizeof(LPCP_PORT_OBJECT));
+    ServerPort->PortContext = PortContext;
+    ServerPort->Flags = LPCP_COMMUNICATION_PORT;
+    ServerPort->MaxMessageLength = ConnectionPort->MaxMessageLength;
+    InitializeListHead(&ServerPort->LpcReplyChainHead);
+    InitializeListHead(&ServerPort->LpcDataInfoChainHead);
+
+    /* Reference the connection port until we're fully setup */
+    ObReferenceObject(ConnectionPort);
+
+    /* Link the ports together */
+    ServerPort->ConnectionPort = ConnectionPort;
+    ServerPort->ConnectedPort = ClientPort;
+    ClientPort->ConnectedPort = ServerPort;
+
+    /* Also set the creator CID */
+    ServerPort->Creator = PsGetCurrentThread()->Cid;
+    ClientPort->Creator = Message->Request.ClientId;
+
+    /* Get the section associated and then clear it, while inside the lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+    ClientSectionToMap = ConnectMessage->SectionToMap;
+    ConnectMessage->SectionToMap = NULL;
+    KeReleaseGuardedMutex(&LpcpLock);
+
+    /* Now check if there's a client section */
+    if (ClientSectionToMap)
+    {
+        /* Setup the offset */
+        SectionOffset.QuadPart = ConnectMessage->ClientView.SectionOffset;
+
+        /* Map the section */
+        Status = MmMapViewOfSection(ClientSectionToMap,
+                                    PsGetCurrentProcess(),
+                                    &ServerPort->ClientSectionBase,
+                                    0,
+                                    0,
+                                    &SectionOffset,
+                                    &ConnectMessage->ClientView.ViewSize,
+                                    ViewUnmap,
+                                    0,
+                                    PAGE_READWRITE);
+
+        /* Update the offset and check for mapping status */
+        ConnectMessage->ClientView.SectionOffset = SectionOffset.LowPart;
+        if (NT_SUCCESS(Status))
+        {
+            /* Set the view base */
+            ConnectMessage->ClientView.ViewRemoteBase = ServerPort->
+                                                        ClientSectionBase;
+        }
+        else
+        {
+            /* Otherwise, quit */
+            ObDereferenceObject(ServerPort);
+            goto Cleanup;
+        }
+    }
+
+    /* Check if there's a server section */
+    if (ServerView)
+    {
+        /* FIXME: TODO */
+        ASSERT(FALSE);
+    }
+
+    /* Reference the server port until it's fully inserted */
+    ObReferenceObject(ServerPort);
+
+    /* Insert the server port in the namespace */
+    Status = ObInsertObject(ServerPort,
+                            NULL,
+                            PORT_ALL_ACCESS,
+                            0,
+                            NULL,
+                            &Handle);
+    if (!NT_SUCCESS(Status))
+    {
+        /* We failed, remove the extra reference and cleanup */
+        ObDereferenceObject(ServerPort);
+        goto Cleanup;
+    }
+
+    /* Check if the caller gave a client view */
+    if (ClientView)
+    {
+        /* Fill it out */
+        ClientView->ViewBase = ConnectMessage->ClientView.ViewRemoteBase;
+        ClientView->ViewSize = ConnectMessage->ClientView.ViewSize;
+    }
+
+    /* Return the handle to user mode */
+    *PortHandle = Handle;
+    LPCTRACE(LPC_COMPLETE_DEBUG,
+             "Handle: %lx. Messages: %p/%p. Ports: %p/%p/%p\n",
+             Handle,
+             Message,
+             ConnectMessage,
+             ServerPort,
+             ClientPort,
+             ConnectionPort);
+
+    /* If there was no port context, use the handle by default */
+    if (!PortContext) ServerPort->PortContext = Handle;
+    ServerPort->ClientThread = ClientThread;
+
+    /* Set this message as the LPC Reply message while holding the lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+    ClientThread->LpcReplyMessage = Message;
+    KeReleaseGuardedMutex(&LpcpLock);
+
+    /* Clear the thread pointer so it doesn't get cleaned later */
+    ClientThread = NULL;
+
+    /* Remove the extra reference we had added */
+    ObDereferenceObject(ServerPort);
+
+Cleanup:
+    /* If there was a section, dereference it */
+    if (ClientSectionToMap) ObDereferenceObject(ClientSectionToMap);
+
+    /* Check if we got here while still having a client thread */
+    if (ClientThread)
+    {
+        /* FIXME: Complex cleanup code */
+        ASSERT(FALSE);
+    }
+
+    /* Dereference the client port if we have one, and the process */
+    LPCTRACE(LPC_COMPLETE_DEBUG,
+             "Status: %lx. Thread: %p. Process: [%.16s]\n",
+             Status,
+             ClientThread,
+             ClientProcess->ImageFileName);
+    if (ClientPort) ObDereferenceObject(ClientPort);
+    ObDereferenceObject(ClientProcess);
+    return Status;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtCompleteConnectPort(IN HANDLE PortHandle)
+{
+    NTSTATUS Status;
+    PLPCP_PORT_OBJECT Port;
+    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
+    PETHREAD Thread;
+    PAGED_CODE();
+    LPCTRACE(LPC_COMPLETE_DEBUG, "Handle: %lx\n", PortHandle);
+
+    /* Get the Port Object */
+    Status = ObReferenceObjectByHandle(PortHandle,
+                                       PORT_ALL_ACCESS,
+                                       LpcPortObjectType,
+                                       PreviousMode,
+                                       (PVOID*)&Port,
+                                       NULL);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Make sure this is a connection port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_COMMUNICATION_PORT)
+    {
+        /* It isn't, fail */
+        ObDereferenceObject(Port);
+        return STATUS_INVALID_PORT_HANDLE;
+    }
+
+    /* Acquire the lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Make sure we have a client thread */
+    if (!Port->ClientThread)
+    {
+        /* We don't, fail */
+        KeReleaseGuardedMutex(&LpcpLock);
+        ObDereferenceObject(Port);
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Get the thread */
+    Thread = Port->ClientThread;
+
+    /* Make sure it has a reply message */
+    if (!Thread->LpcReplyMessage)
+    {
+        /* It doesn't, fail */
+        KeReleaseGuardedMutex(&LpcpLock);
+        ObDereferenceObject(Port);
+        return STATUS_PORT_DISCONNECTED;
+    }
+
+    /* Clear the client thread and wake it up */
+    Port->ClientThread = NULL;
+    LpcpPrepareToWakeClient(Thread);
+
+    /* Release the lock and wait for an answer */
+    KeReleaseGuardedMutex(&LpcpLock);
+    LpcpCompleteWait(&Thread->LpcReplySemaphore);
+
+    /* Dereference the Thread and Port  and return */
+    ObDereferenceObject(Port);
+    ObDereferenceObject(Thread);
+    LPCTRACE(LPC_COMPLETE_DEBUG, "Port: %p. Thread: %p\n", Port, Thread);
+    return Status;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/lpc/ntlpc/connect.c b/reactos/ntoskrnl/lpc/ntlpc/connect.c
new file mode 100644 (file)
index 0000000..2b9259e
--- /dev/null
@@ -0,0 +1,568 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/lpc/connect.c
+ * PURPOSE:         Local Procedure Call: Connection Management
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#include "lpc.h"
+#define NDEBUG
+#include <internal/debug.h>
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+PVOID
+NTAPI
+LpcpFreeConMsg(IN OUT PLPCP_MESSAGE *Message,
+               IN OUT PLPCP_CONNECTION_MESSAGE *ConnectMessage,
+               IN PETHREAD CurrentThread)
+{
+    PVOID SectionToMap;
+
+    /* Acquire the LPC lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Check if the reply chain is not empty */
+    if (!IsListEmpty(&CurrentThread->LpcReplyChain))
+    {
+        /* Remove this entry and re-initialize it */
+        RemoveEntryList(&CurrentThread->LpcReplyChain);
+        InitializeListHead(&CurrentThread->LpcReplyChain);
+    }
+
+    /* Check if there's a reply message */
+    if (CurrentThread->LpcReplyMessage)
+    {
+        /* Get the message */
+        *Message = CurrentThread->LpcReplyMessage;
+
+        /* Clear message data */
+        CurrentThread->LpcReceivedMessageId = 0;
+        CurrentThread->LpcReplyMessage = NULL;
+
+        /* Get the connection message and clear the section */
+        *ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(*Message + 1);
+        SectionToMap = (*ConnectMessage)->SectionToMap;
+        (*ConnectMessage)->SectionToMap = NULL;
+    }
+    else
+    {
+        /* No message to return */
+        *Message = NULL;
+        SectionToMap = NULL;
+    }
+
+    /* Release the lock and return the section */
+    KeReleaseGuardedMutex(&LpcpLock);
+    return SectionToMap;
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtSecureConnectPort(OUT PHANDLE PortHandle,
+                    IN PUNICODE_STRING PortName,
+                    IN PSECURITY_QUALITY_OF_SERVICE Qos,
+                    IN OUT PPORT_VIEW ClientView OPTIONAL,
+                    IN PSID ServerSid OPTIONAL,
+                    IN OUT PREMOTE_PORT_VIEW ServerView OPTIONAL,
+                    OUT PULONG MaxMessageLength OPTIONAL,
+                    IN OUT PVOID ConnectionInformation OPTIONAL,
+                    IN OUT PULONG ConnectionInformationLength OPTIONAL)
+{
+    ULONG ConnectionInfoLength = 0;
+    PLPCP_PORT_OBJECT Port, ClientPort;
+    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
+    NTSTATUS Status = STATUS_SUCCESS;
+    HANDLE Handle;
+    PVOID SectionToMap;
+    PLPCP_MESSAGE Message;
+    PLPCP_CONNECTION_MESSAGE ConnectMessage;
+    PETHREAD Thread = PsGetCurrentThread();
+    ULONG PortMessageLength;
+    LARGE_INTEGER SectionOffset;
+    PTOKEN Token;
+    PTOKEN_USER TokenUserInfo;
+    PAGED_CODE();
+    LPCTRACE(LPC_CONNECT_DEBUG,
+             "Name: %wZ. Qos: %p. Views: %p/%p. Sid: %p\n",
+             PortName,
+             Qos,
+             ClientView,
+             ServerView,
+             ServerSid);
+
+    /* Validate client view */
+    if ((ClientView) && (ClientView->Length != sizeof(PORT_VIEW)))
+    {
+        /* Fail */
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Validate server view */
+    if ((ServerView) && (ServerView->Length != sizeof(REMOTE_PORT_VIEW)))
+    {
+        /* Fail */
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Check if caller sent connection information length */
+    if (ConnectionInformationLength)
+    {
+        /* Retrieve the input length */
+        ConnectionInfoLength = *ConnectionInformationLength;
+    }
+
+    /* Get the port */
+    Status = ObReferenceObjectByName(PortName,
+                                     0,
+                                     NULL,
+                                     PORT_ALL_ACCESS,
+                                     LpcPortObjectType,
+                                     PreviousMode,
+                                     NULL,
+                                     (PVOID *)&Port);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* This has to be a connection port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_CONNECTION_PORT)
+    {
+        /* It isn't, so fail */
+        ObDereferenceObject(Port);
+        return STATUS_INVALID_PORT_HANDLE;
+    }
+
+    /* Check if we have a SID */
+    if (ServerSid)
+    {
+        /* Make sure that we have a server */
+        if (Port->ServerProcess)
+        {
+            /* Get its token and query user information */
+            Token = PsReferencePrimaryToken(Port->ServerProcess);
+            //Status = SeQueryInformationToken(Token, TokenUser, (PVOID*)&TokenUserInfo);
+            // FIXME: Need SeQueryInformationToken
+            Status = STATUS_SUCCESS;
+            TokenUserInfo = ExAllocatePool(PagedPool, sizeof(TOKEN_USER));
+            TokenUserInfo->User.Sid = ServerSid;
+            PsDereferencePrimaryToken(Token);
+
+            /* Check for success */
+            if (NT_SUCCESS(Status))
+            {
+                /* Compare the SIDs */
+                if (!RtlEqualSid(ServerSid, TokenUserInfo->User.Sid))
+                {
+                    /* Fail */
+                    Status = STATUS_SERVER_SID_MISMATCH;
+                }
+
+                /* Free token information */
+                ExFreePool(TokenUserInfo);
+            }
+        }
+        else
+        {
+            /* Invalid SID */
+            Status = STATUS_SERVER_SID_MISMATCH;
+        }
+
+        /* Check if SID failed */
+        if (!NT_SUCCESS(Status))
+        {
+            /* Quit */
+            ObDereferenceObject(Port);
+            return Status;
+        }
+    }
+
+    /* Create the client port */
+    Status = ObCreateObject(PreviousMode,
+                            LpcPortObjectType,
+                            NULL,
+                            PreviousMode,
+                            NULL,
+                            sizeof(LPCP_PORT_OBJECT),
+                            0,
+                            0,
+                            (PVOID *)&ClientPort);
+    if (!NT_SUCCESS(Status))
+    {
+        /* Failed, dereference the server port and return */
+        ObDereferenceObject(Port);
+        return Status;
+    }
+
+    /* Setup the client port */
+    RtlZeroMemory(ClientPort, sizeof(LPCP_PORT_OBJECT));
+    ClientPort->Flags = LPCP_CLIENT_PORT;
+    ClientPort->ConnectionPort = Port;
+    ClientPort->MaxMessageLength = Port->MaxMessageLength;
+    ClientPort->SecurityQos = *Qos;
+    InitializeListHead(&ClientPort->LpcReplyChainHead);
+    InitializeListHead(&ClientPort->LpcDataInfoChainHead);
+
+    /* Check if we have dynamic security */
+    if (Qos->ContextTrackingMode == SECURITY_DYNAMIC_TRACKING)
+    {
+        /* Remember that */
+        ClientPort->Flags |= LPCP_SECURITY_DYNAMIC;
+    }
+    else
+    {
+        /* Create our own client security */
+        Status = SeCreateClientSecurity(Thread,
+                                        Qos,
+                                        FALSE,
+                                        &ClientPort->StaticSecurity);
+        if (!NT_SUCCESS(Status))
+        {
+            /* Security failed, dereference and return */
+            ObDereferenceObject(ClientPort);
+            return Status;
+        }
+    }
+
+    /* Initialize the port queue */
+    Status = LpcpInitializePortQueue(ClientPort);
+    if (!NT_SUCCESS(Status))
+    {
+        /* Failed */
+        ObDereferenceObject(ClientPort);
+        return Status;
+    }
+
+    /* Check if we have a client view */
+    if (ClientView)
+    {
+        /* Get the section handle */
+        Status = ObReferenceObjectByHandle(ClientView->SectionHandle,
+                                           SECTION_MAP_READ |
+                                           SECTION_MAP_WRITE,
+                                           MmSectionObjectType,
+                                           PreviousMode,
+                                           (PVOID*)&SectionToMap,
+                                           NULL);
+        if (!NT_SUCCESS(Status))
+        {
+            /* Fail */
+            ObDereferenceObject(Port);
+            return Status;
+        }
+
+        /* Set the section offset */
+        SectionOffset.QuadPart = ClientView->SectionOffset;
+
+        /* Map it */
+        Status = MmMapViewOfSection(SectionToMap,
+                                    PsGetCurrentProcess(),
+                                    &Port->ClientSectionBase,
+                                    0,
+                                    0,
+                                    &SectionOffset,
+                                    &ClientView->ViewSize,
+                                    ViewUnmap,
+                                    0,
+                                    PAGE_READWRITE);
+
+        /* Update the offset */
+        ClientView->SectionOffset = SectionOffset.LowPart;
+
+        /* Check for failure */
+        if (!NT_SUCCESS(Status))
+        {
+            /* Fail */
+            ObDereferenceObject(SectionToMap);
+            ObDereferenceObject(Port);
+            return Status;
+        }
+
+        /* Update the base */
+        ClientView->ViewBase = Port->ClientSectionBase;
+    }
+    else
+    {
+        /* No section */
+        SectionToMap = NULL;
+    }
+
+    /* Normalize connection information */
+    if (ConnectionInfoLength > Port->MaxConnectionInfoLength)
+    {
+        /* Use the port's maximum allowed value */
+        ConnectionInfoLength = Port->MaxConnectionInfoLength;
+    }
+
+    /* Allocate a message from the port zone */
+    Message = LpcpAllocateFromPortZone();
+    if (!Message)
+    {
+        /* Fail if we couldn't allocate a message */
+        if (SectionToMap) ObDereferenceObject(SectionToMap);
+        ObDereferenceObject(ClientPort);
+        return STATUS_NO_MEMORY;
+    }
+
+    /* Set pointer to the connection message and fill in the CID */
+    ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
+    Message->Request.ClientId = Thread->Cid;
+
+    /* Check if we have a client view */
+    if (ClientView)
+    {
+        /* Set the view size */
+        Message->Request.ClientViewSize = ClientView->ViewSize;
+
+        /* Copy the client view and clear the server view */
+        RtlMoveMemory(&ConnectMessage->ClientView,
+                      ClientView,
+                      sizeof(PORT_VIEW));
+        RtlZeroMemory(&ConnectMessage->ServerView, sizeof(REMOTE_PORT_VIEW));
+    }
+    else
+    {
+        /* Set the size to 0 and clear the connect message */
+        Message->Request.ClientViewSize = 0;
+        RtlZeroMemory(ConnectMessage, sizeof(LPCP_CONNECTION_MESSAGE));
+    }
+
+    /* Set the section and client port. Port is NULL for now */
+    ConnectMessage->ClientPort = NULL;
+    ConnectMessage->SectionToMap = SectionToMap;
+
+    /* Set the data for the connection request message */
+    Message->Request.u1.s1.DataLength = sizeof(LPCP_CONNECTION_MESSAGE) +
+                                        ConnectionInfoLength;
+    Message->Request.u1.s1.TotalLength = sizeof(LPCP_MESSAGE) +
+                                         Message->Request.u1.s1.DataLength;
+    Message->Request.u2.s2.Type = LPC_CONNECTION_REQUEST;
+
+    /* Check if we have connection information */
+    if (ConnectionInformation)
+    {
+        /* Copy it in */
+        RtlMoveMemory(ConnectMessage + 1,
+                      ConnectionInformation,
+                      ConnectionInfoLength);
+    }
+
+    /* Acquire the port lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Check if someone already deleted the port name */
+    if (Port->Flags & LPCP_NAME_DELETED)
+    {
+        /* Fail the request */
+        KeReleaseGuardedMutex(&LpcpLock);
+        Status = STATUS_OBJECT_NAME_NOT_FOUND;
+        goto Cleanup;
+    }
+
+    /* Associate no thread yet */
+    Message->RepliedToThread = NULL;
+
+    /* Generate the Message ID and set it */
+    Message->Request.MessageId =  LpcpNextMessageId++;
+    if (!LpcpNextMessageId) LpcpNextMessageId = 1;
+    Thread->LpcReplyMessageId = Message->Request.MessageId;
+
+    /* Insert the message into the queue and thread chain */
+    InsertTailList(&Port->MsgQueue.ReceiveHead, &Message->Entry);
+    InsertTailList(&Port->LpcReplyChainHead, &Thread->LpcReplyChain);
+    Thread->LpcReplyMessage = Message;
+
+    /* Now we can finally reference the client port and link it*/
+    ObReferenceObject(ClientPort);
+    ConnectMessage->ClientPort = ClientPort;
+
+    /* Release the lock */
+    KeReleaseGuardedMutex(&LpcpLock);
+    LPCTRACE(LPC_CONNECT_DEBUG,
+             "Messages: %p/%p. Ports: %p/%p. Status: %lx\n",
+             Message,
+             ConnectMessage,
+             Port,
+             ClientPort,
+             Status);
+
+    /* If this is a waitable port, set the event */
+    if (Port->Flags & LPCP_WAITABLE_PORT) KeSetEvent(&Port->WaitEvent,
+                                                     1,
+                                                     FALSE);
+
+    /* Release the queue semaphore */
+    LpcpCompleteWait(Port->MsgQueue.Semaphore);
+
+    /* Now wait for a reply */
+    LpcpConnectWait(&Thread->LpcReplySemaphore, PreviousMode);
+
+    /* Check if our wait ended in success */
+    if (Status != STATUS_SUCCESS) goto Cleanup;
+
+    /* Free the connection message */
+    SectionToMap = LpcpFreeConMsg(&Message, &ConnectMessage, Thread);
+
+    /* Check if we got a message back */
+    if (Message)
+    {
+        /* Check for new return length */
+        if ((Message->Request.u1.s1.DataLength -
+             sizeof(LPCP_CONNECTION_MESSAGE)) < ConnectionInfoLength)
+        {
+            /* Set new normalized connection length */
+            ConnectionInfoLength = Message->Request.u1.s1.DataLength -
+                                   sizeof(LPCP_CONNECTION_MESSAGE);
+        }
+
+        /* Check if we had connection information */
+        if (ConnectionInformation)
+        {
+            /* Check if we had a length pointer */
+            if (ConnectionInformationLength)
+            {
+                /* Return the length */
+                *ConnectionInformationLength = ConnectionInfoLength;
+            }
+
+            /* Return the connection information */
+            RtlMoveMemory(ConnectionInformation,
+                          ConnectMessage + 1,
+                          ConnectionInfoLength );
+        }
+
+        /* Make sure we had a connected port */
+        if (ClientPort->ConnectedPort)
+        {
+            /* Get the message length before the port might get killed */
+            PortMessageLength = Port->MaxMessageLength;
+
+            /* Insert the client port */
+            Status = ObInsertObject(ClientPort,
+                                    NULL,
+                                    PORT_ALL_ACCESS,
+                                    0,
+                                    (PVOID *)NULL,
+                                    &Handle);
+            if (NT_SUCCESS(Status))
+            {
+                /* Return the handle */
+                *PortHandle = Handle;
+                LPCTRACE(LPC_CONNECT_DEBUG,
+                         "Handle: %lx. Length: %lx\n",
+                         Handle,
+                         PortMessageLength);
+
+                /* Check if maximum length was requested */
+                if (MaxMessageLength) *MaxMessageLength = PortMessageLength;
+
+                /* Check if we had a client view */
+                if (ClientView)
+                {
+                    /* Copy it back */
+                    RtlMoveMemory(ClientView,
+                                  &ConnectMessage->ClientView,
+                                  sizeof(PORT_VIEW));
+                }
+
+                /* Check if we had a server view */
+                if (ServerView)
+                {
+                    /* Copy it back */
+                    RtlMoveMemory(ServerView,
+                                  &ConnectMessage->ServerView,
+                                  sizeof(REMOTE_PORT_VIEW));
+                }
+            }
+        }
+        else
+        {
+            /* No connection port, we failed */
+            if (SectionToMap) ObDereferenceObject(SectionToMap);
+
+            /* Check if it's because the name got deleted */
+            if (Port->Flags & LPCP_NAME_DELETED)
+            {
+                /* Set the correct status */
+                Status = STATUS_OBJECT_NAME_NOT_FOUND;
+            }
+            else
+            {
+                /* Otherwise, the caller refused us */
+                Status = STATUS_PORT_CONNECTION_REFUSED;
+            }
+
+            /* Kill the port */
+            ObDereferenceObject(ClientPort);
+        }
+
+        /* Free the message */
+        LpcpFreeToPortZone(Message, FALSE);
+        return Status;
+    }
+
+    /* No reply message, fail */
+    if (SectionToMap) ObDereferenceObject(SectionToMap);
+    ObDereferenceObject(ClientPort);
+    return STATUS_PORT_CONNECTION_REFUSED;
+
+Cleanup:
+    /* We failed, free the message */
+    SectionToMap = LpcpFreeConMsg(&Message, &ConnectMessage, Thread);
+
+    /* Check if the semaphore got signaled */
+    if (KeReadStateSemaphore(&Thread->LpcReplySemaphore))
+    {
+        /* Wait on it */
+        KeWaitForSingleObject(&Thread->LpcReplySemaphore,
+                              KernelMode,
+                              Executive,
+                              FALSE,
+                              NULL);
+    }
+
+    /* Check if we had a message and free it */
+    if (Message) LpcpFreeToPortZone(Message, FALSE);
+
+    /* Dereference other objects */
+    if (SectionToMap) ObDereferenceObject(SectionToMap);
+    ObDereferenceObject(ClientPort);
+
+    /* Return status */
+    return Status;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtConnectPort(OUT PHANDLE PortHandle,
+              IN PUNICODE_STRING PortName,
+              IN PSECURITY_QUALITY_OF_SERVICE Qos,
+              IN PPORT_VIEW ClientView,
+              IN PREMOTE_PORT_VIEW ServerView,
+              OUT PULONG MaxMessageLength,
+              IN PVOID ConnectionInformation,
+              OUT PULONG ConnectionInformationLength)
+{
+    /* Call the newer API */
+    return NtSecureConnectPort(PortHandle,
+                               PortName,
+                               Qos,
+                               ClientView,
+                               NULL,
+                               ServerView,
+                               MaxMessageLength,
+                               ConnectionInformation,
+                               ConnectionInformationLength);
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/lpc/ntlpc/create.c b/reactos/ntoskrnl/lpc/ntlpc/create.c
new file mode 100644 (file)
index 0000000..2bf08c1
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/lpc/create.c
+ * PURPOSE:         Local Procedure Call: Port/Queue/Message Creation
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#include "lpc.h"
+#define NDEBUG
+#include <internal/debug.h>
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+NTSTATUS
+NTAPI
+LpcpInitializePortQueue(IN PLPCP_PORT_OBJECT Port)
+{
+    PLPCP_NONPAGED_PORT_QUEUE MessageQueue;
+
+    /* Allocate the queue */
+    MessageQueue = ExAllocatePoolWithTag(NonPagedPool,
+                                         sizeof(LPCP_NONPAGED_PORT_QUEUE),
+                                         TAG('P', 'o', 'r', 't'));
+    if (!MessageQueue) return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* Set it up */
+    KeInitializeSemaphore(&MessageQueue->Semaphore, 0, MAXLONG);
+    MessageQueue->BackPointer = Port;
+
+    /* And link it with the Paged Pool part */
+    Port->MsgQueue.Semaphore = &MessageQueue->Semaphore;
+    InitializeListHead(&Port->MsgQueue.ReceiveHead);
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+LpcpCreatePort(OUT PHANDLE PortHandle,
+               IN POBJECT_ATTRIBUTES ObjectAttributes,
+               IN ULONG MaxConnectionInfoLength,
+               IN ULONG MaxMessageLength,
+               IN ULONG MaxPoolUsage,
+               IN BOOLEAN Waitable)
+{
+    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
+    NTSTATUS Status;
+    PLPCP_PORT_OBJECT Port;
+    LPCTRACE(LPC_CREATE_DEBUG, "Name: %wZ\n", ObjectAttributes->ObjectName);
+
+    /* Create the Object */
+    Status = ObCreateObject(PreviousMode,
+                            LpcPortObjectType,
+                            ObjectAttributes,
+                            PreviousMode,
+                            NULL,
+                            sizeof(LPCP_PORT_OBJECT),
+                            0,
+                            0,
+                            (PVOID*)&Port);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Set up the Object */
+    RtlZeroMemory(Port, sizeof(LPCP_PORT_OBJECT));
+    Port->ConnectionPort = Port;
+    Port->Creator = PsGetCurrentThread()->Cid;
+    InitializeListHead(&Port->LpcDataInfoChainHead);
+    InitializeListHead(&Port->LpcReplyChainHead);
+
+    /* Check if we don't have a name */
+    if (!ObjectAttributes->ObjectName->Buffer)
+    {
+        /* Set up for an unconnected port */
+        Port->Flags = LPCP_UNCONNECTED_PORT;
+        Port->ConnectedPort = Port;
+        Port->ServerProcess = NULL;
+    }
+    else
+    {
+        /* Set up for a named connection port */
+        Port->Flags = LPCP_CONNECTION_PORT;
+        Port->ServerProcess = PsGetCurrentProcess();
+
+        /* Don't let the process die on us */
+        ObReferenceObject(Port->ServerProcess);
+    }
+
+    /* Check if this is a waitable port */
+    if (Waitable) Port->Flags |= LPCP_WAITABLE_PORT;
+
+    /* Setup the port queue */
+    Status = LpcpInitializePortQueue(Port);
+    if (!NT_SUCCESS(Status))
+    {
+        /* Fail */
+        ObDereferenceObject(Port);
+        return Status;
+    }
+
+    /* Check if this is a waitable port */
+    if (Port->Flags & LPCP_WAITABLE_PORT)
+    {
+        /* Setup the wait event */
+        KeInitializeEvent(&Port->WaitEvent, NotificationEvent, FALSE);
+    }
+
+    /* Set the maximum message size allowed */
+    Port->MaxMessageLength = LpcpMaxMessageSize -
+                             FIELD_OFFSET(LPCP_MESSAGE, Request);
+
+    /* Now subtract the actual message structures and get the data size */
+    Port->MaxConnectionInfoLength = Port->MaxMessageLength -
+                                    sizeof(PORT_MESSAGE) -
+                                    sizeof(LPCP_CONNECTION_MESSAGE);
+
+    /* Validate the sizes */
+    if (Port->MaxConnectionInfoLength < MaxConnectionInfoLength)
+    {
+        /* Not enough space for your request */
+        ObDereferenceObject(Port);
+        return STATUS_INVALID_PARAMETER_3;
+    }
+    else if (Port->MaxMessageLength < MaxMessageLength)
+    {
+        /* Not enough space for your request */
+        ObDereferenceObject(Port);
+        return STATUS_INVALID_PARAMETER_4;
+    }
+
+    /* Now set the custom setting */
+    Port->MaxMessageLength = MaxMessageLength;
+
+    /* Insert it now */
+    Status = ObInsertObject((PVOID)Port,
+                            NULL,
+                            PORT_ALL_ACCESS,
+                            0,
+                            NULL,
+                            PortHandle);
+
+    /* Return success or the error */
+    LPCTRACE(LPC_CREATE_DEBUG, "Port: %p. Handle: %lx\n", Port, *PortHandle);
+    return Status;
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtCreatePort(OUT PHANDLE PortHandle,
+             IN POBJECT_ATTRIBUTES ObjectAttributes,
+             IN ULONG MaxConnectInfoLength,
+             IN ULONG MaxDataLength,
+             IN ULONG MaxPoolUsage)
+{
+    PAGED_CODE();
+
+    /* Call the internal API */
+    return LpcpCreatePort(PortHandle,
+                          ObjectAttributes,
+                          MaxConnectInfoLength,
+                          MaxDataLength,
+                          MaxPoolUsage,
+                          FALSE);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtCreateWaitablePort(OUT PHANDLE PortHandle,
+                     IN POBJECT_ATTRIBUTES ObjectAttributes,
+                     IN ULONG MaxConnectInfoLength,
+                     IN ULONG MaxDataLength,
+                     IN ULONG MaxPoolUsage)
+{
+    PAGED_CODE();
+
+    /* Call the internal API */
+    return LpcpCreatePort(PortHandle,
+                          ObjectAttributes,
+                          MaxConnectInfoLength,
+                          MaxDataLength,
+                          MaxPoolUsage,
+                          TRUE);
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/lpc/ntlpc/listen.c b/reactos/ntoskrnl/lpc/ntlpc/listen.c
new file mode 100644 (file)
index 0000000..ee2ade0
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/lpc/listen.c
+ * PURPOSE:         Local Procedure Call: Listening
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#include "lpc.h"
+#define NDEBUG
+#include <internal/debug.h>
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtListenPort(IN HANDLE PortHandle,
+             OUT PPORT_MESSAGE ConnectMessage)
+{
+        NTSTATUS Status;
+        PAGED_CODE();
+        LPCTRACE(LPC_LISTEN_DEBUG, "Handle: %lx\n", PortHandle);
+
+        /* Wait forever for a connection request. */
+        for (;;)
+        {
+            /* Do the wait */
+            Status = NtReplyWaitReceivePort(PortHandle,
+                                            NULL,
+                                            NULL,
+                                            ConnectMessage);
+
+            /* Accept only LPC_CONNECTION_REQUEST requests. */
+            if ((Status != STATUS_SUCCESS) ||
+                (LpcpGetMessageType(ConnectMessage) == LPC_CONNECTION_REQUEST))
+            {
+                /* Break out */
+                break;
+            }
+        }
+
+        /* Return status */
+        return Status;
+}
+
+
+/* EOF */
diff --git a/reactos/ntoskrnl/lpc/ntlpc/lpc.h b/reactos/ntoskrnl/lpc/ntlpc/lpc.h
new file mode 100644 (file)
index 0000000..5570e81
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+* PROJECT:         ReactOS Kernel
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            ntoskrnl/include/lpc.h
+* PURPOSE:         Internal header for the Local Procedure Call
+* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+*/
+
+//
+// Define this if you want debugging support
+//
+#define _LPC_DEBUG_                                         0x01
+
+//
+// These define the Debug Masks Supported
+//
+#define LPC_CREATE_DEBUG                                    0x01
+#define LPC_CLOSE_DEBUG                                     0x02
+#define LPC_CONNECT_DEBUG                                   0x04
+#define LPC_LISTEN_DEBUG                                    0x08
+#define LPC_REPLY_DEBUG                                     0x10
+#define LPC_COMPLETE_DEBUG                                  0x20
+#define LPC_SEND_DEBUG                                      0x40
+
+//
+// Debug/Tracing support
+//
+#if _LPC_DEBUG_
+#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
+#define LPCTRACE(x, ...)                                    \
+    {                                                       \
+        DbgPrintEx("%s [%.16s] - ",                         \
+                   __FUNCTION__,                            \
+                   PsGetCurrentProcess()->ImageFileName);   \
+        DbgPrintEx(__VA_ARGS__);                            \
+    }
+#else
+#define LPCTRACE(x, ...)                                    \
+    if (x & LpcpTraceLevel)                                 \
+    {                                                       \
+        DbgPrint("%s [%.16s:%lx] - ",                       \
+                 __FUNCTION__,                              \
+                 PsGetCurrentProcess()->ImageFileName,      \
+                 PsGetCurrentThreadId());                   \
+        DbgPrint(__VA_ARGS__);                              \
+    }
+#endif
+#endif
+
+//
+// Internal Port Management
+//
+VOID
+NTAPI
+LpcpClosePort(
+    IN PEPROCESS Process OPTIONAL,
+    IN PVOID Object,
+    IN ACCESS_MASK GrantedAccess,
+    IN ULONG ProcessHandleCount,
+    IN ULONG SystemHandleCount
+);
+
+VOID
+NTAPI
+LpcpDeletePort(
+    IN PVOID ObjectBody
+);
+
+NTSTATUS
+NTAPI
+LpcpInitializePortQueue(
+    IN PLPCP_PORT_OBJECT Port
+);
+
+VOID
+NTAPI
+LpcpFreeToPortZone(
+    IN PLPCP_MESSAGE Message,
+    IN ULONG Flags
+);
+
+VOID
+NTAPI
+LpcpMoveMessage(
+    IN PPORT_MESSAGE Destination,
+    IN PPORT_MESSAGE Origin,
+    IN PVOID Data,
+    IN ULONG MessageType,
+    IN PCLIENT_ID ClientId
+);
+
+VOID
+NTAPI
+LpcpSaveDataInfoMessage(
+    IN PLPCP_PORT_OBJECT Port,
+    IN PLPCP_MESSAGE Message
+);
+
+//
+// Module-external utlity functions
+//
+VOID
+NTAPI
+LpcExitThread(
+    IN PETHREAD Thread
+);
+
+//
+// Initialization functions
+//
+NTSTATUS
+NTAPI
+LpcpInitSystem(
+    VOID
+);
+
+//
+// Global data inside the Process Manager
+//
+extern POBJECT_TYPE LpcPortObjectType;
+extern ULONG LpcpNextMessageId, LpcpNextCallbackId;
+extern KGUARDED_MUTEX LpcpLock;
+extern PAGED_LOOKASIDE_LIST LpcpMessagesLookaside;
+extern ULONG LpcpMaxMessageSize;
+extern ULONG LpcpTraceLevel;
+
+//
+// Inlined Functions
+//
+#include "lpc_x.h"
similarity index 76%
rename from reactos/ntoskrnl/include/internal/lpc_x.h
rename to reactos/ntoskrnl/lpc/ntlpc/lpc_x.h
index 6e8acf5..3c0bc8f 100644 (file)
-/*\r
-* PROJECT:         ReactOS Kernel\r
-* LICENSE:         GPL - See COPYING in the top level directory\r
-* FILE:            ntoskrnl/include/lpc_x.h\r
-* PURPOSE:         Intenral Inlined Functions for Local Procedure Call\r
-* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)\r
-*/\r
-\r
-//\r
-// Gets the message type, removing the kernel-mode flag\r
-//\r
-#define LpcpGetMessageType(x)                               \\r
-    ((x)->u2.s2.Type &~ LPC_KERNELMODE_MESSAGE)\r
-\r
-//\r
-// Waits on an LPC semaphore for a receive operation\r
-//\r
-#define LpcpReceiveWait(s, w)                               \\r
-{                                                           \\r
-    LPCTRACE(LPC_REPLY_DEBUG, "Wait: %p\n", s);             \\r
-    Status = KeWaitForSingleObject(s,                       \\r
-                                   WrLpcReceive,            \\r
-                                   w,                       \\r
-                                   FALSE,                   \\r
-                                   NULL);                   \\r
-    LPCTRACE(LPC_REPLY_DEBUG, "Wait done: %lx\n", Status);  \\r
-}\r
-\r
-//\r
-// Waits on an LPC semaphore for a reply operation\r
-//\r
-#define LpcpReplyWait(s, w)                                 \\r
-{                                                           \\r
-    LPCTRACE(LPC_SEND_DEBUG, "Wait: %p\n", s);              \\r
-    Status = KeWaitForSingleObject(s,                       \\r
-                                   WrLpcReply,              \\r
-                                   w,                       \\r
-                                   FALSE,                   \\r
-                                   NULL);                   \\r
-    LPCTRACE(LPC_SEND_DEBUG, "Wait done: %lx\n", Status);   \\r
-    if (Status == STATUS_USER_APC)                          \\r
-    {                                                       \\r
-        /* We were preempted by an APC */                   \\r
-        if (KeReadStateSemaphore(s))                        \\r
-        {                                                   \\r
-            /* It's still signaled, so wait on it */        \\r
-            KeWaitForSingleObject(s,                        \\r
-                                  WrExecutive,              \\r
-                                  KernelMode,               \\r
-                                  FALSE,                    \\r
-                                  NULL);                    \\r
-            Status = STATUS_SUCCESS;                        \\r
-        }                                                   \\r
-    }                                                       \\r
-}\r
-\r
-//\r
-// Waits on an LPC semaphore for a connect operation\r
-//\r
-#define LpcpConnectWait(s, w)                               \\r
-{                                                           \\r
-    LPCTRACE(LPC_CONNECT_DEBUG, "Wait: %p\n", s);           \\r
-    Status = KeWaitForSingleObject(s,                       \\r
-                                   Executive,               \\r
-                                   w,                       \\r
-                                   FALSE,                   \\r
-                                   NULL);                   \\r
-    LPCTRACE(LPC_CONNECT_DEBUG, "Wait done: %lx\n", Status);\\r
-    if (Status == STATUS_USER_APC)                          \\r
-    {                                                       \\r
-        /* We were preempted by an APC */                   \\r
-        if (KeReadStateSemaphore(s))                        \\r
-        {                                                   \\r
-            /* It's still signaled, so wait on it */        \\r
-            KeWaitForSingleObject(s,                        \\r
-                                  WrExecutive,              \\r
-                                  KernelMode,               \\r
-                                  FALSE,                    \\r
-                                  NULL);                    \\r
-            Status = STATUS_SUCCESS;                        \\r
-        }                                                   \\r
-    }                                                       \\r
-}\r
-\r
-//\r
-// Releases an LPC Semaphore to complete a wait\r
-//\r
-#define LpcpCompleteWait(s)                                 \\r
-{                                                           \\r
-    /* Release the semaphore */                             \\r
-    LPCTRACE(LPC_SEND_DEBUG, "Release: %p\n", s);           \\r
-    KeReleaseSemaphore(s, 1, 1, FALSE);                     \\r
-}\r
-\r
-//\r
-// Allocates a new message\r
-//\r
-PLPCP_MESSAGE\r
-FORCEINLINE\r
-LpcpAllocateFromPortZone(VOID)\r
-{\r
-    PLPCP_MESSAGE Message;\r
-\r
-    /* Allocate a message from the port zone while holding the lock */\r
-    KeAcquireGuardedMutex(&LpcpLock);\r
-    Message = ExAllocateFromPagedLookasideList(&LpcpMessagesLookaside);\r
-    if (!Message)\r
-    {\r
-        /* Fail, and let caller cleanup */\r
-        KeReleaseGuardedMutex(&LpcpLock);\r
-        return NULL;\r
-    }\r
-\r
-    /* Initialize it */\r
-    InitializeListHead(&Message->Entry);\r
-    Message->RepliedToThread = NULL;\r
-    Message->Request.u2.ZeroInit = 0;\r
-\r
-    /* Release the lock */\r
-    KeReleaseGuardedMutex(&LpcpLock);\r
-    return Message;\r
-}\r
-\r
-//\r
-// Get the LPC Message associated to the Thread\r
-//\r
-PLPCP_MESSAGE\r
-FORCEINLINE\r
-LpcpGetMessageFromThread(IN PETHREAD Thread)\r
-{\r
-    /* Check if the port flag is set */\r
-    if (((ULONG_PTR)Thread->LpcReplyMessage) & LPCP_THREAD_FLAG_IS_PORT)\r
-    {\r
-        /* The pointer is actually a port, not a message, so return NULL */\r
-        return NULL;\r
-    }\r
-\r
-    /* Otherwise, this is a message. Return the pointer */\r
-    return (PVOID)((ULONG_PTR)Thread->LpcReplyMessage & ~LPCP_THREAD_FLAGS);\r
-}\r
-\r
-PLPCP_PORT_OBJECT\r
-FORCEINLINE\r
-LpcpGetPortFromThread(IN PETHREAD Thread)\r
-{\r
-    /* Check if the port flag is set */\r
-    if (((ULONG_PTR)Thread->LpcReplyMessage) & LPCP_THREAD_FLAG_IS_PORT)\r
-    {\r
-        /* The pointer is actually a port, return it */\r
-        return (PVOID)((ULONG_PTR)Thread->LpcWaitingOnPort &\r
-                       ~LPCP_THREAD_FLAGS);\r
-    }\r
-\r
-    /* Otherwise, this is a message. There is nothing to return */\r
-    return NULL;\r
-}\r
-\r
-VOID\r
-FORCEINLINE\r
-LpcpSetPortToThread(IN PETHREAD Thread,\r
-                    IN PLPCP_PORT_OBJECT Port)\r
-{\r
-    /* Set the port object */\r
-    Thread->LpcWaitingOnPort = (PVOID)(((ULONG_PTR)Port) |\r
-                                       LPCP_THREAD_FLAG_IS_PORT);\r
-}\r
+/*
+* PROJECT:         ReactOS Kernel
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            ntoskrnl/include/lpc_x.h
+* PURPOSE:         Intenral Inlined Functions for Local Procedure Call
+* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+*/
+
+//
+// Gets the message type, removing the kernel-mode flag
+//
+#define LpcpGetMessageType(x)                               \
+    ((x)->u2.s2.Type &~ LPC_KERNELMODE_MESSAGE)
+
+//
+// Waits on an LPC semaphore for a receive operation
+//
+#define LpcpReceiveWait(s, w)                               \
+{                                                           \
+    LPCTRACE(LPC_REPLY_DEBUG, "Wait: %p\n", s);             \
+    Status = KeWaitForSingleObject(s,                       \
+                                   WrLpcReceive,            \
+                                   w,                       \
+                                   FALSE,                   \
+                                   NULL);                   \
+    LPCTRACE(LPC_REPLY_DEBUG, "Wait done: %lx\n", Status);  \
+}
+
+//
+// Waits on an LPC semaphore for a reply operation
+//
+#define LpcpReplyWait(s, w)                                 \
+{                                                           \
+    LPCTRACE(LPC_SEND_DEBUG, "Wait: %p\n", s);              \
+    Status = KeWaitForSingleObject(s,                       \
+                                   WrLpcReply,              \
+                                   w,                       \
+                                   FALSE,                   \
+                                   NULL);                   \
+    LPCTRACE(LPC_SEND_DEBUG, "Wait done: %lx\n", Status);   \
+    if (Status == STATUS_USER_APC)                          \
+    {                                                       \
+        /* We were preempted by an APC */                   \
+        if (KeReadStateSemaphore(s))                        \
+        {                                                   \
+            /* It's still signaled, so wait on it */        \
+            KeWaitForSingleObject(s,                        \
+                                  Executive,                \
+                                  KernelMode,               \
+                                  FALSE,                    \
+                                  NULL);                    \
+            Status = STATUS_SUCCESS;                        \
+        }                                                   \
+    }                                                       \
+}
+
+//
+// Waits on an LPC semaphore for a connect operation
+//
+#define LpcpConnectWait(s, w)                               \
+{                                                           \
+    LPCTRACE(LPC_CONNECT_DEBUG, "Wait: %p\n", s);           \
+    Status = KeWaitForSingleObject(s,                       \
+                                   Executive,               \
+                                   w,                       \
+                                   FALSE,                   \
+                                   NULL);                   \
+    LPCTRACE(LPC_CONNECT_DEBUG, "Wait done: %lx\n", Status);\
+    if (Status == STATUS_USER_APC)                          \
+    {                                                       \
+        /* We were preempted by an APC */                   \
+        if (KeReadStateSemaphore(s))                        \
+        {                                                   \
+            /* It's still signaled, so wait on it */        \
+            KeWaitForSingleObject(s,                        \
+                                  Executive,                \
+                                  KernelMode,               \
+                                  FALSE,                    \
+                                  NULL);                    \
+            Status = STATUS_SUCCESS;                        \
+        }                                                   \
+    }                                                       \
+}
+
+//
+// Releases an LPC Semaphore to complete a wait
+//
+#define LpcpCompleteWait(s)                                 \
+{                                                           \
+    /* Release the semaphore */                             \
+    LPCTRACE(LPC_SEND_DEBUG, "Release: %p\n", s);           \
+    KeReleaseSemaphore(s, 1, 1, FALSE);                     \
+}
+
+//
+// Allocates a new message
+//
+PLPCP_MESSAGE
+FORCEINLINE
+LpcpAllocateFromPortZone(VOID)
+{
+    PLPCP_MESSAGE Message;
+
+    /* Allocate a message from the port zone while holding the lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+    Message = ExAllocateFromPagedLookasideList(&LpcpMessagesLookaside);
+    if (!Message)
+    {
+        /* Fail, and let caller cleanup */
+        KeReleaseGuardedMutex(&LpcpLock);
+        return NULL;
+    }
+
+    /* Initialize it */
+    InitializeListHead(&Message->Entry);
+    Message->RepliedToThread = NULL;
+    Message->Request.u2.ZeroInit = 0;
+
+    /* Release the lock */
+    KeReleaseGuardedMutex(&LpcpLock);
+    return Message;
+}
diff --git a/reactos/ntoskrnl/lpc/ntlpc/port.c b/reactos/ntoskrnl/lpc/ntlpc/port.c
new file mode 100644 (file)
index 0000000..05aa952
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/lpc/port.c
+ * PURPOSE:         Local Procedure Call: Port Management
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#include "lpc.h"
+#define NDEBUG
+#include <internal/debug.h>
+
+/* GLOBALS *******************************************************************/
+
+POBJECT_TYPE LpcPortObjectType;
+ULONG LpcpMaxMessageSize;
+PAGED_LOOKASIDE_LIST LpcpMessagesLookaside;
+KGUARDED_MUTEX LpcpLock;
+ULONG LpcpTraceLevel = LPC_CLOSE_DEBUG;
+ULONG LpcpNextMessageId = 1, LpcpNextCallbackId = 1;
+
+static GENERIC_MAPPING LpcpPortMapping = 
+{
+    STANDARD_RIGHTS_READ,
+    STANDARD_RIGHTS_WRITE,
+    0,
+    PORT_ALL_ACCESS
+};
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+NTSTATUS
+INIT_FUNCTION
+NTAPI
+LpcpInitSystem(VOID)
+{
+    OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
+    UNICODE_STRING Name;
+
+    /* Setup the LPC Lock */
+    KeInitializeGuardedMutex(&LpcpLock);
+
+    /* Create the Port Object Type */
+    RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
+    RtlInitUnicodeString(&Name, L"Port");
+    ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
+    ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(LPCP_PORT_OBJECT);
+    ObjectTypeInitializer.DefaultPagedPoolCharge = sizeof(LPCP_NONPAGED_PORT_QUEUE);
+    ObjectTypeInitializer.GenericMapping = LpcpPortMapping;
+    ObjectTypeInitializer.PoolType = PagedPool;
+    ObjectTypeInitializer.UseDefaultObject = TRUE;
+    ObjectTypeInitializer.CloseProcedure = LpcpClosePort;
+    ObjectTypeInitializer.DeleteProcedure = LpcpDeletePort;
+    ObjectTypeInitializer.ValidAccessMask = PORT_ALL_ACCESS;
+    ObCreateObjectType(&Name,
+                       &ObjectTypeInitializer,
+                       NULL,
+                       &LpcPortObjectType);
+
+    /* Allocate the LPC lookaside list */
+    LpcpMaxMessageSize = LPCP_MAX_MESSAGE_SIZE;
+    ExInitializePagedLookasideList(&LpcpMessagesLookaside,
+                                   NULL,
+                                   NULL,
+                                   0,
+                                   LpcpMaxMessageSize,
+                                   TAG('L', 'p', 'c', 'M'),
+                                   32);
+
+    /* We're done */
+    return STATUS_SUCCESS;
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+NTSTATUS
+NTAPI
+NtImpersonateClientOfPort(IN HANDLE PortHandle,
+                          IN PPORT_MESSAGE ClientMessage)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+NtQueryPortInformationProcess(VOID)
+{
+    /* This is all this function does */
+    return STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS
+NTAPI
+NtQueryInformationPort(IN HANDLE PortHandle,
+                       IN PORT_INFORMATION_CLASS PortInformationClass,
+                       OUT PVOID PortInformation,
+                       IN ULONG PortInformationLength,
+                       OUT PULONG ReturnLength)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/lpc/ntlpc/reply.c b/reactos/ntoskrnl/lpc/ntlpc/reply.c
new file mode 100644 (file)
index 0000000..311002e
--- /dev/null
@@ -0,0 +1,491 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/lpc/reply.c
+ * PURPOSE:         Local Procedure Call: Receive (Replies)
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#include "lpc.h"
+#define NDEBUG
+#include <internal/debug.h>
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+VOID
+NTAPI
+LpcpFreeDataInfoMessage(IN PLPCP_PORT_OBJECT Port,
+                        IN ULONG MessageId,
+                        IN ULONG CallbackId)
+{
+    PLPCP_MESSAGE Message;
+    PLIST_ENTRY ListHead, NextEntry;
+
+    /* Check if the port we want is the connection port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) > LPCP_UNCONNECTED_PORT)
+    {
+        /* Use it */
+        Port = Port->ConnectionPort;
+    }
+
+    /* Loop the list */
+    ListHead = &Port->LpcDataInfoChainHead;
+    NextEntry = ListHead->Flink;
+    while (ListHead != NextEntry)
+    {
+        /* Get the message */
+        Message = CONTAINING_RECORD(NextEntry, LPCP_MESSAGE, Entry);
+
+        /* Make sure it matches */
+        if ((Message->Request.MessageId == MessageId) &&
+            (Message->Request.CallbackId == CallbackId))
+        {
+            /* Unlink and free it */
+            RemoveEntryList(&Message->Entry);
+            InitializeListHead(&Message->Entry);
+            LpcpFreeToPortZone(Message, TRUE);
+            break;
+        }
+
+        /* Go to the next entry */
+        NextEntry = NextEntry->Flink;
+    }
+}
+
+VOID
+NTAPI
+LpcpSaveDataInfoMessage(IN PLPCP_PORT_OBJECT Port,
+                        IN PLPCP_MESSAGE Message)
+{
+    PAGED_CODE();
+
+    /* Acquire the lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Check if the port we want is the connection port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) > LPCP_UNCONNECTED_PORT)
+    {
+        /* Use it */
+        Port = Port->ConnectionPort;
+    }
+
+    /* Link the message */
+    InsertTailList(&Port->LpcDataInfoChainHead, &Message->Entry);
+
+    /* Release the lock */
+    KeReleaseGuardedMutex(&LpcpLock);
+}
+
+VOID
+NTAPI
+LpcpMoveMessage(IN PPORT_MESSAGE Destination,
+                IN PPORT_MESSAGE Origin,
+                IN PVOID Data,
+                IN ULONG MessageType,
+                IN PCLIENT_ID ClientId)
+{
+    /* Set the Message size */
+    LPCTRACE((LPC_REPLY_DEBUG | LPC_SEND_DEBUG),
+             "Destination/Origin: %p/%p. Data: %p. Length: %lx\n",
+             Destination,
+             Origin,
+             Data,
+             Origin->u1.Length);
+    Destination->u1.Length = Origin->u1.Length;
+
+    /* Set the Message Type */
+    Destination->u2.s2.Type = !MessageType ?
+                              Origin->u2.s2.Type : MessageType & 0xFFFF;
+
+    /* Check if we have a Client ID */
+    if (ClientId)
+    {
+        /* Set the Client ID */
+        Destination->ClientId.UniqueProcess = ClientId->UniqueProcess;
+        Destination->ClientId.UniqueThread = ClientId->UniqueThread;
+    }
+    else
+    {
+        /* Otherwise, copy it */
+        Destination->ClientId.UniqueProcess = Origin->ClientId.UniqueProcess;
+        Destination->ClientId.UniqueThread = Origin->ClientId.UniqueThread;
+    }
+
+    /* Copy the MessageId and ClientViewSize */
+    Destination->MessageId = Origin->MessageId;
+    Destination->ClientViewSize = Origin->ClientViewSize;
+
+    /* Copy the Message Data */
+    RtlMoveMemory(Destination + 1,
+                  Data,
+                  ((Destination->u1.Length & 0xFFFF) + 3) &~3);
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+NtReplyPort(IN HANDLE PortHandle,
+            IN PPORT_MESSAGE LpcReply)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtReplyWaitReceivePortEx(IN HANDLE PortHandle,
+                         OUT PVOID *PortContext OPTIONAL,
+                         IN PPORT_MESSAGE ReplyMessage OPTIONAL,
+                         OUT PPORT_MESSAGE ReceiveMessage,
+                         IN PLARGE_INTEGER Timeout OPTIONAL)
+{
+    PLPCP_PORT_OBJECT Port, ReceivePort;
+    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(), WaitMode = PreviousMode;
+    NTSTATUS Status;
+    PLPCP_MESSAGE Message;
+    PETHREAD Thread = PsGetCurrentThread(), WakeupThread;
+    PLPCP_CONNECTION_MESSAGE ConnectMessage;
+    ULONG ConnectionInfoLength;
+    PAGED_CODE();
+    LPCTRACE(LPC_REPLY_DEBUG,
+             "Handle: %lx. Messages: %p/%p. Context: %p\n",
+             PortHandle,
+             ReplyMessage,
+             ReceiveMessage,
+             PortContext);
+
+    /* If this is a system thread, then let it page out its stack */
+    if (Thread->SystemThread) WaitMode = UserMode;
+
+    /* Check if caller has a reply message */
+    if (ReplyMessage)
+    {
+        /* Validate its length */
+        if ((ReplyMessage->u1.s1.DataLength + sizeof(PORT_MESSAGE)) >
+            ReplyMessage->u1.s1.TotalLength)
+        {
+            /* Fail */
+            return STATUS_INVALID_PARAMETER;
+        }
+
+        /* Make sure it has a valid ID */
+        if (!ReplyMessage->MessageId) return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Get the Port object */
+    Status = ObReferenceObjectByHandle(PortHandle,
+                                       0,
+                                       LpcPortObjectType,
+                                       PreviousMode,
+                                       (PVOID*)&Port,
+                                       NULL);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Check if the caller has a reply message */
+    if (ReplyMessage)
+    {
+        /* Validate its length in respect to the port object */
+        if ((ReplyMessage->u1.s1.TotalLength > Port->MaxMessageLength) ||
+            (ReplyMessage->u1.s1.TotalLength <= ReplyMessage->u1.s1.DataLength))
+        {
+            /* Too large, fail */
+            ObDereferenceObject(Port);
+            return STATUS_PORT_MESSAGE_TOO_LONG;
+        }
+    }
+
+    /* Check if this is anything but a client port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_CLIENT_PORT)
+    {
+        /* Use the connection port */
+        ReceivePort = Port->ConnectionPort;
+    }
+    else
+    {
+        /* Otherwise, use the port itself */
+        ReceivePort = Port;
+    }
+
+    /* Check if the caller gave a reply message */
+    if (ReplyMessage)
+    {
+        /* Get the ETHREAD corresponding to it */
+        Status = PsLookupProcessThreadByCid(&ReplyMessage->ClientId,
+                                            NULL,
+                                            &WakeupThread);
+        if (!NT_SUCCESS(Status))
+        {
+            /* No thread found, fail */
+            ObDereferenceObject(Port);
+            return Status;
+        }
+
+        /* Allocate a message from the port zone */
+        Message = LpcpAllocateFromPortZone();
+        if (!Message)
+        {
+            /* Fail if we couldn't allocate a message */
+            ObDereferenceObject(WakeupThread);
+            ObDereferenceObject(Port);
+            return STATUS_NO_MEMORY;
+        }
+
+        /* Keep the lock acquired */
+        KeAcquireGuardedMutex(&LpcpLock);
+
+        /* Make sure this is the reply the thread is waiting for */
+        if (WakeupThread->LpcReplyMessageId != ReplyMessage->MessageId)
+        {
+            /* It isn't, fail */
+            LpcpFreeToPortZone(Message, TRUE);
+            KeReleaseGuardedMutex(&LpcpLock);
+            ObDereferenceObject(WakeupThread);
+            ObDereferenceObject(Port);
+            return STATUS_REPLY_MESSAGE_MISMATCH;
+        }
+
+        /* Copy the message */
+        LpcpMoveMessage(&Message->Request,
+                        ReplyMessage,
+                        ReplyMessage + 1,
+                        LPC_REPLY,
+                        NULL);
+
+        /* Free any data information */
+        LpcpFreeDataInfoMessage(Port,
+                                ReplyMessage->MessageId,
+                                ReplyMessage->CallbackId);
+
+        /* Reference the thread while we use it */
+        ObReferenceObject(WakeupThread);
+        Message->RepliedToThread = WakeupThread;
+
+        /* Set this as the reply message */
+        WakeupThread->LpcReplyMessageId = 0;
+        WakeupThread->LpcReplyMessage = (PVOID)Message;
+
+        /* Check if we have messages on the reply chain */
+        if (!(WakeupThread->LpcExitThreadCalled) &&
+            !(IsListEmpty(&WakeupThread->LpcReplyChain)))
+        {
+            /* Remove us from it and reinitialize it */
+            RemoveEntryList(&WakeupThread->LpcReplyChain);
+            InitializeListHead(&WakeupThread->LpcReplyChain);
+        }
+
+        /* Check if this is the message the thread had received */
+        if ((Thread->LpcReceivedMsgIdValid) &&
+            (Thread->LpcReceivedMessageId == ReplyMessage->MessageId))
+        {
+            /* Clear this data */
+            Thread->LpcReceivedMessageId = 0;
+            Thread->LpcReceivedMsgIdValid = FALSE;
+        }
+
+        /* Release the lock and release the LPC semaphore to wake up waiters */
+        KeReleaseGuardedMutex(&LpcpLock);
+        LpcpCompleteWait(&WakeupThread->LpcReplySemaphore);
+
+        /* Now we can let go of the thread */
+        ObDereferenceObject(WakeupThread);
+    }
+
+    /* Now wait for someone to reply to us */
+    LpcpReceiveWait(ReceivePort->MsgQueue.Semaphore, WaitMode);
+    if (Status != STATUS_SUCCESS) goto Cleanup;
+
+    /* Wait done, get the LPC lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Check if we've received nothing */
+    if (IsListEmpty(&ReceivePort->MsgQueue.ReceiveHead))
+    {
+        /* Check if this was a waitable port and wake it */
+        if (ReceivePort->Flags & LPCP_WAITABLE_PORT)
+        {
+            /* Reset its event */
+            KeResetEvent(&ReceivePort->WaitEvent);
+        }
+
+        /* Release the lock and fail */
+        KeReleaseGuardedMutex(&LpcpLock);
+        ObDereferenceObject(Port);
+        return STATUS_UNSUCCESSFUL;
+    }
+
+    /* Get the message on the queue */
+    Message = CONTAINING_RECORD(RemoveHeadList(&ReceivePort->
+                                               MsgQueue.ReceiveHead),
+                                LPCP_MESSAGE,
+                                Entry);
+
+    /* Check if the queue is empty now */
+    if (IsListEmpty(&ReceivePort->MsgQueue.ReceiveHead))
+    {
+        /* Check if this was a waitable port */
+        if (ReceivePort->Flags & LPCP_WAITABLE_PORT)
+        {
+            /* Reset its event */
+            KeResetEvent(&ReceivePort->WaitEvent);
+        }
+    }
+
+    /* Re-initialize the message's list entry */
+    InitializeListHead(&Message->Entry);
+
+    /* Set this as the received message */
+    Thread->LpcReceivedMessageId = Message->Request.MessageId;
+    Thread->LpcReceivedMsgIdValid = TRUE;
+
+    /* Done touching global data, release the lock */
+    KeReleaseGuardedMutex(&LpcpLock);
+
+    /* Check if this was a connection request */
+    if (LpcpGetMessageType(&Message->Request) == LPC_CONNECTION_REQUEST)
+    {
+        /* Get the connection message */
+        ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
+        LPCTRACE(LPC_REPLY_DEBUG,
+                 "Request Messages: %p/%p\n",
+                 Message,
+                 ConnectMessage);
+
+        /* Get its length */
+        ConnectionInfoLength = Message->Request.u1.s1.DataLength -
+                               sizeof(LPCP_CONNECTION_MESSAGE);
+
+        /* Return it as the receive message */
+        *ReceiveMessage = Message->Request;
+
+        /* Clear our stack variable so the message doesn't get freed */
+        Message = NULL;
+
+        /* Setup the receive message */
+        ReceiveMessage->u1.s1.TotalLength = sizeof(LPCP_MESSAGE) +
+                                            ConnectionInfoLength;
+        ReceiveMessage->u1.s1.DataLength = ConnectionInfoLength;
+        RtlMoveMemory(ReceiveMessage + 1,
+                      ConnectMessage + 1,
+                      ConnectionInfoLength);
+
+        /* Clear the port context if the caller requested one */
+        if (PortContext) *PortContext = NULL;
+    }
+    else if (Message->Request.u2.s2.Type != LPC_REPLY)
+    {
+        /* Otherwise, this is a new message or event */
+        LPCTRACE(LPC_REPLY_DEBUG,
+                 "Non-Reply Messages: %p/%p\n",
+                 &Message->Request,
+                 (&Message->Request) + 1);
+
+        /* Copy it */
+        LpcpMoveMessage(ReceiveMessage,
+                        &Message->Request,
+                        (&Message->Request) + 1,
+                        0,
+                        NULL);
+
+        /* Return its context */
+        if (PortContext) *PortContext = Message->PortContext;
+
+        /* And check if it has data information */
+        if (Message->Request.u2.s2.DataInfoOffset)
+        {
+            /* It does, save it, and don't free the message below */
+            LpcpSaveDataInfoMessage(Port, Message);
+            Message = NULL;
+        }
+    }
+    else
+    {
+        /* This is a reply message, should never happen! */
+        ASSERT(FALSE);
+    }
+
+    /* If we have a message pointer here, free it */
+    if (Message) LpcpFreeToPortZone(Message, FALSE);
+
+Cleanup:
+    /* All done, dereference the port and return the status */
+    LPCTRACE(LPC_REPLY_DEBUG,
+             "Port: %p. Status: %p\n",
+             Port,
+             Status);
+    ObDereferenceObject(Port);
+    return Status;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtReplyWaitReceivePort(IN HANDLE PortHandle,
+                       OUT PVOID *PortContext OPTIONAL,
+                       IN PPORT_MESSAGE ReplyMessage OPTIONAL,
+                       OUT PPORT_MESSAGE ReceiveMessage)
+{
+    /* Call the newer API */
+    return NtReplyWaitReceivePortEx(PortHandle,
+                                    PortContext,
+                                    ReplyMessage,
+                                    ReceiveMessage,
+                                    NULL);
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+NtReplyWaitReplyPort(IN HANDLE PortHandle,
+                     IN PPORT_MESSAGE ReplyMessage)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+NtReadRequestData(IN HANDLE PortHandle,
+                  IN PPORT_MESSAGE Message,
+                  IN ULONG Index,
+                  IN PVOID Buffer,
+                  IN ULONG BufferLength,
+                  OUT PULONG Returnlength)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+NtWriteRequestData(IN HANDLE PortHandle,
+                   IN PPORT_MESSAGE Message,
+                   IN ULONG Index,
+                   IN PVOID Buffer,
+                   IN ULONG BufferLength,
+                   OUT PULONG ReturnLength)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/* EOF */
diff --git a/reactos/ntoskrnl/lpc/ntlpc/send.c b/reactos/ntoskrnl/lpc/ntlpc/send.c
new file mode 100644 (file)
index 0000000..f49e0a6
--- /dev/null
@@ -0,0 +1,426 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/lpc/send.c
+ * PURPOSE:         Local Procedure Call: Sending (Requests)
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#include "lpc.h"
+#define NDEBUG
+#include <internal/debug.h>
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+LpcRequestPort(IN PVOID PortObject,
+               IN PPORT_MESSAGE LpcMessage)
+{
+    PLPCP_PORT_OBJECT Port = (PLPCP_PORT_OBJECT)PortObject, QueuePort;
+    ULONG MessageType;
+    PLPCP_MESSAGE Message;
+    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
+    PAGED_CODE();
+    LPCTRACE(LPC_SEND_DEBUG, "Port: %p. Message: %p\n", Port, LpcMessage);
+
+    /* Check if this is a non-datagram message */
+    if (LpcMessage->u2.s2.Type)
+    {
+        /* Get the message type */
+        MessageType = LpcpGetMessageType(LpcMessage);
+
+        /* Validate it */
+        if ((MessageType < LPC_DATAGRAM) || (MessageType > LPC_CLIENT_DIED))
+        {
+            /* Fail */
+            return STATUS_INVALID_PARAMETER;
+        }
+
+        /* Mark this as a kernel-mode message only if we really came from there */
+        if ((PreviousMode == KernelMode) &&
+            (LpcMessage->u2.s2.Type & LPC_KERNELMODE_MESSAGE))
+        {
+            /* We did, this is a kernel mode message */
+            MessageType |= LPC_KERNELMODE_MESSAGE;
+        }
+    }
+    else
+    {
+        /* This is a datagram */
+        MessageType = LPC_DATAGRAM;
+    }
+
+    /* Can't have data information on this type of call */
+    if (LpcMessage->u2.s2.DataInfoOffset) return STATUS_INVALID_PARAMETER;
+
+    /* Validate message sizes */
+    if ((LpcMessage->u1.s1.TotalLength > Port->MaxMessageLength) ||
+        (LpcMessage->u1.s1.TotalLength <= LpcMessage->u1.s1.DataLength))
+    {
+        /* Fail */
+        return STATUS_PORT_MESSAGE_TOO_LONG;
+    }
+
+    /* Allocate a new message */
+    Message = LpcpAllocateFromPortZone();
+    if (!Message) return STATUS_NO_MEMORY;
+
+    /* Clear the context */
+    Message->PortContext = NULL;
+
+    /* Copy the message */
+    LpcpMoveMessage(&Message->Request,
+                    LpcMessage,
+                    LpcMessage + 1,
+                    MessageType,
+                    &PsGetCurrentThread()->Cid);
+
+    /* Acquire the LPC lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Check if this is anything but a connection port */
+    if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_CONNECTION_PORT)
+    {
+        /* The queue port is the connected port */
+        QueuePort = Port->ConnectedPort;
+        if (QueuePort)
+        {
+            /* Check if this is a client port */
+            if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CLIENT_PORT)
+            {
+                /* Then copy the context */
+                Message->PortContext = QueuePort->PortContext;
+                QueuePort = Port->ConnectionPort;
+            }
+            else if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_COMMUNICATION_PORT)
+            {
+                /* Any other kind of port, use the connection port */
+                QueuePort = Port->ConnectionPort;
+            }
+        }
+    }
+    else
+    {
+        /* For connection ports, use the port itself */
+        QueuePort = PortObject;
+    }
+
+    /* Make sure we have a port */
+    if (QueuePort)
+    {
+        /* Generate the Message ID and set it */
+        Message->Request.MessageId =  LpcpNextMessageId++;
+        if (!LpcpNextMessageId) LpcpNextMessageId = 1;
+        Message->Request.CallbackId = 0;
+
+        /* No Message ID for the thread */
+        PsGetCurrentThread()->LpcReplyMessageId = 0;
+
+        /* Insert the message in our chain */
+        InsertTailList(&QueuePort->MsgQueue.ReceiveHead, &Message->Entry);
+
+        /* Release the lock and release the semaphore */
+        KeReleaseGuardedMutex(&LpcpLock);
+        LpcpCompleteWait(QueuePort->MsgQueue.Semaphore);
+
+        /* If this is a waitable port, wake it up */
+        if (QueuePort->Flags & LPCP_WAITABLE_PORT)
+        {
+            /* Wake it */
+            KeSetEvent(&QueuePort->WaitEvent, IO_NO_INCREMENT, FALSE);
+        }
+
+        /* We're done */
+        LPCTRACE(LPC_SEND_DEBUG, "Port: %p. Message: %p\n", QueuePort, Message);
+        return STATUS_SUCCESS;
+    }
+
+    /* If we got here, then free the message and fail */
+    LpcpFreeToPortZone(Message, TRUE);
+    KeReleaseGuardedMutex(&LpcpLock);
+    return STATUS_PORT_DISCONNECTED;
+}
+
+/*
+* @unimplemented
+*/
+NTSTATUS
+NTAPI
+LpcRequestWaitReplyPort(IN PVOID Port,
+                        IN PPORT_MESSAGE LpcMessageRequest,
+                        OUT PPORT_MESSAGE LpcMessageReply)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+NtRequestPort(IN HANDLE PortHandle,
+              IN PPORT_MESSAGE LpcMessage)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtRequestWaitReplyPort(IN HANDLE PortHandle,
+                       IN PPORT_MESSAGE LpcRequest,
+                       IN OUT PPORT_MESSAGE LpcReply)
+{
+    PLPCP_PORT_OBJECT Port, QueuePort, ReplyPort;
+    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
+    NTSTATUS Status;
+    PLPCP_MESSAGE Message;
+    PETHREAD Thread = PsGetCurrentThread();
+    BOOLEAN Callback;
+    PKSEMAPHORE Semaphore;
+    ULONG MessageType;
+    PAGED_CODE();
+    LPCTRACE(LPC_SEND_DEBUG,
+             "Handle: %lx. Messages: %p/%p. Type: %lx\n",
+             PortHandle,
+             LpcRequest,
+             LpcReply,
+             LpcpGetMessageType(LpcRequest));
+
+    /* Check if the thread is dying */
+    if (Thread->LpcExitThreadCalled) return STATUS_THREAD_IS_TERMINATING;
+
+    /* Check if this is an LPC Request */
+    if (LpcpGetMessageType(LpcRequest) == LPC_REQUEST)
+    {
+        /* Then it's a callback */
+        Callback = TRUE;
+    }
+    else if (LpcpGetMessageType(LpcRequest))
+    {
+        /* This is a not kernel-mode message */
+        return STATUS_INVALID_PARAMETER;
+    }
+    else
+    {
+        /* This is a kernel-mode message without a callback */
+        LpcRequest->u2.s2.Type |= LPC_REQUEST;
+        Callback = FALSE;
+    }
+
+    /* Get the message type */
+    MessageType = LpcRequest->u2.s2.Type;
+
+    /* Validate the length */
+    if ((LpcRequest->u1.s1.DataLength + sizeof(PORT_MESSAGE)) >
+         LpcRequest->u1.s1.TotalLength)
+    {
+        /* Fail */
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Reference the object */
+    Status = ObReferenceObjectByHandle(PortHandle,
+                                       0,
+                                       LpcPortObjectType,
+                                       PreviousMode,
+                                       (PVOID*)&Port,
+                                       NULL);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Validate the message length */
+    if ((LpcRequest->u1.s1.TotalLength > Port->MaxMessageLength) ||
+        (LpcRequest->u1.s1.TotalLength <= LpcRequest->u1.s1.DataLength))
+    {
+        /* Fail */
+        ObDereferenceObject(Port);
+        return STATUS_PORT_MESSAGE_TOO_LONG;
+    }
+
+    /* Allocate a message from the port zone */
+    Message = LpcpAllocateFromPortZone();
+    if (!Message)
+    {
+        /* Fail if we couldn't allocate a message */
+        ObDereferenceObject(Port);
+        return STATUS_NO_MEMORY;
+    }
+
+    /* Check if this is a callback */
+    if (Callback)
+    {
+        /* FIXME: TODO */
+        Semaphore = NULL; // we'd use the Thread Semaphore here
+        ASSERT(FALSE);
+    }
+    else
+    {
+        /* No callback, just copy the message */
+        LpcpMoveMessage(&Message->Request,
+                        LpcRequest,
+                        LpcRequest + 1,
+                        MessageType,
+                        &Thread->Cid);
+
+        /* Acquire the LPC lock */
+        KeAcquireGuardedMutex(&LpcpLock);
+
+        /* Right now clear the port context */
+        Message->PortContext = NULL;
+
+        /* Check if this is a not connection port */
+        if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_CONNECTION_PORT)
+        {
+            /* We want the connected port */
+            QueuePort = Port->ConnectedPort;
+            if (!QueuePort)
+            {
+                /* We have no connected port, fail */
+                LpcpFreeToPortZone(Message, TRUE);
+                KeReleaseGuardedMutex(&LpcpLock);
+                ObDereferenceObject(Port);
+                return STATUS_PORT_DISCONNECTED;
+            }
+
+            /* This will be the rundown port */
+            ReplyPort = QueuePort;
+
+            /* Check if this is a communication port */
+            if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CLIENT_PORT)
+            {
+                /* Copy the port context and use the connection port */
+                Message->PortContext = ReplyPort->PortContext;
+                QueuePort = Port->ConnectionPort;
+            }
+            else if ((Port->Flags & LPCP_PORT_TYPE_MASK) !=
+                      LPCP_COMMUNICATION_PORT)
+            {
+                /* Use the connection port for anything but communication ports */
+                QueuePort = Port->ConnectionPort;
+            }
+        }
+        else
+        {
+            /* Otherwise, for a connection port, use the same port object */
+            QueuePort = ReplyPort = Port;
+        }
+
+        /* No reply thread */
+        Message->RepliedToThread = NULL;
+
+        /* Generate the Message ID and set it */
+        Message->Request.MessageId =  LpcpNextMessageId++;
+        if (!LpcpNextMessageId) LpcpNextMessageId = 1;
+        Message->Request.CallbackId = 0;
+
+        /* Set the message ID for our thread now */
+        Thread->LpcReplyMessageId = Message->Request.MessageId;
+        Thread->LpcReplyMessage = NULL;
+
+        /* Insert the message in our chain */
+        InsertTailList(&QueuePort->MsgQueue.ReceiveHead, &Message->Entry);
+        InsertTailList(&ReplyPort->LpcReplyChainHead, &Thread->LpcReplyChain);
+
+        /* Release the lock and get the semaphore we'll use later */
+        KeReleaseGuardedMutex(&LpcpLock);
+        Semaphore = QueuePort->MsgQueue.Semaphore;
+
+        /* If this is a waitable port, wake it up */
+        if (QueuePort->Flags & LPCP_WAITABLE_PORT)
+        {
+            /* Wake it */
+            KeSetEvent(&QueuePort->WaitEvent, IO_NO_INCREMENT, FALSE);
+        }
+    }
+
+    /* Now release the semaphore */
+    LpcpCompleteWait(Semaphore);
+
+    /* And let's wait for the reply */
+    LpcpReplyWait(&Thread->LpcReplySemaphore, PreviousMode);
+
+    /* Acquire the LPC lock */
+    KeAcquireGuardedMutex(&LpcpLock);
+
+    /* Get the LPC Message and clear our thread's reply data */
+    Message = Thread->LpcReplyMessage;
+    Thread->LpcReplyMessage = NULL;
+    Thread->LpcReplyMessageId = 0;
+
+    /* Check if we have anything on the reply chain*/
+    if (!IsListEmpty(&Thread->LpcReplyChain))
+    {
+        /* Remove this thread and reinitialize the list */
+        RemoveEntryList(&Thread->LpcReplyChain);
+        InitializeListHead(&Thread->LpcReplyChain);
+    }
+
+    /* Release the lock */
+    KeReleaseGuardedMutex(&LpcpLock);
+
+    /* Check if we got a reply */
+    if (Status == STATUS_SUCCESS)
+    {
+        /* Check if we have a valid message */
+        if (Message)
+        {
+            LPCTRACE(LPC_SEND_DEBUG,
+                     "Reply Messages: %p/%p\n",
+                     &Message->Request,
+                     (&Message->Request) + 1);
+
+            /* Move the message */
+            LpcpMoveMessage(LpcReply,
+                            &Message->Request,
+                            (&Message->Request) + 1,
+                            0,
+                            NULL);
+
+            /* Check if this is an LPC request with data information */
+            if ((LpcpGetMessageType(&Message->Request) == LPC_REQUEST) &&
+                (Message->Request.u2.s2.DataInfoOffset))
+            {
+                /* Save the data information */
+                LpcpSaveDataInfoMessage(Port, Message);
+            }
+            else
+            {
+                /* Otherwise, just free it */
+                LpcpFreeToPortZone(Message, FALSE);
+            }
+        }
+        else
+        {
+            /* We don't have a reply */
+            Status = STATUS_LPC_REPLY_LOST;
+        }
+    }
+    else
+    {
+        /* The wait failed, free the message while holding the lock */
+        KeAcquireGuardedMutex(&LpcpLock);
+        LpcpFreeToPortZone(Message, TRUE);
+        KeReleaseGuardedMutex(&LpcpLock);
+    }
+
+    /* All done */
+    LPCTRACE(LPC_SEND_DEBUG,
+             "Port: %p. Status: %p\n",
+             Port,
+             Status);
+    ObDereferenceObject(Port);
+    return Status;
+}
+
+/* EOF */
index adea907..18fec96 100644 (file)
@@ -1,25 +1,29 @@
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/port.c
- * PURPOSE:         Local Procedure Call: Port Management
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
+
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, LpcpInitSystem)
+#endif
 
 /* GLOBALS *******************************************************************/
 
-POBJECT_TYPE LpcPortObjectType;
-ULONG LpcpMaxMessageSize;
-PAGED_LOOKASIDE_LIST LpcpMessagesLookaside;
-KGUARDED_MUTEX LpcpLock;
-ULONG LpcpTraceLevel = 0;
-ULONG LpcpNextMessageId = 1, LpcpNextCallbackId = 1;
+POBJECT_TYPE   LpcPortObjectType = 0;
+ULONG          LpcpNextMessageId = 0; /* 0 is not a valid ID */
+FAST_MUTEX     LpcpLock; /* global internal sync in LPC facility */
 
 static GENERIC_MAPPING LpcpPortMapping = 
 {
@@ -29,78 +33,113 @@ static GENERIC_MAPPING LpcpPortMapping =
     PORT_ALL_ACCESS
 };
 
-/* PRIVATE FUNCTIONS *********************************************************/
+/* FUNCTIONS *****************************************************************/
+
 
-BOOLEAN
+NTSTATUS
+INIT_FUNCTION
 NTAPI
-LpcInitSystem(VOID)
+LpcpInitSystem (VOID)
 {
     OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
     UNICODE_STRING Name;
 
-    /* Setup the LPC Lock */
-    KeInitializeGuardedMutex(&LpcpLock);
-
+    DPRINT("Creating Port Object Type\n");
+  
     /* Create the Port Object Type */
     RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
     RtlInitUnicodeString(&Name, L"Port");
     ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
-    ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(LPCP_PORT_OBJECT);
-    ObjectTypeInitializer.DefaultPagedPoolCharge = sizeof(LPCP_NONPAGED_PORT_QUEUE);
+    ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(EPORT);
     ObjectTypeInitializer.GenericMapping = LpcpPortMapping;
-    ObjectTypeInitializer.PoolType = PagedPool;
+    ObjectTypeInitializer.PoolType = NonPagedPool;
     ObjectTypeInitializer.UseDefaultObject = TRUE;
     ObjectTypeInitializer.CloseProcedure = LpcpClosePort;
     ObjectTypeInitializer.DeleteProcedure = LpcpDeletePort;
     ObjectTypeInitializer.ValidAccessMask = PORT_ALL_ACCESS;
-    ObCreateObjectType(&Name,
-                       &ObjectTypeInitializer,
-                       NULL,
-                       &LpcPortObjectType);
-
-    /* Allocate the LPC lookaside list */
-    LpcpMaxMessageSize = LPCP_MAX_MESSAGE_SIZE;
-    ExInitializePagedLookasideList(&LpcpMessagesLookaside,
-                                   NULL,
-                                   NULL,
-                                   0,
-                                   LpcpMaxMessageSize,
-                                   TAG('L', 'p', 'c', 'M'),
-                                   32);
-
-    /* We're done */
-    return TRUE;
+    ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &LpcPortObjectType);
+
+    LpcpNextMessageId = 0;
+    ExInitializeFastMutex (& LpcpLock);
+
+    return(STATUS_SUCCESS);
 }
 
-/* PUBLIC FUNCTIONS **********************************************************/
 
-NTSTATUS
-NTAPI
-NtImpersonateClientOfPort(IN HANDLE PortHandle,
-                          IN PPORT_MESSAGE ClientMessage)
+/**********************************************************************
+ * NAME                                                        INTERNAL
+ *     NiInitializePort/3
+ *
+ * DESCRIPTION
+ *     Initialize the EPORT object attributes. The Port
+ *     object enters the inactive state.
+ *
+ * ARGUMENTS
+ *     Port    Pointer to an EPORT object to initialize.
+ *     Type    connect (RQST), or communication port (COMM)
+ *     Parent  OPTIONAL connect port a communication port
+ *             is created from
+ *
+ * RETURN VALUE
+ *     STATUS_SUCCESS if initialization succedeed. An error code
+ *     otherwise.
+ */
+NTSTATUS STDCALL
+LpcpInitializePort (IN OUT  PEPORT Port,
+                 IN      USHORT Type,
+                 IN      PEPORT Parent OPTIONAL)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+  if ((Type != EPORT_TYPE_SERVER_RQST_PORT) &&
+      (Type != EPORT_TYPE_SERVER_COMM_PORT) &&
+      (Type != EPORT_TYPE_CLIENT_COMM_PORT))
+  {
+         return STATUS_INVALID_PARAMETER_2;
+  }
+  memset (Port, 0, sizeof(EPORT));
+  KeInitializeSpinLock (& Port->Lock);
+  KeInitializeSemaphore( &Port->Semaphore, 0, MAXLONG );
+  Port->RequestPort = Parent;
+  Port->OtherPort = NULL;
+  Port->QueueLength = 0;
+  Port->ConnectQueueLength = 0;
+  Port->Type = Type;
+  Port->State = EPORT_INACTIVE;
+  InitializeListHead (& Port->QueueListHead);
+  InitializeListHead (& Port->ConnectQueueListHead);
+
+  return (STATUS_SUCCESS);
 }
 
-NTSTATUS
-NTAPI
-NtQueryPortInformationProcess(VOID)
+
+/* MISCELLANEA SYSTEM SERVICES */
+
+
+/**********************************************************************
+ * NAME                                                        SYSTEM
+ *     NtImpersonateClientOfPort/2
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *     PortHandle,
+ *     ClientMessage
+ *
+ * RETURN VALUE
+ */
+NTSTATUS STDCALL
+NtImpersonateClientOfPort (HANDLE              PortHandle,
+                          PPORT_MESSAGE        ClientMessage)
 {
-    /* This is all this function does */
-    return STATUS_UNSUCCESSFUL;
+  UNIMPLEMENTED;
+  return(STATUS_NOT_IMPLEMENTED);
 }
 
 NTSTATUS
 NTAPI
-NtQueryInformationPort(IN HANDLE PortHandle,
-                       IN PORT_INFORMATION_CLASS PortInformationClass,
-                       OUT PVOID PortInformation,
-                       IN ULONG PortInformationLength,
-                       OUT PULONG ReturnLength)
+NtQueryPortInformationProcess(VOID)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    /* This is all this function does */
+    return STATUS_UNSUCCESSFUL;
 }
 
 /* EOF */
diff --git a/reactos/ntoskrnl/lpc/query.c b/reactos/ntoskrnl/lpc/query.c
new file mode 100644 (file)
index 0000000..3463047
--- /dev/null
@@ -0,0 +1,69 @@
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/lpc/query.c
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtQueryInformationPort@20
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *     PortHandle              [IN]
+ *     PortInformationClass    [IN]
+ *     PortInformation         [OUT]
+ *     PortInformationLength   [IN]
+ *     ReturnLength            [OUT]
+ *
+ * RETURN VALUE
+ *     STATUS_SUCCESS if the call succedeed. An error code
+ *     otherwise.
+ *
+ * NOTES
+ *     P. Dabak reports that this system service seems to return
+ *     no information.
+ */
+/*EXPORTED*/ NTSTATUS STDCALL
+NtQueryInformationPort (IN     HANDLE  PortHandle,
+                       IN      PORT_INFORMATION_CLASS  PortInformationClass,
+                       OUT     PVOID   PortInformation,
+                       IN      ULONG   PortInformationLength,
+                       OUT     PULONG  ReturnLength)
+{
+  NTSTATUS     Status;
+  PEPORT               Port;
+
+  Status = ObReferenceObjectByHandle (PortHandle,
+                                     PORT_ALL_ACCESS,   /* AccessRequired */
+                                     LpcPortObjectType,
+                                     UserMode,
+                                     (PVOID *) & Port,
+                                     NULL);
+  if (!NT_SUCCESS(Status))
+    {
+      DPRINT("NtQueryInformationPort() = %x\n", Status);
+      return (Status);
+    }
+  /*
+   * FIXME: NT does nothing here!
+   */
+  ObDereferenceObject (Port);
+  return STATUS_SUCCESS;
+}
+
+
+/* EOF */
diff --git a/reactos/ntoskrnl/lpc/queue.c b/reactos/ntoskrnl/lpc/queue.c
new file mode 100644 (file)
index 0000000..971e108
--- /dev/null
@@ -0,0 +1,83 @@
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/lpc/queue.c
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+VOID STDCALL
+EiEnqueueMessagePort (IN OUT   PEPORT          Port,
+                     IN        PQUEUEDMESSAGE  Message)
+{
+  InsertTailList (&Port->QueueListHead,
+                 &Message->QueueListEntry);
+  Port->QueueLength++;
+}
+
+VOID STDCALL
+EiEnqueueMessageAtHeadPort (IN OUT     PEPORT          Port,
+                           IN  PQUEUEDMESSAGE  Message)
+{
+  InsertTailList (&Port->QueueListHead,
+                 &Message->QueueListEntry);
+  Port->QueueLength++;
+}
+
+PQUEUEDMESSAGE STDCALL
+EiDequeueMessagePort (IN OUT   PEPORT  Port)
+{
+  PQUEUEDMESSAGE       Message;
+  PLIST_ENTRY  entry;
+
+  if (IsListEmpty(&Port->QueueListHead))
+    {
+      return(NULL);
+    }
+  entry = RemoveHeadList (&Port->QueueListHead);
+  Message = CONTAINING_RECORD (entry, QUEUEDMESSAGE, QueueListEntry);
+  Port->QueueLength--;
+
+  return (Message);
+}
+
+
+VOID STDCALL
+EiEnqueueConnectMessagePort (IN OUT    PEPORT          Port,
+                            IN PQUEUEDMESSAGE  Message)
+{
+  InsertTailList (&Port->ConnectQueueListHead,
+                 &Message->QueueListEntry);
+  Port->ConnectQueueLength++;
+}
+
+
+PQUEUEDMESSAGE STDCALL
+EiDequeueConnectMessagePort (IN OUT    PEPORT  Port)
+{
+  PQUEUEDMESSAGE       Message;
+  PLIST_ENTRY  entry;
+
+  if (IsListEmpty(&Port->ConnectQueueListHead))
+    {
+      return(NULL);
+    }
+  entry = RemoveHeadList (&Port->ConnectQueueListHead);
+  Message = CONTAINING_RECORD (entry, QUEUEDMESSAGE, QueueListEntry);
+  Port->ConnectQueueLength--;
+
+  return (Message);
+}
+
+
+/* EOF */
diff --git a/reactos/ntoskrnl/lpc/receive.c b/reactos/ntoskrnl/lpc/receive.c
new file mode 100644 (file)
index 0000000..83631aa
--- /dev/null
@@ -0,0 +1,41 @@
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/lpc/receive.c
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/**********************************************************************
+ * NAME                                                        SYSTEM
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ */
+NTSTATUS STDCALL
+NtReadRequestData (HANDLE              PortHandle,
+                  PPORT_MESSAGE        Message,
+                  ULONG                Index,
+                  PVOID                Buffer,
+                  ULONG                BufferLength,
+                  PULONG               Returnlength)
+{
+       UNIMPLEMENTED;
+       return(STATUS_NOT_IMPLEMENTED);
+}
+
+
+/* EOF */
index ae69951..5fb58c2 100644 (file)
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/reply.c
- * PURPOSE:         Local Procedure Call: Receive (Replies)
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
 /* INCLUDES ******************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
-
-/* PRIVATE FUNCTIONS *********************************************************/
-
-VOID
-NTAPI
-LpcpFreeDataInfoMessage(IN PLPCP_PORT_OBJECT Port,
-                        IN ULONG MessageId,
-                        IN ULONG CallbackId,
-                        IN CLIENT_ID ClientId)
-{
-    PLPCP_MESSAGE Message;
-    PLIST_ENTRY ListHead, NextEntry;
-
-    /* Check if the port we want is the connection port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) > LPCP_UNCONNECTED_PORT)
-    {
-        /* Use it */
-        Port = Port->ConnectionPort;
-        if (!Port) return;
-    }
-
-    /* Loop the list */
-    ListHead = &Port->LpcDataInfoChainHead;
-    NextEntry = ListHead->Flink;
-    while (ListHead != NextEntry)
-    {
-        /* Get the message */
-        Message = CONTAINING_RECORD(NextEntry, LPCP_MESSAGE, Entry);
-
-        /* Make sure it matches */
-        if ((Message->Request.MessageId == MessageId) &&
-            (Message->Request.ClientId.UniqueThread == ClientId.UniqueThread) &&
-            (Message->Request.ClientId.UniqueProcess == ClientId.UniqueProcess))
-        {
-            /* Unlink and free it */
-            RemoveEntryList(&Message->Entry);
-            InitializeListHead(&Message->Entry);
-            LpcpFreeToPortZone(Message, 1);
-            break;
-        }
-
-        /* Go to the next entry */
-        NextEntry = NextEntry->Flink;
-    }
-}
-
-VOID
-NTAPI
-LpcpSaveDataInfoMessage(IN PLPCP_PORT_OBJECT Port,
-                        IN PLPCP_MESSAGE Message,
-                        IN ULONG LockHeld)
-{
-    PAGED_CODE();
-
-    /* Acquire the lock */
-    if (!LockHeld) KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Check if the port we want is the connection port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) > LPCP_UNCONNECTED_PORT)
-    {
-        /* Use it */
-        Port = Port->ConnectionPort;
-        if (!Port)
-        {
-            /* Release the lock and return */
-            if (!LockHeld) KeReleaseGuardedMutex(&LpcpLock);
-            return;
-        }
-    }
-
-    /* Link the message */
-    InsertTailList(&Port->LpcDataInfoChainHead, &Message->Entry);
-
-    /* Release the lock */
-    if (!LockHeld) KeReleaseGuardedMutex(&LpcpLock);
-}
-
-VOID
-NTAPI
-LpcpMoveMessage(IN PPORT_MESSAGE Destination,
-                IN PPORT_MESSAGE Origin,
-                IN PVOID Data,
-                IN ULONG MessageType,
-                IN PCLIENT_ID ClientId)
+#include <internal/debug.h>
+
+/* GLOBALS *******************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+/**********************************************************************
+ * NAME
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ */
+NTSTATUS STDCALL
+EiReplyOrRequestPort (IN       PEPORT          Port,
+                     IN        PPORT_MESSAGE   LpcReply,
+                     IN        ULONG           MessageType,
+                     IN        PEPORT          Sender)
 {
-    /* Set the Message size */
-    LPCTRACE((LPC_REPLY_DEBUG | LPC_SEND_DEBUG),
-             "Destination/Origin: %p/%p. Data: %p. Length: %lx\n",
-             Destination,
-             Origin,
-             Data,
-             Origin->u1.Length);
-    Destination->u1.Length = Origin->u1.Length;
-
-    /* Set the Message Type */
-    Destination->u2.s2.Type = !MessageType ?
-                              Origin->u2.s2.Type : MessageType & 0xFFFF;
-
-    /* Check if we have a Client ID */
-    if (ClientId)
-    {
-        /* Set the Client ID */
-        Destination->ClientId.UniqueProcess = ClientId->UniqueProcess;
-        Destination->ClientId.UniqueThread = ClientId->UniqueThread;
-    }
-    else
-    {
-        /* Otherwise, copy it */
-        Destination->ClientId.UniqueProcess = Origin->ClientId.UniqueProcess;
-        Destination->ClientId.UniqueThread = Origin->ClientId.UniqueThread;
-    }
-
-    /* Copy the MessageId and ClientViewSize */
-    Destination->MessageId = Origin->MessageId;
-    Destination->ClientViewSize = Origin->ClientViewSize;
-
-    /* Copy the Message Data */
-    RtlCopyMemory(Destination + 1,
-                  Data,
-                  ((Destination->u1.Length & 0xFFFF) + 3) &~3);
+   KIRQL oldIrql;
+   PQUEUEDMESSAGE MessageReply;
+   ULONG Size;
+
+   if (Port == NULL)
+     {
+       KEBUGCHECK(0);
+     }
+
+   Size = sizeof(QUEUEDMESSAGE);
+   if (LpcReply && LpcReply->u1.s1.TotalLength > (CSHORT)sizeof(PORT_MESSAGE))
+     {
+       Size += LpcReply->u1.s1.TotalLength - sizeof(PORT_MESSAGE);
+     }
+   MessageReply = ExAllocatePoolWithTag(NonPagedPool, Size, 
+                                       TAG_LPC_MESSAGE);
+   MessageReply->Sender = Sender;
+
+   if (LpcReply != NULL)
+     {
+       memcpy(&MessageReply->Message, LpcReply, LpcReply->u1.s1.TotalLength);
+     }
+   else
+     {
+       MessageReply->Message.u1.s1.TotalLength = sizeof(PORT_MESSAGE);
+       MessageReply->Message.u1.s1.DataLength = 0;
+     }
+
+   MessageReply->Message.ClientId.UniqueProcess = PsGetCurrentProcessId();
+   MessageReply->Message.ClientId.UniqueThread = PsGetCurrentThreadId();
+   MessageReply->Message.u2.s2.Type = (CSHORT)MessageType;
+   MessageReply->Message.MessageId = InterlockedIncrementUL(&LpcpNextMessageId);
+
+   KeAcquireSpinLock(&Port->Lock, &oldIrql);
+   EiEnqueueMessagePort(Port, MessageReply);
+   KeReleaseSpinLock(&Port->Lock, oldIrql);
+
+   return(STATUS_SUCCESS);
 }
 
-/* PUBLIC FUNCTIONS **********************************************************/
 
-/*
- * @unimplemented
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
  */
-NTSTATUS
-NTAPI
-NtReplyPort(IN HANDLE PortHandle,
-            IN PPORT_MESSAGE LpcReply)
+NTSTATUS STDCALL
+NtReplyPort (IN        HANDLE          PortHandle,
+            IN PPORT_MESSAGE   LpcReply)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+   NTSTATUS Status;
+   PEPORT Port;
+
+   DPRINT("NtReplyPort(PortHandle %x, LpcReply %x)\n", PortHandle, LpcReply);
+
+   Status = ObReferenceObjectByHandle(PortHandle,
+                                     PORT_ALL_ACCESS,   /* AccessRequired */
+                                     LpcPortObjectType,
+                                     UserMode,
+                                     (PVOID*)&Port,
+                                     NULL);
+   if (!NT_SUCCESS(Status))
+     {
+       DPRINT("NtReplyPort() = %x\n", Status);
+       return(Status);
+     }
+
+   if (EPORT_DISCONNECTED == Port->State)
+     {
+       ObDereferenceObject(Port);
+       return STATUS_PORT_DISCONNECTED;
+     }
+
+   Status = EiReplyOrRequestPort(Port->OtherPort,
+                                LpcReply,
+                                LPC_REPLY,
+                                Port);
+   KeReleaseSemaphore(&Port->OtherPort->Semaphore, IO_NO_INCREMENT, 1, FALSE);
+
+   ObDereferenceObject(Port);
+
+   return(Status);
 }
 
-/*
- * @implemented
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     NtReplyWaitReceivePortEx
+ *
+ * DESCRIPTION
+ *     Can be used with waitable ports.
+ *     Present only in w2k+.
+ *
+ * ARGUMENTS
+ *     PortHandle
+ *     PortId
+ *     LpcReply
+ *     LpcMessage
+ *     Timeout
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
  */
-NTSTATUS
-NTAPI
+NTSTATUS STDCALL
 NtReplyWaitReceivePortEx(IN HANDLE PortHandle,
                          OUT PVOID *PortContext OPTIONAL,
                          IN PPORT_MESSAGE ReplyMessage OPTIONAL,
                          OUT PPORT_MESSAGE ReceiveMessage,
-                         IN PLARGE_INTEGER Timeout OPTIONAL)
+                                    IN PLARGE_INTEGER Timeout OPTIONAL)
 {
-    PLPCP_PORT_OBJECT Port, ReceivePort, ConnectionPort = NULL;
-    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(), WaitMode = PreviousMode;
-    NTSTATUS Status;
-    PLPCP_MESSAGE Message;
-    PETHREAD Thread = PsGetCurrentThread(), WakeupThread;
-    PLPCP_CONNECTION_MESSAGE ConnectMessage;
-    ULONG ConnectionInfoLength;
-    PAGED_CODE();
-    LPCTRACE(LPC_REPLY_DEBUG,
-             "Handle: %lx. Messages: %p/%p. Context: %p\n",
-             PortHandle,
-             ReplyMessage,
-             ReceiveMessage,
-             PortContext);
-
-    /* If this is a system thread, then let it page out its stack */
-    if (Thread->SystemThread) WaitMode = UserMode;
-
-    /* Check if caller has a reply message */
-    if (ReplyMessage)
-    {
-        /* Validate its length */
-        if ((ReplyMessage->u1.s1.DataLength + sizeof(PORT_MESSAGE)) >
-            ReplyMessage->u1.s1.TotalLength)
-        {
-            /* Fail */
-            return STATUS_INVALID_PARAMETER;
-        }
-
-        /* Make sure it has a valid ID */
-        if (!ReplyMessage->MessageId) return STATUS_INVALID_PARAMETER;
-    }
-
-    /* Get the Port object */
-    Status = ObReferenceObjectByHandle(PortHandle,
-                                       0,
-                                       LpcPortObjectType,
-                                       PreviousMode,
-                                       (PVOID*)&Port,
-                                       NULL);
-    if (!NT_SUCCESS(Status)) return Status;
-
-    /* Check if the caller has a reply message */
-    if (ReplyMessage)
-    {
-        /* Validate its length in respect to the port object */
-        if ((ReplyMessage->u1.s1.TotalLength > Port->MaxMessageLength) ||
-            (ReplyMessage->u1.s1.TotalLength <= ReplyMessage->u1.s1.DataLength))
-        {
-            /* Too large, fail */
-            ObDereferenceObject(Port);
-            return STATUS_PORT_MESSAGE_TOO_LONG;
-        }
-    }
-
-    /* Check if this is anything but a client port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_CLIENT_PORT)
-    {
-        /* Check if this is the connection port */
-        if (Port->ConnectionPort == Port)
-        {
-            /* Use this port */
-            ConnectionPort = ReceivePort = Port;
-            ObReferenceObject(ConnectionPort);
-        }
-        else
-        {
-            /* Acquire the lock */
-            KeAcquireGuardedMutex(&LpcpLock);
-
-            /* Get the port */
-            ConnectionPort = ReceivePort = Port->ConnectionPort;
-            if (!ConnectionPort)
-            {
-                /* Fail */
-                KeReleaseGuardedMutex(&LpcpLock);
-                ObDereferenceObject(Port);
-                return STATUS_PORT_DISCONNECTED;
-            }
-
-            /* Release lock and reference */
-            ObReferenceObject(Port);
-            KeReleaseGuardedMutex(&LpcpLock);
-        }
-    }
-    else
-    {
-        /* Otherwise, use the port itself */
-        ReceivePort = Port;
-    }
-
-    /* Check if the caller gave a reply message */
-    if (ReplyMessage)
-    {
-        /* Get the ETHREAD corresponding to it */
-        Status = PsLookupProcessThreadByCid(&ReplyMessage->ClientId,
-                                            NULL,
-                                            &WakeupThread);
-        if (!NT_SUCCESS(Status))
-        {
-            /* No thread found, fail */
-            ObDereferenceObject(Port);
-            if (ConnectionPort) ObDereferenceObject(ConnectionPort);
-            return Status;
-        }
-
-        /* Allocate a message from the port zone */
-        Message = LpcpAllocateFromPortZone();
-        if (!Message)
-        {
-            /* Fail if we couldn't allocate a message */
-            if (ConnectionPort) ObDereferenceObject(ConnectionPort);
-            ObDereferenceObject(WakeupThread);
-            ObDereferenceObject(Port);
-            return STATUS_NO_MEMORY;
-        }
-
-        /* Keep the lock acquired */
-        KeAcquireGuardedMutex(&LpcpLock);
-
-        /* Make sure this is the reply the thread is waiting for */
-        if ((WakeupThread->LpcReplyMessageId != ReplyMessage->MessageId) ||
-            ((LpcpGetMessageFromThread(WakeupThread)) &&
-             (LpcpGetMessageType(&LpcpGetMessageFromThread(WakeupThread)->
-                                 Request) != LPC_REQUEST)))
-        {
-            /* It isn't, fail */
-            LpcpFreeToPortZone(Message, 3);
-            if (ConnectionPort) ObDereferenceObject(ConnectionPort);
-            ObDereferenceObject(WakeupThread);
-            ObDereferenceObject(Port);
-            return STATUS_REPLY_MESSAGE_MISMATCH;
-        }
-
-        /* Copy the message */
-        LpcpMoveMessage(&Message->Request,
-                        ReplyMessage,
-                        ReplyMessage + 1,
-                        LPC_REPLY,
-                        NULL);
-
-        /* Reference the thread while we use it */
-        ObReferenceObject(WakeupThread);
-        Message->RepliedToThread = WakeupThread;
-
-        /* Set this as the reply message */
-        WakeupThread->LpcReplyMessageId = 0;
-        WakeupThread->LpcReplyMessage = (PVOID)Message;
-
-        /* Check if we have messages on the reply chain */
-        if (!(WakeupThread->LpcExitThreadCalled) &&
-            !(IsListEmpty(&WakeupThread->LpcReplyChain)))
-        {
-            /* Remove us from it and reinitialize it */
-            RemoveEntryList(&WakeupThread->LpcReplyChain);
-            InitializeListHead(&WakeupThread->LpcReplyChain);
-        }
-
-        /* Check if this is the message the thread had received */
-        if ((Thread->LpcReceivedMsgIdValid) &&
-            (Thread->LpcReceivedMessageId == ReplyMessage->MessageId))
-        {
-            /* Clear this data */
-            Thread->LpcReceivedMessageId = 0;
-            Thread->LpcReceivedMsgIdValid = FALSE;
-        }
-
-        /* Free any data information */
-        LpcpFreeDataInfoMessage(Port,
-                                ReplyMessage->MessageId,
-                                ReplyMessage->CallbackId,
-                                ReplyMessage->ClientId);
-
-        /* Release the lock and release the LPC semaphore to wake up waiters */
-        KeReleaseGuardedMutex(&LpcpLock);
-        LpcpCompleteWait(&WakeupThread->LpcReplySemaphore);
-
-        /* Now we can let go of the thread */
-        ObDereferenceObject(WakeupThread);
-    }
-
-    /* Now wait for someone to reply to us */
-    LpcpReceiveWait(ReceivePort->MsgQueue.Semaphore, WaitMode);
-    if (Status != STATUS_SUCCESS) goto Cleanup;
-
-    /* Wait done, get the LPC lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Check if we've received nothing */
-    if (IsListEmpty(&ReceivePort->MsgQueue.ReceiveHead))
-    {
-        /* Check if this was a waitable port and wake it */
-        if (ReceivePort->Flags & LPCP_WAITABLE_PORT)
-        {
-            /* Reset its event */
-            KeResetEvent(&ReceivePort->WaitEvent);
-        }
-
-        /* Release the lock and fail */
-        KeReleaseGuardedMutex(&LpcpLock);
-        if (ConnectionPort) ObDereferenceObject(ConnectionPort);
-        ObDereferenceObject(Port);
-        return STATUS_UNSUCCESSFUL;
-    }
-
-    /* Get the message on the queue */
-    Message = CONTAINING_RECORD(RemoveHeadList(&ReceivePort->
-                                               MsgQueue.ReceiveHead),
-                                LPCP_MESSAGE,
-                                Entry);
-
-    /* Check if the queue is empty now */
-    if (IsListEmpty(&ReceivePort->MsgQueue.ReceiveHead))
-    {
-        /* Check if this was a waitable port */
-        if (ReceivePort->Flags & LPCP_WAITABLE_PORT)
-        {
-            /* Reset its event */
-            KeResetEvent(&ReceivePort->WaitEvent);
-        }
-    }
-
-    /* Re-initialize the message's list entry */
-    InitializeListHead(&Message->Entry);
-
-    /* Set this as the received message */
-    Thread->LpcReceivedMessageId = Message->Request.MessageId;
-    Thread->LpcReceivedMsgIdValid = TRUE;
-
-    /* Check if this was a connection request */
-    if (LpcpGetMessageType(&Message->Request) == LPC_CONNECTION_REQUEST)
-    {
-        /* Get the connection message */
-        ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);
-        LPCTRACE(LPC_REPLY_DEBUG,
-                 "Request Messages: %p/%p\n",
-                 Message,
-                 ConnectMessage);
-
-        /* Get its length */
-        ConnectionInfoLength = Message->Request.u1.s1.DataLength -
-                               sizeof(LPCP_CONNECTION_MESSAGE);
-
-        /* Return it as the receive message */
-        *ReceiveMessage = Message->Request;
-
-        /* Clear our stack variable so the message doesn't get freed */
-        Message = NULL;
-
-        /* Setup the receive message */
-        ReceiveMessage->u1.s1.TotalLength = sizeof(LPCP_MESSAGE) +
-                                            ConnectionInfoLength;
-        ReceiveMessage->u1.s1.DataLength = ConnectionInfoLength;
-        RtlCopyMemory(ReceiveMessage + 1,
-                      ConnectMessage + 1,
-                      ConnectionInfoLength);
-
-        /* Clear the port context if the caller requested one */
-        if (PortContext) *PortContext = NULL;
-    }
-    else if (Message->Request.u2.s2.Type != LPC_REPLY)
-    {
-        /* Otherwise, this is a new message or event */
-        LPCTRACE(LPC_REPLY_DEBUG,
-                 "Non-Reply Messages: %p/%p\n",
-                 &Message->Request,
-                 (&Message->Request) + 1);
-
-        /* Copy it */
-        LpcpMoveMessage(ReceiveMessage,
-                        &Message->Request,
-                        (&Message->Request) + 1,
-                        0,
-                        NULL);
-
-        /* Return its context */
-        if (PortContext) *PortContext = Message->PortContext;
-
-        /* And check if it has data information */
-        if (Message->Request.u2.s2.DataInfoOffset)
-        {
-            /* It does, save it, and don't free the message below */
-            LpcpSaveDataInfoMessage(Port, Message, 1);
-            Message = NULL;
-        }
-    }
-    else
-    {
-        /* This is a reply message, should never happen! */
-        ASSERT(FALSE);
-    }
-
-    /* Check if we have a message pointer here */
-    if (Message)
-    {
-        /* Free it and release the lock */
-        LpcpFreeToPortZone(Message, 3);
-    }
-    else
-    {
-        /* Just release the lock */
-        KeReleaseGuardedMutex(&LpcpLock);
-    }
-
-Cleanup:
-    /* All done, dereference the port and return the status */
-    LPCTRACE(LPC_REPLY_DEBUG,
-             "Port: %p. Status: %p\n",
-             Port,
-             Status);
-    if (ConnectionPort) ObDereferenceObject(ConnectionPort);
-    ObDereferenceObject(Port);
-    return Status;
+   PEPORT Port;
+   KIRQL oldIrql;
+   PQUEUEDMESSAGE Request;
+   BOOLEAN Disconnected;
+   LARGE_INTEGER to;
+   KPROCESSOR_MODE PreviousMode;
+   NTSTATUS Status = STATUS_SUCCESS;
+   
+   PreviousMode = ExGetPreviousMode();
+
+   DPRINT("NtReplyWaitReceivePortEx(PortHandle %x, LpcReply %x, "
+         "LpcMessage %x)\n", PortHandle, ReplyMessage, ReceiveMessage);
+
+   if (PreviousMode != KernelMode)
+     {
+       _SEH_TRY
+         {
+           ProbeForWrite(ReceiveMessage,
+                         sizeof(PORT_MESSAGE),
+                         1);
+         }
+       _SEH_HANDLE
+         {
+           Status = _SEH_GetExceptionCode();
+         }
+       _SEH_END;
+       
+       if (!NT_SUCCESS(Status))
+         {
+           return Status;
+         }
+     }
+
+   Status = ObReferenceObjectByHandle(PortHandle,
+                                     PORT_ALL_ACCESS,
+                                     LpcPortObjectType,
+                                     UserMode,
+                                     (PVOID*)&Port,
+                                     NULL);
+   if (!NT_SUCCESS(Status))
+     {
+       DPRINT1("NtReplyWaitReceivePortEx() = %x\n", Status);
+       return(Status);
+     }
+   if( Port->State == EPORT_DISCONNECTED )
+     {
+       /* If the port is disconnected, force the timeout to be 0
+        * so we don't wait for new messages, because there won't be
+        * any, only try to remove any existing messages
+       */
+       Disconnected = TRUE;
+       to.QuadPart = 0;
+       Timeout = &to;
+     }
+   else Disconnected = FALSE;
+
+   /*
+    * Send the reply, only if port is connected
+    */
+   if (ReplyMessage != NULL && !Disconnected)
+     {
+       Status = EiReplyOrRequestPort(Port->OtherPort,
+                                     ReplyMessage,
+                                     LPC_REPLY,
+                                     Port);
+       KeReleaseSemaphore(&Port->OtherPort->Semaphore, IO_NO_INCREMENT, 1,
+                          FALSE);
+
+       if (!NT_SUCCESS(Status))
+         {
+            ObDereferenceObject(Port);
+            DPRINT1("NtReplyWaitReceivePortEx() = %x\n", Status);
+            return(Status);
+         }
+     }
+
+   /*
+    * Want for a message to be received
+    */
+   Status = KeWaitForSingleObject(&Port->Semaphore,
+                                 UserRequest,
+                                 UserMode,
+                                 FALSE,
+                                 Timeout);
+   if( Status == STATUS_TIMEOUT )
+     {
+       /*
+       * if the port is disconnected, and there are no remaining messages,
+        * return STATUS_PORT_DISCONNECTED
+       */
+       ObDereferenceObject(Port);
+       return(Disconnected ? STATUS_PORT_DISCONNECTED : STATUS_TIMEOUT);
+     }
+
+   if (!NT_SUCCESS(Status))
+     {
+       if (STATUS_THREAD_IS_TERMINATING != Status)
+        {
+          DPRINT1("NtReplyWaitReceivePortEx() = %x\n", Status);
+        }
+       ObDereferenceObject(Port);
+       return(Status);
+     }
+
+   /*
+    * Dequeue the message
+    */
+   KeAcquireSpinLock(&Port->Lock, &oldIrql);
+   Request = EiDequeueMessagePort(Port);
+   KeReleaseSpinLock(&Port->Lock, oldIrql);
+
+   if (Request == NULL)
+     {
+       ObDereferenceObject(Port);
+       return STATUS_UNSUCCESSFUL;
+     }
+
+   if (Request->Message.u2.s2.Type == LPC_CONNECTION_REQUEST)
+     {
+       PORT_MESSAGE Header;
+       PEPORT_CONNECT_REQUEST_MESSAGE CRequest;
+
+       CRequest = (PEPORT_CONNECT_REQUEST_MESSAGE)&Request->Message;
+       memcpy(&Header, &Request->Message, sizeof(PORT_MESSAGE));
+       Header.u1.s1.DataLength = (CSHORT)CRequest->ConnectDataLength;
+       Header.u1.s1.TotalLength = Header.u1.s1.DataLength + sizeof(PORT_MESSAGE);
+       
+       if (PreviousMode != KernelMode)
+         {
+           _SEH_TRY
+             {
+               ProbeForWrite((PVOID)(ReceiveMessage + 1),
+                             CRequest->ConnectDataLength,
+                             1);
+
+               RtlCopyMemory(ReceiveMessage,
+                             &Header,
+                             sizeof(PORT_MESSAGE));
+               RtlCopyMemory((PVOID)(ReceiveMessage + 1),
+                             CRequest->ConnectData,
+                             CRequest->ConnectDataLength);
+             }
+           _SEH_HANDLE
+             {
+               Status = _SEH_GetExceptionCode();
+             }
+           _SEH_END;
+         }
+       else
+         {
+           RtlCopyMemory(ReceiveMessage,
+                         &Header,
+                         sizeof(PORT_MESSAGE));
+           RtlCopyMemory((PVOID)(ReceiveMessage + 1),
+                         CRequest->ConnectData,
+                         CRequest->ConnectDataLength);
+         }
+     }
+   else
+     {
+       if (PreviousMode != KernelMode)
+         {
+           _SEH_TRY
+             {
+               ProbeForWrite(ReceiveMessage,
+                             Request->Message.u1.s1.TotalLength,
+                             1);
+
+               RtlCopyMemory(ReceiveMessage,
+                             &Request->Message,
+                             Request->Message.u1.s1.TotalLength);
+             }
+           _SEH_HANDLE
+             {
+               Status = _SEH_GetExceptionCode();
+             }
+           _SEH_END;
+         }
+       else
+         {
+           RtlCopyMemory(ReceiveMessage,
+                         &Request->Message,
+                         Request->Message.u1.s1.TotalLength);
+         }
+     }
+   if (!NT_SUCCESS(Status))
+     {
+       /*
+       * Copying the message to the caller's buffer failed so
+       * undo what we did and return.
+       * FIXME: Also increment semaphore.
+       */
+       KeAcquireSpinLock(&Port->Lock, &oldIrql);
+       EiEnqueueMessageAtHeadPort(Port, Request);
+       KeReleaseSpinLock(&Port->Lock, oldIrql);
+       ObDereferenceObject(Port);
+       return(Status);
+     }
+   if (Request->Message.u2.s2.Type == LPC_CONNECTION_REQUEST)
+     {
+       KeAcquireSpinLock(&Port->Lock, &oldIrql);
+       EiEnqueueConnectMessagePort(Port, Request);
+       KeReleaseSpinLock(&Port->Lock, oldIrql);
+     }
+   else
+     {
+       ExFreePool(Request);
+     }
+
+   /*
+    * Dereference the port
+    */
+   ObDereferenceObject(Port);
+   return(STATUS_SUCCESS);
 }
 
-/*
- * @implemented
+
+/**********************************************************************
+ * NAME                                                EXPORTED
+ *     NtReplyWaitReceivePort
+ *
+ * DESCRIPTION
+ *     Can be used with waitable ports.
+ *
+ * ARGUMENTS
+ *     PortHandle
+ *     PortId
+ *     LpcReply
+ *     LpcMessage
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
  */
-NTSTATUS
-NTAPI
+NTSTATUS STDCALL
 NtReplyWaitReceivePort(IN HANDLE PortHandle,
                        OUT PVOID *PortContext OPTIONAL,
                        IN PPORT_MESSAGE ReplyMessage OPTIONAL,
                        OUT PPORT_MESSAGE ReceiveMessage)
 {
-    /* Call the newer API */
     return NtReplyWaitReceivePortEx(PortHandle,
-                                    PortContext,
-                                    ReplyMessage,
-                                    ReceiveMessage,
-                                    NULL);
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS
-NTAPI
-NtReplyWaitReplyPort(IN HANDLE PortHandle,
-                     IN PPORT_MESSAGE ReplyMessage)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+                                                   PortContext,
+                                                   ReplyMessage,
+                                                   ReceiveMessage,
+                                                   NULL);
 }
 
-/*
- * @unimplemented
+/**********************************************************************
+ * NAME
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
  */
-NTSTATUS
-NTAPI
-NtReadRequestData(IN HANDLE PortHandle,
-                  IN PPORT_MESSAGE Message,
-                  IN ULONG Index,
-                  IN PVOID Buffer,
-                  IN ULONG BufferLength,
-                  OUT PULONG Returnlength)
+NTSTATUS STDCALL
+NtReplyWaitReplyPort (HANDLE           PortHandle,
+                     PPORT_MESSAGE     ReplyMessage)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+   UNIMPLEMENTED;
+   return(STATUS_NOT_IMPLEMENTED);
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 NTAPI
-NtWriteRequestData(IN HANDLE PortHandle,
-                   IN PPORT_MESSAGE Message,
-                   IN ULONG Index,
-                   IN PVOID Buffer,
-                   IN ULONG BufferLength,
-                   OUT PULONG ReturnLength)
+LpcRequestWaitReplyPort(IN PVOID Port,
+                        IN PPORT_MESSAGE LpcMessageRequest,
+                        OUT PPORT_MESSAGE LpcMessageReply)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    HANDLE PortHandle;
+    NTSTATUS Status;
+    UNICODE_STRING PortName;
+    ULONG ConnectInfoLength;
+
+    //
+    // OMG HAXX!
+    //
+    RtlInitUnicodeString(&PortName, L"\\Windows\\ApiPort");
+    ConnectInfoLength = 0;
+    Status = ZwConnectPort(&PortHandle,
+                           &PortName,
+                           NULL,
+                           NULL,
+                           NULL,
+                           NULL,
+                           NULL,
+                           &ConnectInfoLength);
+
+    Status = ZwRequestWaitReplyPort(PortHandle,
+                                    LpcMessageRequest,
+                                    LpcMessageReply);
+
+    /* Close the handle */
+    ObCloseHandle(PortHandle, KernelMode);
+    return Status;
 }
 
 /* EOF */
index 952f4ae..1dc522f 100644 (file)
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/send.c
- * PURPOSE:         Local Procedure Call: Sending (Requests)
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PURPOSE:         Communication mechanism
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
-#define NDEBUG
-#include <debug.h>
-
-/* PUBLIC FUNCTIONS **********************************************************/
 
-/*
+#define NDEBUG
+#include <internal/debug.h>
+
+/**********************************************************************
+ * NAME
+ *     LpcRequestPort/2
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ *     2002-03-01 EA
+ *     I investigated this function a bit more in depth.
+ *     It looks like the legal values for the MessageType field in the
+ *     message to send are in the range LPC_NEW_MESSAGE .. LPC_CLIENT_DIED,
+ *     but LPC_DATAGRAM is explicitly forbidden.
+ *
  * @implemented
  */
-NTSTATUS
-NTAPI
-LpcRequestPort(IN PVOID PortObject,
-               IN PPORT_MESSAGE LpcMessage)
+NTSTATUS STDCALL LpcRequestPort (IN    PVOID           PortObject,
+                                IN     PPORT_MESSAGE   LpcMessage)
 {
-    PLPCP_PORT_OBJECT Port = PortObject, QueuePort, ConnectionPort = NULL;
-    ULONG MessageType;
-    PLPCP_MESSAGE Message;
-    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
-    PAGED_CODE();
-    LPCTRACE(LPC_SEND_DEBUG, "Port: %p. Message: %p\n", Port, LpcMessage);
-
-    /* Check if this is a non-datagram message */
-    if (LpcMessage->u2.s2.Type)
-    {
-        /* Get the message type */
-        MessageType = LpcpGetMessageType(LpcMessage);
-
-        /* Validate it */
-        if ((MessageType < LPC_DATAGRAM) || (MessageType > LPC_CLIENT_DIED))
-        {
-            /* Fail */
-            return STATUS_INVALID_PARAMETER;
-        }
-
-        /* Mark this as a kernel-mode message only if we really came from it */
-        if ((PreviousMode == KernelMode) &&
-            (LpcMessage->u2.s2.Type & LPC_KERNELMODE_MESSAGE))
-        {
-            /* We did, this is a kernel mode message */
-            MessageType |= LPC_KERNELMODE_MESSAGE;
-        }
-    }
-    else
-    {
-        /* This is a datagram */
-        MessageType = LPC_DATAGRAM;
-    }
-
-    /* Can't have data information on this type of call */
-    if (LpcMessage->u2.s2.DataInfoOffset) return STATUS_INVALID_PARAMETER;
-
-    /* Validate message sizes */
-    if ((LpcMessage->u1.s1.TotalLength > Port->MaxMessageLength) ||
-        (LpcMessage->u1.s1.TotalLength <= LpcMessage->u1.s1.DataLength))
-    {
-        /* Fail */
-        return STATUS_PORT_MESSAGE_TOO_LONG;
-    }
-
-    /* Allocate a new message */
-    Message = LpcpAllocateFromPortZone();
-    if (!Message) return STATUS_NO_MEMORY;
-
-    /* Clear the context */
-    Message->RepliedToThread = NULL;
-    Message->PortContext = NULL;
-
-    /* Copy the message */
-    LpcpMoveMessage(&Message->Request,
-                    LpcMessage,
-                    LpcMessage + 1,
-                    MessageType,
-                    &PsGetCurrentThread()->Cid);
-
-    /* Acquire the LPC lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Check if this is anything but a connection port */
-    if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_CONNECTION_PORT)
-    {
-        /* The queue port is the connected port */
-        QueuePort = Port->ConnectedPort;
-        if (QueuePort)
-        {
-            /* Check if this is a client port */
-            if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CLIENT_PORT)
-            {
-                /* Then copy the context */
-                Message->PortContext = QueuePort->PortContext;
-                ConnectionPort = QueuePort = Port->ConnectionPort;
-                if (!ConnectionPort)
-                {
-                    /* Fail */
-                    LpcpFreeToPortZone(Message, 3);
-                    return STATUS_PORT_DISCONNECTED;
-                }
-            }
-            else if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_COMMUNICATION_PORT)
-            {
-                /* Any other kind of port, use the connection port */
-                ConnectionPort = QueuePort = Port->ConnectionPort;
-                if (!ConnectionPort)
-                {
-                    /* Fail */
-                    LpcpFreeToPortZone(Message, 3);
-                    return STATUS_PORT_DISCONNECTED;
-                }
-            }
-
-            /* If we have a connection port, reference it */
-            if (ConnectionPort) ObReferenceObject(ConnectionPort);
-        }
-    }
-    else
-    {
-        /* For connection ports, use the port itself */
-        QueuePort = PortObject;
-    }
-
-    /* Make sure we have a port */
-    if (QueuePort)
-    {
-        /* Generate the Message ID and set it */
-        Message->Request.MessageId =  LpcpNextMessageId++;
-        if (!LpcpNextMessageId) LpcpNextMessageId = 1;
-        Message->Request.CallbackId = 0;
-
-        /* No Message ID for the thread */
-        PsGetCurrentThread()->LpcReplyMessageId = 0;
-
-        /* Insert the message in our chain */
-        InsertTailList(&QueuePort->MsgQueue.ReceiveHead, &Message->Entry);
-
-        /* Release the lock and release the semaphore */
-        KeEnterCriticalRegion();
-        KeReleaseGuardedMutex(&LpcpLock);
-        LpcpCompleteWait(QueuePort->MsgQueue.Semaphore);
-
-        /* If this is a waitable port, wake it up */
-        if (QueuePort->Flags & LPCP_WAITABLE_PORT)
-        {
-            /* Wake it */
-            KeSetEvent(&QueuePort->WaitEvent, IO_NO_INCREMENT, FALSE);
-        }
-
-        /* We're done */
-        KeLeaveCriticalRegion();
-        if (ConnectionPort) ObDereferenceObject(ConnectionPort);
-        LPCTRACE(LPC_SEND_DEBUG, "Port: %p. Message: %p\n", QueuePort, Message);
-        return STATUS_SUCCESS;
-    }
-
-    /* If we got here, then free the message and fail */
-    LpcpFreeToPortZone(Message, 3);
-    if (ConnectionPort) ObDereferenceObject(ConnectionPort);
-    return STATUS_PORT_DISCONNECTED;
+   NTSTATUS Status;
+   PEPORT Port = (PEPORT)PortObject;
+
+   DPRINT("LpcRequestPort(PortHandle %08x, LpcMessage %08x)\n", Port, LpcMessage);
+
+#ifdef __USE_NT_LPC__
+   /* Check the message's type */
+   if (LPC_NEW_MESSAGE == LpcMessage->u2.s2.Type)
+   {
+      LpcMessage->u2.s2.Type = LPC_DATAGRAM;
+   }
+   else if (LPC_DATAGRAM == LpcMessage->u2.s2.Type)
+   {
+      return STATUS_INVALID_PARAMETER;
+   }
+   else if (LpcMessage->u2.s2.Type > LPC_CLIENT_DIED)
+   {
+      return STATUS_INVALID_PARAMETER;
+   }
+   /* Check the range offset */
+   if (0 != LpcMessage->VirtualRangesOffset)
+   {
+      return STATUS_INVALID_PARAMETER;
+   }
+#endif
+
+   Status = EiReplyOrRequestPort(Port,
+                                LpcMessage,
+                                LPC_DATAGRAM,
+                                Port);
+   KeReleaseSemaphore( &Port->Semaphore, IO_NO_INCREMENT, 1, FALSE );
+
+   return(Status);
 }
 
-/*
-* @unimplemented
-*/
-NTSTATUS
-NTAPI
-LpcRequestWaitReplyPort(IN PVOID Port,
-                        IN PPORT_MESSAGE LpcMessageRequest,
-                        OUT PPORT_MESSAGE LpcMessageReply)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
 
-/*
- * @unimplemented
+/**********************************************************************
+ * NAME
+ *     NtRequestPort/2
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ *
+ * @implemented
  */
-NTSTATUS
-NTAPI
-NtRequestPort(IN HANDLE PortHandle,
-              IN PPORT_MESSAGE LpcMessage)
+NTSTATUS STDCALL NtRequestPort (IN     HANDLE          PortHandle,
+                               IN      PPORT_MESSAGE   LpcMessage)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+   NTSTATUS Status;
+   PEPORT Port;
+
+   DPRINT("NtRequestPort(PortHandle %x LpcMessage %x)\n", PortHandle,
+         LpcMessage);
+
+   Status = ObReferenceObjectByHandle(PortHandle,
+                                     PORT_ALL_ACCESS,
+                                     LpcPortObjectType,
+                                     UserMode,
+                                     (PVOID*)&Port,
+                                     NULL);
+   if (!NT_SUCCESS(Status))
+     {
+       DPRINT("NtRequestPort() = %x\n", Status);
+       return(Status);
+     }
+
+   Status = LpcRequestPort(Port->OtherPort,
+                          LpcMessage);
+
+   ObDereferenceObject(Port);
+   return(Status);
 }
 
-/*
+
+/**********************************************************************
+ * NAME
+ *     NtRequestWaitReplyPort/3
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ *
  * @implemented
  */
-NTSTATUS
-NTAPI
-NtRequestWaitReplyPort(IN HANDLE PortHandle,
-                       IN PPORT_MESSAGE LpcRequest,
-                       IN OUT PPORT_MESSAGE LpcReply)
+NTSTATUS STDCALL
+NtRequestWaitReplyPort (IN HANDLE PortHandle,
+                       PPORT_MESSAGE UnsafeLpcRequest,
+                       PPORT_MESSAGE UnsafeLpcReply)
 {
-    PLPCP_PORT_OBJECT Port, QueuePort, ReplyPort, ConnectionPort = NULL;
-    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
-    NTSTATUS Status;
-    PLPCP_MESSAGE Message;
-    PETHREAD Thread = PsGetCurrentThread();
-    BOOLEAN Callback;
-    PKSEMAPHORE Semaphore;
-    ULONG MessageType;
-    PAGED_CODE();
-    LPCTRACE(LPC_SEND_DEBUG,
-             "Handle: %lx. Messages: %p/%p. Type: %lx\n",
-             PortHandle,
-             LpcRequest,
-             LpcReply,
-             LpcpGetMessageType(LpcRequest));
-
-    /* Check if the thread is dying */
-    if (Thread->LpcExitThreadCalled) return STATUS_THREAD_IS_TERMINATING;
-
-    /* Check if this is an LPC Request */
-    if (LpcpGetMessageType(LpcRequest) == LPC_REQUEST)
-    {
-        /* Then it's a callback */
-        Callback = TRUE;
-    }
-    else if (LpcpGetMessageType(LpcRequest))
-    {
-        /* This is a not kernel-mode message */
-        return STATUS_INVALID_PARAMETER;
-    }
-    else
-    {
-        /* This is a kernel-mode message without a callback */
-        LpcRequest->u2.s2.Type |= LPC_REQUEST;
-        Callback = FALSE;
-    }
-
-    /* Get the message type */
-    MessageType = LpcRequest->u2.s2.Type;
-
-    /* Validate the length */
-    if ((LpcRequest->u1.s1.DataLength + sizeof(PORT_MESSAGE)) >
-         LpcRequest->u1.s1.TotalLength)
-    {
-        /* Fail */
-        return STATUS_INVALID_PARAMETER;
-    }
-
-    /* Reference the object */
-    Status = ObReferenceObjectByHandle(PortHandle,
-                                       0,
-                                       LpcPortObjectType,
-                                       PreviousMode,
-                                       (PVOID*)&Port,
-                                       NULL);
-    if (!NT_SUCCESS(Status)) return Status;
-
-    /* Validate the message length */
-    if ((LpcRequest->u1.s1.TotalLength > Port->MaxMessageLength) ||
-        (LpcRequest->u1.s1.TotalLength <= LpcRequest->u1.s1.DataLength))
-    {
-        /* Fail */
-        ObDereferenceObject(Port);
-        return STATUS_PORT_MESSAGE_TOO_LONG;
-    }
-
-    /* Allocate a message from the port zone */
-    Message = LpcpAllocateFromPortZone();
-    if (!Message)
-    {
-        /* Fail if we couldn't allocate a message */
-        ObDereferenceObject(Port);
-        return STATUS_NO_MEMORY;
-    }
-
-    /* Check if this is a callback */
-    if (Callback)
-    {
-        /* FIXME: TODO */
-        Semaphore = NULL; // we'd use the Thread Semaphore here
-        ASSERT(FALSE);
-    }
-    else
-    {
-        /* No callback, just copy the message */
-        LpcpMoveMessage(&Message->Request,
-                        LpcRequest,
-                        LpcRequest + 1,
-                        MessageType,
-                        &Thread->Cid);
-
-        /* Acquire the LPC lock */
-        KeAcquireGuardedMutex(&LpcpLock);
-
-        /* Right now clear the port context */
-        Message->PortContext = NULL;
-
-        /* Check if this is a not connection port */
-        if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_CONNECTION_PORT)
-        {
-            /* We want the connected port */
-            QueuePort = Port->ConnectedPort;
-            if (!QueuePort)
-            {
-                /* We have no connected port, fail */
-                LpcpFreeToPortZone(Message, 3);
-                ObDereferenceObject(Port);
-                return STATUS_PORT_DISCONNECTED;
-            }
-
-            /* This will be the rundown port */
-            ReplyPort = QueuePort;
-
-            /* Check if this is a communication port */
-            if ((Port->Flags & LPCP_PORT_TYPE_MASK) == LPCP_CLIENT_PORT)
-            {
-                /* Copy the port context and use the connection port */
-                Message->PortContext = QueuePort->PortContext;
-                ConnectionPort = QueuePort = Port->ConnectionPort;
-                if (!ConnectionPort)
-                {
-                    /* Fail */
-                    LpcpFreeToPortZone(Message, 3);
-                    ObDereferenceObject(Port);
-                    return STATUS_PORT_DISCONNECTED;
-                }
-            }
-            else if ((Port->Flags & LPCP_PORT_TYPE_MASK) !=
-                      LPCP_COMMUNICATION_PORT)
-            {
-                /* Use the connection port for anything but communication ports */
-                ConnectionPort = QueuePort = Port->ConnectionPort;
-                if (!ConnectionPort)
-                {
-                    /* Fail */
-                    LpcpFreeToPortZone(Message, 3);
-                    ObDereferenceObject(Port);
-                    return STATUS_PORT_DISCONNECTED;
-                }
-            }
-
-            /* Reference the connection port if it exists */
-            if (ConnectionPort) ObReferenceObject(ConnectionPort);
-        }
-        else
-        {
-            /* Otherwise, for a connection port, use the same port object */
-            QueuePort = ReplyPort = Port;
-        }
-
-        /* No reply thread */
-        Message->RepliedToThread = NULL;
-        Message->SenderPort = Port;
-
-        /* Generate the Message ID and set it */
-        Message->Request.MessageId =  LpcpNextMessageId++;
-        if (!LpcpNextMessageId) LpcpNextMessageId = 1;
-        Message->Request.CallbackId = 0;
-
-        /* Set the message ID for our thread now */
-        Thread->LpcReplyMessageId = Message->Request.MessageId;
-        Thread->LpcReplyMessage = NULL;
-
-        /* Insert the message in our chain */
-        InsertTailList(&QueuePort->MsgQueue.ReceiveHead, &Message->Entry);
-        InsertTailList(&ReplyPort->LpcReplyChainHead, &Thread->LpcReplyChain);
-        LpcpSetPortToThread(Thread, Port);
-
-        /* Release the lock and get the semaphore we'll use later */
-        KeEnterCriticalRegion();
-        KeReleaseGuardedMutex(&LpcpLock);
-        Semaphore = QueuePort->MsgQueue.Semaphore;
-
-        /* If this is a waitable port, wake it up */
-        if (QueuePort->Flags & LPCP_WAITABLE_PORT)
-        {
-            /* Wake it */
-            KeSetEvent(&QueuePort->WaitEvent, IO_NO_INCREMENT, FALSE);
-        }
-    }
-
-    /* Now release the semaphore */
-    LpcpCompleteWait(Semaphore);
-    KeLeaveCriticalRegion();
-
-    /* And let's wait for the reply */
-    LpcpReplyWait(&Thread->LpcReplySemaphore, PreviousMode);
-
-    /* Acquire the LPC lock */
-    KeAcquireGuardedMutex(&LpcpLock);
-
-    /* Get the LPC Message and clear our thread's reply data */
-    Message = LpcpGetMessageFromThread(Thread);
-    Thread->LpcReplyMessage = NULL;
-    Thread->LpcReplyMessageId = 0;
-
-    /* Check if we have anything on the reply chain*/
-    if (!IsListEmpty(&Thread->LpcReplyChain))
-    {
-        /* Remove this thread and reinitialize the list */
-        RemoveEntryList(&Thread->LpcReplyChain);
-        InitializeListHead(&Thread->LpcReplyChain);
-    }
-
-    /* Release the lock */
-    KeReleaseGuardedMutex(&LpcpLock);
-
-    /* Check if we got a reply */
-    if (Status == STATUS_SUCCESS)
-    {
-        /* Check if we have a valid message */
-        if (Message)
-        {
-            LPCTRACE(LPC_SEND_DEBUG,
-                     "Reply Messages: %p/%p\n",
-                     &Message->Request,
-                     (&Message->Request) + 1);
-
-            /* Move the message */
-            LpcpMoveMessage(LpcReply,
-                            &Message->Request,
-                            (&Message->Request) + 1,
-                            0,
-                            NULL);
+   PETHREAD CurrentThread;
+   struct _KPROCESS *AttachedProcess;
+   PEPORT Port;
+   PQUEUEDMESSAGE Message;
+   KIRQL oldIrql;
+   PPORT_MESSAGE LpcRequest;
+   USHORT LpcRequestMessageSize = 0, LpcRequestDataSize = 0;
+   KPROCESSOR_MODE PreviousMode;
+   NTSTATUS Status = STATUS_SUCCESS;
+   
+   PreviousMode = ExGetPreviousMode();
+   
+   if (PreviousMode != KernelMode)
+     {
+       _SEH_TRY
+         {
+           ProbeForRead(UnsafeLpcRequest,
+                        sizeof(PORT_MESSAGE),
+                        1);
+           ProbeForWrite(UnsafeLpcReply,
+                         sizeof(PORT_MESSAGE),
+                         1);
+           LpcRequestMessageSize = UnsafeLpcRequest->u1.s1.TotalLength;
+         }
+       _SEH_HANDLE
+         {
+           Status = _SEH_GetExceptionCode();
+         }
+       _SEH_END;
+       
+       if (!NT_SUCCESS(Status))
+         {
+           return Status;
+         }
+     }
+   else
+     {
+       LpcRequestMessageSize = UnsafeLpcRequest->u1.s1.TotalLength;
+     }
+
+   DPRINT("NtRequestWaitReplyPort(PortHandle %x, LpcRequest %x, "
+         "LpcReply %x)\n", PortHandle, UnsafeLpcRequest, UnsafeLpcReply);
+
+   Status = ObReferenceObjectByHandle(PortHandle,
+                                     PORT_ALL_ACCESS,
+                                     LpcPortObjectType,
+                                     UserMode,
+                                     (PVOID*)&Port,
+                                     NULL);
+   if (!NT_SUCCESS(Status))
+     {
+       return(Status);
+     }
+
+   if (EPORT_DISCONNECTED == Port->State)
+     {
+       ObDereferenceObject(Port);
+       return STATUS_PORT_DISCONNECTED;
+     }
+
+   /* win32k sometimes needs to KeAttach() the CSRSS process in order to make
+      the PortHandle valid. Now that we've got the EPORT structure from the
+      handle we can undo this, so everything is normal again. Need to
+      re-KeAttach() before returning though */
+   CurrentThread = PsGetCurrentThread();
+   if (&CurrentThread->ThreadsProcess->Pcb == CurrentThread->Tcb.ApcState.Process)
+     {
+       AttachedProcess = NULL;
+     }
+   else
+     {
+       AttachedProcess = CurrentThread->Tcb.ApcState.Process;
+       KeDetachProcess();
+     }
+
+   if (LpcRequestMessageSize > LPC_MAX_MESSAGE_LENGTH)
+     {
+       if (NULL != AttachedProcess)
+         {
+           KeAttachProcess(AttachedProcess);
+         }
+       ObDereferenceObject(Port);
+       return(STATUS_PORT_MESSAGE_TOO_LONG);
+     }
+   LpcRequest = ExAllocatePool(NonPagedPool, LpcRequestMessageSize);
+   if (LpcRequest == NULL)
+     {
+       if (NULL != AttachedProcess)
+         {
+           KeAttachProcess(AttachedProcess);
+         }
+       ObDereferenceObject(Port);
+       return(STATUS_NO_MEMORY);
+     }
+   if (PreviousMode != KernelMode)
+     {
+       _SEH_TRY
+         {
+           RtlCopyMemory(LpcRequest,
+                         UnsafeLpcRequest,
+                         LpcRequestMessageSize);
+           LpcRequestMessageSize = LpcRequest->u1.s1.TotalLength;
+           LpcRequestDataSize = LpcRequest->u1.s1.DataLength;
+         }
+       _SEH_HANDLE
+         {
+           Status = _SEH_GetExceptionCode();
+         }
+       _SEH_END;
+       
+       if (!NT_SUCCESS(Status))
+         {
+           ExFreePool(LpcRequest);
+           if (NULL != AttachedProcess)
+             {
+               KeAttachProcess(AttachedProcess);
+             }
+           ObDereferenceObject(Port);
+           return(Status);
+         }
+     }
+   else
+     {
+       RtlCopyMemory(LpcRequest,
+                     UnsafeLpcRequest,
+                     LpcRequestMessageSize);
+       LpcRequestMessageSize = LpcRequest->u1.s1.TotalLength;
+       LpcRequestDataSize = LpcRequest->u1.s1.DataLength;
+     }
+
+   if (LpcRequestMessageSize > LPC_MAX_MESSAGE_LENGTH)
+     {
+       ExFreePool(LpcRequest);
+       if (NULL != AttachedProcess)
+         {
+           KeAttachProcess(AttachedProcess);
+         }
+       ObDereferenceObject(Port);
+       return(STATUS_PORT_MESSAGE_TOO_LONG);
+     }
+   if (LpcRequestDataSize > LPC_MAX_DATA_LENGTH)
+     {
+       ExFreePool(LpcRequest);
+       if (NULL != AttachedProcess)
+         {
+           KeAttachProcess(AttachedProcess);
+         }
+       ObDereferenceObject(Port);
+       return(STATUS_PORT_MESSAGE_TOO_LONG);
+     }
+
+   Status = EiReplyOrRequestPort(Port->OtherPort,
+                                LpcRequest,
+                 LpcRequest->u2.s2.Type == LPC_ERROR_EVENT ? LPC_ERROR_EVENT : LPC_REQUEST,
+                                Port);
+   if (!NT_SUCCESS(Status))
+     {
+       DPRINT1("Enqueue failed\n");
+       ExFreePool(LpcRequest);
+        if (NULL != AttachedProcess)
+          {
+            KeAttachProcess(AttachedProcess);
+          }
+       ObDereferenceObject(Port);
+       return(Status);
+     }
+   ExFreePool(LpcRequest);
+   KeReleaseSemaphore (&Port->OtherPort->Semaphore, IO_NO_INCREMENT,
+                      1, FALSE);
+
+   /*
+    * Wait for a reply
+    */
+   Status = KeWaitForSingleObject(&Port->Semaphore,
+                                 UserRequest,
+                                 UserMode,
+                                 FALSE,
+                                 NULL);
+   if (Status == STATUS_SUCCESS)
+     {
+
+       /*
+        * Dequeue the reply
+        */
+       KeAcquireSpinLock(&Port->Lock, &oldIrql);
+       Message = EiDequeueMessagePort(Port);
+       KeReleaseSpinLock(&Port->Lock, oldIrql);
+       if (Message)
+         {
+           DPRINT("Message->Message.u1.s1.TotalLength %d\n",
+                 Message->Message.u1.s1.TotalLength);
+           if (PreviousMode != KernelMode)
+             {
+               _SEH_TRY
+                 {
+                   RtlCopyMemory(UnsafeLpcReply,
+                                 &Message->Message,
+                                 Message->Message.u1.s1.TotalLength);
+                 }
+               _SEH_HANDLE
+                 {
+                   Status = _SEH_GetExceptionCode();
+                 }
+               _SEH_END;
+             }
+           else
+             {
+               RtlCopyMemory(UnsafeLpcReply,
+                             &Message->Message,
+                             Message->Message.u1.s1.TotalLength);
+             }
+           ExFreePool(Message);
+         }
+       else
+         Status = STATUS_UNSUCCESSFUL;
+     }
+   else
+     {
+       if (NT_SUCCESS(Status))
+         {
+          Status = STATUS_UNSUCCESSFUL;
+        }
+     }
+   if (NULL != AttachedProcess)
+     {
+       KeAttachProcess(AttachedProcess);
+     }
+   ObDereferenceObject(Port);
+
+   return(Status);
+}
 
-            /* Check if this is an LPC request with data information */
-            if ((LpcpGetMessageType(&Message->Request) == LPC_REQUEST) &&
-                (Message->Request.u2.s2.DataInfoOffset))
-            {
-                /* Save the data information */
-                LpcpSaveDataInfoMessage(Port, Message, 0);
-            }
-            else
-            {
-                /* Otherwise, just free it */
-                LpcpFreeToPortZone(Message, 0);
-            }
-        }
-        else
-        {
-            /* We don't have a reply */
-            Status = STATUS_LPC_REPLY_LOST;
-        }
-    }
-    else
-    {
-        /* The wait failed, free the message */
-        if (Message) LpcpFreeToPortZone(Message, 0);
-    }
 
-    /* All done */
-    LPCTRACE(LPC_SEND_DEBUG,
-             "Port: %p. Status: %p\n",
-             Port,
-             Status);
-    ObDereferenceObject(Port);
-    if (ConnectionPort) ObDereferenceObject(ConnectionPort);
-    return Status;
+/**********************************************************************
+ * NAME
+ *     NtWriteRequestData/6
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ */
+NTSTATUS STDCALL NtWriteRequestData (HANDLE            PortHandle,
+                                    PPORT_MESSAGE      Message,
+                                    ULONG              Index,
+                                    PVOID              Buffer,
+                                    ULONG              BufferLength,
+                                    PULONG             ReturnLength)
+{
+   UNIMPLEMENTED;
+   return(STATUS_NOT_IMPLEMENTED);
 }
 
+
 /* EOF */
index 59895d0..b12bb87 100644 (file)
@@ -451,44 +451,40 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
    MmInitializeMdlImplementation();
 }
 
-BOOLEAN RmapReady, PageOpReady, SectionsReady, PagingReady;
+VOID
+NTAPI
+INIT_FUNCTION
+MmInit2(VOID)
+{
+   MmInitializeRmapList();
+   MmInitializePageOp();
+   MmInitSectionImplementation();
+   MmInitPagingFile();
+}
 
-BOOLEAN
+VOID
+INIT_FUNCTION
 NTAPI
-MmInitSystem(IN ULONG Phase,
-             IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+MmInit3(VOID)
 {
-    if (Phase == 1)
-    {
-        MmInitializeRmapList();
-        RmapReady = TRUE;
-        MmInitializePageOp();
-        PageOpReady = TRUE;
-        MmInitSectionImplementation();
-        SectionsReady = TRUE;
-        MmInitPagingFile();
-        PagingReady = TRUE;
-    }
-    else if (Phase == 2)
-    {
-        /*
-        * Unmap low memory
-        */
-        MmCreatePhysicalMemorySection();
-        MiInitBalancerThread();
-
-        /*
-        * Initialise the modified page writer.
-        */
-        MmInitMpwThread();
-
-        /* Initialize the balance set manager */
-        MmInitBsmThread();
-
-        /* FIXME: Read parameters from memory */
-    }
-
-    return TRUE;
+   /*
+    * Unmap low memory
+    */
+#ifdef CONFIG_SMP
+   /* In SMP mode we can unmap the low memory
+      if all processors are started. */
+   MmDeletePageTable(NULL, 0);
+#endif
+
+   MmCreatePhysicalMemorySection();
+   MiInitBalancerThread();
+
+   /*
+    * Initialise the modified page writer.
+    */
+   MmInitMpwThread();
+
+   /* FIXME: Read parameters from memory */
 }
 
 VOID static
index 95c0453..be3db58 100644 (file)
@@ -123,26 +123,3 @@ MmInitMpwThread(VOID)
 
    return(STATUS_SUCCESS);
 }
-
-NTSTATUS
-NTAPI
-MmInitBsmThread(VOID)
-{
-    NTSTATUS Status;
-    OBJECT_ATTRIBUTES ObjectAttributes;
-    HANDLE ThreadHandle;
-
-    /* Create the thread */
-    InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
-    Status = PsCreateSystemThread(&ThreadHandle,
-                                  THREAD_ALL_ACCESS,
-                                  &ObjectAttributes,
-                                  NULL,
-                                  NULL,
-                                  KeBalanceSetManager,
-                                  NULL);
-
-    /* Close the handle and return status */
-    ZwClose(ThreadHandle);
-    return Status;
-}
index 3b5fed1..5ce6407 100644 (file)
@@ -318,8 +318,6 @@ MmReadFromSwapPage(SWAPENTRY SwapEntry, PFN_TYPE Page)
    return(Status);
 }
 
-extern BOOLEAN PagingReady;
-
 VOID
 INIT_FUNCTION
 NTAPI
@@ -363,11 +361,6 @@ MmReserveSwapPages(ULONG Nr)
    KIRQL oldIrql;
    ULONG MiAvailSwapPages;
 
-   if (!PagingReady)
-   {
-       DPRINT1("PAGING USED TOO SOON!!!\n");
-       while (TRUE);
-   }
    KeAcquireSpinLock(&PagingFileListLock, &oldIrql);
    MiAvailSwapPages =
       (MiFreeSwapPages * MM_PAGEFILE_COMMIT_RATIO) + MM_PAGEFILE_COMMIT_GRACE;
@@ -387,11 +380,6 @@ MmDereserveSwapPages(ULONG Nr)
 {
    KIRQL oldIrql;
 
-   if (!PagingReady)
-   {
-       DPRINT1("PAGING USED TOO SOON!!!\n");
-       while (TRUE);
-   }
    KeAcquireSpinLock(&PagingFileListLock, &oldIrql);
    MiReservedSwapPages = MiReservedSwapPages - Nr;
    KeReleaseSpinLock(&PagingFileListLock, oldIrql);
@@ -403,11 +391,6 @@ MiAllocPageFromPagingFile(PPAGINGFILE PagingFile)
    KIRQL oldIrql;
    ULONG i, j;
 
-   if (!PagingReady)
-   {
-       DPRINT1("PAGING USED TOO SOON!!!\n");
-       while (TRUE);
-   }
    KeAcquireSpinLock(&PagingFile->AllocMapLock, &oldIrql);
 
    for (i = 0; i < PagingFile->AllocMapSize; i++)
@@ -437,11 +420,6 @@ MmFreeSwapPage(SWAPENTRY Entry)
    ULONG off;
    KIRQL oldIrql;
 
-   if (!PagingReady)
-   {
-       DPRINT1("PAGING USED TOO SOON!!!\n");
-       while (TRUE);
-   }
    i = FILE_FROM_ENTRY(Entry);
    off = OFFSET_FROM_ENTRY(Entry);
 
@@ -486,11 +464,6 @@ MmAllocSwapPage(VOID)
    ULONG off;
    SWAPENTRY entry;
 
-   if (!PagingReady)
-   {
-       DPRINT1("PAGING USED TOO SOON!!!\n");
-       while (TRUE);
-   }
    KeAcquireSpinLock(&PagingFileListLock, &oldIrql);
 
    if (MiFreeSwapPages == 0)
index 9dd84c4..2ab70dd 100644 (file)
@@ -133,8 +133,6 @@ MmCheckForPageOp(PMEMORY_AREA MArea, HANDLE Pid, PVOID Address,
    return(NULL);
 }
 
-extern BOOLEAN RmapReady, PageOpReady, SectionsReady, PagingReady;
-
 PMM_PAGEOP
 NTAPI
 MmGetPageOp(PMEMORY_AREA MArea, HANDLE Pid, PVOID Address,
@@ -149,12 +147,6 @@ MmGetPageOp(PMEMORY_AREA MArea, HANDLE Pid, PVOID Address,
    KIRQL oldIrql;
    PMM_PAGEOP PageOp;
 
-   if (!PageOpReady)
-   {
-       DPRINT1("PAGEOPS USED TOO SOON!!!\n");
-       while (TRUE);
-   }
-
    /*
     * Calcuate the hash value for pageop structure
     */
@@ -273,4 +265,3 @@ MmInitializePageOp(VOID)
 
 
 
-
index 19a96fc..e76b809 100644 (file)
@@ -379,8 +379,6 @@ MmIsDirtyPageRmap(PFN_TYPE Page)
    return(FALSE);
 }
 
-extern BOOLEAN RmapReady, PageOpReady, SectionsReady, PagingReady;
-
 VOID
 NTAPI
 MmInsertRmap(PFN_TYPE Page, PEPROCESS Process,
@@ -390,12 +388,6 @@ MmInsertRmap(PFN_TYPE Page, PEPROCESS Process,
    PMM_RMAP_ENTRY new_entry;
    ULONG PrevSize;
 
-   if (!RmapReady)
-   {
-       DPRINT1("RMAPS USED TOO SOON!!!\n");
-       while (TRUE);
-   }
-
    Address = (PVOID)PAGE_ROUND_DOWN(Address);
 
    new_entry = ExAllocateFromNPagedLookasideList(&RmapLookasideList);
@@ -463,12 +455,6 @@ MmDeleteAllRmaps(PFN_TYPE Page, PVOID Context,
    PMM_RMAP_ENTRY previous_entry;
    PEPROCESS Process;
 
-   if (!RmapReady)
-   {
-       DPRINT1("RMAPS USED TOO SOON!!!\n");
-       while (TRUE);
-   }
-
    ExAcquireFastMutex(&RmapListLock);
    current_entry = MmGetRmapListHeadPage(Page);
    if (current_entry == NULL)
@@ -507,12 +493,6 @@ MmDeleteRmap(PFN_TYPE Page, PEPROCESS Process,
 {
    PMM_RMAP_ENTRY current_entry, previous_entry;
 
-   if (!RmapReady)
-   {
-       DPRINT1("RMAPS USED TOO SOON!!!\n");
-       while (TRUE);
-   }
-
    ExAcquireFastMutex(&RmapListLock);
    previous_entry = NULL;
    current_entry = MmGetRmapListHeadPage(Page);
index 1afbbc8..1e757de 100644 (file)
@@ -2216,7 +2216,6 @@ MmCreatePhysicalMemorySection(VOID)
    OBJECT_ATTRIBUTES Obj;
    UNICODE_STRING Name = RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
    LARGE_INTEGER SectionSize;
-   HANDLE Handle;
 
    /*
     * Create the section mapping physical memory
@@ -2245,12 +2244,11 @@ MmCreatePhysicalMemorySection(VOID)
                            SECTION_ALL_ACCESS,
                            0,
                            NULL,
-                           &Handle);
+                           NULL);
    if (!NT_SUCCESS(Status))
    {
       ObDereferenceObject(PhysSection);
    }
-   ObCloseHandle(Handle, KernelMode);
    PhysSection->AllocationAttributes |= SEC_PHYSICALMEMORY;
    PhysSection->Segment->Flags &= ~MM_PAGEFILE_SEGMENT;
 
index 05beae7..7293fad 100644 (file)
@@ -176,125 +176,111 @@ ExWindowStationObjectType DATA
 Exi386InterlockedDecrementLong@4
 Exi386InterlockedExchangeUlong@12
 Exi386InterlockedIncrementLong@4
-FsRtlAcquireFileExclusive
-;FsRtlAddBaseMcbEntry
-FsRtlAddLargeMcbEntry
-FsRtlAddMcbEntry
-FsRtlAddToTunnelCache
-FsRtlAllocateFileLock
-FsRtlAllocatePool
-FsRtlAllocatePoolWithQuota
-FsRtlAllocatePoolWithQuotaTag
-FsRtlAllocatePoolWithTag
-FsRtlAllocateResource
+FsRtlAcquireFileExclusive@4
+FsRtlAddLargeMcbEntry@28
+FsRtlAddMcbEntry@16
+FsRtlAddToTunnelCache@32
+FsRtlAllocateFileLock@8
+FsRtlAllocatePool@8
+FsRtlAllocatePoolWithQuota@8
+FsRtlAllocatePoolWithQuotaTag@12
+FsRtlAllocatePoolWithTag@12
+FsRtlAllocateResource@0
 FsRtlAreNamesEqual@16
-FsRtlBalanceReads
+FsRtlBalanceReads@4
 FsRtlCheckLockForReadAccess@8
 FsRtlCheckLockForWriteAccess@8
-FsRtlCheckOplock
-FsRtlCopyRead
-FsRtlCopyWrite
-;FsRtlCreateSectionForDataScan
-FsRtlCurrentBatchOplock
-FsRtlDeleteKeyFromTunnelCache
-FsRtlDeleteTunnelCache
-FsRtlDeregisterUncProvider
-FsRtlDissectDbcs
-FsRtlDissectName
-FsRtlDoesDbcsContainWildCards
+FsRtlCheckOplock@20
+FsRtlCopyRead@32
+FsRtlCopyWrite@32
+FsRtlCurrentBatchOplock@4
+FsRtlDeleteKeyFromTunnelCache@12
+FsRtlDeleteTunnelCache@4
+FsRtlDeregisterUncProvider@4
+FsRtlDissectDbcs@16
+FsRtlDissectName@16
+FsRtlDoesDbcsContainWildCards@4
 FsRtlDoesNameContainWildCards@4
-FsRtlFastCheckLockForRead
-FsRtlFastCheckLockForWrite
+FsRtlFastCheckLockForRead@24
+FsRtlFastCheckLockForWrite@24
 FsRtlFastUnlockAll@16
-FsRtlFastUnlockAllByKey
-FsRtlFastUnlockSingle
-FsRtlFindInTunnelCache
-FsRtlFreeFileLock
-FsRtlGetFileSize
-;FsRtlGetNextBaseMcbEntry
-FsRtlGetNextFileLock
-FsRtlGetNextLargeMcbEntry
-FsRtlGetNextMcbEntry
-FsRtlIncrementCcFastReadNotPossible
-FsRtlIncrementCcFastReadNoWait
-FsRtlIncrementCcFastReadResourceMiss
-FsRtlIncrementCcFastReadWait
-;FsRtlInitializeBaseMcb
+FsRtlFastUnlockAllByKey@20
+FsRtlFastUnlockSingle@32
+FsRtlFindInTunnelCache@32
+FsRtlFreeFileLock@4
+FsRtlGetFileSize@8
+FsRtlGetNextFileLock@8
+FsRtlGetNextLargeMcbEntry@20
+FsRtlGetNextMcbEntry@20
+FsRtlIncrementCcFastReadNotPossible@0
+FsRtlIncrementCcFastReadNoWait@0
+FsRtlIncrementCcFastReadResourceMiss@0
+FsRtlIncrementCcFastReadWait@0
 FsRtlInitializeFileLock@12
-FsRtlInitializeLargeMcb
-FsRtlInitializeMcb
-FsRtlInitializeOplock
-FsRtlInitializeTunnelCache
-FsRtlInsertPerFileObjectContext
-FsRtlInsertPerStreamContext
-FsRtlIsDbcsInExpression
-FsRtlIsFatDbcsLegal
-FsRtlIsHpfsDbcsLegal
+FsRtlInitializeLargeMcb@8
+FsRtlInitializeMcb@8
+FsRtlInitializeOplock@4
+FsRtlInitializeTunnelCache@4
+FsRtlInsertPerFileObjectContext@8
+FsRtlInsertPerStreamContext@8
+FsRtlIsDbcsInExpression@8
+FsRtlIsFatDbcsLegal@20
+FsRtlIsHpfsDbcsLegal@20
 FsRtlIsNameInExpression@16
-FsRtlIsNtstatusExpected
-FsRtlIsPagingFile
-FsRtlIsTotalDeviceFailure
+FsRtlIsNtstatusExpected@4
+FsRtlIsPagingFile@4
+FsRtlIsTotalDeviceFailure@4
 FsRtlLegalAnsiCharacterArray=_FsRtlLegalAnsiCharacterArray
-;FsRtlLookupBaseMcbEntry
-FsRtlLookupLargeMcbEntry
-;FsRtlLookupLastBaseMcbEntry
-;FsRtlLookupLastBaseMcbEntryAndIndex
-FsRtlLookupLastLargeMcbEntry
-FsRtlLookupLastLargeMcbEntryAndIndex
-FsRtlLookupLastMcbEntry
-FsRtlLookupMcbEntry
-FsRtlLookupPerFileObjectContext
-FsRtlLookupPerStreamContextInternal
-FsRtlMdlRead
-FsRtlMdlReadComplete
-FsRtlMdlReadCompleteDev
-FsRtlMdlReadDev
-FsRtlMdlWriteComplete
-FsRtlMdlWriteCompleteDev
-FsRtlNormalizeNtstatus
-FsRtlNotifyChangeDirectory
-FsRtlNotifyCleanup
-FsRtlNotifyFilterChangeDirectory
-FsRtlNotifyFilterReportChange
-FsRtlNotifyFullChangeDirectory
-FsRtlNotifyFullReportChange
-FsRtlNotifyInitializeSync
-FsRtlNotifyReportChange
-FsRtlNotifyUninitializeSync
-FsRtlNotifyVolumeEvent
-;FsRtlNumberOfRunsInBaseMcb
-FsRtlNumberOfRunsInLargeMcb
-FsRtlNumberOfRunsInMcb
-FsRtlOplockFsctrl
-FsRtlOplockIsFastIoPossible
-FsRtlPostPagingFileStackOverflow
-FsRtlPostStackOverflow
-FsRtlPrepareMdlWrite
-FsRtlPrepareMdlWriteDev
-FsRtlPrivateLock
+FsRtlLookupLargeMcbEntry@32
+FsRtlLookupLastLargeMcbEntry@12
+FsRtlLookupLastLargeMcbEntryAndIndex@16
+FsRtlLookupLastMcbEntry@12
+FsRtlLookupMcbEntry@20
+FsRtlLookupPerFileObjectContext@12
+FsRtlLookupPerStreamContextInternal@12
+FsRtlMdlRead@24
+FsRtlMdlReadComplete@8
+FsRtlMdlReadCompleteDev@12
+FsRtlMdlReadDev@28
+FsRtlMdlWriteComplete@12
+FsRtlMdlWriteCompleteDev@16
+FsRtlNormalizeNtstatus@8
+FsRtlNotifyChangeDirectory@28
+FsRtlNotifyCleanup@12
+FsRtlNotifyFilterChangeDirectory@44
+FsRtlNotifyFilterReportChange@40
+FsRtlNotifyFullChangeDirectory@40
+FsRtlNotifyFullReportChange@36
+FsRtlNotifyInitializeSync@4
+FsRtlNotifyReportChange@20
+FsRtlNotifyUninitializeSync@4
+FsRtlNotifyVolumeEvent@8
+FsRtlNumberOfRunsInLargeMcb@4
+FsRtlNumberOfRunsInMcb@4
+FsRtlOplockFsctrl@12
+FsRtlOplockIsFastIoPossible@4
+FsRtlPostPagingFileStackOverflow@12
+FsRtlPostStackOverflow@12
+FsRtlPrepareMdlWrite@24
+FsRtlPrepareMdlWriteDev@28
+FsRtlPrivateLock@48
 FsRtlProcessFileLock@12
-FsRtlRegisterFileSystemFilterCallbacks
-FsRtlRegisterUncProvider
-FsRtlReleaseFile
-;FsRtlRemoveBaseMcbEntry
-FsRtlRemoveLargeMcbEntry
-FsRtlRemoveMcbEntry
-FsRtlRemovePerFileObjectContext
-FsRtlRemovePerStreamContext
-;FsRtlResetBaseMcb
-FsRtlResetLargeMcb
-;FsRtlSplitBaseMcb
-FsRtlSplitLargeMcb
-FsRtlSyncVolumes
-FsRtlTeardownPerStreamContexts
-;FsRtlTruncateBaseMcb
-FsRtlTruncateLargeMcb
-FsRtlTruncateMcb
-;FsRtlUninitializeBaseMcb
+FsRtlRegisterUncProvider@12
+FsRtlReleaseFile@4
+FsRtlRemoveLargeMcbEntry@20
+FsRtlRemoveMcbEntry@12
+FsRtlRemovePerFileObjectContext@12
+FsRtlRemovePerStreamContext@12
+FsRtlResetLargeMcb@8
+FsRtlSplitLargeMcb@20
+FsRtlSyncVolumes@12
+FsRtlTeardownPerStreamContexts@4
+FsRtlTruncateLargeMcb@12
+FsRtlTruncateMcb@8
 FsRtlUninitializeFileLock@4
-FsRtlUninitializeLargeMcb
-FsRtlUninitializeMcb
-FsRtlUninitializeOplock
+FsRtlUninitializeLargeMcb@4
+FsRtlUninitializeMcb@4
+FsRtlUninitializeOplock@4
 HalDispatchTable=_HalDispatchTable
 HalPrivateDispatchTable DATA
 @HalExamineMBR@16
index 589a274..3ebb82e 100644 (file)
@@ -1081,22 +1081,6 @@ Language=English
 SPIN_LOCK_INIT_FAILURE
 .
 
-MessageId=0x8F
-Severity=Success
-Facility=System
-SymbolicName=PP0_INITIALIZATION_FAILED
-Language=English
-PP0_INITIALIZATION_FAILED
-.
-
-MessageId=0x90
-Severity=Success
-Facility=System
-SymbolicName=PP1_INITIALIZATION_FAILED
-Language=English
-PP1_INITIALIZATION_FAILED
-.
-
 MessageId=0x94
 Severity=Success
 Facility=System
@@ -1113,14 +1097,6 @@ Language=English
 INVALID_WORK_QUEUE_ITEM
 .
 
-MessageId=0xA0
-Severity=Success
-Facility=System
-SymbolicName=INTERNAL_POWER_ERROR
-Language=English
-INTERNAL_POWER_ERROR
-.
-
 MessageId=0xA5
 Severity=Success
 Facility=System
@@ -1308,42 +1284,42 @@ Language=English
 IMPERSONATING_WORKER_THREAD
 .
 
-MessageId=0x7E
+MessageId=0x9A
 Severity=Informational
 Facility=System
-SymbolicName=WINDOWS_NT_BANNER
+SymbolicName=REACTOS_BANNER
 Language=English
-ReactOS (R) Version %hs (Build %u%hs)
+ReactOS Version %s (Build %s)
 .
 
-MessageId=0x87
+MessageId=0x9B
 Severity=Informational
 Facility=System
-SymbolicName=WINDOWS_NT_CSD_STRING
+SymbolicName=REACTOS_SERVICE_PACK
 Language=English
 Service Pack
 .
 
-MessageId=0x88
+MessageId=0x9C
 Severity=Informational
 Facility=System
-SymbolicName=WINDOWS_NT_INFO_STRING
+SymbolicName=REACTOS_INFO_STRING_UNI_PROCESSOR
 Language=English
 %u System Processor [%u MB Memory] %Z
 .
 
-MessageId=0x89
+MessageId=0x9D
 Severity=Informational
 Facility=System
-SymbolicName=WINDOWS_NT_MP_STRING
+SymbolicName=REACTOS_MP_KERNEL
 Language=English
 MulitProcessor Kernel
 .
 
-MessageId=0x9D
+MessageId=0x9E
 Severity=Informational
 Facility=System
-SymbolicName=WINDOWS_NT_INFO_STRING_PLURAL
+SymbolicName=REACTOS_INFO_STRING_MULTI_PROCESSOR
 Language=English
 %u System Processors [%u MB Memory] %Z
 .
index 600d0ef..3f0ce54 100644 (file)
@@ -9,6 +9,9 @@
     <define name="__NO_CTYPE_INLINES" />
     <define name="__USE_W32API" />
     <define name="WIN9X_COMPAT_SPINLOCK" />
+    <if property="NTLPC" value="1">
+        <define name="NTLPC" />
+    </if>
     <include base="cmlib">.</include>
     <include base="ntoskrnl">include</include>
     <include base="ReactOS">include/reactos/drivers</include>
@@ -47,7 +50,6 @@
             </directory>
         </if>
             <file>apc.c</file>
-            <file>balmgr.c</file>
             <file>bug.c</file>
             <file>clock.c</file>
             <file>config.c</file>
             <file>zone.c</file>
         <file>zw.S</file>
     </directory>
-    <directory name="fsrtl">
-            <file>dbcsname.c</file>
+    <directory name="fs">
+            <file>context.c</file>
             <file>fastio.c</file>
-            <file>faulttol.c</file>
             <file>filelock.c</file>
-            <file>filter.c</file>
-            <file>filtrctx.c</file>
-            <file>fsfilter.c</file>
-            <file>fsrtlpc.c</file>
-            <file>largemcb.c</file>
+            <file>mcb.c</file>
             <file>name.c</file>
             <file>notify.c</file>
             <file>oplock.c</file>
-            <file>pnp.c</file>
-            <file>stackovf.c</file>
+            <file>pool.c</file>
             <file>tunnel.c</file>
             <file>unc.c</file>
+            <file>util.c</file>
     </directory>
     <directory name="fstub">
         <file>disksup.c</file>
             <file>loader.c</file>
             <file>rtl.c</file>
     </directory>
-    <directory name="lpc">
-            <file>close.c</file>
-            <file>complete.c</file>
-            <file>connect.c</file>
-            <file>create.c</file>
-            <file>listen.c</file>
-            <file>port.c</file>
-            <file>reply.c</file>
-            <file>send.c</file>
-    </directory>
+    <if property="NTLPC" value="0">
+        <directory name="lpc">
+                <file>close.c</file>
+                <file>complete.c</file>
+                <file>connect.c</file>
+                <file>create.c</file>
+                <file>listen.c</file>
+                <file>port.c</file>
+                <file>query.c</file>
+                <file>queue.c</file>
+                <file>receive.c</file>
+                <file>reply.c</file>
+                <file>send.c</file>
+        </directory>
+    </if>
+    <if property="NTLPC" value="1">
+        <directory name="lpc">
+            <directory name="ntlpc">
+                <file>close.c</file>
+                <file>complete.c</file>
+                <file>connect.c</file>
+                <file>create.c</file>
+                <file>listen.c</file>
+                <file>port.c</file>
+                <file>reply.c</file>
+                <file>send.c</file>
+            </directory>
+        </directory>
+    </if>
     <directory name="mm">
         <if property="ARCH" value="i386">
             <directory name="i386">
index 882a439..a0cfdda 100644 (file)
 
 /* INCLUDES ***************************************************************/
 
+#define NTDDI_VERSION NTDDI_WS03
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
-BOOLEAN ObpLUIDDeviceMapsEnabled;
 POBJECT_TYPE ObDirectoryType = NULL;
 
 /* PRIVATE FUNCTIONS ******************************************************/
@@ -54,18 +54,6 @@ ObpInsertEntryDirectory(IN POBJECT_DIRECTORY Parent,
     /* Make sure we have a name */
     ASSERT(ObjectHeader->NameInfoOffset != 0);
 
-    /* Validate the context */
-    if ((Context->Object) ||
-        !(Context->DirectoryLocked) ||
-        (Parent != Context->Directory))
-    {
-        /* Invalid context */
-        DPRINT1("OB: ObpInsertEntryDirectory - invalid context %p %ld\n",
-                Context, Context->DirectoryLocked);
-        KEBUGCHECK(0);
-        return FALSE;
-    }
-
     /* Allocate a new Directory Entry */
     NewEntry = ExAllocatePoolWithTag(PagedPool,
                                      sizeof(OBJECT_DIRECTORY_ENTRY),
@@ -128,7 +116,6 @@ ObpLookupEntryDirectory(IN POBJECT_DIRECTORY Directory,
 {
     BOOLEAN CaseInsensitive = FALSE;
     POBJECT_HEADER_NAME_INFO HeaderNameInfo;
-    POBJECT_HEADER ObjectHeader;
     ULONG HashValue;
     ULONG HashIndex;
     LONG TotalChars;
@@ -140,8 +127,8 @@ ObpLookupEntryDirectory(IN POBJECT_DIRECTORY Directory,
     PWSTR Buffer;
     PAGED_CODE();
 
-    /* Check if we should search the shadow directory */
-    if (!ObpLUIDDeviceMapsEnabled) SearchShadow = FALSE;
+    /* Always disable this until we have DOS Device Maps */
+    SearchShadow = FALSE;
 
     /* Fail if we don't have a directory or name */
     if (!(Directory) || !(Name)) goto Quickie;
@@ -150,12 +137,12 @@ ObpLookupEntryDirectory(IN POBJECT_DIRECTORY Directory,
     TotalChars = Name->Length / sizeof(WCHAR);
     Buffer = Name->Buffer;
 
-    /* Set up case-sensitivity */
-    if (Attributes & OBJ_CASE_INSENSITIVE) CaseInsensitive = TRUE;
-
     /* Fail if the name is empty */
     if (!(Buffer) || !(TotalChars)) goto Quickie;
 
+    /* Set up case-sensitivity */
+    if (Attributes & OBJ_CASE_INSENSITIVE) CaseInsensitive = TRUE;
+
     /* Create the Hash */
     for (HashValue = 0; TotalChars; TotalChars--)
     {
@@ -186,7 +173,8 @@ ObpLookupEntryDirectory(IN POBJECT_DIRECTORY Directory,
     if (!Context->DirectoryLocked)
     {
         /* Lock it */
-        ObpAcquireDirectoryLockShared(Directory, Context);
+        KeEnterCriticalRegion();
+        ExAcquireResourceSharedLite(&Directory->Lock, TRUE);
     }
 
     /* Start looping */
@@ -196,11 +184,10 @@ ObpLookupEntryDirectory(IN POBJECT_DIRECTORY Directory,
         if (CurrentEntry->HashValue == HashValue)
         {
             /* Make sure that it has a name */
-            ObjectHeader = OBJECT_TO_OBJECT_HEADER(CurrentEntry->Object);
+            ASSERT(OBJECT_TO_OBJECT_HEADER(CurrentEntry->Object)->NameInfoOffset != 0);
 
             /* Get the name information */
-            ASSERT(ObjectHeader->NameInfoOffset != 0);
-            HeaderNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
+            HeaderNameInfo = OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(CurrentEntry->Object));
 
             /* Do the names match? */
             if ((Name->Length == HeaderNameInfo->Name.Length) &&
@@ -220,73 +207,30 @@ ObpLookupEntryDirectory(IN POBJECT_DIRECTORY Directory,
         /* Set this entry as the first, to speed up incoming insertion */
         if (AllocatedEntry != LookupBucket)
         {
-            /* Check if the directory was locked or convert the lock */
-            if ((Context->DirectoryLocked) ||
-                (ExConvertPushLockSharedToExclusive(&Directory->Lock)))
-            {
-                /* Set the Current Entry */
-                *AllocatedEntry = CurrentEntry->ChainLink;
+            /* Set the Current Entry */
+            *AllocatedEntry = CurrentEntry->ChainLink;
 
-                /* Link to the old Hash Entry */
-                CurrentEntry->ChainLink = *LookupBucket;
+            /* Link to the old Hash Entry */
+            CurrentEntry->ChainLink = *LookupBucket;
 
-                /* Set the new Hash Entry */
-                *LookupBucket = CurrentEntry;
-            }
+            /* Set the new Hash Entry */
+            *LookupBucket = CurrentEntry;
         }
 
         /* Save the found object */
         FoundObject = CurrentEntry->Object;
-        goto Quickie;
+        if (!FoundObject) goto Quickie;
     }
-    else
-    {
-        /* Check if the directory was locked */
-        if (!Context->DirectoryLocked)
-        {
-            /* Release the lock */
-            ObpReleaseDirectoryLock(Directory, Context);
-        }
 
-        /* Check if we should scan the shadow directory */
-        if ((SearchShadow) && (Directory->DeviceMap))
-        {
-            /* FIXME: We don't support this yet */
-            KEBUGCHECK(0);
-        }
-    }
-
-Quickie:
-    /* Check if we inserted an object */
-    if (FoundObject)
-    {
-        /* Get the object name information */
-        ObjectHeader = OBJECT_TO_OBJECT_HEADER(FoundObject);
-        ObpAcquireNameInformation(ObjectHeader);
-
-        /* Reference the object being looked up */
-        ObReferenceObject(FoundObject);
-
-        /* Check if the directory was locked */
-        if (!Context->DirectoryLocked)
-        {
-            /* Release the lock */
-            ObpReleaseDirectoryLock(Directory, Context);
-        }
-    }
-
-    /* Check if we found an object already */
-    if (Context->Object)
+    /* Check if the directory was unlocked (which means we locked it) */
+    if (!Context->DirectoryLocked)
     {
-        /* We already did a lookup, so remove this object's query reference */
-        ObjectHeader = OBJECT_TO_OBJECT_HEADER(Context->Object);
-        HeaderNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
-        ObpReleaseNameInformation(HeaderNameInfo);
-
-        /* Also dereference the object itself */
-        ObDereferenceObject(Context->Object);
+        /* Lock it */
+        ExReleaseResourceLite(&Directory->Lock);
+        KeLeaveCriticalRegion();
     }
 
+Quickie:
     /* Return the object we found */
     Context->Object = FoundObject;
     return FoundObject;
@@ -356,17 +300,17 @@ ObpDeleteEntryDirectory(POBP_LOOKUP_CONTEXT Context)
 *--*/
 NTSTATUS
 NTAPI
-NtOpenDirectoryObject(OUT PHANDLE DirectoryHandle,
-                      IN ACCESS_MASK DesiredAccess,
-                      IN POBJECT_ATTRIBUTES ObjectAttributes)
+NtOpenDirectoryObject (OUT PHANDLE DirectoryHandle,
+                       IN ACCESS_MASK DesiredAccess,
+                       IN POBJECT_ATTRIBUTES ObjectAttributes)
 {
-    HANDLE Directory;
+    HANDLE hDirectory;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status = STATUS_SUCCESS;
     PAGED_CODE();
 
     /* Check if we need to do any probing */
-    if (PreviousMode != KernelMode)
+    if(PreviousMode != KernelMode)
     {
         _SEH_TRY
         {
@@ -379,6 +323,8 @@ NtOpenDirectoryObject(OUT PHANDLE DirectoryHandle,
             Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
+
+        /* If we failed, return the error */
         if(!NT_SUCCESS(Status)) return Status;
     }
 
@@ -389,13 +335,13 @@ NtOpenDirectoryObject(OUT PHANDLE DirectoryHandle,
                                 NULL,
                                 DesiredAccess,
                                 NULL,
-                                &Directory);
-    if (NT_SUCCESS(Status))
+                                &hDirectory);
+    if(NT_SUCCESS(Status))
     {
         _SEH_TRY
         {
             /* Write back the handle to the caller */
-            *DirectoryHandle = Directory;
+            *DirectoryHandle = hDirectory;
         }
         _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
         {
@@ -476,14 +422,10 @@ NtQueryDirectoryObject(IN HANDLE DirectoryHandle,
     POBJECT_HEADER_NAME_INFO ObjectNameInfo;
     UNICODE_STRING Name;
     PWSTR p;
-    OBP_LOOKUP_CONTEXT LookupContext;
     PAGED_CODE();
 
-    /* Initialize lookup */
-    ObpInitializeDirectoryLookup(&LookupContext);
-
     /* Check if we need to do any probing */
-    if (PreviousMode != KernelMode)
+    if(PreviousMode != KernelMode)
     {
         _SEH_TRY
         {
@@ -495,7 +437,7 @@ NtQueryDirectoryObject(IN HANDLE DirectoryHandle,
             if (!RestartScan) SkipEntries = *Context;
 
             /* Probe the return length if the caller specified one */
-            if (ReturnLength) ProbeForWriteUlong(ReturnLength);
+            if(ReturnLength) ProbeForWriteUlong(ReturnLength);
         }
         _SEH_HANDLE
         {
@@ -503,6 +445,8 @@ NtQueryDirectoryObject(IN HANDLE DirectoryHandle,
             Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
+
+        /* Return the exception to caller if we failed */
         if(!NT_SUCCESS(Status)) return Status;
     }
     else if (!RestartScan)
@@ -533,9 +477,6 @@ NtQueryDirectoryObject(IN HANDLE DirectoryHandle,
         return Status;
     }
 
-    /* Lock directory in shared mode */
-    ObpAcquireDirectoryLockShared(Directory, &LookupContext);
-
     /* Start at position 0 */
     DirectoryInfo = (POBJECT_DIRECTORY_INFORMATION)LocalBuffer;
     TotalLength = sizeof(OBJECT_DIRECTORY_INFORMATION);
@@ -696,9 +637,6 @@ Quickie:
     }
     _SEH_END;
 
-    /* Unlock the directory */
-    ObpReleaseDirectoryLock(Directory, &LookupContext);
-
     /* Dereference the directory and free our buffer */
     ObDereferenceObject(Directory);
     ExFreePool(LocalBuffer);
@@ -734,11 +672,15 @@ NtCreateDirectoryObject(OUT PHANDLE DirectoryHandle,
                         IN POBJECT_ATTRIBUTES ObjectAttributes)
 {
     POBJECT_DIRECTORY Directory;
-    HANDLE NewHandle;
+    HANDLE hDirectory;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status = STATUS_SUCCESS;
     PAGED_CODE();
 
+    DPRINT("NtCreateDirectoryObject(DirectoryHandle %x, "
+            "DesiredAccess %x, ObjectAttributes %x\n",
+            DirectoryHandle, DesiredAccess, ObjectAttributes);
+
     /* Check if we need to do any probing */
     if(PreviousMode != KernelMode)
     {
@@ -753,6 +695,8 @@ NtCreateDirectoryObject(OUT PHANDLE DirectoryHandle,
             Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
+
+        /* If we failed, return the error */
         if(!NT_SUCCESS(Status)) return Status;
     }
 
@@ -766,33 +710,30 @@ NtCreateDirectoryObject(OUT PHANDLE DirectoryHandle,
                             0,
                             0,
                             (PVOID*)&Directory);
-    if (!NT_SUCCESS(Status)) return Status;
-
-    /* Setup the object */
-    RtlZeroMemory(Directory, sizeof(OBJECT_DIRECTORY));
-    ExInitializePushLock((PULONG_PTR)&Directory->Lock);
-    Directory->SessionId = -1;
-
-    /* Insert it into the handle table */
-    Status = ObInsertObject((PVOID)Directory,
-                            NULL,
-                            DesiredAccess,
-                            0,
-                            NULL,
-                            &NewHandle);
-
-    /* Enter SEH to protect write */
-    _SEH_TRY
-    {
-        /* Return the handle back to the caller */
-        *DirectoryHandle = NewHandle;
-    }
-    _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
+    if(NT_SUCCESS(Status))
     {
-        /* Get the exception code */
-        Status = _SEH_GetExceptionCode();
+        /* Insert it into the handle table */
+        Status = ObInsertObject((PVOID)Directory,
+                                NULL,
+                                DesiredAccess,
+                                0,
+                                NULL,
+                                &hDirectory);
+        if(NT_SUCCESS(Status))
+        {
+            _SEH_TRY
+            {
+                /* Return the handle back to the caller */
+                *DirectoryHandle = hDirectory;
+            }
+            _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
+            {
+                /* Get the exception code */
+                Status = _SEH_GetExceptionCode();
+            }
+            _SEH_END;
+        }
     }
-    _SEH_END;
 
     /* Return status to caller */
     return Status;
index f9b71e2..85b0271 100644 (file)
 
 PHANDLE_TABLE ObpKernelHandleTable = NULL;
 
-#define TAG_OB_HANDLE TAG('O', 'b', 'H', 'd')
-
 /* PRIVATE FUNCTIONS *********************************************************/
 
-PHANDLE_TABLE
-NTAPI
-ObReferenceProcessHandleTable(IN PEPROCESS Process)
-{
-    PHANDLE_TABLE HandleTable = NULL;
-
-    /* Lock the process */
-    if (ExAcquireRundownProtection(&Process->RundownProtect))
-    {
-        /* Get the handle table */
-        HandleTable = Process->ObjectTable;
-        if (!HandleTable)
-        {
-            /* No table, release the lock */
-            ExReleaseRundownProtection(&Process->RundownProtect);
-        }
-    }
-
-    /* Return the handle table */
-    return HandleTable;
-}
-
-VOID
-NTAPI
-ObDereferenceProcessHandleTable(IN PEPROCESS Process)
-{
-    /* Release the process lock */
-    ExReleaseRundownProtection(&Process->RundownProtect);
-}
-
-NTSTATUS
-NTAPI
-ObpReferenceProcessObjectByHandle(IN HANDLE Handle,
-                                  IN PEPROCESS Process,
-                                  IN PHANDLE_TABLE HandleTable,
-                                  IN KPROCESSOR_MODE AccessMode,
-                                  OUT PVOID *Object,
-                                  OUT POBJECT_HANDLE_INFORMATION HandleInformation,
-                                  OUT PACCESS_MASK AuditMask)
-{
-    PHANDLE_TABLE_ENTRY HandleEntry;
-    POBJECT_HEADER ObjectHeader;
-    ACCESS_MASK GrantedAccess;
-    ULONG Attributes;
-    PETHREAD Thread = PsGetCurrentThread();
-    NTSTATUS Status;
-    PAGED_CODE();
-
-    /* Assume failure */
-    *Object = NULL;
-
-    /* Check if the caller wants the current process */
-    if (Handle == NtCurrentProcess())
-    {
-        /* Return handle info */
-        HandleInformation->HandleAttributes = 0;
-        HandleInformation->GrantedAccess = Process->GrantedAccess;
-
-        /* No audit mask */
-        *AuditMask = 0;
-
-        /* Reference ourselves */
-        ObjectHeader = OBJECT_TO_OBJECT_HEADER(Process);
-        InterlockedExchangeAdd(&ObjectHeader->PointerCount, 1);
-
-        /* Return the pointer */
-        *Object = Process;
-        ASSERT(*Object != NULL);
-        return STATUS_SUCCESS;
-    }
-
-    /* Check if the caller wants the current thread */
-    if (Handle == NtCurrentThread())
-    {
-        /* Return handle information */
-        HandleInformation->HandleAttributes = 0;
-        HandleInformation->GrantedAccess = Thread->GrantedAccess;
-
-        /* Reference ourselves */
-        ObjectHeader = OBJECT_TO_OBJECT_HEADER(Thread);
-        InterlockedExchangeAdd(&ObjectHeader->PointerCount, 1);
-
-        /* No audit mask */
-        *AuditMask = 0;
-
-        /* Return the pointer */
-        *Object = Thread;
-        ASSERT(*Object != NULL);
-        return STATUS_SUCCESS;
-    }
-
-    /* Check if this is a kernel handle */
-    if (ObIsKernelHandle(Handle, AccessMode))
-    {
-        /* Use the kernel handle table and get the actual handle value */
-        Handle = ObKernelHandleToHandle(Handle);
-        HandleTable = ObpKernelHandleTable;
-    }
-
-    /* Enter a critical region while we touch the handle table */
-    ASSERT(HandleTable != NULL);
-    KeEnterCriticalRegion();
-
-    /* Get the handle entry */
-    HandleEntry = ExMapHandleToPointer(HandleTable, Handle);
-    if (HandleEntry)
-    {
-        /* Get the object header and validate the type*/
-        ObjectHeader = ObpGetHandleObject(HandleEntry);
-
-        /* Get the granted access and validate it */
-        GrantedAccess = HandleEntry->GrantedAccess;
-
-        /* Mask out the internal attributes */
-        Attributes = HandleEntry->ObAttributes & OBJ_HANDLE_ATTRIBUTES;
-
-        /* Fill out the information */
-        HandleInformation->HandleAttributes = Attributes;
-        HandleInformation->GrantedAccess = GrantedAccess;
-
-        /* No audit mask (FIXME!) */
-        *AuditMask = 0;
-
-        /* Return the pointer */
-        *Object = &ObjectHeader->Body;
-
-        /* Add a reference */
-        InterlockedExchangeAdd(&ObjectHeader->PointerCount, 1);
-
-        /* Unlock the handle */
-        ExUnlockHandleTableEntry(HandleTable, HandleEntry);
-        KeLeaveCriticalRegion();
-
-        /* Return success */
-        ASSERT(*Object != NULL);
-        return STATUS_SUCCESS;
-    }
-    else
-    {
-        /* Invalid handle */
-        Status = STATUS_INVALID_HANDLE;
-    }
-
-    /* Return failure status */
-    KeLeaveCriticalRegion();
-    return Status;
-}
-
-BOOLEAN
-NTAPI
-ObpEnumFindHandleProcedure(IN PHANDLE_TABLE_ENTRY HandleEntry,
-                           IN HANDLE Handle,
-                           IN PVOID Context)
-{
-    POBJECT_HEADER ObjectHeader;
-    ACCESS_MASK GrantedAccess;
-    ULONG HandleAttributes;
-    POBP_FIND_HANDLE_DATA FindData = Context;
-
-    /* Get the object header */
-    ObjectHeader = ObpGetHandleObject(HandleEntry);
-
-    /* Make sure it's valid and matching */
-    if ((FindData->ObjectHeader) && (FindData->ObjectHeader != ObjectHeader))
-    {
-        /* No match, fail */
-        return FALSE;
-    }
-
-    /* Now attempt to match the object type */
-    if ((FindData->ObjectType) && (FindData->ObjectType != ObjectHeader->Type))
-    {
-        /* No match, fail */
-        return FALSE;
-    }
-
-    /* Check if we have extra information */
-    if (FindData->HandleInformation)
-    {
-        /* Get the granted access and attributes */
-        GrantedAccess = HandleEntry->GrantedAccess;
-        HandleAttributes = HandleEntry->ObAttributes & OBJ_HANDLE_ATTRIBUTES;
-
-        /* Attempt to match them */
-        if ((FindData->HandleInformation->HandleAttributes != HandleAttributes) ||
-            (FindData->HandleInformation->GrantedAccess != GrantedAccess))
-        {
-            /* No match, fail */
-            return FALSE;
-        }
-    }
-
-    /* We have a match */
-    return TRUE;
-}
-
-POBJECT_HANDLE_COUNT_ENTRY
-NTAPI
-ObpInsertHandleCount(IN POBJECT_HEADER ObjectHeader)
-{
-    POBJECT_HEADER_HANDLE_INFO HandleInfo;
-    POBJECT_HANDLE_COUNT_ENTRY FreeEntry;
-    POBJECT_HANDLE_COUNT_DATABASE HandleDatabase, OldHandleDatabase;
-    ULONG i;
-    ULONG Size, OldSize;
-    OBJECT_HANDLE_COUNT_DATABASE SingleDatabase;
-    PAGED_CODE();
-
-    /* Get the handle info */
-    HandleInfo = OBJECT_HEADER_TO_HANDLE_INFO(ObjectHeader);
-    if (!HandleInfo) return NULL;
-
-    /* Check if we only have one entry */
-    if (ObjectHeader->Flags & OB_FLAG_SINGLE_PROCESS)
-    {
-        /* Fill out the single entry */
-        SingleDatabase.CountEntries = 1;
-        SingleDatabase.HandleCountEntries[0] = HandleInfo->SingleEntry;
-
-        /* Use this as the old size */
-        OldHandleDatabase = &SingleDatabase;
-        OldSize = sizeof(SingleDatabase);
-
-        /* Now we'll have two entries, and an entire DB */
-        i = 2;
-        Size = sizeof(OBJECT_HANDLE_COUNT_DATABASE) +
-               sizeof(OBJECT_HANDLE_COUNT_ENTRY);
-    }
-    else
-    {
-        /* We already have a DB, get the information from it */
-        OldHandleDatabase = HandleInfo->HandleCountDatabase;
-        i = OldHandleDatabase->CountEntries;
-        OldSize = sizeof(OBJECT_HANDLE_COUNT_DATABASE) +
-                  ((i - 1) * sizeof(OBJECT_HANDLE_COUNT_ENTRY));
-
-        /* Add 4 more entries */
-        i += 4;
-        Size = OldSize += (4 * sizeof(OBJECT_HANDLE_COUNT_ENTRY));
-    }
-
-    /* Allocate the DB */
-    HandleDatabase = ExAllocatePoolWithTag(PagedPool, Size, TAG_OB_HANDLE);
-    if (!HandleDatabase) return NULL;
-
-    /* Copy the old database */
-    RtlCopyMemory(HandleDatabase, OldHandleDatabase, OldSize);
-
-    /* Check if we he had a single entry before */
-    if (ObjectHeader->Flags & OB_FLAG_SINGLE_PROCESS)
-    {
-        /* Now we have more */
-        ObjectHeader->Flags &= ~OB_FLAG_SINGLE_PROCESS;
-    }
-    else
-    {
-        /* Otherwise we had a DB, free it */
-        ExFreePool(OldHandleDatabase);
-    }
-
-    /* Find the end of the copy and zero out the new data */
-    FreeEntry = (PVOID)((ULONG_PTR)HandleDatabase + OldSize);
-    RtlZeroMemory(FreeEntry, Size - OldSize);
-
-    /* Set the new information and return the free entry */
-    HandleDatabase->CountEntries = i;
-    HandleInfo->HandleCountDatabase = HandleDatabase;
-    return FreeEntry;
-}
-
-NTSTATUS
-NTAPI
-ObpIncrementHandleDataBase(IN POBJECT_HEADER ObjectHeader,
-                           IN PEPROCESS Process,
-                           IN OUT PULONG NewProcessHandleCount)
-{
-    POBJECT_HEADER_HANDLE_INFO HandleInfo;
-    POBJECT_HANDLE_COUNT_ENTRY HandleEntry, FreeEntry = NULL;
-    POBJECT_HANDLE_COUNT_DATABASE HandleDatabase;
-    ULONG i;
-    PAGED_CODE();
-
-    /* Get the handle info and check if we only have one entry */
-    HandleInfo = OBJECT_HEADER_TO_HANDLE_INFO(ObjectHeader);
-    if (ObjectHeader->Flags & OB_FLAG_SINGLE_PROCESS)
-    {
-        /* Check if the entry is free */
-        if (!HandleInfo->SingleEntry.HandleCount)
-        {
-            /* Add ours */
-            HandleInfo->SingleEntry.HandleCount = 1;
-            HandleInfo->SingleEntry.Process = Process;
-
-            /* Return success and 1 handle */
-            *NewProcessHandleCount = 1;
-            return STATUS_SUCCESS;
-        }
-        else if (HandleInfo->SingleEntry.Process == Process)
-        {
-            /* Busy entry, but same process */
-            *NewProcessHandleCount = ++HandleInfo->SingleEntry.HandleCount;
-            return STATUS_SUCCESS;
-        }
-        else
-        {
-            /* Insert a new entry */
-            FreeEntry = ObpInsertHandleCount(ObjectHeader);
-            if (!FreeEntry) return STATUS_INSUFFICIENT_RESOURCES;
-
-            /* Fill it out */
-            FreeEntry->Process = Process;
-            FreeEntry->HandleCount = 1;
-
-            /* Return success and 1 handle */
-            *NewProcessHandleCount = 1;
-            return STATUS_SUCCESS;
-        }
-    }
-
-    /* We have a database instead */
-    HandleDatabase = HandleInfo->HandleCountDatabase;
-    if (HandleDatabase)
-    {
-        /* Get the entries and loop them */
-        i = HandleDatabase->CountEntries;
-        HandleEntry = &HandleDatabase->HandleCountEntries[0];
-        while (i)
-        {
-            /* Check if this is a match */
-            if (HandleEntry->Process == Process)
-            {
-                /* Found it, get the process handle count */
-                *NewProcessHandleCount = ++HandleEntry->HandleCount;
-                return STATUS_SUCCESS;
-            }
-            else if (!HandleEntry->HandleCount)
-            {
-                /* Found a free entry */
-                FreeEntry = HandleEntry;
-            }
-
-            /* Keep looping */
-            HandleEntry++;
-            i--;
-        }
-
-        /* Check if we couldn't find a free entry */
-        if (!FreeEntry)
-        {
-            /* Allocate one */
-            FreeEntry = ObpInsertHandleCount(ObjectHeader);
-            if (!FreeEntry) return STATUS_INSUFFICIENT_RESOURCES;
-        }
-
-        /* Fill out the entry */
-        FreeEntry->Process = Process;
-        FreeEntry->HandleCount = 1;
-        *NewProcessHandleCount = 1;
-    }
-
-    /* Return success if we got here */
-    return STATUS_SUCCESS;
-}
-
 NTSTATUS
 NTAPI
 ObpChargeQuotaForObject(IN POBJECT_HEADER ObjectHeader,
-                        IN POBJECT_TYPE ObjectType,
-                        OUT PBOOLEAN NewObject)
+                        IN POBJECT_TYPE ObjectType)
 {
     POBJECT_HEADER_QUOTA_INFO ObjectQuota;
     ULONG PagedPoolCharge, NonPagedPoolCharge;
@@ -399,14 +32,10 @@ ObpChargeQuotaForObject(IN POBJECT_HEADER ObjectHeader,
 
     /* Get quota information */
     ObjectQuota = OBJECT_HEADER_TO_QUOTA_INFO(ObjectHeader);
-    *NewObject = FALSE;
 
     /* Check if this is a new object */
     if (ObjectHeader->Flags & OB_FLAG_CREATE_INFO)
     {
-        /* Set the flag */
-        *NewObject = TRUE;
-
         /* Remove the flag */
         ObjectHeader->Flags &= ~ OB_FLAG_CREATE_INFO;
         if (ObjectQuota)
@@ -465,12 +94,7 @@ ObpDecrementHandleCount(IN PVOID ObjectBody,
     POBJECT_TYPE ObjectType;
     LONG SystemHandleCount, ProcessHandleCount;
     LONG NewCount;
-    KIRQL CalloutIrql;
-    POBJECT_HEADER_HANDLE_INFO HandleInfo;
-    POBJECT_HANDLE_COUNT_ENTRY HandleEntry;
-    POBJECT_HANDLE_COUNT_DATABASE HandleDatabase;
-    ULONG i;
-    PAGED_CODE();
+    POBJECT_HEADER_CREATOR_INFO CreatorInfo;
 
     /* Get the object type and header */
     ObjectHeader = OBJECT_TO_OBJECT_HEADER(ObjectBody);
@@ -485,69 +109,23 @@ ObpDecrementHandleCount(IN PVOID ObjectBody,
     /* Lock the object type */
     ObpEnterObjectTypeMutex(ObjectType);
 
-    /* Set default counts */
+    /* FIXME: The process handle count should be in the Handle DB. Investigate */
     SystemHandleCount = ObjectHeader->HandleCount;
     ProcessHandleCount = 0;
 
     /* Decrement the handle count */
     NewCount = InterlockedDecrement(&ObjectHeader->HandleCount);
 
-    /* Check if we're out of handles and this was an exclusive object */
-    if (!(NewCount) && (ObjectHeader->Flags & OB_FLAG_EXCLUSIVE))
+    /* Check if we're out of handles */
+    if (!NewCount)
     {
-        /* Clear the exclusive flag */
-        OBJECT_HEADER_TO_QUOTA_INFO(ObjectHeader)->ExclusiveProcess = NULL;
-    }
-
-    /* Is the object type keeping track of handles? */
-    if (ObjectType->TypeInfo.MaintainHandleCount)
-    {
-        /* Get handle information */
-        HandleInfo = OBJECT_HEADER_TO_HANDLE_INFO(ObjectHeader);
-
-        /* Check if there's only a single entry */
-        if (ObjectHeader->Flags & OB_FLAG_SINGLE_PROCESS)
-        {
-            /* It should be us */
-            ASSERT(HandleInfo->SingleEntry.Process == Process);
-            ASSERT(HandleInfo->SingleEntry.HandleCount > 0);
-
-            /* Get the handle counts */
-            ProcessHandleCount = HandleInfo->SingleEntry.HandleCount--;
-            HandleEntry = &HandleInfo->SingleEntry;
-        }
-        else
-        {
-            /* Otherwise, get the database */
-            HandleDatabase = HandleInfo->HandleCountDatabase;
-            if (HandleDatabase)
-            {
-                /* Get the entries and loop them */
-                i = HandleDatabase->CountEntries;
-                HandleEntry = &HandleDatabase->HandleCountEntries[0];
-                while (i)
-                {
-                    /* Check if this is a match */
-                    if ((HandleEntry->HandleCount) &&
-                        (HandleEntry->Process == Process))
-                    {
-                        /* Found it, get the process handle count */
-                        ProcessHandleCount = HandleEntry->HandleCount--;
-                    }
-
-                    /* Keep looping */
-                    HandleEntry++;
-                    i--;
-                }
-            }
-        }
-
-        /* Check if this is the last handle */
-        if (ProcessHandleCount == 1)
+        /* Get the creator info */
+        CreatorInfo = OBJECT_HEADER_TO_CREATOR_INFO(ObjectHeader);
+        if ((CreatorInfo) && !(IsListEmpty(&CreatorInfo->TypeList)))
         {
-            /* Then clear the entry */
-            HandleEntry->Process = NULL;
-            HandleEntry->HandleCount = 0;
+            /* Remove it from the list and re-initialize it */
+            RemoveEntryList(&CreatorInfo->TypeList);
+            InitializeListHead(&CreatorInfo->TypeList);
         }
     }
 
@@ -558,13 +136,11 @@ ObpDecrementHandleCount(IN PVOID ObjectBody,
     if (ObjectType->TypeInfo.CloseProcedure)
     {
         /* Call it */
-        ObpCalloutStart(&CalloutIrql);
         ObjectType->TypeInfo.CloseProcedure(Process,
                                             ObjectBody,
                                             GrantedAccess,
                                             ProcessHandleCount,
                                             SystemHandleCount);
-        ObpCalloutEnd(CalloutIrql, "Close", ObjectType, ObjectBody);
     }
 
     /* Check if we should delete the object */
@@ -617,11 +193,10 @@ ObpCloseHandleTableEntry(IN PHANDLE_TABLE HandleTable,
     POBJECT_TYPE ObjectType;
     POBJECT_HEADER ObjectHeader;
     ACCESS_MASK GrantedAccess;
-    KIRQL CalloutIrql;
     PAGED_CODE();
 
     /* Get the object data */
-    ObjectHeader = ObpGetHandleObject(HandleEntry);
+    ObjectHeader = EX_HTE_TO_HDR(HandleEntry);
     ObjectType = ObjectHeader->Type;
     Body = &ObjectHeader->Body;
     GrantedAccess = HandleEntry->GrantedAccess;
@@ -637,24 +212,19 @@ ObpCloseHandleTableEntry(IN PHANDLE_TABLE HandleTable,
     if (ObjectType->TypeInfo.OkayToCloseProcedure)
     {
         /* Call it and check if it's not letting us close it */
-        ObpCalloutStart(&CalloutIrql);
         if (!ObjectType->TypeInfo.OkayToCloseProcedure(PsGetCurrentProcess(),
                                                        Body,
                                                        Handle,
                                                        AccessMode))
         {
             /* Fail */
-            ObpCalloutEnd(CalloutIrql, "NtClose", ObjectType, Body);
             ExUnlockHandleTableEntry(HandleTable, HandleEntry);
             return STATUS_HANDLE_NOT_CLOSABLE;
         }
-
-        /* Success, validate callout retrn */
-        ObpCalloutEnd(CalloutIrql, "NtClose", ObjectType, Body);
     }
 
     /* The callback allowed us to close it, but does the handle itself? */
-    if ((HandleEntry->ObAttributes & OBJ_PROTECT_CLOSE) &&
+    if ((HandleEntry->ObAttributes & EX_HANDLE_ENTRY_PROTECTFROMCLOSE) &&
         !(IgnoreHandleProtection))
     {
         /* It doesn't, are we from user mode? */
@@ -663,32 +233,34 @@ ObpCloseHandleTableEntry(IN PHANDLE_TABLE HandleTable,
             /* We are! Unlock the entry */
             ExUnlockHandleTableEntry(HandleTable, HandleEntry);
 
-            /* Make sure we have a debug port */
-            if (PsGetCurrentProcess()->DebugPort)
+            /* Make sure we have an exception port */
+            if (PsGetCurrentProcess()->ExceptionPort)
             {
                 /* Raise an exception */
                 return KeRaiseUserException(STATUS_HANDLE_NOT_CLOSABLE);
             }
             else
             {
-                /* Return the error instead */
+                /* Return the error isntead */
                 return STATUS_HANDLE_NOT_CLOSABLE;
             }
         }
-        else
-        {
-            /* Otherwise, bugcheck the OS */
-            KeBugCheckEx(0x8B, (ULONG_PTR)Handle, 0, 0, 0);
-        }
+
+        /* Otherwise, we are kernel mode, so unlock the entry and return */
+        ExUnlockHandleTableEntry(HandleTable, HandleEntry);
+        return STATUS_HANDLE_NOT_CLOSABLE;
     }
 
     /* Destroy and unlock the handle entry */
-    ExDestroyHandle(HandleTable, Handle, HandleEntry);
+    ExDestroyHandleByEntry(HandleTable, HandleEntry, Handle);
 
     /* Now decrement the handle count */
     ObpDecrementHandleCount(Body, PsGetCurrentProcess(), GrantedAccess);
 
     /* Dereference the object as well */
+    ASSERT(ObjectHeader->Type);
+    ASSERT(ObjectHeader->PointerCount != 0xCCCCCCCC);
+
     ObDereferenceObject(Body);
 
     /* Return to caller */
@@ -743,12 +315,6 @@ ObpIncrementHandleCount(IN PVOID Object,
     POBJECT_TYPE ObjectType;
     ULONG ProcessHandleCount;
     NTSTATUS Status;
-    PEPROCESS ExclusiveProcess;
-    BOOLEAN Exclusive = FALSE, NewObject;
-    POBJECT_HEADER_CREATOR_INFO CreatorInfo;
-    KIRQL CalloutIrql;
-    KPROCESSOR_MODE ProbeMode;
-    ULONG Total;
 
     /* Get the object header and type */
     ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
@@ -761,78 +327,15 @@ ObpIncrementHandleCount(IN PVOID Object,
             ObjectHeader->HandleCount,
             ObjectHeader->PointerCount);
 
-    /* Check if caller is forcing user mode */
-    if (HandleAttributes & OBJ_FORCE_ACCESS_CHECK)
-    {
-        /* Force it */
-        ProbeMode = UserMode;
-    }
-    else
-    {
-        /* Keep original setting */
-        ProbeMode = AccessMode;
-    }
-
     /* Lock the object type */
     ObpEnterObjectTypeMutex(ObjectType);
 
     /* Charge quota and remove the creator info flag */
-    Status = ObpChargeQuotaForObject(ObjectHeader, ObjectType, &NewObject);
+    Status = ObpChargeQuotaForObject(ObjectHeader, ObjectType);
     if (!NT_SUCCESS(Status)) return Status;
 
-    /* Check if the open is exclusive */
-    if (HandleAttributes & OBJ_EXCLUSIVE)
-    {
-        /* Check if the object allows this, or if the inherit flag was given */
-        if ((HandleAttributes & OBJ_INHERIT) ||
-            !(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE))
-        {
-            /* Incorrect attempt */
-            Status = STATUS_INVALID_PARAMETER;
-            goto Quickie;
-        }
-
-        /* Check if we have access to it */
-        ExclusiveProcess = OBJECT_HEADER_TO_EXCLUSIVE_PROCESS(ObjectHeader);
-        if ((!(ExclusiveProcess) && (ObjectHeader->HandleCount)) ||
-            ((ExclusiveProcess) && (ExclusiveProcess != PsGetCurrentProcess())))
-        {
-            /* This isn't the right process */
-            Status = STATUS_ACCESS_DENIED;
-            goto Quickie;
-        }
-
-        /* Now you got exclusive access */
-        Exclusive = TRUE;
-    }
-    else if ((ObjectHeader->Flags & OB_FLAG_EXCLUSIVE) &&
-             (OBJECT_HEADER_TO_EXCLUSIVE_PROCESS(ObjectHeader)))
-    {
-        /* Caller didn't want exclusive access, but the object is exclusive */
-        Status = STATUS_ACCESS_DENIED;
-        goto Quickie;
-    }
-
-    /*
-     * Check if this is an object that went from 0 handles back to existence,
-     * but doesn't have an open procedure, only a close procedure. This means
-     * that it will never realize that the object is back alive, so we must
-     * fail the request.
-     */
-    if (!(ObjectHeader->HandleCount) &&
-        !(NewObject) &&
-        (ObjectType->TypeInfo.MaintainHandleCount) &&
-        !(ObjectType->TypeInfo.OpenProcedure) &&
-        (ObjectType->TypeInfo.CloseProcedure))
-    {
-        /* Fail */
-        Status = STATUS_UNSUCCESSFUL;
-        goto Quickie;
-    }
-
     /* Check if we're opening an existing handle */
-    if ((OpenReason == ObOpenHandle) ||
-        ((OpenReason == ObDuplicateHandle) && (AccessState)))
+    if (OpenReason == ObOpenHandle)
     {
         /* Validate the caller's access to this object */
         if (!ObCheckObjectAccess(Object,
@@ -842,7 +345,7 @@ ObpIncrementHandleCount(IN PVOID Object,
                                  &Status))
         {
             /* Access was denied, so fail */
-            goto Quickie;
+            return Status;
         }
     }
     else if (OpenReason == ObCreateHandle)
@@ -862,98 +365,30 @@ ObpIncrementHandleCount(IN PVOID Object,
             RtlMapGenericMask(&AccessState->RemainingDesiredAccess,
                               &ObjectType->TypeInfo.GenericMapping);
         }
-
-        /* Check if the caller is trying to access system security */
-        if (AccessState->RemainingDesiredAccess & ACCESS_SYSTEM_SECURITY)
-        {
-            /* FIXME: TODO */
-            DPRINT1("ACCESS_SYSTEM_SECURITY not validated!\n");
-        }
-    }
-
-    /* Check if this is an exclusive handle */
-    if (Exclusive)
-    {
-        /* Save the owner process */
-        OBJECT_HEADER_TO_QUOTA_INFO(ObjectHeader)->ExclusiveProcess = Process;
     }
 
     /* Increase the handle count */
     InterlockedIncrement(&ObjectHeader->HandleCount);
-    ProcessHandleCount = 0;
-
-    /* Check if we have a handle database */
-    if (ObjectType->TypeInfo.MaintainHandleCount)
-    {
-        /* Increment the handle database */
-        Status = ObpIncrementHandleDataBase(ObjectHeader,
-                                            Process,
-                                            &ProcessHandleCount);
-        if (!NT_SUCCESS(Status))
-        {
-            /* FIXME: This should never happen for now */
-            DPRINT1("Unhandled case\n");
-            KEBUGCHECK(0);
-            goto Quickie;
-        }
-    }
 
     /* Release the lock */
     ObpLeaveObjectTypeMutex(ObjectType);
 
+    /* FIXME: Use the Handle Database */
+    ProcessHandleCount = 0;
+
     /* Check if we have an open procedure */
-    Status = STATUS_SUCCESS;
     if (ObjectType->TypeInfo.OpenProcedure)
     {
         /* Call it */
-        ObpCalloutStart(&CalloutIrql);
-        Status = ObjectType->TypeInfo.OpenProcedure(OpenReason,
-                                                    Process,
-                                                    Object,
-                                                    AccessState ?
-                                                    AccessState->
-                                                    PreviouslyGrantedAccess :
-                                                    0,
-                                                    ProcessHandleCount);
-        ObpCalloutEnd(CalloutIrql, "Open", ObjectType, Object);
-
-        /* Check if the open procedure failed */
-        if (!NT_SUCCESS(Status))
-        {
-            /* FIXME: This should never happen for now */
-            DPRINT1("Unhandled case\n");
-            KEBUGCHECK(0);
-            return Status;
-        }
-    }
-
-    /* Check if this is a create operation */
-    if (OpenReason == ObCreateHandle)
-    {
-        /* Check if we have creator info */
-        CreatorInfo = OBJECT_HEADER_TO_CREATOR_INFO(ObjectHeader);
-        if (CreatorInfo)
-        {
-            /* We do, acquire the lock */
-            ObpEnterObjectTypeMutex(ObjectType);
-
-            /* Insert us on the list */
-            InsertTailList(&ObjectType->TypeList, &CreatorInfo->TypeList);
-
-            /* Release the lock */
-            ObpLeaveObjectTypeMutex(ObjectType);
-        }
+        ObjectType->TypeInfo.OpenProcedure(OpenReason,
+                                           Process,
+                                           Object,
+                                           AccessState->PreviouslyGrantedAccess,
+                                           ProcessHandleCount);
     }
 
     /* Increase total number of handles */
-    Total = InterlockedIncrement((PLONG)&ObjectType->TotalNumberOfHandles);
-    if (Total > ObjectType->HighWaterNumberOfHandles)
-    {
-        /* Fixup count */
-        ObjectType->HighWaterNumberOfHandles = Total;
-    }
-
-    /* Trace call and return */
+    InterlockedIncrement((PLONG)&ObjectType->TotalNumberOfHandles);
     OBTRACE(OB_HANDLE_DEBUG,
             "%s - Incremented count for: %p. Reason: %lx HC LC %lx %lx\n",
             __FUNCTION__,
@@ -961,12 +396,7 @@ ObpIncrementHandleCount(IN PVOID Object,
             OpenReason,
             ObjectHeader->HandleCount,
             ObjectHeader->PointerCount);
-    return Status;
-
-Quickie:
-    /* Release lock and return */
-    ObpLeaveObjectTypeMutex(ObjectType);
-    return Status;
+    return STATUS_SUCCESS;
 }
 
 /*++
@@ -1009,11 +439,6 @@ ObpIncrementUnnamedHandleCount(IN PVOID Object,
     POBJECT_TYPE ObjectType;
     ULONG ProcessHandleCount;
     NTSTATUS Status;
-    PEPROCESS ExclusiveProcess;
-    BOOLEAN Exclusive = FALSE, NewObject;
-    POBJECT_HEADER_CREATOR_INFO CreatorInfo;
-    KIRQL CalloutIrql;
-    ULONG Total;
 
     /* Get the object header and type */
     ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
@@ -1029,59 +454,9 @@ ObpIncrementUnnamedHandleCount(IN PVOID Object,
     ObpEnterObjectTypeMutex(ObjectType);
 
     /* Charge quota and remove the creator info flag */
-    Status = ObpChargeQuotaForObject(ObjectHeader, ObjectType, &NewObject);
+    Status = ObpChargeQuotaForObject(ObjectHeader, ObjectType);
     if (!NT_SUCCESS(Status)) return Status;
 
-    /* Check if the open is exclusive */
-    if (HandleAttributes & OBJ_EXCLUSIVE)
-    {
-        /* Check if the object allows this, or if the inherit flag was given */
-        if ((HandleAttributes & OBJ_INHERIT) ||
-            !(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE))
-        {
-            /* Incorrect attempt */
-            Status = STATUS_INVALID_PARAMETER;
-            goto Quickie;
-        }
-
-        /* Check if we have access to it */
-        ExclusiveProcess = OBJECT_HEADER_TO_EXCLUSIVE_PROCESS(ObjectHeader);
-        if ((!(ExclusiveProcess) && (ObjectHeader->HandleCount)) ||
-            ((ExclusiveProcess) && (ExclusiveProcess != PsGetCurrentProcess())))
-        {
-            /* This isn't the right process */
-            Status = STATUS_ACCESS_DENIED;
-            goto Quickie;
-        }
-
-        /* Now you got exclusive access */
-        Exclusive = TRUE;
-    }
-    else if ((ObjectHeader->Flags & OB_FLAG_EXCLUSIVE) &&
-             (OBJECT_HEADER_TO_EXCLUSIVE_PROCESS(ObjectHeader)))
-    {
-        /* Caller didn't want exclusive access, but the object is exclusive */
-        Status = STATUS_ACCESS_DENIED;
-        goto Quickie;
-    }
-
-    /*
-     * Check if this is an object that went from 0 handles back to existence,
-     * but doesn't have an open procedure, only a close procedure. This means
-     * that it will never realize that the object is back alive, so we must
-     * fail the request.
-     */
-    if (!(ObjectHeader->HandleCount) &&
-        !(NewObject) &&
-        (ObjectType->TypeInfo.MaintainHandleCount) &&
-        !(ObjectType->TypeInfo.OpenProcedure) &&
-        (ObjectType->TypeInfo.CloseProcedure))
-    {
-        /* Fail */
-        Status = STATUS_UNSUCCESSFUL;
-        goto Quickie;
-    }
-
     /* Convert MAXIMUM_ALLOWED to GENERIC_ALL */
     if (*DesiredAccess & MAXIMUM_ALLOWED)
     {
@@ -1098,94 +473,35 @@ ObpIncrementUnnamedHandleCount(IN PVOID Object,
                           &ObjectType->TypeInfo.GenericMapping);
     }
 
-    /* Check if this is an exclusive handle */
-    if (Exclusive)
-    {
-        /* Save the owner process */
-        OBJECT_HEADER_TO_QUOTA_INFO(ObjectHeader)->ExclusiveProcess = Process;
-    }
-
     /* Increase the handle count */
     InterlockedIncrement(&ObjectHeader->HandleCount);
-    ProcessHandleCount = 0;
-
-    /* Check if we have a handle database */
-    if (ObjectType->TypeInfo.MaintainHandleCount)
-    {
-        /* Increment the handle database */
-        Status = ObpIncrementHandleDataBase(ObjectHeader,
-                                            Process,
-                                            &ProcessHandleCount);
-        if (!NT_SUCCESS(Status))
-        {
-            /* FIXME: This should never happen for now */
-            DPRINT1("Unhandled case\n");
-            KEBUGCHECK(0);
-            goto Quickie;
-        }
-    }
 
-    /* Release the lock */
+    /* Release the object type */
     ObpLeaveObjectTypeMutex(ObjectType);
 
+    /* FIXME: Use the Handle Database */
+    ProcessHandleCount = 0;
+
     /* Check if we have an open procedure */
-    Status = STATUS_SUCCESS;
     if (ObjectType->TypeInfo.OpenProcedure)
     {
         /* Call it */
-        ObpCalloutStart(&CalloutIrql);
-        Status = ObjectType->TypeInfo.OpenProcedure(ObCreateHandle,
-                                                    Process,
-                                                    Object,
-                                                    *DesiredAccess,
-                                                    ProcessHandleCount);
-        ObpCalloutEnd(CalloutIrql, "Open", ObjectType, Object);
-
-        /* Check if the open procedure failed */
-        if (!NT_SUCCESS(Status))
-        {
-            /* FIXME: This should never happen for now */
-            DPRINT1("Unhandled case\n");
-            KEBUGCHECK(0);
-            return Status;
-        }
-    }
-
-    /* Check if we have creator info */
-    CreatorInfo = OBJECT_HEADER_TO_CREATOR_INFO(ObjectHeader);
-    if (CreatorInfo)
-    {
-        /* We do, acquire the lock */
-        ObpEnterObjectTypeMutex(ObjectType);
-
-        /* Insert us on the list */
-        InsertTailList(&ObjectType->TypeList, &CreatorInfo->TypeList);
-
-        /* Release the lock */
-        ObpLeaveObjectTypeMutex(ObjectType);
+        ObjectType->TypeInfo.OpenProcedure(ObCreateHandle,
+                                           Process,
+                                           Object,
+                                           *DesiredAccess,
+                                           ProcessHandleCount);
     }
 
     /* Increase total number of handles */
-    Total = InterlockedIncrement((PLONG)&ObjectType->TotalNumberOfHandles);
-    if (Total > ObjectType->HighWaterNumberOfHandles)
-    {
-        /* Fixup count */
-        ObjectType->HighWaterNumberOfHandles = Total;
-    }
-
-    /* Trace call and return */
+    InterlockedIncrement((PLONG)&ObjectType->TotalNumberOfHandles);
     OBTRACE(OB_HANDLE_DEBUG,
             "%s - Incremented count for: %p. UNNAMED HC LC %lx %lx\n",
             __FUNCTION__,
             Object,
             ObjectHeader->HandleCount,
             ObjectHeader->PointerCount);
-    return Status;
-
-Quickie:
-    /* Release lock and return */
-    ObpLeaveObjectTypeMutex(ObjectType);
-    return Status;
+    return STATUS_SUCCESS;
 }
 
 /*++
@@ -1233,16 +549,14 @@ ObpCreateUnnamedHandle(IN PVOID Object,
     POBJECT_HEADER ObjectHeader;
     HANDLE Handle;
     KAPC_STATE ApcState;
-    BOOLEAN AttachedToProcess = FALSE, KernelHandle = FALSE;
+    BOOLEAN AttachedToProcess = FALSE;
     PVOID HandleTable;
     NTSTATUS Status;
-    ACCESS_MASK GrantedAccess;
-    POBJECT_TYPE ObjectType;
+    ULONG i;
     PAGED_CODE();
 
     /* Get the object header and type */
     ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
-    ObjectType = ObjectHeader->Type;
     OBTRACE(OB_HANDLE_DEBUG,
             "%s - Creating handle for: %p. UNNAMED. HC LC %lx %lx\n",
             __FUNCTION__,
@@ -1251,11 +565,10 @@ ObpCreateUnnamedHandle(IN PVOID Object,
             ObjectHeader->PointerCount);
 
     /* Check if this is a kernel handle */
-    if (HandleAttributes & OBJ_KERNEL_HANDLE)
+    if ((HandleAttributes & OBJ_KERNEL_HANDLE) && (AccessMode == KernelMode))
     {
         /* Set the handle table */
         HandleTable = ObpKernelHandleTable;
-        KernelHandle = TRUE;
 
         /* Check if we're not in the system process */
         if (PsGetCurrentProcess() != PsInitialSystemProcess)
@@ -1287,27 +600,31 @@ ObpCreateUnnamedHandle(IN PVOID Object,
         return Status;
     }
 
-    /* Save the object header */
+    /* Save the object header (assert its validity too) */
+    ASSERT((ULONG_PTR)ObjectHeader & EX_HANDLE_ENTRY_LOCKED);
     NewEntry.Object = ObjectHeader;
 
     /* Mask out the internal attributes */
-    NewEntry.ObAttributes |= HandleAttributes & OBJ_HANDLE_ATTRIBUTES;
+    NewEntry.ObAttributes |= HandleAttributes &
+                             (EX_HANDLE_ENTRY_PROTECTFROMCLOSE |
+                              EX_HANDLE_ENTRY_INHERITABLE |
+                              EX_HANDLE_ENTRY_AUDITONCLOSE);
 
-    /* Remove what's not in the valid access mask */
-    GrantedAccess = DesiredAccess & (ObjectType->TypeInfo.ValidAccessMask |
-                                     ACCESS_SYSTEM_SECURITY);
+    /* Save the access mask */
+    NewEntry.GrantedAccess = DesiredAccess;
 
     /* Handle extra references */
     if (AdditionalReferences)
     {
-        /* Add them to the header */
-        InterlockedExchangeAdd(&ObjectHeader->PointerCount,
-                               AdditionalReferences);
+        /* Make a copy in case we fail later below */
+        i = AdditionalReferences;
+        while (i--)
+        {
+            /* Increment the count */
+            InterlockedIncrement(&ObjectHeader->PointerCount);
+        }
     }
 
-    /* Save the access mask */
-    NewEntry.GrantedAccess = GrantedAccess;
-
     /*
      * Create the actual handle. We'll need to do this *after* calling
      * ObpIncrementHandleCount to make sure that Object Security is valid
@@ -1319,26 +636,22 @@ ObpCreateUnnamedHandle(IN PVOID Object,
             NewEntry.Object, NewEntry.ObAttributes & 3, NewEntry.GrantedAccess);
     Handle = ExCreateHandle(HandleTable, &NewEntry);
 
+     /* Detach if needed */
+    if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
+
     /* Make sure we got a handle */
     if (Handle)
     {
         /* Check if this was a kernel handle */
-        if (KernelHandle) Handle = ObMarkHandleAsKernelHandle(Handle);
-
-        /* Return handle and object */
-        *ReturnedHandle = Handle;
-
-        /* Return the new object only if caller wanted it biased */
-        if ((AdditionalReferences) && (ReturnedObject))
+        if (HandleAttributes & OBJ_KERNEL_HANDLE)
         {
-            /* Return it */
-            *ReturnedObject = Object;
+            /* Set the kernel handle bit */
+            Handle = ObMarkHandleAsKernelHandle(Handle);
         }
 
-        /* Detach if needed */
-        if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
-
-        /* Trace and return */
+        /* Return handle and object */
+        *ReturnedHandle = Handle;
+        if (ReturnedObject) *ReturnedObject = Object;
         OBTRACE(OB_HANDLE_DEBUG,
                 "%s - Returning Handle: %lx HC LC %lx %lx\n",
                 __FUNCTION__,
@@ -1349,20 +662,16 @@ ObpCreateUnnamedHandle(IN PVOID Object,
     }
 
     /* Handle extra references */
-    if (AdditionalReferences)
+    while (AdditionalReferences--)
     {
-        /* Dereference it as many times as required */
-        InterlockedExchangeAdd(&ObjectHeader->PointerCount,
-                               -AdditionalReferences);
+        /* Decrement the count */
+        InterlockedDecrement(&ObjectHeader->PointerCount);
     }
 
     /* Decrement the handle count and detach */
     ObpDecrementHandleCount(&ObjectHeader->Body,
                             PsGetCurrentProcess(),
-                            GrantedAccess);
-
-    /* Detach and fail */
-    if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
+                            NewEntry.GrantedAccess);
     return STATUS_INSUFFICIENT_RESOURCES;
 }
 
@@ -1400,7 +709,12 @@ ObpCreateUnnamedHandle(IN PVOID Object,
 *
 * @return <FILLMEIN>.
 *
-* @remarks Cleans up the Lookup Context on return.
+* @remarks Gloomy says OpenReason is "enables Security" if == 1.
+*          since this function *has* to call ObpIncrementHandleCount,
+*          which needs to somehow know the OpenReason, and since
+*          ObOpenHandle == 1, I'm guessing this is actually the
+*          OpenReason. Also makes sense since this function is shared
+*          by Duplication, Creation and Opening..
 *
 *--*/
 NTSTATUS
@@ -1411,7 +725,6 @@ ObpCreateHandle(IN OB_OPEN_REASON OpenReason,
                 IN PACCESS_STATE AccessState,
                 IN ULONG AdditionalReferences,
                 IN ULONG HandleAttributes,
-                IN POBP_LOOKUP_CONTEXT Context,
                 IN KPROCESSOR_MODE AccessMode,
                 OUT PVOID *ReturnedObject,
                 OUT PHANDLE ReturnedHandle)
@@ -1420,12 +733,11 @@ ObpCreateHandle(IN OB_OPEN_REASON OpenReason,
     POBJECT_HEADER ObjectHeader;
     HANDLE Handle;
     KAPC_STATE ApcState;
-    BOOLEAN AttachedToProcess = FALSE, KernelHandle = FALSE;
+    BOOLEAN AttachedToProcess = FALSE;
     POBJECT_TYPE ObjectType;
     PVOID HandleTable;
     NTSTATUS Status;
-    ACCESS_MASK DesiredAccess, GrantedAccess;
-    PAUX_DATA AuxData;
+    ULONG i;
     PAGED_CODE();
 
     /* Get the object header and type */
@@ -1440,19 +752,13 @@ ObpCreateHandle(IN OB_OPEN_REASON OpenReason,
             ObjectHeader->PointerCount);
 
     /* Check if the types match */
-    if ((Type) && (ObjectType != Type))
-    {
-        /* They don't, cleanup */
-        if (Context) ObpCleanupDirectoryLookup(Context);
-        return STATUS_OBJECT_TYPE_MISMATCH;
-    }
+    if ((Type) && (ObjectType != Type)) return STATUS_OBJECT_TYPE_MISMATCH;
 
     /* Check if this is a kernel handle */
-    if (HandleAttributes & OBJ_KERNEL_HANDLE)
+    if ((HandleAttributes & OBJ_KERNEL_HANDLE) && (AccessMode == KernelMode))
     {
         /* Set the handle table */
         HandleTable = ObpKernelHandleTable;
-        KernelHandle = TRUE;
 
         /* Check if we're not in the system process */
         if (PsGetCurrentProcess() != PsInitialSystemProcess)
@@ -1481,51 +787,36 @@ ObpCreateHandle(IN OB_OPEN_REASON OpenReason,
          * We failed (meaning security failure, according to NT Internals)
          * detach and return
          */
-        if (Context) ObpCleanupDirectoryLookup(Context);
         if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
         return Status;
     }
 
-    /* Check if we are doing audits on close */
-    if (AccessState->GenerateOnClose)
-    {
-        /* Force the attribute on */
-        HandleAttributes|= OBJ_AUDIT_OBJECT_CLOSE;
-    }
+    /* Save the object header (assert its validity too) */
+    ASSERT((ULONG_PTR)ObjectHeader & EX_HANDLE_ENTRY_LOCKED);
+    NewEntry.Object = ObjectHeader;
 
     /* Mask out the internal attributes */
-    NewEntry.ObAttributes |= HandleAttributes & OBJ_HANDLE_ATTRIBUTES;
-
-    /* Get the original desired access */
-    DesiredAccess = AccessState->RemainingDesiredAccess |
-                    AccessState->PreviouslyGrantedAccess;
-
-    /* Remove what's not in the valid access mask */
-    GrantedAccess = DesiredAccess & (ObjectType->TypeInfo.ValidAccessMask |
-                                     ACCESS_SYSTEM_SECURITY);
+    NewEntry.ObAttributes |= HandleAttributes &
+                             (EX_HANDLE_ENTRY_PROTECTFROMCLOSE |
+                              EX_HANDLE_ENTRY_INHERITABLE |
+                              EX_HANDLE_ENTRY_AUDITONCLOSE);
 
-    /* Update the value in the access state */
-    AccessState->PreviouslyGrantedAccess = GrantedAccess;
-
-    /* Get the auxiliary data */
-    AuxData = AccessState->AuxData;
+    /* Save the access mask */
+    NewEntry.GrantedAccess = AccessState->RemainingDesiredAccess |
+                             AccessState->PreviouslyGrantedAccess;
 
     /* Handle extra references */
     if (AdditionalReferences)
     {
-        /* Add them to the header */
-        InterlockedExchangeAdd(&ObjectHeader->PointerCount, AdditionalReferences);
+        /* Make a copy in case we fail later below */
+        i = AdditionalReferences;
+        while (i--)
+        {
+            /* Increment the count */
+            InterlockedIncrement(&ObjectHeader->PointerCount);
+        }
     }
 
-    /* Now we can release the object */
-    if (Context) ObpCleanupDirectoryLookup(Context);
-
-    /* Save the object header */
-    NewEntry.Object = ObjectHeader;
-
-    /* Save the access mask */
-    NewEntry.GrantedAccess = GrantedAccess;
-
     /*
      * Create the actual handle. We'll need to do this *after* calling
      * ObpIncrementHandleCount to make sure that Object Security is valid
@@ -1537,53 +828,22 @@ ObpCreateHandle(IN OB_OPEN_REASON OpenReason,
             NewEntry.Object, NewEntry.ObAttributes & 3, NewEntry.GrantedAccess);
     Handle = ExCreateHandle(HandleTable, &NewEntry);
 
+     /* Detach if needed */
+    if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
+
     /* Make sure we got a handle */
     if (Handle)
     {
         /* Check if this was a kernel handle */
-        if (KernelHandle) Handle = ObMarkHandleAsKernelHandle(Handle);
-
-        /* Return it */
-        *ReturnedHandle = Handle;
-
-        /* Check if we need to generate on audit */
-        if (AccessState->GenerateAudit)
-        {
-            /* Audit the handle creation */
-            //SeAuditHandleCreation(AccessState, Handle);
-        }
-
-        /* Check if this was a create */
-        if (OpenReason == ObCreateHandle)
+        if (HandleAttributes & OBJ_KERNEL_HANDLE)
         {
-            /* Check if we need to audit the privileges */
-            if ((AuxData->PrivilegeSet) &&
-                (AuxData->PrivilegeSet->PrivilegeCount))
-            {
-                /* Do the audit */
-#if 0
-                SePrivilegeObjectAuditAlarm(Handle,
-                                            &AccessState->
-                                            SubjectSecurityContext,
-                                            GrantedAccess,
-                                            AuxData->PrivilegeSet,
-                                            TRUE,
-                                            ExGetPreviousMode());
-#endif
-            }
+            /* Set the kernel handle bit */
+            Handle = ObMarkHandleAsKernelHandle(Handle);
         }
 
-        /* Return the new object only if caller wanted it biased */
-        if ((AdditionalReferences) && (ReturnedObject))
-        {
-            /* Return it */
-            *ReturnedObject = Object;
-        }
-
-        /* Detach if needed */
-        if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
-
-        /* Trace and return */
+        /* Return handle and object */
+        *ReturnedHandle = Handle;
+        if (ReturnedObject) *ReturnedObject = Object;
         OBTRACE(OB_HANDLE_DEBUG,
                 "%s - Returning Handle: %lx HC LC %lx %lx\n",
                 __FUNCTION__,
@@ -1593,28 +853,17 @@ ObpCreateHandle(IN OB_OPEN_REASON OpenReason,
         return STATUS_SUCCESS;
     }
 
-    /* Decrement the handle count and detach */
-    ObpDecrementHandleCount(&ObjectHeader->Body,
-                            PsGetCurrentProcess(),
-                            GrantedAccess);
-
     /* Handle extra references */
-    if (AdditionalReferences)
+    while (AdditionalReferences--)
     {
-        /* Check how many extra references were added */
-        if (AdditionalReferences > 1)
-        {
-            /* Dereference it many times */
-            InterlockedExchangeAdd(&ObjectHeader->PointerCount,
-                                  -(AdditionalReferences - 1));
-        }
-
-        /* Dereference the object one last time */
-        ObDereferenceObject(Object);
+        /* Increment the count */
+        InterlockedDecrement(&ObjectHeader->PointerCount);
     }
 
-    /* Detach if necessary and fail */
-    if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
+    /* Decrement the handle count and detach */
+    ObpDecrementHandleCount(&ObjectHeader->Body,
+                            PsGetCurrentProcess(),
+                            NewEntry.GrantedAccess);
     return STATUS_INSUFFICIENT_RESOURCES;
 }
 
@@ -1698,9 +947,9 @@ ObpCloseHandle(IN HANDLE Handle,
         /* Detach */
         if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
 
-        /* Check if this was a user-mode caller with a valid debug port */
+        /* Check if this was a user-mode caller with a valid exception port */
         if ((AccessMode != KernelMode) &&
-            (PsGetCurrentProcess()->DebugPort))
+            (PsGetCurrentProcess()->ExceptionPort))
         {
             /* Raise an exception */
             Status = KeRaiseUserException(STATUS_INVALID_HANDLE);
@@ -1724,6 +973,9 @@ ObpCloseHandle(IN HANDLE Handle,
 *
 *     The ObpSetHandleAttributes routine <FILLMEIN>
 *
+* @param HandleTable
+*        <FILLMEIN>.
+*
 * @param HandleTableEntry
 *        <FILLMEIN>.
 *
@@ -1737,11 +989,13 @@ ObpCloseHandle(IN HANDLE Handle,
 *--*/
 BOOLEAN
 NTAPI
-ObpSetHandleAttributes(IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry,
-                       IN ULONG_PTR Context)
+ObpSetHandleAttributes(IN PHANDLE_TABLE HandleTable,
+                       IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry,
+                       IN PVOID Context)
 {
-    POBP_SET_HANDLE_ATTRIBUTES_CONTEXT SetHandleInfo = (PVOID)Context;
-    POBJECT_HEADER ObjectHeader = ObpGetHandleObject(HandleTableEntry);
+    POBP_SET_HANDLE_ATTRIBUTES_CONTEXT SetHandleInfo =
+        (POBP_SET_HANDLE_ATTRIBUTES_CONTEXT)Context;
+    POBJECT_HEADER ObjectHeader = EX_HTE_TO_HDR(HandleTableEntry);
     PAGED_CODE();
 
     /* Don't allow operations on kernel objects */
@@ -1763,24 +1017,24 @@ ObpSetHandleAttributes(IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry,
         }
 
         /* Set the flag */
-        HandleTableEntry->ObAttributes |= OBJ_INHERIT;
+        HandleTableEntry->ObAttributes |= EX_HANDLE_ENTRY_INHERITABLE;
     }
     else
     {
         /* Otherwise this implies we're removing the flag */
-        HandleTableEntry->ObAttributes &= ~OBJ_INHERIT;
+        HandleTableEntry->ObAttributes &= ~EX_HANDLE_ENTRY_INHERITABLE;
     }
 
     /* Check if making the handle protected */
     if (SetHandleInfo->Information.ProtectFromClose)
     {
         /* Set the flag */
-        HandleTableEntry->ObAttributes |= OBJ_PROTECT_CLOSE;
+        HandleTableEntry->ObAttributes |= EX_HANDLE_ENTRY_PROTECTFROMCLOSE;
     }
     else
     {
         /* Otherwise, remove it */
-        HandleTableEntry->ObAttributes &= ~OBJ_PROTECT_CLOSE;
+        HandleTableEntry->ObAttributes &= ~EX_HANDLE_ENTRY_PROTECTFROMCLOSE;
     }
 
     /* Return success */
@@ -1846,10 +1100,9 @@ ObpCloseHandleCallback(IN PHANDLE_TABLE_ENTRY HandleTableEntry,
 *--*/
 BOOLEAN
 NTAPI
-ObpDuplicateHandleCallback(IN PEPROCESS Process,
-                           IN PHANDLE_TABLE HandleTable,
-                           IN PHANDLE_TABLE_ENTRY OldEntry,
-                           IN PHANDLE_TABLE_ENTRY HandleTableEntry)
+ObpDuplicateHandleCallback(IN PHANDLE_TABLE HandleTable,
+                           IN PHANDLE_TABLE_ENTRY HandleTableEntry,
+                           IN PVOID Context)
 {
     POBJECT_HEADER ObjectHeader;
     BOOLEAN Ret = FALSE;
@@ -1858,17 +1111,11 @@ ObpDuplicateHandleCallback(IN PEPROCESS Process,
     PAGED_CODE();
 
     /* Make sure that the handle is inheritable */
-    Ret = (HandleTableEntry->ObAttributes & OBJ_INHERIT) != 0;
+    Ret = (HandleTableEntry->ObAttributes & EX_HANDLE_ENTRY_INHERITABLE) != 0;
     if (Ret)
     {
         /* Get the object header */
-        ObjectHeader = ObpGetHandleObject(HandleTableEntry);
-
-        /* Increment the pointer count */
-        InterlockedIncrement(&ObjectHeader->PointerCount);
-
-        /* Release the handle lock */
-        ExUnlockHandleTableEntry(HandleTable, OldEntry);
+        ObjectHeader = EX_HTE_TO_HDR(HandleTableEntry);
 
         /* Setup the access state */
         AccessState.PreviouslyGrantedAccess = HandleTableEntry->GrantedAccess;
@@ -1878,19 +1125,18 @@ ObpDuplicateHandleCallback(IN PEPROCESS Process,
                                          &AccessState,
                                          KernelMode,
                                          HandleTableEntry->ObAttributes,
-                                         Process,
+                                         PsGetCurrentProcess(),
                                          ObInheritHandle);
         if (!NT_SUCCESS(Status))
         {
             /* Return failure */
-            ObDereferenceObject(&ObjectHeader->Body);
             Ret = FALSE;
         }
-    }
-    else
-    {
-        /* Release the handle lock */
-        ExUnlockHandleTableEntry(HandleTable, OldEntry);
+        else
+        {
+            /* Otherwise increment the pointer count */
+            InterlockedIncrement(&ObjectHeader->PointerCount);
+        }
     }
 
     /* Return duplication result */
@@ -1931,15 +1177,11 @@ ObpCreateHandleTable(IN PEPROCESS Parent,
     /* Check if we have a parent */
     if (Parent)
     {
-        /* Get the parent's table */
-        HandleTable = ObReferenceProcessHandleTable(Parent);
-        if (!HandleTable) return STATUS_PROCESS_IS_TERMINATING;
-
         /* Duplicate the parent's */
         HandleTable = ExDupHandleTable(Process,
-                                       HandleTable,
                                        ObpDuplicateHandleCallback,
-                                       OBJ_INHERIT);
+                                       NULL,
+                                       Parent->ObjectTable);
     }
     else
     {
@@ -1947,14 +1189,11 @@ ObpCreateHandleTable(IN PEPROCESS Parent,
         HandleTable = ExCreateHandleTable(Process);
     }
 
-    /* Now write it */
+    /* Now write it and make sure we got one */
     Process->ObjectTable = HandleTable;
-
-    /* Dereference the parent's handle table if we have one */
-    if (Parent) ObDereferenceProcessHandleTable(Parent);
-
-    /* Fail or succeed depending on whether we got a handle table or not */
     if (!HandleTable) return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* If we got here then the table was created OK */
     return STATUS_SUCCESS;
 }
 
@@ -1975,22 +1214,10 @@ VOID
 NTAPI
 ObKillProcess(IN PEPROCESS Process)
 {
-    PHANDLE_TABLE HandleTable;
+    PHANDLE_TABLE HandleTable = Process->ObjectTable;
     OBP_CLOSE_HANDLE_CONTEXT Context;
-    BOOLEAN HardErrors;
     PAGED_CODE();
 
-    /* Wait for process rundown and then complete it */
-    ExWaitForRundownProtectionRelease(&Process->RundownProtect);
-    ExRundownCompleted(&Process->RundownProtect);
-
-    /* Get the object table */
-    HandleTable = Process->ObjectTable;
-    if (!HandleTable) return;
-
-    /* Disable hard errors while we close handles */
-    HardErrors = IoSetThreadHardErrorMode(FALSE);
-
     /* Enter a critical region */
     KeEnterCriticalRegion();
 
@@ -2002,17 +1229,13 @@ ObKillProcess(IN PEPROCESS Process)
     ExSweepHandleTable(HandleTable,
                        ObpCloseHandleCallback,
                        &Context);
-    ASSERT(HandleTable->HandleCount == 0);
 
-    /* Leave the critical region */
+    /* Destroy the table and leave the critical region */
+    ExDestroyHandleTable(HandleTable);
     KeLeaveCriticalRegion();
 
-    /* Re-enable hard errors */
-    IoSetThreadHardErrorMode(HardErrors);
-
-    /* Destroy the object table */
+    /* Clear the object table */
     Process->ObjectTable = NULL;
-    ExDestroyHandleTable(HandleTable, NULL);
 }
 
 NTSTATUS
@@ -2033,14 +1256,13 @@ ObDuplicateObject(IN PEPROCESS SourceProcess,
     POBJECT_TYPE ObjectType;
     HANDLE NewHandle;
     KAPC_STATE ApcState;
-    NTSTATUS Status;
+    NTSTATUS Status = STATUS_SUCCESS;
     ACCESS_MASK TargetAccess, SourceAccess;
     ACCESS_STATE AccessState;
     PACCESS_STATE PassedAccessState = NULL;
     AUX_DATA AuxData;
-    PHANDLE_TABLE HandleTable;
+    PHANDLE_TABLE HandleTable = NULL;
     OBJECT_HANDLE_INFORMATION HandleInformation;
-    ULONG AuditMask;
     PAGED_CODE();
     OBTRACE(OB_HANDLE_DEBUG,
             "%s - Duplicating handle: %lx for %p into %p\n",
@@ -2049,81 +1271,32 @@ ObDuplicateObject(IN PEPROCESS SourceProcess,
             SourceProcess,
             TargetProcess);
 
-    /* Assume failure */
-    if (TargetHandle) *TargetHandle = NULL;
-
-    /* Check if we're not duplicating the same access */
-    if (!(Options & DUPLICATE_SAME_ACCESS))
+    /* Check if we're not in the source process */
+    if (SourceProcess != PsGetCurrentProcess())
     {
-        /* Validate the desired access */
-        Status = STATUS_SUCCESS; //ObpValidateDesiredAccess(DesiredAccess);
-        if (!NT_SUCCESS(Status)) return Status;
+        /* Attach to it */
+        KeStackAttachProcess(&SourceProcess->Pcb, &ApcState);
+        AttachedToProcess = TRUE;
     }
 
-    /* Reference the object table */
-    HandleTable = ObReferenceProcessHandleTable(SourceProcess);
-    if (!HandleTable) return STATUS_PROCESS_IS_TERMINATING;
-
-    /* Reference the process object */
-    Status = ObpReferenceProcessObjectByHandle(SourceHandle,
-                                               SourceProcess,
-                                               HandleTable,
-                                               PreviousMode,
-                                               &SourceObject,
-                                               &HandleInformation,
-                                               &AuditMask);
-    if (!NT_SUCCESS(Status))
-    {
-        /* Fail */
-        ObDereferenceProcessHandleTable(SourceProcess);
-        return Status;
-    }
+    /* Now reference the source handle */
+    Status = ObReferenceObjectByHandle(SourceHandle,
+                                       0,
+                                       NULL,
+                                       PreviousMode,
+                                       (PVOID*)&SourceObject,
+                                       &HandleInformation);
 
-    /* Check if there's no target process */
-    if (!TargetProcess)
+    /* Check if we were attached */
+    if (AttachedToProcess)
     {
-        /* Check if the caller wanted actual duplication */
-        if (!(Options & DUPLICATE_CLOSE_SOURCE))
-        {
-            /* Invalid request */
-            Status = STATUS_INVALID_PARAMETER;
-        }
-        else
-        {
-            /* Otherwise, do the attach */
-            KeStackAttachProcess(&SourceProcess->Pcb, &ApcState);
-
-            /* Close the handle and detach */
-            NtClose(SourceHandle);
-            KeUnstackDetachProcess(&ApcState);
-        }
-
-        /* Return */
-        ObDereferenceProcessHandleTable(SourceProcess);
-        ObDereferenceObject(SourceObject);
-        return Status;
+        /* We can safely detach now */
+        KeUnstackDetachProcess(&ApcState);
+        AttachedToProcess = FALSE;
     }
 
-    /* Get the target handle table */
-    HandleTable = ObReferenceProcessHandleTable(TargetProcess);
-    if (!HandleTable)
-    {
-        /* Check if the caller wanted us to close the handle */
-        if (Options & DUPLICATE_CLOSE_SOURCE)
-        {
-            /* Do the attach */
-            KeStackAttachProcess(&SourceProcess->Pcb, &ApcState);
-
-            /* Close the handle and detach */
-            NtClose(SourceHandle);
-            KeUnstackDetachProcess(&ApcState);
-        }
-
-        /* Return */
-        ObDereferenceProcessHandleTable(SourceProcess);
-        ObDereferenceObject(SourceObject);
-        return STATUS_PROCESS_IS_TERMINATING;
-    }
+    /* Fail if we couldn't reference it */
+    if (!NT_SUCCESS(Status)) return Status;
 
     /* Get the source access */
     SourceAccess = HandleInformation.GrantedAccess;
@@ -2152,14 +1325,16 @@ ObDuplicateObject(IN PEPROCESS SourceProcess,
 
     /* Fill out the entry */
     NewHandleEntry.Object = ObjectHeader;
-    NewHandleEntry.ObAttributes |= HandleAttributes & OBJ_HANDLE_ATTRIBUTES;
+    NewHandleEntry.ObAttributes |= HandleAttributes &
+                                   (EX_HANDLE_ENTRY_PROTECTFROMCLOSE |
+                                    EX_HANDLE_ENTRY_INHERITABLE |
+                                    EX_HANDLE_ENTRY_AUDITONCLOSE);
 
     /* Check if we're using a generic mask */
     if (DesiredAccess & GENERIC_ACCESS)
     {
         /* Map it */
-        RtlMapGenericMask(&DesiredAccess,
-                          &ObjectType->TypeInfo.GenericMapping);
+        RtlMapGenericMask(&DesiredAccess, &ObjectType->TypeInfo.GenericMapping);
     }
 
     /* Set the target access */
@@ -2201,6 +1376,9 @@ ObDuplicateObject(IN PEPROCESS SourceProcess,
                                          HandleAttributes,
                                          PsGetCurrentProcess(),
                                          ObDuplicateHandle);
+
+        /* Set the handle table, now that we know this handle was added */
+        HandleTable = PsGetCurrentProcess()->ObjectTable;
     }
 
     /* Check if we were attached */
@@ -2226,10 +1404,6 @@ ObDuplicateObject(IN PEPROCESS SourceProcess,
     /* Now check if incrementing actually failed */
     if (!NT_SUCCESS(Status))
     {
-        /* Dereference handle tables */
-        ObDereferenceProcessHandleTable(SourceProcess);
-        ObDereferenceProcessHandleTable(TargetProcess);
-
         /* Dereference the source object */
         ObDereferenceObject(SourceObject);
         return Status;
@@ -2252,10 +1426,6 @@ ObDuplicateObject(IN PEPROCESS SourceProcess,
     /* Return the handle */
     if (TargetHandle) *TargetHandle = NewHandle;
 
-    /* Dereference handle tables */
-    ObDereferenceProcessHandleTable(SourceProcess);
-    ObDereferenceProcessHandleTable(TargetProcess);
-
     /* Return status */
     OBTRACE(OB_HANDLE_DEBUG,
             "%s - Duplicated handle: %lx for %p into %p. Source: %p HC PC %lx %lx\n",
@@ -2315,41 +1485,31 @@ ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
 {
     PVOID Object = NULL;
     UNICODE_STRING ObjectName;
+    OBJECT_CREATE_INFORMATION ObjectCreateInfo;
     NTSTATUS Status;
+    OBP_LOOKUP_CONTEXT Context;
     POBJECT_HEADER ObjectHeader;
+    AUX_DATA AuxData;
     PGENERIC_MAPPING GenericMapping = NULL;
+    ACCESS_STATE AccessState;
     OB_OPEN_REASON OpenReason;
-    POB_TEMP_BUFFER TempBuffer;
     PAGED_CODE();
 
-    /* Assume failure */
-    *Handle = NULL;
-
     /* Check if we didn't get any Object Attributes */
     if (!ObjectAttributes)
     {
         /* Fail with special status code */
+        *Handle = NULL;
         return STATUS_INVALID_PARAMETER;
     }
 
-    /* Allocate the temporary buffer */
-    TempBuffer = ExAllocatePoolWithTag(NonPagedPool,
-                                       sizeof(OB_TEMP_BUFFER),
-                                       TAG_OB_TEMP_STORAGE);
-    if (!TempBuffer) return STATUS_INSUFFICIENT_RESOURCES;
-
     /* Capture all the info */
     Status = ObpCaptureObjectAttributes(ObjectAttributes,
                                         AccessMode,
                                         TRUE,
-                                        &TempBuffer->ObjectCreateInfo,
+                                        &ObjectCreateInfo,
                                         &ObjectName);
-    if (!NT_SUCCESS(Status))
-    {
-        /* Fail */
-        ExFreePool(TempBuffer);
-        return Status;
-    }
+    if (!NT_SUCCESS(Status)) return Status;
 
     /* Check if we didn't get an access state */
     if (!PassedAccessState)
@@ -2358,40 +1518,35 @@ ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
         if (ObjectType) GenericMapping = &ObjectType->TypeInfo.GenericMapping;
 
         /* Use our built-in access state */
-        PassedAccessState = &TempBuffer->LocalAccessState;
-        Status = SeCreateAccessState(&TempBuffer->LocalAccessState,
-                                     &TempBuffer->AuxData,
+        PassedAccessState = &AccessState;
+        Status = SeCreateAccessState(&AccessState,
+                                     &AuxData,
                                      DesiredAccess,
                                      GenericMapping);
         if (!NT_SUCCESS(Status)) goto Quickie;
     }
 
     /* Get the security descriptor */
-    if (TempBuffer->ObjectCreateInfo.SecurityDescriptor)
+    if (ObjectCreateInfo.SecurityDescriptor)
     {
         /* Save it in the access state */
         PassedAccessState->SecurityDescriptor =
-            TempBuffer->ObjectCreateInfo.SecurityDescriptor;
+            ObjectCreateInfo.SecurityDescriptor;
     }
 
     /* Now do the lookup */
-    Status = ObpLookupObjectName(TempBuffer->ObjectCreateInfo.RootDirectory,
-                                 &ObjectName,
-                                 TempBuffer->ObjectCreateInfo.Attributes,
-                                 ObjectType,
-                                 AccessMode,
-                                 ParseContext,
-                                 TempBuffer->ObjectCreateInfo.SecurityQos,
-                                 NULL,
-                                 PassedAccessState,
-                                 &TempBuffer->LookupContext,
-                                 &Object);
-    if (!NT_SUCCESS(Status))
-    {
-        /* Cleanup after lookup */
-        ObpCleanupDirectoryLookup(&TempBuffer->LookupContext);
-        goto Cleanup;
-    }
+    Status = ObFindObject(ObjectCreateInfo.RootDirectory,
+                          &ObjectName,
+                          ObjectCreateInfo.Attributes,
+                          AccessMode,
+                          &Object,
+                          ObjectType,
+                          &Context,
+                          PassedAccessState,
+                          ObjectCreateInfo.SecurityQos,
+                          ParseContext,
+                          NULL);
+    if (!NT_SUCCESS(Status)) goto Cleanup;
 
     /* Check if this object has create information */
     ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
@@ -2415,49 +1570,29 @@ ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
         OpenReason = ObOpenHandle;
     }
 
-    /* Check if we have invalid object attributes */
-    if (ObjectHeader->Type->TypeInfo.InvalidAttributes &
-        TempBuffer->ObjectCreateInfo.Attributes)
-    {
-        /* Set failure code */
-        Status = STATUS_INVALID_PARAMETER;
-
-        /* Cleanup after lookup */
-        ObpCleanupDirectoryLookup(&TempBuffer->LookupContext);
-
-        /* Dereference the object */
-        ObDereferenceObject(Object);
-    }
-    else
-    {
-        /* Create the actual handle now */
-        Status = ObpCreateHandle(OpenReason,
-                                 Object,
-                                 ObjectType,
-                                 PassedAccessState,
-                                 0,
-                                 TempBuffer->ObjectCreateInfo.Attributes,
-                                 &TempBuffer->LookupContext,
-                                 AccessMode,
-                                 NULL,
-                                 Handle);
-        if (!NT_SUCCESS(Status)) ObDereferenceObject(Object);
-    }
+    /* Create the actual handle now */
+    Status = ObpCreateHandle(OpenReason,
+                             Object,
+                             ObjectType,
+                             PassedAccessState,
+                             0,
+                             ObjectCreateInfo.Attributes,
+                             AccessMode,
+                             NULL,
+                             Handle);
+    if (!NT_SUCCESS(Status)) ObDereferenceObject(Object);
 
 Cleanup:
     /* Delete the access state */
-    if (PassedAccessState == &TempBuffer->LocalAccessState)
+    if (PassedAccessState == &AccessState)
     {
         SeDeleteAccessState(PassedAccessState);
     }
 
+    /* Release the object attributes and return status */
 Quickie:
-    /* Release the object attributes and temporary buffer */
-    ObpReleaseCapturedAttributes(&TempBuffer->ObjectCreateInfo);
-    if (ObjectName.Buffer) ObpFreeObjectNameBuffer(&ObjectName);
-    ExFreePool(TempBuffer);
-
-    /* Return status */
+    ObpReleaseCapturedAttributes(&ObjectCreateInfo);
+    if (ObjectName.Buffer) ObpReleaseCapturedName(&ObjectName);
     OBTRACE(OB_HANDLE_DEBUG,
             "%s - returning Object %p with PC S: %lx %lx\n",
             __FUNCTION__,
@@ -2515,8 +1650,8 @@ ObOpenObjectByPointer(IN PVOID Object,
     AUX_DATA AuxData;
     PAGED_CODE();
 
-    /* Assume failure */
-    *Handle = NULL;
+    /* Get the Header Info */
+    Header = OBJECT_TO_OBJECT_HEADER(Object);
 
     /* Reference the object */
     Status = ObReferenceObjectByPointer(Object,
@@ -2525,9 +1660,6 @@ ObOpenObjectByPointer(IN PVOID Object,
                                         AccessMode);
     if (!NT_SUCCESS(Status)) return Status;
 
-    /* Get the Header Info */
-    Header = OBJECT_TO_OBJECT_HEADER(Object);
-
     /* Check if we didn't get an access state */
     if (!PassedAccessState)
     {
@@ -2545,20 +1677,6 @@ ObOpenObjectByPointer(IN PVOID Object,
         }
     }
 
-    /* Check if we have invalid object attributes */
-    if (Header->Type->TypeInfo.InvalidAttributes & HandleAttributes)
-    {
-        /* Delete the access state */
-        if (PassedAccessState == &AccessState)
-        {
-            SeDeleteAccessState(PassedAccessState);
-        }
-
-        /* Dereference the object */
-        ObDereferenceObject(Object);
-        return STATUS_INVALID_PARAMETER;
-    }
-
     /* Create the handle */
     Status = ObpCreateHandle(ObOpenHandle,
                              Object,
@@ -2566,7 +1684,6 @@ ObOpenObjectByPointer(IN PVOID Object,
                              PassedAccessState,
                              0,
                              HandleAttributes,
-                             NULL,
                              AccessMode,
                              NULL,
                              Handle);
@@ -2587,75 +1704,15 @@ ObOpenObjectByPointer(IN PVOID Object,
     return Status;
 }
 
-/*++
-* @name ObFindHandleForObject
-* @implemented NT4
-*
-*     The ObFindHandleForObject routine <FILLMEIN>
-*
-* @param Process
-*        <FILLMEIN>.
-*
-* @param Object
-*        <FILLMEIN>.
-*
-* @param ObjectType
-*        <FILLMEIN>.
-*
-* @param HandleInformation
-*        <FILLMEIN>.
-*
-* @param HandleReturn
-*        <FILLMEIN>.
-*
-* @return <FILLMEIN>.
-*
-* @remarks None.
-*
-*--*/
-BOOLEAN
-NTAPI
+NTSTATUS STDCALL
 ObFindHandleForObject(IN PEPROCESS Process,
                       IN PVOID Object,
                       IN POBJECT_TYPE ObjectType,
                       IN POBJECT_HANDLE_INFORMATION HandleInformation,
-                      OUT PHANDLE Handle)
+                      OUT PHANDLE HandleReturn)
 {
-    OBP_FIND_HANDLE_DATA FindData;
-    BOOLEAN Result = FALSE;
-
-    /* Make sure we have an object table */
-    if (Process->ObjectTable)
-    {
-        /* Check if we have an object */
-        if (Object)
-        {
-            /* Set its header */
-            FindData.ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
-        }
-        else
-        {
-            /* Otherwise, no object to match*/
-            FindData.ObjectHeader = NULL;
-        }
-
-        /* Set other information */
-        FindData.ObjectType = ObjectType;
-        FindData.HandleInformation = HandleInformation;
-
-        /* Enumerate the handle table */
-        if (ExEnumHandleTable(Process->ObjectTable,
-                              ObpEnumFindHandleProcedure,
-                              &FindData,
-                              Handle))
-        {
-            /* Set success */
-            Result = TRUE;
-        }
-    }
-
-    /* Return the result */
-    return Result;
+    DPRINT("ObFindHandleForObject is unimplemented!\n");
+    return STATUS_UNSUCCESSFUL;
 }
 
 /*++
@@ -2690,163 +1747,121 @@ ObFindHandleForObject(IN PEPROCESS Process,
 NTSTATUS
 NTAPI
 ObInsertObject(IN PVOID Object,
-               IN PACCESS_STATE AccessState OPTIONAL,
+               IN PACCESS_STATE PassedAccessState OPTIONAL,
                IN ACCESS_MASK DesiredAccess,
-               IN ULONG ObjectPointerBias,
-               OUT PVOID *NewObject OPTIONAL,
+               IN ULONG AdditionalReferences,
+               OUT PVOID *ReferencedObject OPTIONAL,
                OUT PHANDLE Handle)
 {
     POBJECT_CREATE_INFORMATION ObjectCreateInfo;
-    POBJECT_HEADER ObjectHeader;
+    POBJECT_HEADER Header;
     POBJECT_TYPE ObjectType;
-    PUNICODE_STRING ObjectName;
-    PVOID InsertObject;
-    PSECURITY_DESCRIPTOR ParentDescriptor = NULL;
-    BOOLEAN SdAllocated = FALSE;
-    POBJECT_HEADER_NAME_INFO ObjectNameInfo;
+    PVOID FoundObject = Object;
+    POBJECT_HEADER FoundHeader = NULL;
+    NTSTATUS Status = STATUS_SUCCESS, RealStatus;
+    PSECURITY_DESCRIPTOR DirectorySd = NULL;
+    BOOLEAN SdAllocated;
     OBP_LOOKUP_CONTEXT Context;
-    ACCESS_STATE LocalAccessState;
+    POBJECT_HEADER_NAME_INFO ObjectNameInfo;
+    ACCESS_STATE AccessState;
     AUX_DATA AuxData;
-    OB_OPEN_REASON OpenReason;
-    KPROCESSOR_MODE PreviousMode;
-    NTSTATUS Status = STATUS_SUCCESS, RealStatus;
-    BOOLEAN IsNewObject;
+    BOOLEAN IsNamed = FALSE;
+    OB_OPEN_REASON OpenReason = ObCreateHandle;
     PAGED_CODE();
 
-    /* Get the Header */
-    ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
-
-    /* Detect invalid insert */
-    if (!(ObjectHeader->Flags & OB_FLAG_CREATE_INFO))
-    {
-        /* Display warning and break into debugger */
-        DPRINT1("OB: Attempting to insert existing object %08x\n", Object);
-        DbgBreakPoint();
-
-        /* Allow debugger to continue */
-        ObDereferenceObject(Object);
-        return STATUS_INVALID_PARAMETER;
-    }
-
-    /* Get the create and name info, as well as the object type */
-    ObjectCreateInfo = ObjectHeader->ObjectCreateInfo;
-    ObjectNameInfo = ObpAcquireNameInformation(ObjectHeader);
-    ObjectType = ObjectHeader->Type;
-    ObjectName = NULL;
+    /* Get the Header and Create Info */
+    Header = OBJECT_TO_OBJECT_HEADER(Object);
+    ObjectCreateInfo = Header->ObjectCreateInfo;
+    ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO(Header);
+    ObjectType = Header->Type;
 
     /* Check if this is an named object */
-    if ((ObjectNameInfo) && (ObjectNameInfo->Name.Buffer))
-    {
-        /* Get the object name */
-        ObjectName = &ObjectNameInfo->Name;
-    }
-
-    /* Sanity check */
-    ASSERT((Handle) ||
-           ((ObjectPointerBias == 0) &&
-            (ObjectName == NULL) &&
-            (ObjectType->TypeInfo.SecurityRequired) &&
-            (NewObject == NULL)));
+    if ((ObjectNameInfo) && (ObjectNameInfo->Name.Buffer)) IsNamed = TRUE;
 
     /* Check if the object is unnamed and also doesn't have security */
-    PreviousMode = KeGetPreviousMode();
-    if (!(ObjectType->TypeInfo.SecurityRequired) && !(ObjectName))
+    if ((!ObjectType->TypeInfo.SecurityRequired) && !(IsNamed))
     {
-        /* Assume failure */
-        *Handle = NULL;
-        ObjectHeader->ObjectCreateInfo = NULL;
+        /* ReactOS HACK */
+        if (Handle)
+        {
+            /* Assume failure */
+            *Handle = NULL;
 
-        /* Create the handle */
-        Status = ObpCreateUnnamedHandle(Object,
-                                        DesiredAccess,
-                                        ObjectPointerBias + 1,
-                                        ObjectCreateInfo->Attributes,
-                                        PreviousMode,
-                                        NewObject,
-                                        Handle);
+            /* Create the handle */
+            Status = ObpCreateUnnamedHandle(Object,
+                                            DesiredAccess,
+                                            AdditionalReferences + 1,
+                                            ObjectCreateInfo->Attributes,
+                                            ExGetPreviousMode(),
+                                            ReferencedObject,
+                                            Handle);
+        }
 
         /* Free the create information */
         ObpFreeAndReleaseCapturedAttributes(ObjectCreateInfo);
-
-        /* Release the object name information */
-        ObpReleaseNameInformation(ObjectNameInfo);
+        Header->ObjectCreateInfo = NULL;
 
         /* Remove the extra keep-alive reference */
-        ObDereferenceObject(Object);
+        if (Handle) ObDereferenceObject(Object);
 
         /* Return */
         OBTRACE(OB_HANDLE_DEBUG,
                 "%s - returning Object with PC S: %lx %lx\n",
                 __FUNCTION__,
-                ObjectHeader->PointerCount,
+                OBJECT_TO_OBJECT_HEADER(Object)->PointerCount,
                 Status);
         return Status;
     }
 
     /* Check if we didn't get an access state */
-    if (!AccessState)
+    if (!PassedAccessState)
     {
         /* Use our built-in access state */
-        AccessState = &LocalAccessState;
-        Status = SeCreateAccessState(&LocalAccessState,
+        PassedAccessState = &AccessState;
+        Status = SeCreateAccessState(&AccessState,
                                      &AuxData,
                                      DesiredAccess,
                                      &ObjectType->TypeInfo.GenericMapping);
         if (!NT_SUCCESS(Status))
         {
             /* Fail */
-            ObpReleaseNameInformation(ObjectNameInfo);
             ObDereferenceObject(Object);
             return Status;
         }
     }
 
     /* Save the security descriptor */
-    AccessState->SecurityDescriptor = ObjectCreateInfo->SecurityDescriptor;
-
-    /* Validate the access mask */
-    Status = STATUS_SUCCESS;//ObpValidateAccessMask(AccessState);
-    if (!NT_SUCCESS(Status))
-    {
-        /* Fail */
-        ObpReleaseNameInformation(ObjectNameInfo);
-        ObDereferenceObject(Object);
-        return Status;
-    }
-
-    /* Setup a lookup context */
-    ObpInitializeDirectoryLookup(&Context);
-    InsertObject = Object;
-    OpenReason = ObCreateHandle;
+    PassedAccessState->SecurityDescriptor =
+        ObjectCreateInfo->SecurityDescriptor;
 
     /* Check if the object is named */
-    if (ObjectName)
+    if (IsNamed)
     {
         /* Look it up */
-        Status = ObpLookupObjectName(ObjectCreateInfo->RootDirectory,
-                                     ObjectName,
-                                     ObjectCreateInfo->Attributes,
-                                     ObjectType,
-                                     (ObjectHeader->Flags & OB_FLAG_KERNEL_MODE) ?
-                                     KernelMode : UserMode,
-                                     ObjectCreateInfo->ParseContext,
-                                     ObjectCreateInfo->SecurityQos,
-                                     Object,
-                                     AccessState,
-                                     &Context,
-                                     &InsertObject);
-
+        Status = ObFindObject(ObjectCreateInfo->RootDirectory,
+                              &ObjectNameInfo->Name,
+                              ObjectCreateInfo->Attributes,
+                              (Header->Flags & OB_FLAG_KERNEL_MODE) ?
+                              KernelMode : UserMode,
+                              &FoundObject,
+                              ObjectType,
+                              &Context,
+                              PassedAccessState,
+                              ObjectCreateInfo->SecurityQos,
+                              ObjectCreateInfo->ParseContext,
+                              Object);
         /* Check if we found an object that doesn't match the one requested */
-        if ((NT_SUCCESS(Status)) && (InsertObject) && (Object != InsertObject))
+        if ((NT_SUCCESS(Status)) && (FoundObject) && (Object != FoundObject))
         {
             /* This means we're opening an object, not creating a new one */
+            FoundHeader = OBJECT_TO_OBJECT_HEADER(FoundObject);
             OpenReason = ObOpenHandle;
 
             /* Make sure the caller said it's OK to do this */
             if (ObjectCreateInfo->Attributes & OBJ_OPENIF)
             {
                 /* He did, but did he want this type? */
-                if (ObjectType != OBJECT_TO_OBJECT_HEADER(InsertObject)->Type)
+                if (ObjectType != FoundHeader->Type)
                 {
                     /* Wrong type, so fail */
                     Status = STATUS_OBJECT_TYPE_MISMATCH;
@@ -2867,60 +1882,45 @@ ObInsertObject(IN PVOID Object,
         /* Check if anything until now failed */
         if (!NT_SUCCESS(Status))
         {
-            /* Cleanup after lookup */
-            ObpCleanupDirectoryLookup(&Context);
-
-            /* Remove query reference that we added */
-            ObpReleaseNameInformation(ObjectNameInfo);
-
-            /* Dereference the object and delete the access state */
+            /* We failed, dereference the object and delete the access state */
             ObDereferenceObject(Object);
-            if (AccessState == &LocalAccessState)
+            if (PassedAccessState == &AccessState)
             {
                 /* We used a local one; delete it */
-                SeDeleteAccessState(AccessState);
+                SeDeleteAccessState(PassedAccessState);
             }
 
             /* Return failure code */
             return Status;
         }
-        else
-        {
-            /* Check if this is a symbolic link */
-            if (ObjectType == ObSymbolicLinkType)
-            {
-                /* Create the internal name */
-                ObpCreateSymbolicLinkName(Object);
-            }
-        }
     }
 
     /* Now check if this object is being created */
-    if (InsertObject == Object)
+    if (FoundObject == Object)
     {
         /* Check if it's named or forces security */
-        if ((ObjectName) || (ObjectType->TypeInfo.SecurityRequired))
+        if ((IsNamed) || (ObjectType->TypeInfo.SecurityRequired))
         {
             /* Make sure it's inserted into an object directory */
             if ((ObjectNameInfo) && (ObjectNameInfo->Directory))
             {
                 /* Get the current descriptor */
                 ObGetObjectSecurity(ObjectNameInfo->Directory,
-                                    &ParentDescriptor,
+                                    &DirectorySd,
                                     &SdAllocated);
             }
 
             /* Now assign it */
-            Status = ObAssignSecurity(AccessState,
-                                      ParentDescriptor,
+            Status = ObAssignSecurity(PassedAccessState,
+                                      DirectorySd,
                                       Object,
                                       ObjectType);
 
             /* Check if we captured one */
-            if (ParentDescriptor)
+            if (DirectorySd)
             {
                 /* We did, release it */
-                ObReleaseObjectSecurity(ParentDescriptor, SdAllocated);
+                ObReleaseObjectSecurity(DirectorySd, SdAllocated);
             }
             else if (NT_SUCCESS(Status))
             {
@@ -2930,38 +1930,24 @@ ObInsertObject(IN PVOID Object,
                                             TRUE);
 
                 /* Clear the current one */
-                AccessState->SecurityDescriptor =
-                ObjectCreateInfo->SecurityDescriptor = NULL;
+                PassedAccessState->SecurityDescriptor =
+                    ObjectCreateInfo->SecurityDescriptor = NULL;
             }
         }
 
         /* Check if anything until now failed */
         if (!NT_SUCCESS(Status))
         {
-            /* Check if the directory was added */
-            if (Context.DirectoryLocked)
-            {
-                /* Weird case where we need to do a manual delete */
-                DPRINT1("Unhandled path\n");
-                KEBUGCHECK(0);
-            }
-
-            /* Cleanup the lookup */
-            ObpCleanupDirectoryLookup(&Context);
-
-            /* Remove query reference that we added */
-            ObpReleaseNameInformation(ObjectNameInfo);
-
-            /* Dereference the object and delete the access state */
+            /* We failed, dereference the object and delete the access state */
+            KEBUGCHECK(0);
             ObDereferenceObject(Object);
-            if (AccessState == &LocalAccessState)
+            if (PassedAccessState == &AccessState)
             {
                 /* We used a local one; delete it */
-                SeDeleteAccessState(AccessState);
+                SeDeleteAccessState(PassedAccessState);
             }
 
             /* Return failure code */
-            KEBUGCHECK(0);
             return Status;
         }
     }
@@ -2969,59 +1955,54 @@ ObInsertObject(IN PVOID Object,
     /* Save the actual status until here */
     RealStatus = Status;
 
-    /* Check if caller wants us to create a handle */
-    ObjectHeader->ObjectCreateInfo = NULL;
+    /* HACKHACK: Because of ROS's incorrect startup, this can be called
+     * without a valid Process until I finalize the startup patch,
+     * so don't create a handle if this is the case. We also don't create
+     * a handle if Handle is NULL when the Registry Code calls it, because
+     * the registry code totally bastardizes the Ob and needs to be fixed
+     */
     if (Handle)
     {
         /* Create the handle */
         Status = ObpCreateHandle(OpenReason,
-                                 InsertObject,
+                                 FoundObject,
                                  NULL,
-                                 AccessState,
-                                 ObjectPointerBias + 1,
+                                 PassedAccessState,
+                                 AdditionalReferences + 1,
                                  ObjectCreateInfo->Attributes,
-                                 &Context,
-                                 PreviousMode,
-                                 NewObject,
+                                 ExGetPreviousMode(),
+                                 ReferencedObject,
                                  Handle);
-        if (!NT_SUCCESS(Status))
-        {
-            /* If the object had a name, backout everything */
-            if (ObjectName) ObpDeleteNameCheck(Object);
-
-            /* Return the status of the failure */
-            *Handle = NULL;
-            RealStatus = Status;
-        }
+    }
 
-        /* Remove a query reference */
-        ObpReleaseNameInformation(ObjectNameInfo);
+    /* We can delete the Create Info now */
+    Header->ObjectCreateInfo = NULL;
+    ObpFreeAndReleaseCapturedAttributes(ObjectCreateInfo);
 
-        /* Remove the extra keep-alive reference */
-        ObDereferenceObject(Object);
-    }
-    else
+    /* Check if creating the handle failed */
+    if (!NT_SUCCESS(Status))
     {
-        /* Otherwise, lock the object type */
-        ObpEnterObjectTypeMutex(ObjectType);
-
-        /* And charge quota for the process to make it appear as used */
-        RealStatus = ObpChargeQuotaForObject(ObjectHeader,
-                                             ObjectType,
-                                             &IsNewObject);
+        /* If the object had a name, backout everything */
+        if (IsNamed) ObpDeleteNameCheck(Object);
+    }
 
-        /* Release the lock */
-        ObpLeaveObjectTypeMutex(ObjectType);
+    /* Remove the extra keep-alive reference */
+    if (Handle) ObDereferenceObject(Object);
 
-        /* Check if we failed and dereference the object if so */
-        if (!NT_SUCCESS(RealStatus)) ObDereferenceObject(Object);
+    /* Check our final status */
+    if (!NT_SUCCESS(Status))
+    {
+        /* Return the status of the failure */
+        *Handle = NULL;
+        RealStatus = Status;
     }
 
-    /* We can delete the Create Info now */
-    ObpFreeAndReleaseCapturedAttributes(ObjectCreateInfo);
-
-    /* Check if we created our own access state and delete it if so */
-    if (AccessState == &LocalAccessState) SeDeleteAccessState(AccessState);
+    /* Check if we created our own access state */
+    if (PassedAccessState == &AccessState)
+    {
+        /* We used a local one; delete it */
+        SeDeleteAccessState(PassedAccessState);
+    }
 
     /* Return status code */
     OBTRACE(OB_HANDLE_DEBUG,
@@ -3076,7 +2057,9 @@ NTSTATUS
 NTAPI
 NtClose(IN HANDLE Handle)
 {
-    /* Call the internal API */
+    //
+    // Call the internal API
+    //
     return ObpCloseHandle(Handle, ExGetPreviousMode());
 }
 
@@ -3102,8 +2085,7 @@ NtDuplicateObject(IN HANDLE SourceProcessHandle,
             SourceProcessHandle,
             TargetProcessHandle);
 
-    /* Check if we have a target handle */
-    if ((TargetHandle) && (PreviousMode != KernelMode))
+    if((TargetHandle) && (PreviousMode != KernelMode))
     {
         /* Enter SEH */
         _SEH_TRY
@@ -3117,6 +2099,8 @@ NtDuplicateObject(IN HANDLE SourceProcessHandle,
             Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
+
+        /* Fail if the pointer was invalid */
         if (!NT_SUCCESS(Status)) return Status;
     }
 
@@ -3191,7 +2175,7 @@ NtDuplicateObject(IN HANDLE SourceProcessHandle,
             hTarget,
             TargetProcessHandle,
             Status);
-    if (Target) ObDereferenceObject(Target);
+    ObDereferenceObject(Target);
     ObDereferenceObject(SourceProcess);
     return Status;
 }
index d3c7042..978888a 100644 (file)
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
-/* GLOBALS *******************************************************************/
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, ObInit)
+#endif
 
 GENERIC_MAPPING ObpTypeMapping =
 {
@@ -173,10 +175,6 @@ ObInit(VOID)
     /* Initialize the Default Event */
     KeInitializeEvent(&ObpDefaultObject, NotificationEvent, TRUE );
 
-    /* Setup default access for the system process */
-    PsGetCurrentProcess()->GrantedAccess = PROCESS_ALL_ACCESS;
-    PsGetCurrentThread()->GrantedAccess = THREAD_ALL_ACCESS;
-
     /* Setup the Object Reaper */
     ExInitializeWorkItem(&ObpReaperWorkItem, ObpReapObject, NULL);
 
@@ -282,12 +280,6 @@ ObPostPhase0:
     Status = NtClose(Handle);
     if (!NT_SUCCESS(Status)) return FALSE;
 
-    /* Initialize lookup context */
-    ObpInitializeDirectoryLookup(&Context);
-
-    /* Lock it */
-    ObpAcquireDirectoryLockExclusive(ObpTypeDirectoryObject, &Context);
-
     /* Loop the object types */
     ListHead = &ObTypeObjectType->TypeList;
     NextEntry = ListHead->Flink;
@@ -305,6 +297,10 @@ ObPostPhase0:
         /* Make sure we have a name, and aren't inserted yet */
         if ((NameInfo) && !(NameInfo->Directory))
         {
+            /* Set up the context for the insert */
+            Context.Directory = ObpTypeDirectoryObject;
+            Context.DirectoryLocked = TRUE;
+
             /* Do the initial lookup to setup the context */
             if (!ObpLookupEntryDirectory(ObpTypeDirectoryObject,
                                          &NameInfo->Name,
@@ -323,9 +319,6 @@ ObPostPhase0:
         NextEntry = NextEntry->Flink;
     }
 
-    /* Cleanup after lookup */
-    ObpCleanupDirectoryLookup(&Context);
-
     /* Initialize DOS Devices Directory and related Symbolic Links */
     Status = ObpCreateDosDevicesDirectory();
     if (!NT_SUCCESS(Status)) return FALSE;
index 0179489..72ef1c1 100644 (file)
@@ -107,6 +107,9 @@ ObpDeallocateObject(IN PVOID Object)
                 /* Add the SD charge too */
                 if (Header->Flags & OB_FLAG_SECURITY) PagedPoolCharge += 2048;
             }
+
+            /* FIXME: Should be returning quota */
+            DPRINT("Quotas: %lx %lx\n", PagedPoolCharge, NonPagedPoolCharge);
         }
     }
 
@@ -126,9 +129,6 @@ ObpDeallocateObject(IN PVOID Object)
         NameInfo->Name.Buffer = NULL;
     }
 
-    /* Catch invalid access */
-    Header->Type = (POBJECT_TYPE)0xBAADB0B0;
-
     /* Free the object using the same allocation tag */
     ExFreePoolWithTag(HeaderLocation, ObjectType->Key);
 }
@@ -142,7 +142,6 @@ ObpDeleteObject(IN PVOID Object,
     POBJECT_TYPE ObjectType;
     POBJECT_HEADER_NAME_INFO NameInfo;
     POBJECT_HEADER_CREATOR_INFO CreatorInfo;
-    KIRQL CalloutIrql;
     PAGED_CODE();
 
     /* Get the header and type */
@@ -153,32 +152,33 @@ ObpDeleteObject(IN PVOID Object,
     NameInfo = OBJECT_HEADER_TO_NAME_INFO(Header);
     CreatorInfo = OBJECT_HEADER_TO_CREATOR_INFO(Header);
 
+    /* Lock the object type */
+    ObpEnterObjectTypeMutex(ObjectType);
+
     /* Check if the object is on a type list */
     if ((CreatorInfo) && !(IsListEmpty(&CreatorInfo->TypeList)))
     {
-        /* Lock the object type */
-        ObpEnterObjectTypeMutex(ObjectType);
-
         /* Remove the object from the type list */
         RemoveEntryList(&CreatorInfo->TypeList);
-
-        /* Release the lock */
-        ObpLeaveObjectTypeMutex(ObjectType);
     }
 
+    /* Release the lock */
+    ObpLeaveObjectTypeMutex(ObjectType);
+
     /* Check if we have a name */
     if ((NameInfo) && (NameInfo->Name.Buffer))
     {
         /* Free it */
         ExFreePool(NameInfo->Name.Buffer);
-        RtlInitEmptyUnicodeString(&NameInfo->Name, NULL, 0);
+
+        /* Clean up the string so we don't try this again */
+        RtlInitUnicodeString(&NameInfo->Name, NULL);
     }
 
     /* Check if we have a security descriptor */
     if (Header->SecurityDescriptor)
     {
         /* Call the security procedure to delete it */
-        ObpCalloutStart(&CalloutIrql);
         ObjectType->TypeInfo.SecurityProcedure(Object,
                                                DeleteSecurityDescriptor,
                                                0,
@@ -187,19 +187,13 @@ ObpDeleteObject(IN PVOID Object,
                                                &Header->SecurityDescriptor,
                                                0,
                                                NULL);
-        ObpCalloutEnd(CalloutIrql, "Security", ObjectType, Object);
     }
 
     /* Check if we have a delete procedure */
     if (ObjectType->TypeInfo.DeleteProcedure)
     {
-        /* Save whether we were deleted from worker thread or not */
-        if (!CalledFromWorkerThread) Header->Flags |= OB_FLAG_DEFER_DELETE;
-
         /* Call it */
-        ObpCalloutStart(&CalloutIrql);
         ObjectType->TypeInfo.DeleteProcedure(Object);
-        ObpCalloutEnd(CalloutIrql, "Delete", ObjectType, Object);
     }
 
     /* Now de-allocate all object members */
@@ -210,13 +204,14 @@ VOID
 NTAPI
 ObpReapObject(IN PVOID Parameter)
 {
-    POBJECT_HEADER ReapObject, NextObject;
+    POBJECT_HEADER ReapObject = (PVOID)1;
+    PVOID NextObject;
 
     /* Start reaping */
     do
     {
         /* Get the reap object */
-        ReapObject = InterlockedExchangePointer(&ObpReaperList, (PVOID)1);
+        ReapObject = InterlockedExchangePointer(&ObpReaperList, ReapObject);
 
         /* Start deletion loop */
         do
@@ -229,7 +224,7 @@ ObpReapObject(IN PVOID Parameter)
 
             /* Move to the next one */
             ReapObject = NextObject;
-        } while ((ReapObject) && (ReapObject != (PVOID)1));
+        } while ((NextObject) && (NextObject != (PVOID)1));
     } while ((ObpReaperList != (PVOID)1) ||
              (InterlockedCompareExchange((PLONG)&ObpReaperList, 0, 1) != 1));
 }
@@ -261,96 +256,32 @@ ObpSetPermanentObject(IN PVOID ObjectBody,
 
     /* Get the header */
     ObjectHeader = OBJECT_TO_OBJECT_HEADER(ObjectBody);
-
-    /* Acquire object type lock */
-    ObpEnterObjectTypeMutex(ObjectHeader->Type);
-
-    /* Check what we're doing to it */
     if (Permanent)
     {
         /* Set it to permanent */
         ObjectHeader->Flags |= OB_FLAG_PERMANENT;
-
-        /* Release the lock */
-        ObpLeaveObjectTypeMutex(ObjectHeader->Type);
     }
     else
     {
         /* Remove the flag */
         ObjectHeader->Flags &= ~OB_FLAG_PERMANENT;
 
-        /* Release the lock */
-        ObpLeaveObjectTypeMutex(ObjectHeader->Type);
-
         /* Check if we should delete the object now */
         ObpDeleteNameCheck(ObjectBody);
     }
 }
 
-PWCHAR
-NTAPI
-ObpAllocateObjectNameBuffer(IN ULONG Length,
-                            IN BOOLEAN UseLookaside,
-                            IN OUT PUNICODE_STRING ObjectName)
-{
-    ULONG MaximumLength;
-    PVOID Buffer;
-
-    /* Set the maximum length to the length plus the terminator */
-    MaximumLength = Length + sizeof(UNICODE_NULL);
-
-    /* Check if we should use the lookaside buffer */
-    if (!(UseLookaside) || (MaximumLength > 248))
-    {
-        /* Nope, allocate directly from pool */
-        Buffer = ExAllocatePoolWithTag(PagedPool,
-                                       MaximumLength,
-                                       OB_NAME_TAG);
-    }
-    else
-    {
-        /* Allocate from the lookaside */
-        //MaximumLength = 248; <= hack, we should actually set this...!
-        Buffer = ObpAllocateCapturedAttributes(LookasideNameBufferList);
-    }
-
-    /* Setup the string */
-    ObjectName->Length = (USHORT)Length;
-    ObjectName->MaximumLength = (USHORT)MaximumLength;
-    ObjectName->Buffer = Buffer;
-    return Buffer;
-}
-
-VOID
-NTAPI
-ObpFreeObjectNameBuffer(IN PUNICODE_STRING Name)
-{
-    PVOID Buffer = Name->Buffer;
-
-    /* We know this is a pool-allocation if the size doesn't match */
-    if (Name->MaximumLength != 248)
-    {
-        /* Free it from the pool */
-        ExFreePool(Buffer);
-    }
-    else
-    {
-        /* Otherwise, free from the lookaside */
-        ObpFreeCapturedAttributes(Buffer, LookasideNameBufferList);
-    }
-}
-
 NTSTATUS
 NTAPI
 ObpCaptureObjectName(IN OUT PUNICODE_STRING CapturedName,
                      IN PUNICODE_STRING ObjectName,
                      IN KPROCESSOR_MODE AccessMode,
-                     IN BOOLEAN UseLookaside)
+                     IN BOOLEAN AllocateFromLookaside)
 {
     NTSTATUS Status = STATUS_SUCCESS;
-    ULONG StringLength;
+    ULONG StringLength, MaximumLength;
     PWCHAR StringBuffer = NULL;
-    UNICODE_STRING LocalName;
+    UNICODE_STRING LocalName = {0}; /* <= GCC 4.0 + Optimizer */
     PAGED_CODE();
 
     /* Initialize the Input String */
@@ -386,21 +317,42 @@ ObpCaptureObjectName(IN OUT PUNICODE_STRING CapturedName,
             }
             else
             {
-                /* Allocate the string buffer */
-                StringBuffer = ObpAllocateObjectNameBuffer(StringLength,
-                                                           UseLookaside,
-                                                           CapturedName);
-                if (!StringBuffer)
+                /* Set the maximum length to the length plus the terminator */
+                MaximumLength = StringLength + sizeof(UNICODE_NULL);
+
+                /* Check if we should use the lookaside buffer */
+                //if (!(AllocateFromLookaside) || (MaximumLength > 248))
                 {
-                    /* Set failure code */
-                    Status = STATUS_INSUFFICIENT_RESOURCES;
+                    /* Nope, allocate directly from pool */
+                    StringBuffer = ExAllocatePoolWithTag(NonPagedPool,
+                                                         MaximumLength,
+                                                         OB_NAME_TAG);
                 }
-                else
+                //else
                 {
-                    /* Copy the name */
+                    /* Allocate from the lookaside */
+                //    MaximumLength = 248;
+                //    StringBuffer =
+                //        ObpAllocateCapturedAttributes(LookasideNameBufferList);
+                }
+
+                /* Setup the string */
+                CapturedName->Length = (USHORT)StringLength;
+                CapturedName->MaximumLength = (USHORT)MaximumLength;
+                CapturedName->Buffer = StringBuffer;
+
+                /* Make sure we have a buffer */
+                if (StringBuffer)
+                {
+                    /* Copy the string and null-terminate it */
                     RtlMoveMemory(StringBuffer, LocalName.Buffer, StringLength);
                     StringBuffer[StringLength / sizeof(WCHAR)] = UNICODE_NULL;
                 }
+                else
+                {
+                    /* Fail */
+                    Status = STATUS_INSUFFICIENT_RESOURCES;
+                }
             }
         }
     }
@@ -671,10 +623,9 @@ ObpAllocateObject(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo,
     Header = ExAllocatePoolWithTag(PoolType, FinalSize + ObjectSize, Tag);
     if (!Header) return STATUS_INSUFFICIENT_RESOURCES;
 
-    /* Check if we have a quota header */
+    /* Initialize quota info */
     if (QuotaSize)
     {
-        /* Initialize quota info */
         QuotaInfo = (POBJECT_HEADER_QUOTA_INFO)Header;
         QuotaInfo->PagedPoolCharge = ObjectCreateInfo->PagedPoolCharge;
         QuotaInfo->NonPagedPoolCharge = ObjectCreateInfo->NonPagedPoolCharge;
@@ -683,41 +634,26 @@ ObpAllocateObject(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo,
         Header = (POBJECT_HEADER)(QuotaInfo + 1);
     }
 
-    /* Check if we have a handle database header */
+    /* Initialize Handle Info */
     if (HandleSize)
     {
-        /* Initialize Handle Info */
         HandleInfo = (POBJECT_HEADER_HANDLE_INFO)Header;
         HandleInfo->SingleEntry.HandleCount = 0;
         Header = (POBJECT_HEADER)(HandleInfo + 1);
     }
 
-    /* Check if we have a name header */
+    /* Initialize the Object Name Info */
     if (NameSize)
     {
-        /* Initialize the Object Name Info */
         NameInfo = (POBJECT_HEADER_NAME_INFO)Header;
         NameInfo->Name = *ObjectName;
         NameInfo->Directory = NULL;
-        NameInfo->QueryReferences = 1;
-
-        /* Check if this is a call with the special protection flag */
-        if ((PreviousMode == KernelMode) &&
-            (ObjectCreateInfo) &&
-            (ObjectCreateInfo->Attributes & 0x10000))
-        {
-            /* Set flag which will make the object protected from user-mode */
-            NameInfo->QueryReferences |= 0x40000000;
-        }
-
-        /* Set the header pointer */
         Header = (POBJECT_HEADER)(NameInfo + 1);
     }
 
-    /* Check if we have a creator header */
+    /* Initialize Creator Info */
     if (CreatorSize)
     {
-        /* Initialize Creator Info */
         CreatorInfo = (POBJECT_HEADER_CREATOR_INFO)Header;
         CreatorInfo->CreatorBackTraceIndex = 0;
         CreatorInfo->CreatorUniqueProcess = PsGetCurrentProcessId();
@@ -803,7 +739,7 @@ ObpAllocateObject(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo,
     if (ObjectType)
     {
         /* Increase the number of objects of this type */
-        InterlockedIncrement((PLONG)&ObjectType->TotalNumberOfObjects);
+        ObjectType->TotalNumberOfObjects++;
 
         /* Update the high water */
         ObjectType->HighWaterNumberOfObjects = max(ObjectType->
@@ -820,78 +756,6 @@ ObpAllocateObject(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo,
     return STATUS_SUCCESS;
 }
 
-NTSTATUS
-NTAPI
-ObQueryTypeInfo(IN POBJECT_TYPE ObjectType,
-                OUT POBJECT_TYPE_INFORMATION ObjectTypeInfo,
-                IN ULONG Length,
-                OUT PULONG ReturnLength)
-{
-    NTSTATUS Status = STATUS_SUCCESS;
-    PWSTR InfoBuffer;
-
-    /* Enter SEH */
-    _SEH_TRY
-    {
-        /* Set return length aligned to 4-byte boundary */
-        *ReturnLength += sizeof(*ObjectTypeInfo) +
-                         ALIGN_UP(ObjectType->Name.MaximumLength, ULONG);
-
-        /* Check if thats too much though. */
-        if (Length < *ReturnLength) return STATUS_INFO_LENGTH_MISMATCH;
-
-        /* Build the data */
-        ObjectTypeInfo->TotalNumberOfHandles =
-            ObjectType->TotalNumberOfHandles;
-        ObjectTypeInfo->TotalNumberOfObjects =
-            ObjectType->TotalNumberOfObjects;
-        ObjectTypeInfo->HighWaterNumberOfHandles =
-            ObjectType->HighWaterNumberOfHandles;
-        ObjectTypeInfo->HighWaterNumberOfObjects =
-            ObjectType->HighWaterNumberOfObjects;
-        ObjectTypeInfo->PoolType =
-            ObjectType->TypeInfo.PoolType;
-        ObjectTypeInfo->DefaultNonPagedPoolCharge =
-            ObjectType->TypeInfo.DefaultNonPagedPoolCharge;
-        ObjectTypeInfo->DefaultPagedPoolCharge =
-            ObjectType->TypeInfo.DefaultPagedPoolCharge;
-        ObjectTypeInfo->ValidAccessMask =
-            ObjectType->TypeInfo.ValidAccessMask;
-        ObjectTypeInfo->SecurityRequired =
-            ObjectType->TypeInfo.SecurityRequired;
-        ObjectTypeInfo->InvalidAttributes =
-            ObjectType->TypeInfo.InvalidAttributes;
-        ObjectTypeInfo->GenericMapping =
-            ObjectType->TypeInfo.GenericMapping;
-        ObjectTypeInfo->MaintainHandleCount =
-            ObjectType->TypeInfo.MaintainHandleCount;
-
-        /* Setup the name buffer */
-        InfoBuffer = (PWSTR)(ObjectTypeInfo + 1);
-        ObjectTypeInfo->TypeName.Buffer = InfoBuffer;
-        ObjectTypeInfo->TypeName.MaximumLength = ObjectType->Name.MaximumLength;
-        ObjectTypeInfo->TypeName.Length = ObjectType->Name.Length;
-
-        /* Copy it */
-        RtlCopyMemory(InfoBuffer,
-                      ObjectType->Name.Buffer,
-                      ObjectType->Name.Length);
-
-        /* Null-terminate it */
-        (InfoBuffer)[ObjectType->Name.Length / sizeof(WCHAR)] = UNICODE_NULL;
-    }
-    _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
-    {
-        /* Otherwise, get the exception code */
-        Status = _SEH_GetExceptionCode();
-    }
-    _SEH_END;
-
-    /* Return status to caller */
-    return Status;
-}
-
-
 /* PUBLIC FUNCTIONS **********************************************************/
 
 NTSTATUS
@@ -910,6 +774,8 @@ ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL,
     POBJECT_CREATE_INFORMATION ObjectCreateInfo;
     UNICODE_STRING ObjectName;
     POBJECT_HEADER Header;
+    DPRINT("ObCreateObject(Type %p ObjectAttributes %p, Object %p)\n", 
+            Type, ObjectAttributes, Object);
 
     /* Allocate a capture buffer */
     ObjectCreateInfo = ObpAllocateCapturedAttributes(LookasideCreateInfoList);
@@ -981,7 +847,7 @@ ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL,
 
         /* Release the Capture Info, we don't need it */
         ObpReleaseCapturedAttributes(ObjectCreateInfo);
-        if (ObjectName.Buffer) ObpFreeObjectNameBuffer(&ObjectName);
+        if (ObjectName.Buffer) ObpReleaseCapturedName(&ObjectName);
     }
 
     /* We failed, so release the Buffer */
@@ -1032,16 +898,12 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
         if (*p++ == OBJ_NAME_PATH_SEPARATOR) return STATUS_OBJECT_NAME_INVALID;
     }
 
-    /* Setup a lookup context */
-    ObpInitializeDirectoryLookup(&Context);
-
     /* Check if we've already created the directory of types */
     if (ObpTypeDirectoryObject)
     {
-        /* Acquire the directory lock */
-        ObpAcquireDirectoryLockExclusive(ObpTypeDirectoryObject, &Context);
-
-        /* Do the lookup */
+        /* Then scan it to figure out if we've already created this type */
+        Context.Directory = ObpTypeDirectoryObject;
+        Context.DirectoryLocked = TRUE;
         if (ObpLookupEntryDirectory(ObpTypeDirectoryObject,
                                     TypeName,
                                     OBJ_CASE_INSENSITIVE,
@@ -1049,7 +911,6 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
                                     &Context))
         {
             /* We have already created it, so fail */
-            ObpCleanupDirectoryLookup(&Context);
             return STATUS_OBJECT_NAME_COLLISION;
         }
     }
@@ -1061,7 +922,6 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
     if (!ObjectName.Buffer)
     {
         /* Out of memory, fail */
-        ObpCleanupDirectoryLookup(&Context);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -1079,7 +939,6 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
     if (!NT_SUCCESS(Status))
     {
         /* Free the name and fail */
-        ObpCleanupDirectoryLookup(&Context);
         ExFreePool(ObjectName.Buffer);
         return Status;
     }
@@ -1208,16 +1067,12 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
             ObReferenceObject(ObpTypeDirectoryObject);
         }
 
-        /* Cleanup the lookup context */
-        ObpCleanupDirectoryLookup(&Context);
-
         /* Return the object type and success */
         *ObjectType = LocalObjectType;
         return STATUS_SUCCESS;
     }
 
     /* If we got here, then we failed */
-    ObpCleanupDirectoryLookup(&Context);
     return STATUS_INSUFFICIENT_RESOURCES;
 }
 
@@ -1239,8 +1094,6 @@ VOID
 NTAPI
 ObMakeTemporaryObject(IN PVOID ObjectBody)
 {
-    PAGED_CODE();
-
     /* Call the internal API */
     ObpSetPermanentObject(ObjectBody, FALSE);
 }
@@ -1488,13 +1341,8 @@ NtQueryObject(IN HANDLE ObjectHandle,
 
             /* Information about this type */
             case ObjectTypeInformation:
-
-                /* Call the helper and break out */
-                Status = ObQueryTypeInfo(ObjectHeader->Type,
-                                         (POBJECT_TYPE_INFORMATION)
-                                         ObjectInformation,
-                                         Length,
-                                         &InfoLength);
+                DPRINT1("NOT IMPLEMENTED!\n");
+                Status = STATUS_NOT_IMPLEMENTED;
                 break;
 
             /* Information about all types */
@@ -1519,9 +1367,10 @@ NtQueryObject(IN HANDLE ObjectHandle,
                                ObjectInformation;
 
                 /* Set the flags */
-                HandleFlags->Inherit = HandleInfo.HandleAttributes & OBJ_INHERIT;
+                HandleFlags->Inherit = (HandleInfo.HandleAttributes &
+                                        EX_HANDLE_ENTRY_INHERITABLE) != 0;
                 HandleFlags->ProtectFromClose = (HandleInfo.HandleAttributes &
-                                                 OBJ_PROTECT_CLOSE) != 0;
+                                                 EX_HANDLE_ENTRY_PROTECTFROMCLOSE) != 0;
 
                 /* Break out with success */
                 Status = STATUS_SUCCESS;
@@ -1657,7 +1506,7 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
     if (!ExChangeHandle(ObjectTable,
                         ObjectHandle,
                         ObpSetHandleAttributes,
-                        (ULONG_PTR)&Context))
+                        &Context))
     {
         /* Some failure */
         Status = STATUS_ACCESS_DENIED;
index 2ffd720..aa3d9a8 100644 (file)
 
 /* INCLUDES ******************************************************************/
 
+#define NTDDI_VERSION NTDDI_WINXP
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
-BOOLEAN ObpCaseInsensitive = TRUE;
-POBJECT_DIRECTORY NameSpaceRoot;
-POBJECT_DIRECTORY ObpTypeDirectoryObject;
-
-/* DOS Device Prefix \??\ and \?? */
-ALIGNEDNAME ObpDosDevicesShortNamePrefix = {{L'\\',L'?',L'?',L'\\'}};
-ALIGNEDNAME ObpDosDevicesShortNameRoot = {{L'\\',L'?',L'?',L'\0'}};
-UNICODE_STRING ObpDosDevicesShortName =
-{
-    sizeof(ObpDosDevicesShortNamePrefix),
-    sizeof(ObpDosDevicesShortNamePrefix),
-    (PWSTR)&ObpDosDevicesShortNamePrefix
-};
+POBJECT_DIRECTORY NameSpaceRoot = NULL;
+POBJECT_DIRECTORY ObpTypeDirectoryObject = NULL;
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
@@ -64,7 +54,7 @@ ObpCreateDosDevicesDirectory(VOID)
                                         SYMBOLIC_LINK_ALL_ACCESS,
                                         &ObjectAttributes,
                                         &Name);
-    if (NT_SUCCESS(Status)) NtClose(SymHandle);
+        if (NT_SUCCESS(Status)) NtClose(SymHandle);
 
     /* Link \??\Global to \?? */
     RtlInitUnicodeString(&LinkName, L"Global");
@@ -179,7 +169,7 @@ ObpDeleteNameCheck(IN PVOID Object)
 
     /* Get object structures */
     ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
-    ObjectNameInfo = ObpAcquireNameInformation(ObjectHeader);
+    ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
     ObjectType = ObjectHeader->Type;
 
     /*
@@ -189,136 +179,95 @@ ObpDeleteNameCheck(IN PVOID Object)
     if (!(ObjectHeader->HandleCount) &&
          (ObjectNameInfo) &&
          (ObjectNameInfo->Name.Length) &&
-         (ObjectNameInfo->Directory) &&
          !(ObjectHeader->Flags & OB_FLAG_PERMANENT))
     {
-        /* Setup a lookup context */
-        ObpInitializeDirectoryLookup(&Context);
-
-        /* Lock the directory */
-        ObpAcquireDirectoryLockExclusive(ObjectNameInfo->Directory, &Context);
-
-        /* Do the lookup */
+        /* Make sure it's still inserted */
+        Context.Directory = ObjectNameInfo->Directory;
+        Context.DirectoryLocked = TRUE;
         Object = ObpLookupEntryDirectory(ObjectNameInfo->Directory,
                                          &ObjectNameInfo->Name,
                                          0,
                                          FALSE,
                                          &Context);
-        if (Object)
+        if ((Object) && !(ObjectHeader->HandleCount))
         {
             /* Lock the object type */
             ObpEnterObjectTypeMutex(ObjectType);
 
-            /* Make sure we can still delete the object */
-            if (!(ObjectHeader->HandleCount) &&
-                !(ObjectHeader->Flags & OB_FLAG_PERMANENT))
-            {
-                /* First delete it from the directory */
-                ObpDeleteEntryDirectory(&Context);
-
-                /* Check if this is a symbolic link */
-                if (ObjectType == ObSymbolicLinkType)
-                {
-                    /* Remove internal name */
-                    ObpDeleteSymbolicLinkName(Object);
-                }
-
-                /* Check if the magic protection flag is set */
-                ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
-                if ((ObjectNameInfo) &&
-                    (ObjectNameInfo->QueryReferences & 0x40000000))
-                {
-                    /* Remove protection flag */
-                    InterlockedExchangeAdd((PLONG)&ObjectNameInfo->QueryReferences,
-                                           -0x40000000);
-                }
+            /* First delete it from the directory */
+            ObpDeleteEntryDirectory(&Context);
 
-                /* Get the directory */
-                Directory = ObjectNameInfo->Directory;
+            /* Now check if we have a security callback */
+            if (ObjectType->TypeInfo.SecurityRequired)
+            {
+                /* Call it */
+                ObjectType->TypeInfo.SecurityProcedure(Object,
+                                                       DeleteSecurityDescriptor,
+                                                       0,
+                                                       NULL,
+                                                       NULL,
+                                                       &ObjectHeader->
+                                                       SecurityDescriptor,
+                                                       ObjectType->
+                                                       TypeInfo.PoolType,
+                                                       NULL);
             }
 
             /* Release the lock */
             ObpLeaveObjectTypeMutex(ObjectType);
-        }
 
-        /* Cleanup after lookup */
-        ObpCleanupDirectoryLookup(&Context);
+            /* Free the name */
+            ExFreePool(ObjectNameInfo->Name.Buffer);
+            RtlInitEmptyUnicodeString(&ObjectNameInfo->Name, NULL, 0);
 
-        /* Remove another query reference since we added one on top */
-        ObpReleaseNameInformation(ObjectNameInfo);
+            /* Clear the current directory and de-reference it */
+            Directory = ObjectNameInfo->Directory;
+            ObjectNameInfo->Directory = NULL;
+        }
 
         /* Check if we were inserted in a directory */
         if (Directory)
         {
-            /* We were, so first remove the extra reference we had added */
-            ObpReleaseNameInformation(ObjectNameInfo);
-
-            /* Now dereference the object as well */
+            /* We were, so dereference the directory and the object as well */
+            ObDereferenceObject(Directory);
             ObDereferenceObject(Object);
         }
     }
-    else
-    {
-        /* Remove the reference we added */
-        ObpReleaseNameInformation(ObjectNameInfo);
-    }
 }
 
 NTSTATUS
 NTAPI
-ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
-                    IN PUNICODE_STRING ObjectName,
-                    IN ULONG Attributes,
-                    IN POBJECT_TYPE ObjectType,
-                    IN KPROCESSOR_MODE AccessMode,
-                    IN OUT PVOID ParseContext,
-                    IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
-                    IN PVOID InsertObject OPTIONAL,
-                    IN OUT PACCESS_STATE AccessState,
-                    OUT POBP_LOOKUP_CONTEXT LookupContext,
-                    OUT PVOID *FoundObject)
+ObFindObject(IN HANDLE RootHandle,
+             IN PUNICODE_STRING ObjectName,
+             IN ULONG Attributes,
+             IN KPROCESSOR_MODE AccessMode,
+             IN PVOID *ReturnedObject,
+             IN POBJECT_TYPE ObjectType,
+             IN POBP_LOOKUP_CONTEXT Context,
+             IN PACCESS_STATE AccessState,
+             IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
+             IN OUT PVOID ParseContext,
+             OUT PVOID ExpectedObject)
 {
-    PVOID Object;
-    POBJECT_HEADER ObjectHeader;
-    UNICODE_STRING ComponentName, RemainingName;
-    BOOLEAN Reparse = FALSE, SymLink = FALSE;
-    PDEVICE_MAP DeviceMap = NULL;
-    POBJECT_DIRECTORY Directory = NULL, ParentDirectory = NULL, RootDirectory;
-    POBJECT_DIRECTORY ReferencedDirectory = NULL, ReferencedParentDirectory = NULL;
-    KIRQL CalloutIrql;
-    OB_PARSE_METHOD ParseRoutine;
-    NTSTATUS Status;
-    KPROCESSOR_MODE AccessCheckMode;
-    PWCHAR NewName;
+    PVOID RootDirectory;
+    PVOID CurrentDirectory = NULL;
+    PVOID CurrentObject = NULL;
+    POBJECT_HEADER CurrentHeader;
+    NTSTATUS Status = STATUS_SUCCESS;
+    PVOID NewName;
     POBJECT_HEADER_NAME_INFO ObjectNameInfo;
-    ULONG MaxReparse = 30;
+    UNICODE_STRING RemainingPath, PartName;
+    BOOLEAN InsideRoot = FALSE;
+    OB_PARSE_METHOD ParseRoutine;
     PAGED_CODE();
+
+    /* Assume failure */
     OBTRACE(OB_NAMESPACE_DEBUG,
             "%s - Finding Object: %wZ. Expecting: %p\n",
             __FUNCTION__,
             ObjectName,
-            InsertObject);
-
-    /* Initialize starting state */
-    ObpInitializeDirectoryLookup(LookupContext);
-    *FoundObject = NULL;
-    Status = STATUS_SUCCESS;
-    Object = NULL;
-
-    /* Check if case-insensitivity is checked */
-    if (ObpCaseInsensitive)
-    {
-        /* Check if the object type requests this */
-        if (!(ObjectType) || (ObjectType->TypeInfo.CaseInsensitive))
-        {
-            /* Add the flag to disable case sensitivity */
-            Attributes |= OBJ_CASE_INSENSITIVE;
-        }
-    }
-
-    /* Check if this is a access checks are being forced */
-    AccessCheckMode = (Attributes & OBJ_FORCE_ACCESS_CHECK) ?
-                       UserMode : AccessMode;
+            ExpectedObject);
+    *ReturnedObject = NULL;
 
     /* Check if we got a Root Directory */
     if (RootHandle)
@@ -328,17 +277,17 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
                                            0,
                                            NULL,
                                            AccessMode,
-                                           (PVOID*)&RootDirectory,
+                                           &RootDirectory,
                                            NULL);
         if (!NT_SUCCESS(Status)) return Status;
 
         /* Get the header */
-        ObjectHeader = OBJECT_TO_OBJECT_HEADER(RootDirectory);
+        CurrentHeader = OBJECT_TO_OBJECT_HEADER(RootDirectory);
 
         /* The name cannot start with a separator, unless this is a file */
         if ((ObjectName->Buffer) &&
             (ObjectName->Buffer[0] == OBJ_NAME_PATH_SEPARATOR) &&
-            (ObjectHeader->Type != IoFileObjectType))
+            (CurrentHeader->Type != IoFileObjectType))
         {
             /* The syntax is bad, so fail this request */
             ObDereferenceObject(RootDirectory);
@@ -346,10 +295,10 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
         }
 
         /* Don't parse a Directory */
-        if (ObjectHeader->Type != ObDirectoryType)
+        if (CurrentHeader->Type != ObDirectoryType)
         {
             /* Make sure the Object Type has a parse routine */
-            ParseRoutine = ObjectHeader->Type->TypeInfo.ParseProcedure;
+            ParseRoutine = CurrentHeader->Type->TypeInfo.ParseProcedure;
             if (!ParseRoutine)
             {
                 /* We can't parse a name if we don't have a parse routine */
@@ -357,28 +306,23 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
                 return STATUS_INVALID_HANDLE;
             }
 
-            /* Set default parse count */
-            MaxReparse = 30;
-
             /* Now parse */
             while (TRUE)
             {
                 /* Start with the full name */
-                RemainingName = *ObjectName;
+                RemainingPath = *ObjectName;
 
                 /* Call the Parse Procedure */
-                ObpCalloutStart(&CalloutIrql);
                 Status = ParseRoutine(RootDirectory,
                                       ObjectType,
                                       AccessState,
-                                      AccessCheckMode,
+                                      AccessMode,
                                       Attributes,
                                       ObjectName,
-                                      &RemainingName,
+                                      &RemainingPath,
                                       ParseContext,
                                       SecurityQos,
-                                      &Object);
-                ObpCalloutEnd(CalloutIrql, "Parse", ObjectHeader->Type, Object);
+                                      &CurrentObject);
 
                 /* Check for success or failure, so not reparse */
                 if ((Status != STATUS_REPARSE) &&
@@ -388,16 +332,16 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
                     if (!NT_SUCCESS(Status))
                     {
                         /* Parse routine might not have cleared this, do it */
-                        Object = NULL;
+                        CurrentObject = NULL;
                     }
-                    else if (!Object)
+                    else if (!CurrentObject)
                     {
                         /* Modify status to reflect failure inside Ob */
                         Status = STATUS_OBJECT_NAME_NOT_FOUND;
                     }
 
                     /* We're done, return the status and object */
-                    *FoundObject = Object;
+                    *ReturnedObject = CurrentObject;
                     ObDereferenceObject(RootDirectory);
                     return Status;
                 }
@@ -411,22 +355,7 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
 
                     /* Don't use this anymore, since we're starting at root */
                     RootHandle = NULL;
-                    goto ParseFromRoot;
-                }
-                else if (--MaxReparse)
-                {
-                    /* Try reparsing again */
-                    continue;
-                }
-                else
-                {
-                    /* Reparsed too many times */
-                    ObDereferenceObject(RootDirectory);
-
-                    /* Return the object and normalized status */
-                    *FoundObject = Object;
-                    if (!Object) Status = STATUS_OBJECT_NAME_NOT_FOUND;
-                    return Status;
+                    break;
                 }
             }
         }
@@ -437,11 +366,8 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
                                                 0,
                                                 ObjectType,
                                                 AccessMode);
-            if (NT_SUCCESS(Status)) Object = RootDirectory;
-
-            /* Remove the first reference we added and return the object */
+            if (NT_SUCCESS(Status)) *ReturnedObject = RootDirectory;
             ObDereferenceObject(RootDirectory);
-            *FoundObject = Object;
             return Status;
         }
     }
@@ -466,14 +392,14 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
             if (!RootDirectory)
             {
                 /* This must be the first time we're creating it... right? */
-                if (InsertObject)
+                if (ExpectedObject)
                 {
                     /* Yes, so return it to ObInsert so that it can create it */
-                    Status = ObReferenceObjectByPointer(InsertObject,
+                    Status = ObReferenceObjectByPointer(ExpectedObject,
                                                         0,
                                                         ObjectType,
                                                         AccessMode);
-                    if (NT_SUCCESS(Status)) *FoundObject = InsertObject;
+                    if (NT_SUCCESS(Status)) *ReturnedObject = ExpectedObject;
                     return Status;
                 }
                 else
@@ -490,484 +416,257 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
                                                     0,
                                                     ObjectType,
                                                     AccessMode);
-                if (NT_SUCCESS(Status)) *FoundObject = RootDirectory;
+                if (NT_SUCCESS(Status)) *ReturnedObject = RootDirectory;
                 return Status;
             }
         }
-        else
-        {
-ParseFromRoot:
-            /* Check if we have a device map */
-            if (DeviceMap)
-            {
-                /* Dereference it */
-                //ObfDereferenceDeviceMap(DeviceMap);
-                DeviceMap = NULL;
-            }
-
-            /* Check if this is a possible DOS name */
-            if (!((ULONG_PTR)(ObjectName->Buffer) & 7))
-            {
-                /*
-                 * This could be one. Does it match the prefix?
-                 * Note that as an optimization, the match is done as 64-bit
-                 * compare since the prefix is "\??\" which is exactly 8 bytes.
-                 *
-                 * In the second branch, we test for "\??" which is also valid.
-                 * This time, we use a 32-bit compare followed by a Unicode
-                 * character compare (16-bit), since the sum is 6 bytes.
-                 */
-                if ((ObjectName->Length >= ObpDosDevicesShortName.Length) &&
-                    (*(PULONGLONG)(ObjectName->Buffer) ==
-                     ObpDosDevicesShortNamePrefix.Alignment.QuadPart))
-                {
-                    /* FIXME! */
-                }
-                else if ((ObjectName->Length == ObpDosDevicesShortName.Length -
-                                                sizeof(WCHAR)) &&
-                         (*(PULONG)(ObjectName->Buffer) ==
-                          ObpDosDevicesShortNameRoot.Alignment.LowPart) &&
-                         (*((PWCHAR)(ObjectName->Buffer) + 2) ==
-                          (WCHAR)(ObpDosDevicesShortNameRoot.Alignment.HighPart)))
-                {
-                    /* FIXME! */
-                }
-            }
-        }
     }
 
-    /* Check if we were reparsing a symbolic link */
-    if (!SymLink)
-    {
-        /* Allow reparse */
-        Reparse = TRUE;
-        MaxReparse = 30;
-    }
+    /* Save the name */
+ReparseNewDir:
+    RemainingPath = *ObjectName;
 
     /* Reparse */
-    while (Reparse)
+    while (TRUE)
     {
-        /* Get the name */
-        RemainingName = *ObjectName;
-
-        /* Disable reparsing again */
-        Reparse = FALSE;
+        /* Check if we should use the Root Directory */
+        if (!InsideRoot)
+        {
+            /* Yes, use the root directory and remember that */
+            CurrentDirectory = RootDirectory;
+            InsideRoot = TRUE;
+        }
 
-        /* Start parse loop */
-        while (TRUE)
+        /* Check if the name starts with a path separator */
+        if ((RemainingPath.Length) &&
+            (RemainingPath.Buffer[0] == OBJ_NAME_PATH_SEPARATOR))
         {
-            /* Clear object */
-            Object = NULL;
+            /* Skip the path separator */
+            RemainingPath.Buffer++;
+            RemainingPath.Length -= sizeof(OBJ_NAME_PATH_SEPARATOR);
+        }
 
-            /* Check if the name starts with a path separator */
-            if ((RemainingName.Length) &&
-                (RemainingName.Buffer[0] == OBJ_NAME_PATH_SEPARATOR))
-            {
-                /* Skip the path separator */
-                RemainingName.Buffer++;
-                RemainingName.Length -= sizeof(OBJ_NAME_PATH_SEPARATOR);
-            }
+        /* Find the next Part Name */
+        PartName = RemainingPath;
+        while (RemainingPath.Length)
+        {
+            /* Break if we found the \ ending */
+            if (RemainingPath.Buffer[0] == OBJ_NAME_PATH_SEPARATOR) break;
 
-            /* Find the next Part Name */
-            ComponentName = RemainingName;
-            while (RemainingName.Length)
-            {
-                /* Break if we found the \ ending */
-                if (RemainingName.Buffer[0] == OBJ_NAME_PATH_SEPARATOR) break;
+            /* Move on */
+            RemainingPath.Buffer++;
+            RemainingPath.Length -= sizeof(OBJ_NAME_PATH_SEPARATOR);
+        }
 
-                /* Move on */
-                RemainingName.Buffer++;
-                RemainingName.Length -= sizeof(OBJ_NAME_PATH_SEPARATOR);
-            }
+        /* Get its size and make sure it's valid */
+        if (!(PartName.Length -= RemainingPath.Length))
+        {
+            Status = STATUS_OBJECT_NAME_INVALID;
+            break;
+        }
 
-            /* Get its size and make sure it's valid */
-            ComponentName.Length -= RemainingName.Length;
-            if (!ComponentName.Length)
+        /* Do the look up */
+        Context->DirectoryLocked = TRUE;
+        Context->Directory = CurrentDirectory;
+        CurrentObject = ObpLookupEntryDirectory(CurrentDirectory,
+                                                &PartName,
+                                                Attributes,
+                                                FALSE,
+                                                Context);
+        if (!CurrentObject)
+        {
+            /* We didn't find it... do we still have a path? */
+            if (RemainingPath.Length)
             {
-                /* Invalid size, fail */
-                Status = STATUS_OBJECT_NAME_INVALID;
+                /* Then tell the caller the path wasn't found */
+                Status = STATUS_OBJECT_PATH_NOT_FOUND;
                 break;
             }
-
-            /* Check if we're in the root */
-            if (!Directory) Directory = RootDirectory;
-
-            /* Check if this is a user-mode call that needs to traverse */
-            if ((AccessCheckMode != KernelMode) &&
-                !(AccessState->Flags & TOKEN_HAS_TRAVERSE_PRIVILEGE))
+            else if (!ExpectedObject)
             {
-                /* We shouldn't have referenced a directory yet */
-                ASSERT(ReferencedDirectory == NULL);
-
-                /* Reference the directory */
-                ObReferenceObject(Directory);
-                ReferencedDirectory = Directory;
-
-                /* Check if we have a parent directory */
-                if (ParentDirectory)
-                {
-                    /* Check for traverse access */
-                    if (!ObpCheckTraverseAccess(ParentDirectory,
-                                                DIRECTORY_TRAVERSE,
-                                                AccessState,
-                                                FALSE,
-                                                AccessCheckMode,
-                                                &Status))
-                    {
-                        /* We don't have it, fail */
-                        break;
-                    }
-                }
+                /* Otherwise, we have a path, but the name isn't valid */
+                Status = STATUS_OBJECT_NAME_NOT_FOUND;
+                break;
             }
 
-            /* Check if we don't have a remaining name yet */
-            if (!RemainingName.Length)
-            {
-                /* Check if we don't have a referenced directory yet */
-                if (!ReferencedDirectory)
-                {
-                    /* Reference it */
-                    ObReferenceObject(Directory);
-                    ReferencedDirectory = Directory;
-                }
+            /* Reference newly to be inserted object */
+            ObReferenceObject(ExpectedObject);
+            CurrentHeader = OBJECT_TO_OBJECT_HEADER(ExpectedObject);
 
-                /* Check if we are inserting an object */
-                if (InsertObject)
-                {
-                    /* Lock the directory */
-                    ObpAcquireDirectoryLockExclusive(Directory, LookupContext);
-                }
-            }
+            /* Create Object Name */
+            NewName = ExAllocatePoolWithTag(NonPagedPool,
+                                            PartName.MaximumLength,
+                                            OB_NAME_TAG);
+            ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO(CurrentHeader);
 
-            /* Do the lookup */
-            Object = ObpLookupEntryDirectory(Directory,
-                                             &ComponentName,
-                                             Attributes,
-                                             InsertObject ? FALSE : TRUE,
-                                             LookupContext);
-            if (!Object)
-            {
-                /* We didn't find it... do we still have a path? */
-                if (RemainingName.Length)
-                {
-                    /* Then tell the caller the path wasn't found */
-                    Status = STATUS_OBJECT_PATH_NOT_FOUND;
-                    break;
-                }
-                else if (!InsertObject)
-                {
-                    /* Otherwise, we have a path, but the name isn't valid */
-                    Status = STATUS_OBJECT_NAME_NOT_FOUND;
-                    break;
-                }
-
-                /* Check create access for the object */
-                if (!ObCheckCreateObjectAccess(Directory,
-                                               ObjectType == ObDirectoryType ?
-                                               DIRECTORY_CREATE_SUBDIRECTORY :
-                                               DIRECTORY_CREATE_OBJECT,
-                                               AccessState,
-                                               &ComponentName,
-                                               FALSE,
-                                               AccessCheckMode,
-                                               &Status))
-                {
-                    /* We don't have create access, fail */
-                    break;
-                }
-
-                /* Get the object header */
-                ObjectHeader = OBJECT_TO_OBJECT_HEADER(InsertObject);
-
-                /* FIXME: Check if this is a Section Object or Sym Link */
-                /* FIXME: If it is, then check if this isn't session 0 */
-                /* FIXME: If it isn't, check for SeCreateGlobalPrivilege */
-                /* FIXME: If privilege isn't there, check for unsecure name */
-                /* FIXME: If it isn't a known unsecure name, then fail */
-
-                /* Create Object Name */
-                NewName = ExAllocatePoolWithTag(PagedPool,
-                                                ComponentName.Length,
-                                                OB_NAME_TAG);
-                if (!(NewName) ||
-                    !(ObpInsertEntryDirectory(Directory,
-                                              LookupContext,
-                                              ObjectHeader)))
-                {
-                    /* Either couldn't allocate the name, or insert failed */
-                    if (NewName) ExFreePool(NewName);
-
-                    /* Fail due to memory reasons */
-                    Status = STATUS_INSUFFICIENT_RESOURCES;
-                    break;
-                }
+            /* Copy the Name */
+            RtlCopyMemory(NewName, PartName.Buffer, PartName.MaximumLength);
 
-                /* Reference newly to be inserted object */
-                ObReferenceObject(InsertObject);
+            /* Free old name */
+            if (ObjectNameInfo->Name.Buffer) ExFreePool(ObjectNameInfo->Name.Buffer);
 
-                /* Get the name information */
-                ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
+            /* Write new one */
+            ObjectNameInfo->Name.Buffer = NewName;
+            ObjectNameInfo->Name.Length = PartName.Length;
+            ObjectNameInfo->Name.MaximumLength = PartName.MaximumLength;
 
-                /* Reference the directory */
-                ObReferenceObject(Directory);
+            /* Rereference the Directory and insert */
+            ObReferenceObject(CurrentDirectory);
+            ObpInsertEntryDirectory(CurrentDirectory, Context, CurrentHeader);
 
-                /* Copy the Name */
-                RtlCopyMemory(NewName,
-                              ComponentName.Buffer,
-                              ComponentName.Length);
+            /* Return Status and the Expected Object */
+            Status = STATUS_SUCCESS;
+            CurrentObject = ExpectedObject;
 
-                /* Check if we had an old name */
-                if (ObjectNameInfo->Name.Buffer)
-                {
-                    /* Free it */
-                    ExFreePool(ObjectNameInfo->Name.Buffer);
-                }
-
-                /* Write new one */
-                ObjectNameInfo->Name.Buffer = NewName;
-                ObjectNameInfo->Name.Length = ComponentName.Length;
-                ObjectNameInfo->Name.MaximumLength = ComponentName.Length;
-
-                /* Return Status and the Expected Object */
-                Status = STATUS_SUCCESS;
-                Object = InsertObject;
-
-                /* Get out of here */
-                break;
-            }
+            /* Get out of here */
+            break;
+        }
 
-ReparseObject:
-            /* We found it, so now get its header */
-            ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
-
-            /*
-             * Check for a parse Procedure, but don't bother to parse for an insert
-             * unless it's a Symbolic Link, in which case we MUST parse
-             */
-            ParseRoutine = ObjectHeader->Type->TypeInfo.ParseProcedure;
-            if ((ParseRoutine) &&
-                (!(InsertObject) || (ParseRoutine == ObpParseSymbolicLink)))
+Reparse:
+        /* We found it, so now get its header */
+        CurrentHeader = OBJECT_TO_OBJECT_HEADER(CurrentObject);
+
+        /* 
+         * Check for a parse Procedure, but don't bother to parse for an insert
+         * unless it's a Symbolic Link, in which case we MUST parse
+         */
+        ParseRoutine = CurrentHeader->Type->TypeInfo.ParseProcedure;
+        if (ParseRoutine &&
+            (!ExpectedObject || ParseRoutine == ObpParseSymbolicLink))
+        {
+            /* Use the Root Directory next time */
+            InsideRoot = FALSE;
+
+            /* Call the Parse Procedure */
+            Status = ParseRoutine(CurrentObject,
+                                  ObjectType,
+                                  AccessState,
+                                  AccessMode,
+                                  Attributes,
+                                  ObjectName,
+                                  &RemainingPath,
+                                  ParseContext,
+                                  SecurityQos,
+                                  &CurrentObject);
+
+            /* Check if we have to reparse */
+            if ((Status == STATUS_REPARSE) ||
+                (Status == STATUS_REPARSE_OBJECT))
             {
-                /* Use the Root Directory next time */
-                Directory = NULL;
-
-                /* Increment the pointer count */
-                InterlockedExchangeAdd(&ObjectHeader->PointerCount, 1);
-
-                /* Cleanup from the first lookup */
-                ObpCleanupDirectoryLookup(LookupContext);
-
-                /* Check if we have a referenced directory */
-                if (ReferencedDirectory)
-                {
-                    /* We do, dereference it */
-                    ObDereferenceObject(ReferencedDirectory);
-                    ReferencedDirectory = NULL;
-                }
-
-                /* Check if we have a referenced parent directory */
-                if (ReferencedParentDirectory)
-                {
-                    /* We do, dereference it */
-                    ObDereferenceObject(ReferencedParentDirectory);
-                    ReferencedParentDirectory = NULL;
-                }
-
-                /* Call the Parse Procedure */
-                ObpCalloutStart(&CalloutIrql);
-                Status = ParseRoutine(Object,
-                                      ObjectType,
-                                      AccessState,
-                                      AccessCheckMode,
-                                      Attributes,
-                                      ObjectName,
-                                      &RemainingName,
-                                      ParseContext,
-                                      SecurityQos,
-                                      &Object);
-                ObpCalloutEnd(CalloutIrql, "Parse", ObjectHeader->Type, Object);
-
-                /* Remove our extra reference */
-                ObDereferenceObject(&ObjectHeader->Body);
-
-                /* Check if we have to reparse */
-                if ((Status == STATUS_REPARSE) ||
-                    (Status == STATUS_REPARSE_OBJECT))
+                /* Start over from root if we got sent back there */
+                if ((Status == STATUS_REPARSE_OBJECT) ||
+                    (ObjectName->Buffer[0] == OBJ_NAME_PATH_SEPARATOR))
                 {
-                    /* Reparse again */
-                    Reparse = TRUE;
-
-                    /* Start over from root if we got sent back there */
-                    if ((Status == STATUS_REPARSE_OBJECT) ||
-                        (ObjectName->Buffer[0] == OBJ_NAME_PATH_SEPARATOR))
+                    /* Check if we got a root directory */
+                    if (RootHandle)
                     {
-                        /* Check if we got a root directory */
-                        if (RootHandle)
-                        {
-                            /* Stop using it, because we have a new directory now */
-                            ObDereferenceObject(RootDirectory);
-                            RootHandle = NULL;
-                        }
+                        /* Stop using it, because we have a new directory now */
+                        ObDereferenceObject(RootDirectory);
+                        RootHandle = NULL;
+                    }
 
-                        /* Start at Root */
-                        ParentDirectory = NULL;
-                        RootDirectory = NameSpaceRoot;
+                    /* Start at Root */
+                    RootDirectory = NameSpaceRoot;
 
-                        /* Check for reparse status */
-                        if (Status == STATUS_REPARSE_OBJECT)
+                    /* Check for reparse status */
+                    if (Status == STATUS_REPARSE_OBJECT)
+                    {
+                        /* Did we actually get an object to which to reparse? */
+                        if (!CurrentObject)
                         {
-                            /* Don't reparse again */
-                            Reparse = FALSE;
-
-                            /* Did we actually get an object to which to reparse? */
-                            if (!Object)
-                            {
-                                /* We didn't, so set a failure status */
-                                Status = STATUS_OBJECT_NAME_NOT_FOUND;
-                            }
-                            else
-                            {
-                                /* We did, so we're free to parse the new object */
-                                goto ReparseObject;
-                            }
+                            /* We didn't, so set a failure status */
+                            Status = STATUS_OBJECT_NAME_NOT_FOUND;
                         }
                         else
                         {
-                            /* This is a symbolic link */
-                            SymLink = TRUE;
-                            goto ParseFromRoot;
+                            /* We did, so we're free to parse the new object */
+                            InsideRoot = TRUE;
+                            goto Reparse;
                         }
                     }
-                    else if (RootDirectory == NameSpaceRoot)
-                    {
-                        /* We got STATUS_REPARSE but are at the Root Directory */
-                        Object = NULL;
-                        Status = STATUS_OBJECT_NAME_NOT_FOUND;
-                        Reparse = FALSE;
-                    }
+
+                    /* Restart the search */
+                    goto ReparseNewDir;
                 }
-                else if (!NT_SUCCESS(Status))
+                else if (RootDirectory == NameSpaceRoot)
                 {
-                    /* Total failure */
-                    Object = NULL;
+                    /* We got STATUS_REPARSE but are at the Root Directory */
+                    CurrentObject = NULL;
+                    Status = STATUS_OBJECT_NAME_NOT_FOUND;
                 }
-                else if (!Object)
+            }
+            else if (!NT_SUCCESS(Status))
+            {
+                /* Total failure */
+                CurrentObject = NULL;
+            }
+            else if (!CurrentObject)
+            {
+                /* We didn't reparse but we didn't find the Object Either */
+                Status = STATUS_OBJECT_NAME_NOT_FOUND;
+            }
+
+            /* Break out of the loop */
+            break;
+        }
+        else
+        {
+            /* No parse routine...do we still have a remaining name? */
+            if (!RemainingPath.Length)
+            {
+                /* Are we creating an object? */
+                if (!ExpectedObject)
                 {
-                    /* We didn't reparse but we didn't find the Object Either */
-                    Status = STATUS_OBJECT_NAME_NOT_FOUND;
+                    /* We don't... reference the Object */
+                    Status = ObReferenceObjectByPointer(CurrentObject,
+                                                        0,
+                                                        ObjectType,
+                                                        AccessMode);
+                    if (!NT_SUCCESS(Status)) CurrentObject = NULL;
                 }
 
-                /* Break out of the loop */
+                /* And get out of the reparse loop */
                 break;
             }
             else
             {
-                /* No parse routine...do we still have a remaining name? */
-                if (!RemainingName.Length)
+                /* We still have a name; check if this is a directory object */
+                if (CurrentHeader->Type == ObDirectoryType)
                 {
-                    /* Are we creating an object? */
-                    if (!InsertObject)
-                    {
-                        /* Check if this is a user-mode call that needs to traverse */
-                        if ((AccessCheckMode != KernelMode) &&
-                            !(AccessState->Flags & TOKEN_HAS_TRAVERSE_PRIVILEGE))
-                        {
-                            /* Check if we can get it */
-                            if (!ObpCheckTraverseAccess(Directory,
-                                                        DIRECTORY_TRAVERSE,
-                                                        AccessState,
-                                                        FALSE,
-                                                        AccessCheckMode,
-                                                        &Status))
-                            {
-                                /* We don't have access, fail */
-                                Object = NULL;
-                                break;
-                            }
-                        }
-
-                        /* Reference the Object */
-                        Status = ObReferenceObjectByPointer(Object,
-                                                            0,
-                                                            ObjectType,
-                                                            AccessMode);
-                        if (!NT_SUCCESS(Status)) Object = NULL;
-                    }
-
-                    /* And get out of the reparse loop */
-                    break;
+                    /* Restart from this directory */
+                    CurrentDirectory = CurrentObject;
                 }
                 else
                 {
-                    /* We still have a name; check if this is a directory object */
-                    if (ObjectHeader->Type == ObDirectoryType)
-                    {
-                        /* Check if we have a referenced parent directory */
-                        if (ReferencedParentDirectory)
-                        {
-                            /* Dereference it */
-                            ObDereferenceObject(ReferencedParentDirectory);
-                        }
-
-                        /* Restart the lookup from this directory */
-                        ReferencedParentDirectory = ReferencedDirectory;
-                        ParentDirectory = Directory;
-                        Directory = Object;
-                        ReferencedDirectory = NULL;
-                    }
-                    else
-                    {
-                        /* We still have a name, but no parse routine for it */
-                        Status = STATUS_OBJECT_TYPE_MISMATCH;
-                        Object = NULL;
-                        break;
-                    }
+                    /* We still have a name, but no parse routine for it */
+                    Status = STATUS_OBJECT_TYPE_MISMATCH;
+                    CurrentObject = NULL;
+                    break;
                 }
             }
         }
     }
 
-    /* Check if we failed */
-    if (!NT_SUCCESS(Status))
+    /* Write what we found, and if it's null, check if we got success */
+    if (!(*ReturnedObject = CurrentObject) && (NT_SUCCESS(Status)))
     {
-        /* Cleanup after lookup */
-        ObpCleanupDirectoryLookup(LookupContext);
+        /* Nothing found... but we have success. Correct the status code */
+        Status = STATUS_OBJECT_NAME_NOT_FOUND;
     }
 
-    /* Check if we have a device map and dereference it if so */
-    //if (DeviceMap) ObfDereferenceDeviceMap(DeviceMap);
-
-    /* Check if we have a referenced directory and dereference it if so */
-    if (ReferencedDirectory) ObDereferenceObject(ReferencedDirectory);
-
-    /* Check if we have a referenced parent directory */
-    if (ReferencedParentDirectory)
-    {
-        /* We do, dereference it */
-        ObDereferenceObject(ReferencedParentDirectory);
-    }
-
-    /* Set the found object and check if we got one */
-    *FoundObject = Object;
-    if (!Object)
+    /* Check if we had a root directory */
+    if (RootHandle)
     {
-        /* Nothing was found. Did we reparse or get success? */
-        if ((Status == STATUS_REPARSE) || (NT_SUCCESS(Status)))
-        {
-            /* Set correct failure */
-            Status = STATUS_OBJECT_NAME_NOT_FOUND;
-        }
+        /* Dereference it */
+        ObDereferenceObject(RootDirectory);
     }
 
-    /* Check if we had a root directory */
-    if (RootHandle) ObDereferenceObject(RootDirectory);
-
     /* Return status to caller */
     OBTRACE(OB_NAMESPACE_DEBUG,
             "%s - Found Object: %p. Expected: %p\n",
             __FUNCTION__,
-            *FoundObject,
-            InsertObject);
+            *ReturnedObject,
+            ExpectedObject);
     return Status;
 }
 
@@ -975,9 +674,9 @@ ReparseObject:
 
 NTSTATUS
 NTAPI
-ObQueryNameString(IN PVOID Object,
+ObQueryNameString(IN  PVOID Object,
                   OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
-                  IN ULONG Length,
+                  IN  ULONG Length,
                   OUT PULONG ReturnLength)
 {
     POBJECT_HEADER_NAME_INFO LocalInfo;
@@ -985,7 +684,6 @@ ObQueryNameString(IN PVOID Object,
     POBJECT_DIRECTORY ParentDirectory;
     ULONG NameSize;
     PWCH ObjectName;
-    BOOLEAN ObjectIsNamed;
 
     /* Get the Kernel Meta-Structures */
     ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
@@ -995,9 +693,8 @@ ObQueryNameString(IN PVOID Object,
     if (ObjectHeader->Type->TypeInfo.QueryNameProcedure)
     {
         /* Call the procedure */
-        ObjectIsNamed = ((LocalInfo) && (LocalInfo->Name.Length > 0));
         return ObjectHeader->Type->TypeInfo.QueryNameProcedure(Object,
-                                                               ObjectIsNamed,
+                                                               TRUE, //fixme
                                                                ObjectNameInfo,
                                                                Length,
                                                                ReturnLength,
@@ -1126,6 +823,7 @@ ObQueryNameString(IN PVOID Object,
             else
             {
                 /* Directory without a name, we add "..." */
+                DPRINT("Nameless Directory\n");
                 ObjectName -= sizeof(L"...");
                 ObjectName = L"...";
                 break;
index 951e001..0432345 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
@@ -52,7 +52,7 @@ VOID
 NTAPI
 ObpDeferObjectDeletion(IN POBJECT_HEADER Header)
 {
-    PVOID Entry;
+    PVOID Entry, NewEntry;
 
     /* Loop while trying to update the list */
     do
@@ -62,10 +62,11 @@ ObpDeferObjectDeletion(IN POBJECT_HEADER Header)
 
         /* Link our object to the list */
         Header->NextToFree = Entry;
+        NewEntry = Header;
 
         /* Update the list */
     } while (InterlockedCompareExchangePointer(&ObpReaperList,
-                                               Header,
+                                               NewEntry,
                                                Entry) != Entry);
 
     /* Queue the work item if needed */
@@ -305,8 +306,8 @@ ObfDereferenceObject(IN PVOID Object)
             return Header->PointerCount;
         }
 
-        /* Check if APCs are still active */
-        if (!KeAreAllApcsDisabled())
+        /* Check if we're at PASSIVE */
+        if (KeGetCurrentIrql() == PASSIVE_LEVEL)
         {
             /* Remove the object */
             ObpDeleteObject(Object, FALSE);
@@ -368,21 +369,21 @@ ObReferenceObjectByPointer(IN PVOID Object,
         return STATUS_OBJECT_TYPE_MISMATCH;
     }
 
-    /* Increment the reference count and return success */
+    /* Oncrement the reference count and return success */
     InterlockedIncrement(&Header->PointerCount);
     return STATUS_SUCCESS;
 }
 
 NTSTATUS
 NTAPI
-ObReferenceObjectByName(IN PUNICODE_STRING ObjectPath,
-                        IN ULONG Attributes,
-                        IN PACCESS_STATE PassedAccessState,
-                        IN ACCESS_MASK DesiredAccess,
-                        IN POBJECT_TYPE ObjectType,
-                        IN KPROCESSOR_MODE AccessMode,
-                        IN OUT PVOID ParseContext,
-                        OUT PVOID* ObjectPtr)
+ObReferenceObjectByName(PUNICODE_STRING ObjectPath,
+                        ULONG Attributes,
+                        PACCESS_STATE PassedAccessState,
+                        ACCESS_MASK DesiredAccess,
+                        POBJECT_TYPE ObjectType,
+                        KPROCESSOR_MODE AccessMode,
+                        PVOID ParseContext,
+                        PVOID* ObjectPtr)
 {
     PVOID Object = NULL;
     UNICODE_STRING ObjectName;
@@ -390,18 +391,11 @@ ObReferenceObjectByName(IN PUNICODE_STRING ObjectPath,
     OBP_LOOKUP_CONTEXT Context;
     AUX_DATA AuxData;
     ACCESS_STATE AccessState;
-    PAGED_CODE();
-
-    /* Fail quickly */
-    if (!ObjectPath) return STATUS_OBJECT_NAME_INVALID;
 
     /* Capture the name */
     Status = ObpCaptureObjectName(&ObjectName, ObjectPath, AccessMode, TRUE);
     if (!NT_SUCCESS(Status)) return Status;
 
-    /* We also need a valid name after capture */
-    if (!ObjectName.Length) return STATUS_OBJECT_NAME_INVALID;
-
     /* Check if we didn't get an access state */
     if (!PassedAccessState)
     {
@@ -416,34 +410,21 @@ ObReferenceObjectByName(IN PUNICODE_STRING ObjectPath,
 
     /* Find the object */
     *ObjectPtr = NULL;
-    Status = ObpLookupObjectName(NULL,
-                                 &ObjectName,
-                                 Attributes,
-                                 ObjectType,
-                                 AccessMode,
-                                 ParseContext,
-                                 NULL,
-                                 NULL,
-                                 PassedAccessState,
-                                 &Context,
-                                 &Object);
-
-    /* Cleanup after lookup */
-    ObpCleanupDirectoryLookup(&Context);
-
-    /* Check if the lookup succeeded */
+    Status = ObFindObject(NULL,
+                          &ObjectName,
+                          Attributes,
+                          AccessMode,
+                          &Object,
+                          ObjectType,
+                          &Context,
+                          PassedAccessState,
+                          NULL,
+                          ParseContext,
+                          NULL);
     if (NT_SUCCESS(Status))
     {
-        /* Check if access is allowed */
-        if (ObpCheckObjectReference(Object,
-                                    PassedAccessState,
-                                    FALSE,
-                                    AccessMode,
-                                    &Status))
-        {
-            /* Return the object */
-            *ObjectPtr = Object;
-        }
+        /* Return the object */
+        *ObjectPtr = Object;
     }
 
     /* Free the access state */
@@ -454,7 +435,7 @@ ObReferenceObjectByName(IN PUNICODE_STRING ObjectPath,
 
 Quickie:
     /* Free the captured name if we had one, and return status */
-    ObpFreeObjectNameBuffer(&ObjectName);
+    if (ObjectName.Buffer) ObpReleaseCapturedName(&ObjectName);
     return Status;
 }
 
@@ -477,8 +458,8 @@ ObReferenceObjectByHandle(IN HANDLE Handle,
     NTSTATUS Status;
     PAGED_CODE();
 
-    /* Assume failure */
-    *Object = NULL;
+    /* Fail immediately if the handle is NULL */
+    if (!Handle) return STATUS_INVALID_HANDLE;
 
     /* Check if the caller wants the current process */
     if ((Handle == NtCurrentProcess()) &&
@@ -487,6 +468,9 @@ ObReferenceObjectByHandle(IN HANDLE Handle,
         /* Get the current process */
         CurrentProcess = PsGetCurrentProcess();
 
+        /* Reference ourselves */
+        ObReferenceObject(CurrentProcess);
+
         /* Check if the caller wanted handle information */
         if (HandleInformation)
         {
@@ -495,10 +479,6 @@ ObReferenceObjectByHandle(IN HANDLE Handle,
             HandleInformation->GrantedAccess = PROCESS_ALL_ACCESS;
         }
 
-        /* Reference ourselves */
-        ObjectHeader = OBJECT_TO_OBJECT_HEADER(CurrentProcess);
-        InterlockedExchangeAdd(&ObjectHeader->PointerCount, 1);
-
         /* Return the pointer */
         *Object = CurrentProcess;
         return STATUS_SUCCESS;
@@ -516,6 +496,9 @@ ObReferenceObjectByHandle(IN HANDLE Handle,
         /* Get the current thread */
         CurrentThread = PsGetCurrentThread();
 
+        /* Reference ourselves */
+        ObReferenceObject(CurrentThread);
+
         /* Check if the caller wanted handle information */
         if (HandleInformation)
         {
@@ -524,10 +507,6 @@ ObReferenceObjectByHandle(IN HANDLE Handle,
             HandleInformation->GrantedAccess = THREAD_ALL_ACCESS;
         }
 
-        /* Reference ourselves */
-        ObjectHeader = OBJECT_TO_OBJECT_HEADER(CurrentThread);
-        InterlockedExchangeAdd(&ObjectHeader->PointerCount, 1);
-
         /* Return the pointer */
         *Object = CurrentThread;
         return STATUS_SUCCESS;
@@ -552,7 +531,6 @@ ObReferenceObjectByHandle(IN HANDLE Handle,
     }
 
     /* Enter a critical region while we touch the handle table */
-    ASSERT(HandleTable != NULL);
     KeEnterCriticalRegion();
 
     /* Get the handle entry */
@@ -560,7 +538,7 @@ ObReferenceObjectByHandle(IN HANDLE Handle,
     if (HandleEntry)
     {
         /* Get the object header and validate the type*/
-        ObjectHeader = ObpGetHandleObject(HandleEntry);
+        ObjectHeader = EX_HTE_TO_HDR(HandleEntry);
         if (!(ObjectType) || (ObjectType == ObjectHeader->Type))
         {
             /* Get the granted access and validate it */
@@ -572,7 +550,10 @@ ObReferenceObjectByHandle(IN HANDLE Handle,
                 InterlockedIncrement(&ObjectHeader->PointerCount);
 
                 /* Mask out the internal attributes */
-                Attributes = HandleEntry->ObAttributes & OBJ_HANDLE_ATTRIBUTES;
+                Attributes = HandleEntry->ObAttributes &
+                             (EX_HANDLE_ENTRY_PROTECTFROMCLOSE |
+                              EX_HANDLE_ENTRY_INHERITABLE |
+                              EX_HANDLE_ENTRY_AUDITONCLOSE);
 
                 /* Check if the caller wants handle information */
                 if (HandleInformation)
@@ -587,10 +568,9 @@ ObReferenceObjectByHandle(IN HANDLE Handle,
 
                 /* Unlock the handle */
                 ExUnlockHandleTableEntry(HandleTable, HandleEntry);
-                KeLeaveCriticalRegion();
 
                 /* Return success */
-                ASSERT(*Object != NULL);
+                KeLeaveCriticalRegion();
                 return STATUS_SUCCESS;
             }
             else
index 2d81a8d..7faad13 100644 (file)
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <debug.h>
+#include <internal/debug.h>
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
-BOOLEAN
-NTAPI
-ObCheckCreateObjectAccess(IN PVOID Object,
-                          IN ACCESS_MASK CreateAccess,
-                          IN PACCESS_STATE AccessState,
-                          IN PUNICODE_STRING ComponentName,
-                          IN BOOLEAN LockHeld,
-                          IN KPROCESSOR_MODE AccessMode,
-                          OUT PNTSTATUS AccessStatus)
-{
-    POBJECT_HEADER ObjectHeader;
-    POBJECT_TYPE ObjectType;
-    PSECURITY_DESCRIPTOR SecurityDescriptor;
-    BOOLEAN SdAllocated;
-    BOOLEAN Result = TRUE;
-    ACCESS_MASK GrantedAccess = 0;
-    PPRIVILEGE_SET Privileges = NULL;
-    NTSTATUS Status;
-    PAGED_CODE();
-
-    /* Get the header and type */
-    ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
-    ObjectType = ObjectHeader->Type;
-
-    /* Get the security descriptor */
-    Status = ObGetObjectSecurity(Object, &SecurityDescriptor, &SdAllocated);
-    if (!NT_SUCCESS(Status))
-    {
-        /* We failed */
-        *AccessStatus = Status;
-        return FALSE;
-    }
-
-    /* Lock the security context */
-    SeLockSubjectContext(&AccessState->SubjectSecurityContext);
-
-    /* Check if we have an SD */
-    if (SecurityDescriptor)
-    {
-        /* Now do the entire access check */
-        Result = SeAccessCheck(SecurityDescriptor,
-                               &AccessState->SubjectSecurityContext,
-                               TRUE,
-                               CreateAccess,
-                               0,
-                               &Privileges,
-                               &ObjectType->TypeInfo.GenericMapping,
-                               AccessMode,
-                               &GrantedAccess,
-                               AccessStatus);
-        if (Privileges)
-        {
-            /* We got privileges, append them to the access state and free them */
-            Status = SeAppendPrivileges(AccessState, Privileges);
-            SeFreePrivileges(Privileges);
-        }
-    }
-
-    /* We're done, unlock the context and release security */
-    SeUnlockSubjectContext(&AccessState->SubjectSecurityContext);
-    ObReleaseObjectSecurity(SecurityDescriptor, SdAllocated);
-    return Result;
-}
-
-BOOLEAN
-NTAPI
-ObpCheckTraverseAccess(IN PVOID Object,
-                       IN ACCESS_MASK TraverseAccess,
-                       IN PACCESS_STATE AccessState OPTIONAL,
-                       IN BOOLEAN LockHeld,
-                       IN KPROCESSOR_MODE AccessMode,
-                       OUT PNTSTATUS AccessStatus)
-{
-    POBJECT_HEADER ObjectHeader;
-    POBJECT_TYPE ObjectType;
-    PSECURITY_DESCRIPTOR SecurityDescriptor;
-    BOOLEAN SdAllocated;
-    BOOLEAN Result;
-    ACCESS_MASK GrantedAccess = 0;
-    PPRIVILEGE_SET Privileges = NULL;
-    NTSTATUS Status;
-    PAGED_CODE();
-
-    /* Get the header and type */
-    ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
-    ObjectType = ObjectHeader->Type;
-
-    /* Get the security descriptor */
-    Status = ObGetObjectSecurity(Object, &SecurityDescriptor, &SdAllocated);
-    if (!NT_SUCCESS(Status))
-    {
-        /* We failed */
-        *AccessStatus = Status;
-        return FALSE;
-    }
-
-    /* Lock the security context */
-    SeLockSubjectContext(&AccessState->SubjectSecurityContext);
-
-    /* Now do the entire access check */
-    Result = SeAccessCheck(SecurityDescriptor,
-                           &AccessState->SubjectSecurityContext,
-                           TRUE,
-                           TraverseAccess,
-                           0,
-                           &Privileges,
-                           &ObjectType->TypeInfo.GenericMapping,
-                           AccessMode,
-                           &GrantedAccess,
-                           AccessStatus);
-    if (Privileges)
-    {
-        /* We got privileges, append them to the access state and free them */
-        Status = SeAppendPrivileges(AccessState, Privileges);
-        SeFreePrivileges(Privileges);
-    }
-
-    /* We're done, unlock the context and release security */
-    SeUnlockSubjectContext(&AccessState->SubjectSecurityContext);
-    ObReleaseObjectSecurity(SecurityDescriptor, SdAllocated);
-    return Result;
-}
-
-BOOLEAN
-NTAPI
-ObpCheckObjectReference(IN PVOID Object,
-                        IN OUT PACCESS_STATE AccessState,
-                        IN BOOLEAN LockHeld,
-                        IN KPROCESSOR_MODE AccessMode,
-                        OUT PNTSTATUS AccessStatus)
-{
-    POBJECT_HEADER ObjectHeader;
-    POBJECT_TYPE ObjectType;
-    PSECURITY_DESCRIPTOR SecurityDescriptor;
-    BOOLEAN SdAllocated;
-    BOOLEAN Result;
-    ACCESS_MASK GrantedAccess = 0;
-    PPRIVILEGE_SET Privileges = NULL;
-    NTSTATUS Status;
-    PAGED_CODE();
-
-    /* Get the header and type */
-    ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
-    ObjectType = ObjectHeader->Type;
-
-    /* Get the security descriptor */
-    Status = ObGetObjectSecurity(Object, &SecurityDescriptor, &SdAllocated);
-    if (!NT_SUCCESS(Status))
-    {
-        /* We failed */
-        *AccessStatus = Status;
-        return FALSE;
-    }
-
-    /* Lock the security context */
-    SeLockSubjectContext(&AccessState->SubjectSecurityContext);
-
-    /* Now do the entire access check */
-    Result = SeAccessCheck(SecurityDescriptor,
-                           &AccessState->SubjectSecurityContext,
-                           TRUE,
-                           AccessState->RemainingDesiredAccess,
-                           AccessState->PreviouslyGrantedAccess,
-                           &Privileges,
-                           &ObjectType->TypeInfo.GenericMapping,
-                           AccessMode,
-                           &GrantedAccess,
-                           AccessStatus);
-    if (Result)
-    {
-        /* Update the access state */
-        AccessState->RemainingDesiredAccess &= ~GrantedAccess;
-        AccessState->PreviouslyGrantedAccess |= GrantedAccess;
-    }
-
-    /* Check if we have an SD */
-    if (SecurityDescriptor)
-    {
-        /* Do audit alarm */
-#if 0
-        SeObjectReferenceAuditAlarm(&AccessState->OperationID,
-                                    Object,
-                                    SecurityDescriptor,
-                                    &AccessState->SubjectSecurityContext,
-                                    AccessState->RemainingDesiredAccess |
-                                    AccessState->PreviouslyGrantedAccess,
-                                    ((PAUX_DATA)(AccessState->AuxData))->
-                                    PrivilegeSet,
-                                    Result,
-                                    AccessMode);
-#endif
-    }
-
-    /* We're done, unlock the context and release security */
-    SeUnlockSubjectContext(&AccessState->SubjectSecurityContext);
-    ObReleaseObjectSecurity(SecurityDescriptor, SdAllocated);
-    return Result;
-}
-
 /*++
 * @name ObCheckObjectAccess
 *
@@ -225,7 +26,7 @@ ObpCheckObjectReference(IN PVOID Object,
 * @param AccessState
 *        <FILLMEIN>
 *
-* @param LockHeld
+* @param Unknown
 *        <FILLMEIN>
 *
 * @param AccessMode
@@ -243,7 +44,7 @@ BOOLEAN
 NTAPI
 ObCheckObjectAccess(IN PVOID Object,
                     IN OUT PACCESS_STATE AccessState,
-                    IN BOOLEAN LockHeld,
+                    IN BOOLEAN Unknown,
                     IN KPROCESSOR_MODE AccessMode,
                     OUT PNTSTATUS ReturnedStatus)
 {
@@ -292,7 +93,7 @@ ObCheckObjectAccess(IN PVOID Object,
                            ReturnedStatus);
     if (Privileges)
     {
-        /* We got privileges, append them to the access state and free them */
+        /* We got privileges, append them to teh access state and free them */
         Status = SeAppendPrivileges(AccessState, Privileges);
         SeFreePrivileges(Privileges);
     }
@@ -829,7 +630,8 @@ ObQueryObjectAuditingByHandle(IN HANDLE Handle,
     if(HandleEntry)
     {
         /* Check if the flag is set */
-        *GenerateOnClose = HandleEntry->ObAttributes & OBJ_AUDIT_OBJECT_CLOSE;
+        *GenerateOnClose = (HandleEntry->ObAttributes &
+                            EX_HANDLE_ENTRY_AUDITONCLOSE) != 0;
 
         /* Unlock the entry */
         ExUnlockHandleTableEntry(HandleTable, HandleEntry);
index a110604..65b38a2 100644 (file)
@@ -181,7 +181,7 @@ NtWaitForMultipleObjects(IN ULONG ObjectCount,
         }
 
         /* Get the Object Header */
-        ObjectHeader = ObpGetHandleObject(HandleEntry);
+        ObjectHeader = EX_HTE_TO_HDR(HandleEntry);
 
         /* Get default Object */
         DefaultObject = ObjectHeader->Type->DefaultObject;
index 4107998..1f71072 100644 (file)
@@ -19,39 +19,6 @@ POBJECT_TYPE ObSymbolicLinkType = NULL;
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
-VOID
-NTAPI
-ObpDeleteSymbolicLinkName(IN POBJECT_SYMBOLIC_LINK SymbolicLink)
-{
-    /* FIXME: Device maps not supported yet */
-
-}
-
-VOID
-NTAPI
-ObpCreateSymbolicLinkName(IN POBJECT_SYMBOLIC_LINK SymbolicLink)
-{
-    POBJECT_HEADER ObjectHeader;
-    POBJECT_HEADER_NAME_INFO ObjectNameInfo;
-
-    /* Get header data */
-    ObjectHeader = OBJECT_TO_OBJECT_HEADER(SymbolicLink);
-    ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
-
-    /* Check if we are not actually in a directory with a device map */
-    if (!(ObjectNameInfo) ||
-        !(ObjectNameInfo->Directory) ||
-        !(ObjectNameInfo->Directory->DeviceMap))
-    {
-        /* There's nothing to do, return */
-        return;
-    }
-
-    /* FIXME: We don't support device maps yet */
-    DPRINT1("Unhandled path!\n");
-    KEBUGCHECK(0);
-}
-
 /*++
 * @name ObpDeleteSymbolicLink
 *
index 0d3978e..8eb01c5 100644 (file)
 #define NDEBUG
 #include <internal/debug.h>
 
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, PoInit)
+#endif
+
 extern ULONG ExpInitialiationPhase;
 
 typedef struct _REQUEST_POWER_ITEM
@@ -300,10 +304,11 @@ PopSetSystemPowerState(
   return Status;
 }
 
-BOOLEAN
+VOID
+INIT_FUNCTION
 NTAPI
-PoInitSystem(IN ULONG BootPhase,
-             IN BOOLEAN HaveAcpiTable)
+PoInit(IN ULONG BootPhase,
+       IN BOOLEAN HaveAcpiTable)
 {
     PVOID NotificationEntry;
     PCHAR CommandLine;
@@ -321,7 +326,7 @@ PoInitSystem(IN ULONG BootPhase,
                                        PopAddRemoveSysCapsCallback,
                                        NULL,
                                        &NotificationEntry);
-        return TRUE;
+        return;
     }
 
     /* Get the Command Line */
@@ -343,8 +348,6 @@ PoInitSystem(IN ULONG BootPhase,
         /* Otherwise check the LoaderBlock's Flag */
         PopAcpiPresent = HaveAcpiTable;
     }
-
-    return TRUE;
 }
 
 VOID
index d5e05d0..5a28b52 100644 (file)
@@ -18,7 +18,6 @@
 
 LIST_ENTRY PspReaperListHead = {0};
 WORK_QUEUE_ITEM PspReaperWorkItem;
-LARGE_INTEGER ShortTime = {{-10 * 100 * 1000, -1}};
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
@@ -82,8 +81,7 @@ NTAPI
 PspTerminateProcess(IN PEPROCESS Process,
                     IN NTSTATUS ExitStatus)
 {
-    PETHREAD Thread;
-    NTSTATUS Status = STATUS_NOTHING_TO_TERMINATE;
+    PETHREAD Thread = NULL;
     PAGED_CODE();
     PSTRACE(PS_KILL_DEBUG,
             "Process: %p ExitStatus: %p\n", Process, ExitStatus);
@@ -102,26 +100,22 @@ PspTerminateProcess(IN PEPROCESS Process,
     InterlockedOr((PLONG)&Process->Flags, PSF_PROCESS_DELETE_BIT);
 
     /* Get the first thread */
-    Thread = PsGetNextProcessThread(Process, NULL);
+    Thread = PsGetNextProcessThread(Process, Thread);
     while (Thread)
     {
         /* Kill it */
+        PSREFTRACE(Thread);
         PspTerminateThreadByPointer(Thread, ExitStatus, FALSE);
+        PSREFTRACE(Thread);
         Thread = PsGetNextProcessThread(Process, Thread);
-
-        /* We had at least one thread, so termination is OK */
-        Status = STATUS_SUCCESS;
     }
 
-    /* Check if there was nothing to terminate or if we have a debug port */
-    if ((Status == STATUS_NOTHING_TO_TERMINATE) || (Process->DebugPort))
-    {
-        /* Clear the handle table anyway */
-        ObClearProcessHandleTable(Process);
-    }
+    /* Clear the handle table */
+    if (Process->ObjectTable) ObClearProcessHandleTable(Process);
 
-    /* Return status */
-    return Status;
+    /* Return success*/
+    PSREFTRACE(Process);
+    return STATUS_SUCCESS;
 }
 
 NTSTATUS
@@ -169,16 +163,19 @@ VOID
 NTAPI
 PspReapRoutine(IN PVOID Context)
 {
-    PSINGLE_LIST_ENTRY NextEntry;
+    PLIST_ENTRY *ListAddr;
+    PLIST_ENTRY NextEntry;
     PETHREAD Thread;
     PSTRACE(PS_KILL_DEBUG, "Context: %p\n", Context);
 
+    /* Get the Reaper Address Pointer */
+    ListAddr = &PspReaperListHead.Flink;
+
     /* Start main loop */
     do
     {
         /* Write magic value and return the next entry to process */
-        NextEntry = InterlockedExchangePointer(&PspReaperListHead.Flink,
-                                               (PVOID)1);
+        NextEntry = InterlockedExchangePointer(ListAddr, (PVOID)1);
         ASSERT((NextEntry != NULL) && (NextEntry != (PVOID)1));
 
         /* Start inner loop */
@@ -193,16 +190,15 @@ PspReapRoutine(IN PVOID Context)
             Thread->Tcb.InitialStack = NULL;
 
             /* Move to the next entry */
-            NextEntry = NextEntry->Next;
+            NextEntry = NextEntry->Flink;
 
             /* Dereference this thread */
             ObDereferenceObject(Thread);
+            PSREFTRACE(Thread);
         } while ((NextEntry != NULL) && (NextEntry != (PVOID)1));
 
         /* Remove magic value, keep looping if it got changed */
-    } while (InterlockedCompareExchangePointer(&PspReaperListHead.Flink,
-                                               0,
-                                               1) != (PVOID)1);
+    } while (InterlockedCompareExchangePointer(ListAddr, 0, 1) != (PVOID)1);
 }
 
 VOID
@@ -249,7 +245,7 @@ PspDeleteProcess(IN PVOID ObjectBody)
     /* Check if we have a debug port */
     if (Process->DebugPort)
     {
-        /* Deference the Debug Port */
+        /* Dererence the Debug Port */
         ObDereferenceObject(Process->DebugPort);
         Process->DebugPort = NULL;
     }
@@ -257,7 +253,7 @@ PspDeleteProcess(IN PVOID ObjectBody)
     /* Check if we have an exception port */
     if (Process->ExceptionPort)
     {
-        /* Deference the Exception Port */
+        /* Dererence the Exception Port */
         ObDereferenceObject(Process->ExceptionPort);
         Process->ExceptionPort = NULL;
     }
@@ -265,7 +261,7 @@ PspDeleteProcess(IN PVOID ObjectBody)
     /* Check if we have a section object */
     if (Process->SectionObject)
     {
-        /* Deference the Section Object */
+        /* Dererence the Section Object */
         ObDereferenceObject(Process->SectionObject);
         Process->SectionObject = NULL;
     }
@@ -283,7 +279,7 @@ PspDeleteProcess(IN PVOID ObjectBody)
         /* Kill the Object Info */
         ObKillProcess(Process);
 
-        /* Detach */
+        /* Dettach */
         KeUnstackDetachProcess(&ApcState);
     }
 
@@ -299,7 +295,7 @@ PspDeleteProcess(IN PVOID ObjectBody)
         /* Clean the Address Space */
         PspExitProcess(FALSE, Process);
 
-        /* Detach */
+        /* Dettach */
         KeUnstackDetachProcess(&ApcState);
 
         /* Completely delete the Address Space */
@@ -307,10 +303,10 @@ PspDeleteProcess(IN PVOID ObjectBody)
     }
 
     /* See if we have a PID */
-    if (Process->UniqueProcessId)
+    if(Process->UniqueProcessId)
     {
         /* Delete the PID */
-        if (!(ExDestroyHandle(PspCidTable, Process->UniqueProcessId, NULL)))
+        if (!(ExDestroyHandle(PspCidTable, Process->UniqueProcessId)))
         {
             /* Something wrong happened, bugcheck */
             KEBUGCHECK(CID_HANDLE_DELETION);
@@ -335,6 +331,7 @@ PspDeleteProcess(IN PVOID ObjectBody)
 
     /* Destroy the Quota Block */
     PspDestroyQuotaBlock(Process);
+    PSREFTRACE(Process);
 }
 
 VOID
@@ -360,7 +357,7 @@ PspDeleteThread(IN PVOID ObjectBody)
     if (Thread->Cid.UniqueThread)
     {
         /* Delete the CID Handle */
-        if (!(ExDestroyHandle(PspCidTable, Thread->Cid.UniqueThread, NULL)))
+        if (!(ExDestroyHandle(PspCidTable, Thread->Cid.UniqueThread)))
         {
             /* Something wrong happened, bugcheck */
             KEBUGCHECK(CID_HANDLE_DELETION);
@@ -371,6 +368,7 @@ PspDeleteThread(IN PVOID ObjectBody)
     PspDeleteThreadSecurity(Thread);
 
     /* Make sure the thread was inserted, before continuing */
+    PSREFTRACE(Thread);
     if (!Process) return;
 
     /* Check if the thread list is valid */
@@ -390,6 +388,8 @@ PspDeleteThread(IN PVOID ObjectBody)
 
     /* Dereference the Process */
     ObDereferenceObject(Process);
+    PSREFTRACE(Thread);
+    PSREFTRACE(Process);
 }
 
 /*
@@ -404,7 +404,7 @@ PspExitThread(IN NTSTATUS ExitStatus)
     NTSTATUS Status;
     PTEB Teb;
     PEPROCESS CurrentProcess;
-    PETHREAD Thread, OtherThread, PreviousThread = NULL;
+    PETHREAD Thread;
     PVOID DeallocationStack;
     ULONG Dummy;
     BOOLEAN Last = FALSE;
@@ -421,6 +421,8 @@ PspExitThread(IN NTSTATUS ExitStatus)
     ASSERT((Thread) == PsGetCurrentThread());
 
     /* Can't terminate a thread if it attached another process */
+    PSREFTRACE(Thread);
+    PSREFTRACE(CurrentProcess);
     if (KeIsAttachedProcess())
     {
         /* Bugcheck */
@@ -432,7 +434,7 @@ PspExitThread(IN NTSTATUS ExitStatus)
     }
 
     /* Lower to Passive Level */
-    KeLowerIrql(PASSIVE_LEVEL);
+    KfLowerIrql(PASSIVE_LEVEL);
 
     /* Can't be a worker thread */
     if (Thread->ActiveExWorker)
@@ -451,9 +453,9 @@ PspExitThread(IN NTSTATUS ExitStatus)
         /* Bugcheck */
         KEBUGCHECKEX(KERNEL_APC_PENDING_DURING_EXIT,
                      0,
-                     Thread->Tcb.CombinedApcDisable,
-                     0,
-                     1);
+                     Thread->Tcb.KernelApcDisable,
+                     APC_LEVEL,
+                     0);
     }
 
     /* Lock the thread */
@@ -498,44 +500,7 @@ PspExitThread(IN NTSTATUS ExitStatus)
             CurrentProcess->ExitStatus = ExitStatus;
         }
 
-        /* Loop all the current threads */
-        FirstEntry = &CurrentProcess->ThreadListHead;
-        CurrentEntry = FirstEntry->Flink;
-        while (FirstEntry != CurrentEntry)
-        {
-            /* Get the thread on the list */
-            OtherThread = CONTAINING_RECORD(CurrentEntry,
-                                            ETHREAD,
-                                            ThreadListEntry);
-
-            /* Check if it's a thread that's still alive */
-            if ((OtherThread != Thread) &&
-                !(KeReadStateThread(&OtherThread->Tcb)) &&
-                (ObReferenceObjectSafe(OtherThread)))
-            {
-                /* It's a live thread and we referenced it, unlock process */
-                ExReleasePushLockExclusive(&CurrentProcess->ProcessLock);
-                KeLeaveCriticalRegion();
-
-                /* Wait on the thread */
-                KeWaitForSingleObject(OtherThread,
-                                      Executive,
-                                      KernelMode,
-                                      FALSE,
-                                      NULL);
-
-                /* Check if we had a previous thread to dereference */
-                if (PreviousThread) ObDereferenceObject(PreviousThread);
-
-                /* Remember the thread and re-lock the process */
-                PreviousThread = OtherThread;
-                KeEnterCriticalRegion();
-                ExAcquirePushLockExclusive(&CurrentProcess->ProcessLock);
-            }
-
-            /* Go to the next thread */
-            CurrentEntry = CurrentEntry->Flink;
-        }
+        /* FIXME: Wait on the other threads to finish */
     }
     else if (ExitStatus != STATUS_THREAD_IS_TERMINATING)
     {
@@ -547,9 +512,6 @@ PspExitThread(IN NTSTATUS ExitStatus)
     ExReleasePushLockExclusive(&CurrentProcess->ProcessLock);
     KeLeaveCriticalRegion();
 
-    /* Check if we had a previous thread to dereference */
-    if (PreviousThread) ObDereferenceObject(PreviousThread);
-
     /* Check if the process has a debug port and if this is a user thread */
     if ((CurrentProcess->DebugPort) && !(Thread->SystemThread))
     {
@@ -608,20 +570,15 @@ PspExitThread(IN NTSTATUS ExitStatus)
             /* Save the Create Time */
             TerminationMsg.CreateTime = Thread->CreateTime;
 
-            /* Loop trying to send message */
-            while (TRUE)
+TryAgain:
+            /* Send the LPC Message */
+            Status = LpcRequestPort(TerminationPort->Port, &TerminationMsg.h);
+            if ((Status == STATUS_NO_MEMORY) ||
+                (Status == STATUS_INSUFFICIENT_RESOURCES))
             {
-                /* Send the LPC Message */
-                Status = LpcRequestPort(TerminationPort->Port,
-                                        &TerminationMsg.h);
-                if ((Status == STATUS_NO_MEMORY) ||
-                    (Status == STATUS_INSUFFICIENT_RESOURCES))
-                {
-                    /* Wait a bit and try again */
-                    KeDelayExecutionThread(KernelMode, FALSE, &ShortTime);
-                    continue;
-                }
-                break;
+                /* Wait a bit and try again */
+                KeDelayExecutionThread(KernelMode, FALSE, &ShortPsLockDelay);
+                goto TryAgain;
             }
 
             /* Dereference this LPC Port */
@@ -634,8 +591,7 @@ PspExitThread(IN NTSTATUS ExitStatus)
             ExFreePool(TerminationPort);
 
             /* Keep looping as long as there is a port */
-            TerminationPort = NextPort;
-        } while (TerminationPort);
+        } while ((TerminationPort = NextPort));
     }
     else if (((ExitStatus == STATUS_THREAD_IS_TERMINATING) &&
               (Thread->DeadThread)) ||
@@ -671,20 +627,16 @@ PspExitThread(IN NTSTATUS ExitStatus)
             /* Save the Create Time */
             TerminationMsg.CreateTime = Thread->CreateTime;
 
-            /* Loop trying to send message */
-            while (TRUE)
+TryAgain2:
+            /* Send the LPC Message */
+            Status = LpcRequestPort(CurrentProcess->ExceptionPort,
+                                    &TerminationMsg.h);
+            if ((Status == STATUS_NO_MEMORY) ||
+                (Status == STATUS_INSUFFICIENT_RESOURCES))
             {
-                /* Send the LPC Message */
-                Status = LpcRequestPort(CurrentProcess->ExceptionPort,
-                                        &TerminationMsg.h);
-                if ((Status == STATUS_NO_MEMORY) ||
-                    (Status == STATUS_INSUFFICIENT_RESOURCES))
-                {
-                    /* Wait a bit and try again */
-                    KeDelayExecutionThread(KernelMode, FALSE, &ShortTime);
-                    continue;
-                }
-                break;
+                /* Wait a bit and try again */
+                KeDelayExecutionThread(KernelMode, FALSE, &ShortPsLockDelay);
+                goto TryAgain2;
             }
         }
     }
@@ -694,6 +646,7 @@ PspExitThread(IN NTSTATUS ExitStatus)
                                                      PsW32ThreadCalloutExit);
 
     /* If we are the last thread and have a W32 Process */
+    PSREFTRACE(Thread);
     if ((Last) && (CurrentProcess->Win32Process))
     {
         /* Run it down too */
@@ -721,30 +674,26 @@ PspExitThread(IN NTSTATUS ExitStatus)
 
     /* Check if we have a TEB */
     Teb = Thread->Tcb.Teb;
-    if (Teb)
+    if(Teb)
     {
-        /* Check if the thread is still alive */
-        if (!Thread->DeadThread)
+        /* Check if the thread isn't terminated and if we should free stack */
+        if (!(Thread->Terminated) && (Teb->FreeStackOnTermination))
         {
-            /* Check if we need to free its stack */
-            if (Teb->FreeStackOnTermination)
-            {
-                /* Set the TEB's Deallocation Stack as the Base Address */
-                Dummy = 0;
-                DeallocationStack = Teb->DeallocationStack;
-
-                /* Free the Thread's Stack */
-                ZwFreeVirtualMemory(NtCurrentProcess(),
-                                    &DeallocationStack,
-                                    &Dummy,
-                                    MEM_RELEASE);
-            }
-
-            /* Free the debug handle */
-            if (Teb->DbgSsReserved[1]) ObCloseHandle(Teb->DbgSsReserved[1],
-                                                     UserMode);
+            /* Set the TEB's Deallocation Stack as the Base Address */
+            Dummy = 0;
+            DeallocationStack = Teb->DeallocationStack;
+
+            /* Free the Thread's Stack */
+            ZwFreeVirtualMemory(NtCurrentProcess(),
+                                &DeallocationStack,
+                                &Dummy,
+                                MEM_RELEASE);
         }
 
+        /* Free the debug handle */
+        if (Teb->DbgSsReserved[1]) ObCloseHandle(Teb->DbgSsReserved[1],
+                                                 UserMode);
+
         /* Decommit the TEB */
         MmDeleteTeb(CurrentProcess, Teb);
         Thread->Tcb.Teb = NULL;
@@ -761,6 +710,8 @@ PspExitThread(IN NTSTATUS ExitStatus)
     ASSERT(Thread->Tcb.CombinedApcDisable == 0);
 
     /* Check if this is the final thread or not */
+    PSREFTRACE(Thread);
+    PSREFTRACE(CurrentProcess);
     if (Last)
     {
         /* Set the process exit time */
@@ -785,6 +736,7 @@ PspExitThread(IN NTSTATUS ExitStatus)
 
         /* Kill the process in the Object Manager */
         ObKillProcess(CurrentProcess);
+        PSREFTRACE(CurrentProcess);
 
         /* Check if we have a section object */
         if (CurrentProcess->SectionObject)
@@ -816,7 +768,6 @@ PspExitThread(IN NTSTATUS ExitStatus)
     FirstEntry = KeFlushQueueApc(&Thread->Tcb, UserMode);
     if (FirstEntry)
     {
-        /* Start with the first entry */
         CurrentEntry = FirstEntry;
         do
         {
@@ -830,7 +781,7 @@ PspExitThread(IN NTSTATUS ExitStatus)
            if (Apc->RundownRoutine)
            {
               /* Call its own routine */
-              Apc->RundownRoutine(Apc);
+              (Apc->RundownRoutine)(Apc);
            }
            else
            {
@@ -849,12 +800,12 @@ PspExitThread(IN NTSTATUS ExitStatus)
 
     /* Flush the APC queue, which should be empty */
     FirstEntry = KeFlushQueueApc(&Thread->Tcb, KernelMode);
-    if ((FirstEntry) || (Thread->Tcb.CombinedApcDisable != 0))
+    if (FirstEntry)
     {
         /* Bugcheck time */
         KEBUGCHECKEX(KERNEL_APC_PENDING_DURING_EXIT,
                      (ULONG_PTR)FirstEntry,
-                     Thread->Tcb.CombinedApcDisable,
+                     Thread->Tcb.KernelApcDisable,
                      KeGetCurrentIrql(),
                      0);
     }
@@ -863,6 +814,8 @@ PspExitThread(IN NTSTATUS ExitStatus)
     if (Last) KeSetProcess(&CurrentProcess->Pcb, 0, FALSE);
 
     /* Terminate the Thread from the Scheduler */
+    PSREFTRACE(Thread);
+    PSREFTRACE(CurrentProcess);
     KeTerminateThread(0);
 }
 
@@ -958,7 +911,7 @@ PspTerminateThreadByPointer(IN PETHREAD Thread,
     if ((bSelf) || (PsGetCurrentThread() == Thread))
     {
         /* This should only happen at passive */
-        ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+        ASSERT_IRQL(PASSIVE_LEVEL);
 
         /* Mark it as terminated */
         PspSetCrossThreadFlag(Thread, CT_TERMINATED_BIT);
@@ -974,11 +927,10 @@ PspTerminateThreadByPointer(IN PETHREAD Thread,
     Apc = ExAllocatePoolWithTag(NonPagedPool, sizeof(KAPC), TAG_TERMINATE_APC);
 
     /* Set the Terminated Flag */
-    Flags = Thread->CrossThreadFlags | CT_TERMINATED_BIT;
+    Flags = Thread->CrossThreadFlags | 1;
 
     /* Set it, and check if it was already set while we were running */
-    if (!(InterlockedExchange((PLONG)&Thread->CrossThreadFlags, Flags) &
-          CT_TERMINATED_BIT))
+    if (!(InterlockedExchange((PLONG)&Thread->CrossThreadFlags, Flags) & 1))
     {
         /* Initialize a Kernel Mode APC to Kill the Thread */
         KeInitializeApc(Apc,
@@ -1009,6 +961,7 @@ PspTerminateThreadByPointer(IN PETHREAD Thread,
     ExFreePool(Apc);
 
     /* Return Status */
+    PSREFTRACE(Thread);
     return Status;
 }
 
@@ -1053,6 +1006,7 @@ PspExitProcess(IN BOOLEAN LastThread,
     }
 
     /* Check if we are the last thread */
+    PSREFTRACE(Process);
     if (LastThread)
     {
         /* Check if we have to set the Timer Resolution */
@@ -1134,12 +1088,7 @@ NtTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,
     }
 
     /* Lock the Process */
-    if (!ExAcquireRundownProtection(&Process->RundownProtect))
-    {
-        /* Failed to lock, fal */
-        ObDereferenceObject (Process);
-        return STATUS_PROCESS_IS_TERMINATING;
-    }
+    ExAcquireRundownProtection(&Process->RundownProtect);
 
     /* Set the delete flag */
     if (!KillByHandle) InterlockedOr((PLONG)&Process->Flags,
@@ -1164,8 +1113,7 @@ NtTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,
             }
 
             /* Move to the next thread */
-            Thread = PsGetNextProcessThread(Process, Thread);
-        } while (Thread);
+        } while((Thread = PsGetNextProcessThread(Process, Thread)));
     }
 
     /* Unlock the process */
index c7cd2f9..f330a81 100644 (file)
 
 /* GLOBALS *******************************************************************/
 
-BOOLEAN PsImageNotifyEnabled = FALSE;
-ULONG PspThreadNotifyRoutineCount, PspProcessNotifyRoutineCount;
-ULONG PspLoadImageNotifyRoutineCount;
-EX_CALLBACK PspThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
-EX_CALLBACK PspProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
-EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
+BOOLEAN PsImageNotifyEnabled = TRUE;
+ULONG PspThreadNotifyRoutineCount;
+PCREATE_THREAD_NOTIFY_ROUTINE
+PspThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
+PCREATE_PROCESS_NOTIFY_ROUTINE
+PspProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
+PLOAD_IMAGE_NOTIFY_ROUTINE
+PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
 PLEGO_NOTIFY_ROUTINE PspLegoNotifyRoutine;
 
 /* PUBLIC FUNCTIONS **********************************************************/
@@ -34,78 +36,39 @@ PsSetCreateProcessNotifyRoutine(IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
                                 IN BOOLEAN Remove)
 {
     ULONG i;
-    PEX_CALLBACK_ROUTINE_BLOCK CallBack;
-    PAGED_CODE();
 
-    /* Check if we're removing */
+    /* Check if it's a removal or addition */
     if (Remove)
     {
-        /* Loop all the routines */
-        for (i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++)
+        /* Loop the routines */
+        for(i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++)
         {
-            /* Reference the callback block */
-            CallBack = ExReferenceCallBackBlock(&PspProcessNotifyRoutine[i]);
-            if (!CallBack) continue;
-
-            /* Check it this is a matching block */
-            if (ExGetCallBackBlockRoutine(CallBack) != (PVOID)NotifyRoutine)
-            {
-                /* It's not, try the next one */
-                continue;
-            }
-
-            /* It is, clear the current routine */
-            if (ExCompareExchangeCallBack(&PspProcessNotifyRoutine[i],
-                                          NULL,
-                                          CallBack))
+            /* Check for a match */
+            if (PspProcessNotifyRoutine[i] == NotifyRoutine)
             {
-                /* Decrement the number of routines */
-                InterlockedDecrement((PLONG)&PspProcessNotifyRoutineCount);
-
-                /* Dereference the block */
-                ExDereferenceCallBackBlock(&PspProcessNotifyRoutine[i],
-                                           CallBack);
-
-                /* Wait for actice callbacks */
-                ExWaitForCallBacks(CallBack);
-
-                /* Free the callback and exit */
-                ExFreeCallBack (CallBack);
+                /* Remove and return */
+                PspProcessNotifyRoutine[i] = NULL;
                 return STATUS_SUCCESS;
             }
-
-            /* Dereference the block */
-            ExDereferenceCallBackBlock(&PspProcessNotifyRoutine[i],
-                                       CallBack);
         }
-
-        /* We didn't find any matching block */
-        return STATUS_PROCEDURE_NOT_FOUND;
     }
     else
     {
-        /* Allocate a callback */
-        CallBack = ExAllocateCallBack((PVOID)NotifyRoutine, NULL);
-        if (!CallBack) return STATUS_INSUFFICIENT_RESOURCES;
-
-        /* Loop all callbacks */
-        for (i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++)
+        /* Loop the routines */
+        for(i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++)
         {
-            /* Add this routine if it's an empty slot */
-            if (ExCompareExchangeCallBack(&PspProcessNotifyRoutine[i],
-                                          CallBack,
-                                          NULL))
+            /* Find an empty one */
+            if (!PspProcessNotifyRoutine[i])
             {
-                /* Found and inserted into an empty slot, return */
-                InterlockedIncrement((PLONG)&PspProcessNotifyRoutineCount);
+                /* Add it */
+                PspProcessNotifyRoutine[i] = NotifyRoutine;
                 return STATUS_SUCCESS;
             }
         }
-
-        /* We didn't find a free slot, free the callback and fail */
-        ExFreeCallBack(CallBack);
-        return STATUS_INVALID_PARAMETER;
     }
+
+    /* Nothing found */
+    return Remove ? STATUS_PROCEDURE_NOT_FOUND : STATUS_INVALID_PARAMETER;
 }
 
 /*
@@ -130,45 +93,21 @@ NTAPI
 PsRemoveLoadImageNotifyRoutine(IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine)
 {
     ULONG i;
-    PEX_CALLBACK_ROUTINE_BLOCK CallBack;
-    PAGED_CODE();
 
-    /* Loop all callbacks */
-    for (i = 0; i < PSP_MAX_LOAD_IMAGE_NOTIFY; i++)
+    /* Loop the routines */
+    for(i = 0; i < PSP_MAX_LOAD_IMAGE_NOTIFY; i++)
     {
-        /* Reference this slot */
-        CallBack = ExReferenceCallBackBlock(&PspLoadImageNotifyRoutine[i]);
-        if (CallBack)
+        /* Check for a match */
+        if (PspLoadImageNotifyRoutine[i] == NotifyRoutine)
         {
-            /* Check for a match */
-            if (ExGetCallBackBlockRoutine(CallBack) == (PVOID)NotifyRoutine)
-            {
-                /* Try removing it if it matches */
-                if (ExCompareExchangeCallBack(&PspLoadImageNotifyRoutine[i],
-                                              NULL,
-                                              CallBack))
-                {
-                    /* We removed it, now dereference the block */
-                    InterlockedDecrement((PLONG)&PspLoadImageNotifyRoutineCount);
-                    ExDereferenceCallBackBlock(&PspLoadImageNotifyRoutine[i],
-                                               CallBack);
-
-                    /* Wait for active callbacks */
-                    ExWaitForCallBacks(CallBack);
-
-                    /* Free the callback and return */
-                    ExFreeCallBack(CallBack);
-                    return STATUS_SUCCESS;
-                }
-            }
-
-            /* Dereference the callback */
-            ExDereferenceCallBackBlock(&PspLoadImageNotifyRoutine[i], CallBack);
+            /* Remove and return */
+            PspLoadImageNotifyRoutine[i] = NULL;
+            return STATUS_SUCCESS;
         }
     }
 
-    /* Nothing found to remove */
-    return STATUS_PROCEDURE_NOT_FOUND;
+    /* Nothing found */
+    return STATUS_INVALID_PARAMETER;
 }
 
 /*
@@ -179,31 +118,21 @@ NTAPI
 PsSetLoadImageNotifyRoutine(IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine)
 {
     ULONG i;
-    PEX_CALLBACK_ROUTINE_BLOCK CallBack;
-    PAGED_CODE();
 
-    /* Allocate a callback */
-    CallBack = ExAllocateCallBack((PVOID)NotifyRoutine, NULL);
-    if (!CallBack) return STATUS_INSUFFICIENT_RESOURCES;
-
-    /* Loop callbacks */
+    /* Loop the routines */
     for (i = 0; i < PSP_MAX_LOAD_IMAGE_NOTIFY; i++)
     {
-        /* Add this entry if the slot is empty */
-        if (ExCompareExchangeCallBack(&PspLoadImageNotifyRoutine[i],
-                                      CallBack,
-                                      NULL))
+        /* Find an empty one */
+        if (!PspLoadImageNotifyRoutine[i])
         {
-            /* Return success */
-            InterlockedIncrement((PLONG)&PspLoadImageNotifyRoutineCount);
-            PsImageNotifyEnabled = TRUE;
+            /* Add it */
+            PspLoadImageNotifyRoutine[i] = NotifyRoutine;
             return STATUS_SUCCESS;
         }
     }
 
-    /* No free space found, fail */
-    ExFreeCallBack(CallBack);
-    return STATUS_INSUFFICIENT_RESOURCES;
+    /* Nothing found */
+    return STATUS_INVALID_PARAMETER;
 }
 
 /*
@@ -214,45 +143,21 @@ NTAPI
 PsRemoveCreateThreadNotifyRoutine(IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine)
 {
     ULONG i;
-    PEX_CALLBACK_ROUTINE_BLOCK CallBack;
-    PAGED_CODE();
 
-    /* Loop all callbacks */
-    for (i = 0; i < PSP_MAX_CREATE_THREAD_NOTIFY; i++)
+    /* Loop the routines */
+    for(i = 0; i < PSP_MAX_CREATE_THREAD_NOTIFY; i++)
     {
-        /* Reference this slot */
-        CallBack = ExReferenceCallBackBlock(&PspThreadNotifyRoutine[i]);
-        if (CallBack)
+        /* Check for a match */
+        if (PspThreadNotifyRoutine[i] == NotifyRoutine)
         {
-            /* Check for a match */
-            if (ExGetCallBackBlockRoutine(CallBack) == (PVOID)NotifyRoutine)
-            {
-                /* Try removing it if it matches */
-                if (ExCompareExchangeCallBack(&PspThreadNotifyRoutine[i],
-                                              NULL,
-                                              CallBack))
-                {
-                    /* We removed it, now dereference the block */
-                    InterlockedDecrement((PLONG)&PspThreadNotifyRoutineCount);
-                    ExDereferenceCallBackBlock(&PspThreadNotifyRoutine[i],
-                                               CallBack);
-
-                    /* Wait for active callbacks */
-                    ExWaitForCallBacks(CallBack);
-
-                    /* Free the callback and return */
-                    ExFreeCallBack(CallBack);
-                    return STATUS_SUCCESS;
-                }
-            }
-
-            /* Dereference the callback */
-            ExDereferenceCallBackBlock(&PspThreadNotifyRoutine[i], CallBack);
+            /* Remove and return */
+            PspThreadNotifyRoutine[i] = NULL;
+            return STATUS_SUCCESS;
         }
     }
 
-    /* Nothing found to remove */
-    return STATUS_PROCEDURE_NOT_FOUND;
+    /* Nothing found */
+    return STATUS_INVALID_PARAMETER;
 }
 
 /*
@@ -262,31 +167,16 @@ NTSTATUS
 NTAPI
 PsSetCreateThreadNotifyRoutine(IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine)
 {
-    ULONG i;
-    PEX_CALLBACK_ROUTINE_BLOCK CallBack;
-    PAGED_CODE();
-
-    /* Allocate a callback */
-    CallBack = ExAllocateCallBack((PVOID)NotifyRoutine, NULL);
-    if (!CallBack) return STATUS_INSUFFICIENT_RESOURCES;
-
-    /* Loop callbacks */
-    for (i = 0; i < PSP_MAX_CREATE_THREAD_NOTIFY; i++)
+    /* Make sure we didn't register too many */
+    if (PspThreadNotifyRoutineCount >= PSP_MAX_CREATE_THREAD_NOTIFY)
     {
-        /* Add this entry if the slot is empty */
-        if (ExCompareExchangeCallBack(&PspThreadNotifyRoutine[i],
-                                      CallBack,
-                                      NULL))
-        {
-            /* Return success */
-            InterlockedIncrement((PLONG)&PspThreadNotifyRoutineCount);
-            return STATUS_SUCCESS;
-        }
+        /* Fail */
+        return STATUS_INSUFFICIENT_RESOURCES;
     }
 
-    /* No free space found, fail */
-    ExFreeCallBack(CallBack);
-    return STATUS_INSUFFICIENT_RESOURCES;
+    /* Register this one */
+    PspThreadNotifyRoutine[PspThreadNotifyRoutineCount++] = NotifyRoutine;
+    return STATUS_SUCCESS;
 }
 
 /* EOF */
index c3b9061..e61179d 100644 (file)
@@ -397,6 +397,7 @@ PspCreateProcess(OUT PHANDLE ProcessHandle,
                                            (PVOID*)&Parent,
                                            NULL);
         if (!NT_SUCCESS(Status)) return Status;
+        PSREFTRACE(Parent);
 
         /* If this process should be in a job but the parent isn't */
         if ((InJob) && (!Parent->Job))
@@ -433,6 +434,7 @@ PspCreateProcess(OUT PHANDLE ProcessHandle,
     if (!NT_SUCCESS(Status)) goto Cleanup;
 
     /* Clean up the Object */
+    PSREFTRACE(Process);
     RtlZeroMemory(Process, sizeof(EPROCESS));
 
     /* Initialize pushlock and rundown protection */
@@ -483,15 +485,14 @@ PspCreateProcess(OUT PHANDLE ProcessHandle,
         if (Parent != PsInitialSystemProcess)
         {
             /* It's not, so acquire the process rundown */
-            if (ExAcquireRundownProtection(&Process->RundownProtect))
-            {
-                /* If the parent has a section, use it */
-                SectionObject = Parent->SectionObject;
-                if (SectionObject) ObReferenceObject(SectionObject);
+            ExAcquireRundownProtection(&Process->RundownProtect);
 
-                /* Release process rundown */
-                ExReleaseRundownProtection(&Process->RundownProtect);
-            }
+            /* If the parent has a section, use it */
+            SectionObject = Parent->SectionObject;
+            if (SectionObject) ObReferenceObject(SectionObject);
+
+            /* Release process rundown */
+            ExReleaseRundownProtection(&Process->RundownProtect);
 
             /* If we don't have a section object */
             if (!SectionObject)
@@ -646,25 +647,23 @@ PspCreateProcess(OUT PHANDLE ProcessHandle,
                             AccessState,
                             DesiredAccess,
                             1,
-                            NULL,
+                            (PVOID*)&Process,
                             &hProcess);
 
     /* Free the access state */
     if (AccessState) SeDeleteAccessState(AccessState);
 
     /* Cleanup on failure */
+    PSREFTRACE(Process);
     if (!NT_SUCCESS(Status)) goto Cleanup;
 
     /* Compute Quantum and Priority */
-    ASSERT(IsListEmpty(&Process->ThreadListHead) == TRUE);
-    Process->Pcb.BasePriority =
-        (SCHAR)PspComputeQuantumAndPriority(Process,
-                                            PsProcessPriorityBackground,
-                                            &Quantum);
+    Process->Pcb.BasePriority = (SCHAR)PspComputeQuantumAndPriority(Process,
+                                                                    0,
+                                                                    &Quantum);
     Process->Pcb.QuantumReset = Quantum;
 
     /* Check if we have a parent other then the initial system process */
-    Process->GrantedAccess = PROCESS_TERMINATE;
     if ((Parent) && (Parent != PsInitialSystemProcess))
     {
         /* Get the process's SD */
@@ -684,6 +683,7 @@ PspCreateProcess(OUT PHANDLE ProcessHandle,
         SubjectContext.ClientToken = NULL;
 
         /* Do the access check */
+        if (!SecurityDescriptor) DPRINT1("FIX PS SDs!!\n");
         Result = SeAccessCheck(SecurityDescriptor,
                                &SubjectContext,
                                FALSE,
@@ -712,9 +712,7 @@ PspCreateProcess(OUT PHANDLE ProcessHandle,
                                    PROCESS_CREATE_THREAD |
                                    PROCESS_DUP_HANDLE |
                                    PROCESS_CREATE_PROCESS |
-                                   PROCESS_SET_INFORMATION |
-                                   STANDARD_RIGHTS_ALL |
-                                   PROCESS_SET_QUOTA);
+                                   PROCESS_SET_INFORMATION);
     }
     else
     {
@@ -722,10 +720,14 @@ PspCreateProcess(OUT PHANDLE ProcessHandle,
         Process->GrantedAccess = PROCESS_ALL_ACCESS;
     }
 
+    /* Sanity check */
+    ASSERT(IsListEmpty(&Process->ThreadListHead));
+
     /* Set the Creation Time */
     KeQuerySystemTime(&Process->CreateTime);
 
     /* Protect against bad user-mode pointer */
+    PSREFTRACE(Process);
     _SEH_TRY
     {
         /* Save the process handle */
@@ -751,6 +753,8 @@ Cleanup:
     if (Parent) ObDereferenceObject(Parent);
 
     /* Return status to caller */
+    PSREFTRACE(Process);
+    if (Parent) PSREFTRACE(Parent);
     return Status;
 }
 
@@ -1383,6 +1387,8 @@ NtOpenProcess(OUT PHANDLE ProcessHandle,
 
         /* Dereference the Process */
         ObDereferenceObject(Process);
+        PSREFTRACE(Process);
+        if (Thread) PSREFTRACE(Thread);
     }
     else
     {
index 7567844..41a94f6 100644 (file)
@@ -231,6 +231,7 @@ PsLocateSystemDll(VOID)
         KeBugCheckEx(PROCESS1_INITIALIZATION_FAILED, Status, 4, 0, 0);
     }
 
+
     /* Map it */
     Status = PspMapSystemDll(PsGetCurrentProcess(), &PspSystemDllBase);
     if (!NT_SUCCESS(Status))
@@ -271,7 +272,7 @@ PspInitializeSystemDll(VOID)
 
 BOOLEAN
 NTAPI
-PspInitPhase1()
+PspInitPhase1(VOID)
 {
     /* Initialize the System DLL and return status of operation */
     if (!NT_SUCCESS(PspInitializeSystemDll())) return FALSE;
@@ -280,7 +281,7 @@ PspInitPhase1()
 
 BOOLEAN
 NTAPI
-PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+PspInitPhase0(VOID)
 {
     NTSTATUS Status;
     OBJECT_ATTRIBUTES ObjectAttributes;
@@ -288,8 +289,11 @@ PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     PETHREAD SysThread;
     MM_SYSTEMSIZE SystemSize;
     UNICODE_STRING Name;
-    OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
     ULONG i;
+    OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
+
+    /* FIXME: Initialize Lock Data do it STATIC */
+    ShortPsLockDelay.QuadPart = -100LL;
 
     /* Get the system size */
     SystemSize = MmQuerySystemSize();
@@ -317,23 +321,11 @@ PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
             break;
     }
 
-    /* Setup callbacks */
-    for (i = 0; i < PSP_MAX_CREATE_THREAD_NOTIFY; i++)
-    {
-        ExInitializeCallBack(&PspThreadNotifyRoutine[i]);
-    }
-    for (i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++)
-    {
-        ExInitializeCallBack(&PspProcessNotifyRoutine[i]);
-    }
-    for (i = 0; i < PSP_MAX_LOAD_IMAGE_NOTIFY; i++)
-    {
-        ExInitializeCallBack(&PspLoadImageNotifyRoutine[i]);
-    }
-
     /* Setup the quantum table */
     PsChangeQuantumTable(FALSE, PsRawPrioritySeparation);
 
+    /* Setup callbacks when we implement Generic Callbacks */
+
     /* Set quota settings */
     if (!PspDefaultPagedLimit) PspDefaultPagedLimit = 0;
     if (!PspDefaultNonPagedLimit) PspDefaultNonPagedLimit = 0;
@@ -388,6 +380,12 @@ PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     ObjectTypeInitializer.DeleteProcedure = PspDeleteProcess;
     ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &PsProcessType);
 
+    /* Setup ROS Scheduler lists (HACK!) */
+    for (i = 0; i < MAXIMUM_PRIORITY; i++)
+    {
+        InitializeListHead(&PriorityListHead[i]);
+    }
+
     /*  Initialize the Thread type  */
     RtlInitUnicodeString(&Name, L"Thread");
     ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
@@ -415,7 +413,6 @@ PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
     /* Create the CID Handle table */
     PspCidTable = ExCreateHandleTable(NULL);
-    if (!PspCidTable) return FALSE;
 
     /* FIXME: Initialize LDT/VDM support */
 
@@ -457,29 +454,18 @@ PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     strcpy(PsInitialSystemProcess->ImageFileName, "System");
 
     /* Allocate a structure for the audit name */
-    PsInitialSystemProcess->SeAuditProcessCreationInfo.ImageFileName =
-        ExAllocatePoolWithTag(PagedPool,
-                              sizeof(OBJECT_NAME_INFORMATION),
-                              TAG_SEPA);
-    if (!PsInitialSystemProcess->SeAuditProcessCreationInfo.ImageFileName)
-    {
-        /* Allocation failed */
-        return FALSE;
-    }
-
-    /* Zero it */
-    RtlZeroMemory(PsInitialSystemProcess->
-                  SeAuditProcessCreationInfo.ImageFileName,
-                  sizeof(OBJECT_NAME_INFORMATION));
+    PsIdleProcess->SeAuditProcessCreationInfo.ImageFileName =
+        ExAllocatePoolWithTag(PagedPool, sizeof(UNICODE_STRING), TAG_SEPA);
+    if (!PsIdleProcess->SeAuditProcessCreationInfo.ImageFileName) KEBUGCHECK(0);
 
-    /* Setup the system initialization thread */
+    /* Setup the system initailization thread */
     Status = PsCreateSystemThread(&SysThreadHandle,
                                   THREAD_ALL_ACCESS,
                                   &ObjectAttributes,
                                   0,
                                   NULL,
-                                  Phase1Initialization,
-                                  LoaderBlock);
+                                  ExPhase2Init,
+                                  NULL);
     if (!NT_SUCCESS(Status)) return FALSE;
 
     /* Create a handle to it */
@@ -497,7 +483,7 @@ PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
 BOOLEAN
 NTAPI
-PsInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+PsInitSystem(VOID)
 {
     /* Check the initialization phase */
     switch (ExpInitializationPhase)
@@ -505,7 +491,7 @@ PsInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     case 0:
 
         /* Do Phase 0 */
-        return PspInitPhase0(LoaderBlock);
+        return PspInitPhase0();
 
     case 1:
 
@@ -515,11 +501,7 @@ PsInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     default:
 
         /* Don't know any other phase! Bugcheck! */
-        KeBugCheckEx(UNEXPECTED_INITIALIZATION_CALL,
-                     1,
-                     ExpInitializationPhase,
-                     0,
-                     0);
+        KeBugCheck(UNEXPECTED_INITIALIZATION_CALL);
         return FALSE;
     }
 }
index fd347bf..0c579fb 100644 (file)
@@ -63,7 +63,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
 {
     PEPROCESS Process;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
-    NTSTATUS Status = STATUS_SUCCESS;
+    NTSTATUS Status;
     ULONG Length = 0;
     PPROCESS_BASIC_INFORMATION ProcessBasicInfo =
         (PPROCESS_BASIC_INFORMATION)ProcessInformation;
@@ -78,7 +78,6 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
     PAGED_CODE();
 
     /* Check validity of Information Class */
-#if 0
     Status = DefaultQueryInfoBufferCheck(ProcessInformationClass,
                                          PsProcessInfoClass,
                                          RTL_NUMBER_OF(PsProcessInfoClass),
@@ -87,7 +86,6 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
                                          ReturnLength,
                                          PreviousMode);
     if (!NT_SUCCESS(Status)) return Status;
-#endif
 
     /* Check if this isn't the cookie class */
     if(ProcessInformationClass != ProcessCookie)
@@ -492,7 +490,6 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
     PAGED_CODE();
 
     /* Verify Information Class validity */
-#if 0
     Status = DefaultSetInfoBufferCheck(ProcessInformationClass,
                                        PsProcessInfoClass,
                                        RTL_NUMBER_OF(PsProcessInfoClass),
@@ -500,7 +497,6 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
                                        ProcessInformationLength,
                                        PreviousMode);
     if (!NT_SUCCESS(Status)) return Status;
-#endif
 
     /* Check what class this is */
     Access = PROCESS_SET_INFORMATION;
@@ -722,18 +718,12 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
     NTSTATUS Status;
     HANDLE TokenHandle = NULL;
     KPRIORITY Priority = 0;
-    KAFFINITY Affinity = 0, CombinedAffinity;
+    KAFFINITY Affinity = 0;
     PVOID Address = NULL;
     PEPROCESS Process;
-    ULONG DisableBoost = 0;
-    ULONG IdealProcessor = 0;
-    PTEB Teb;
-    ULONG TlsIndex = 0;
-    PVOID *ExpansionSlots;
     PAGED_CODE();
 
     /* Verify Information Class validity */
-#if 0
     Status = DefaultSetInfoBufferCheck(ThreadInformationClass,
                                        PsThreadInfoClass,
                                        RTL_NUMBER_OF(PsThreadInfoClass),
@@ -741,7 +731,6 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
                                        ThreadInformationLength,
                                        PreviousMode);
     if (!NT_SUCCESS(Status)) return Status;
-#endif
 
     /* Check what class this is */
     Access = THREAD_SET_INFORMATION;
@@ -780,15 +769,6 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
             _SEH_END;
             if (!NT_SUCCESS(Status)) break;
 
-            /* Validate it */
-            if ((Priority > HIGH_PRIORITY) ||
-                (Priority <= LOW_PRIORITY))
-            {
-                /* Fail */
-                Status = STATUS_INVALID_PARAMETER;
-                break;
-            }
-
             /* Set the priority */
             KeSetPriorityThread(&Thread->Tcb, Priority);
             break;
@@ -809,25 +789,6 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
             _SEH_END;
             if (!NT_SUCCESS(Status)) break;
 
-            /* Validate it */
-            if ((Priority > THREAD_BASE_PRIORITY_MAX) ||
-                (Priority < THREAD_BASE_PRIORITY_MIN))
-            {
-                /* These ones are OK */
-                if ((Priority != THREAD_BASE_PRIORITY_LOWRT + 1) ||
-                    (Priority != THREAD_BASE_PRIORITY_IDLE - 1))
-                {
-                    /* Check if the process is real time */
-                    if (PsGetCurrentProcess()->PriorityClass !=
-                        PROCESS_PRIORITY_CLASS_REALTIME)
-                    {
-                        /* It isn't, fail */
-                        Status = STATUS_INVALID_PARAMETER;
-                        break;
-                    }
-                }
-            }
-
             /* Set the base priority */
             KeSetBasePriorityThread(&Thread->Tcb, Priority);
             break;
@@ -848,48 +809,11 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
             _SEH_END;
             if (!NT_SUCCESS(Status)) break;
 
-            /* Validate it */
-            if (!Affinity)
-            {
-                /* Fail */
-                Status = STATUS_INVALID_PARAMETER;
-                break;
-            }
-
             /* Get the process */
             Process = Thread->ThreadsProcess;
 
-            /* Try to acquire rundown */
-            if (ExAcquireRundownProtection(&Process->RundownProtect))
-            {
-                /* Lock it */
-                KeEnterCriticalRegion();
-                ExAcquirePushLockShared(&Process->ProcessLock);
-
-                /* Combine masks */
-                CombinedAffinity = Affinity & Process->Pcb.Affinity;
-                if (CombinedAffinity != Affinity)
-                {
-                    /* Fail */
-                    Status = STATUS_INVALID_PARAMETER;
-                }
-                else
-                {
-                    /* Set the affinity */
-                    KeSetAffinityThread(&Thread->Tcb, CombinedAffinity);
-                }
-
-                /* Release the lock and rundown */
-                ExReleasePushLockShared(&Process->ProcessLock);
-                KeLeaveCriticalRegion();
-            }
-            else
-            {
-                /* Too late */
-                Status = STATUS_PROCESS_IS_TERMINATING;
-            }
-
-            /* Return status */
+            /* Set the affinity */
+            KeSetAffinityThread(&Thread->Tcb, Affinity & Process->Pcb.Affinity);
             break;
 
         case ThreadImpersonationToken:
@@ -932,138 +856,6 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
             Thread->Win32StartAddress = Address;
             break;
 
-        case ThreadIdealProcessor:
-
-            /* Use SEH for capture */
-            _SEH_TRY
-            {
-                /* Get the priority */
-                IdealProcessor = *(PULONG_PTR)ThreadInformation;
-            }
-            _SEH_HANDLE
-            {
-                /* Get the exception code */
-                Status = _SEH_GetExceptionCode();
-            }
-            _SEH_END;
-            if (!NT_SUCCESS(Status)) break;
-
-            /* Validate it */
-            if (IdealProcessor > MAXIMUM_PROCESSORS)
-            {
-                /* Fail */
-                Status = STATUS_INVALID_PARAMETER;
-                break;
-            }
-
-            /* Set the ideal */
-            Status = KeSetIdealProcessorThread(&Thread->Tcb,
-                                               (CCHAR)IdealProcessor);
-
-            /* Get the TEB and protect the thread */
-            Teb = Thread->Tcb.Teb;
-            if ((Teb) && (ExAcquireRundownProtection(&Thread->RundownProtect)))
-            {
-                /* Save the ideal processor */
-                Teb->IdealProcessor = Thread->Tcb.IdealProcessor;
-
-                /* Release rundown protection */
-                ExReleaseRundownProtection(&Thread->RundownProtect);
-            }
-
-            break;
-
-        case ThreadPriorityBoost:
-
-            /* Use SEH for capture */
-            _SEH_TRY
-            {
-                /* Get the priority */
-                DisableBoost = *(PULONG_PTR)ThreadInformation;
-            }
-            _SEH_HANDLE
-            {
-                /* Get the exception code */
-                Status = _SEH_GetExceptionCode();
-            }
-            _SEH_END;
-            if (!NT_SUCCESS(Status)) break;
-
-            /* Call the kernel */
-            KeSetDisableBoostThread(&Thread->Tcb, (BOOLEAN)DisableBoost);
-            break;
-
-        case ThreadZeroTlsCell:
-
-            /* Use SEH for capture */
-            _SEH_TRY
-            {
-                /* Get the priority */
-                TlsIndex = *(PULONG_PTR)ThreadInformation;
-            }
-            _SEH_HANDLE
-            {
-                /* Get the exception code */
-                Status = _SEH_GetExceptionCode();
-            }
-            _SEH_END;
-            if (!NT_SUCCESS(Status)) break;
-
-            /* This is only valid for the current thread */
-            if (Thread != PsGetCurrentThread())
-            {
-                /* Fail */
-                Status = STATUS_INVALID_PARAMETER;
-                break;
-            }
-
-            /* Get the process */
-            Process = Thread->ThreadsProcess;
-
-            /* Loop the threads */
-            Thread = PsGetNextProcessThread(Process, NULL);
-            while (Thread)
-            {
-                /* Acquire rundown */
-                if (ExAcquireRundownProtection(&Thread->RundownProtect))
-                {
-                    /* Get the TEB */
-                    Teb = Thread->Tcb.Teb;
-                    if (Teb)
-                    {
-                        /* Check if we're in the expansion range */
-                        if (TlsIndex > TLS_MINIMUM_AVAILABLE - 1)
-                        {
-                            if (TlsIndex < (TLS_MINIMUM_AVAILABLE +
-                                            TLS_EXPANSION_SLOTS) - 1)
-                            {
-                                /* Check if we have expansion slots */
-                                ExpansionSlots = Teb->TlsExpansionSlots;
-                                if (ExpansionSlots)
-                                {
-                                    /* Clear the index */
-                                    ExpansionSlots[TlsIndex - TLS_MINIMUM_AVAILABLE] = 0;
-                                }
-                            }
-                        }
-                        else
-                        {
-                            /* Clear the index */
-                            Teb->TlsSlots[TlsIndex] = NULL;
-                        }
-                    }
-
-                    /* Release rundown */
-                    ExReleaseRundownProtection(&Thread->RundownProtect);
-                }
-
-                /* Go to the next thread */
-                Thread = PsGetNextProcessThread(Process, Thread);
-            }
-
-            /* All done */
-            break;
-
         default:
             /* We don't implement it yet */
             DPRINT1("Not implemented: %lx\n", ThreadInformationClass);
@@ -1098,7 +890,6 @@ NtQueryInformationThread(IN HANDLE ThreadHandle,
     PAGED_CODE();
 
     /* Verify Information Class validity */
-#if 0
     Status = DefaultQueryInfoBufferCheck(ThreadInformationClass,
                                          PsThreadInfoClass,
                                          RTL_NUMBER_OF(PsThreadInfoClass),
@@ -1107,7 +898,6 @@ NtQueryInformationThread(IN HANDLE ThreadHandle,
                                          ReturnLength,
                                          PreviousMode);
     if (!NT_SUCCESS(Status)) return Status;
-#endif
 
     /* Check what class this is */
     Access = THREAD_QUERY_INFORMATION;
index 12b4cf1..de5363e 100644 (file)
@@ -45,7 +45,6 @@ VOID
 NTAPI
 PspDeleteThreadSecurity(IN PETHREAD Thread)
 {
-    PPS_IMPERSONATION_INFORMATION ImpersonationInfo = Thread->ImpersonationInfo;
     PAGED_CODE();
     PSTRACE(PS_SECURITY_DEBUG, "Thread: %p\n", Thread);
 
@@ -53,14 +52,14 @@ PspDeleteThreadSecurity(IN PETHREAD Thread)
     if (Thread->ActiveImpersonationInfo)
     {
         /* Dereference its token */
-        ObDereferenceObject(ImpersonationInfo->Token);
+        ObDereferenceObject(Thread->ImpersonationInfo->Token);
     }
 
     /* Check if we have impersonation info */
-    if (ImpersonationInfo)
+    if (Thread->ImpersonationInfo)
     {
         /* Free it */
-        ExFreePool(ImpersonationInfo);
+        ExFreePool(Thread->ImpersonationInfo);
         PspClearCrossThreadFlag(Thread, CT_ACTIVE_IMPERSONATION_INFO_BIT);
         Thread->ImpersonationInfo = NULL;
     }
@@ -92,11 +91,7 @@ PspInitializeProcessSecurity(IN PEPROCESS Process,
         ObFastDereferenceObject(&Parent->Token, ParentToken);
 
         /* Set the new Token */
-        if (NT_SUCCESS(Status))
-        {
-            /* Initailize the fast reference */
-            ObInitializeFastReference(&Process->Token, NewToken);
-        }
+        ObInitializeFastReference(&Process->Token, NewToken);
     }
     else
     {
@@ -138,24 +133,26 @@ PspWriteTebImpersonationInfo(IN PETHREAD Thread,
             Attached = TRUE;
         }
 
-        /* Check if we're in a different thread or acquire rundown */
-        if ((Thread == CurrentThread) ||
-            (ExAcquireRundownProtection(&Thread->RundownProtect)))
+        /* Check if we're in a different thread */
+        if (Thread != CurrentThread)
         {
-            /* Check if the thread is impersonating */
-            IsImpersonating = (BOOLEAN)Thread->ActiveImpersonationInfo;
-            if (IsImpersonating)
-            {
-                /* Set TEB data */
-                Teb->ImpersonationLocale = -1;
-                Teb->IsImpersonating = 1;
-            }
-            else
-            {
-                /* Set TEB data */
-                Teb->ImpersonationLocale = 0;
-                Teb->IsImpersonating = 0;
-            }
+            /* Acquire thread rundown protection */
+            ExAcquireRundownProtection(&Thread->RundownProtect);
+        }
+
+        /* Check if the thread is impersonating */
+        IsImpersonating = (BOOLEAN)Thread->ActiveImpersonationInfo;
+        if (IsImpersonating)
+        {
+            /* Set TEB data */
+            Teb->ImpersonationLocale = -1;
+            Teb->IsImpersonating = 1;
+        }
+        else
+        {
+            /* Set TEB data */
+            Teb->ImpersonationLocale = 0;
+            Teb->IsImpersonating = 0;
         }
 
         /* Check if we're in a different thread */
@@ -165,7 +162,7 @@ PspWriteTebImpersonationInfo(IN PETHREAD Thread,
             ExReleaseRundownProtection(&Thread->RundownProtect);
         }
 
-        /* Detach */
+        /* Dettach */
         if (Attached) KeUnstackDetachProcess(&ApcState);
     }
 
@@ -173,40 +170,29 @@ PspWriteTebImpersonationInfo(IN PETHREAD Thread,
     return STATUS_SUCCESS;
 }
 
+
 NTSTATUS
 NTAPI
 PspAssignPrimaryToken(IN PEPROCESS Process,
-                      IN HANDLE Token,
-                      IN PACCESS_TOKEN AccessToken OPTIONAL)
+                      IN PTOKEN Token)
 {
-    PACCESS_TOKEN NewToken = AccessToken, OldToken;
+    PACCESS_TOKEN OldToken;
     NTSTATUS Status;
     PAGED_CODE();
     PSTRACE(PS_SECURITY_DEBUG, "Process: %p Token: %p\n", Process, Token);
 
-    /* Check if we don't have a pointer */
-    if (!AccessToken)
-    {
-        /* Reference it from the handle */
-        Status = ObReferenceObjectByHandle(Token,
-                                           TOKEN_ASSIGN_PRIMARY,
-                                           SepTokenObjectType,
-                                           ExGetPreviousMode(),
-                                           &NewToken,
-                                           NULL);
-        if (!NT_SUCCESS(Status)) return Status;
-    }
+    /* Lock the process */
+    PspLockProcessSecurityExclusive(Process);
 
-    /* Exchange tokens */
-    Status = SeExchangePrimaryToken(Process, NewToken, &OldToken);
+    /* Exchange them */
+    Status = SeExchangePrimaryToken(Process, Token, &OldToken);
 
-    /* Acquire and release the lock */
-    PspLockProcessSecurityExclusive(Process);
+    /* Release the lock */
     PspUnlockProcessSecurityExclusive(Process);
 
     /* Dereference Tokens and Return */
     if (NT_SUCCESS(Status)) ObDereferenceObject(OldToken);
-    if (AccessToken) ObDereferenceObject(NewToken);
+    ObDereferenceObject(Token);
     return Status;
 }
 
@@ -214,11 +200,10 @@ NTSTATUS
 NTAPI
 PspSetPrimaryToken(IN PEPROCESS Process,
                    IN HANDLE TokenHandle OPTIONAL,
-                   IN PACCESS_TOKEN Token OPTIONAL)
+                   IN PTOKEN Token OPTIONAL)
 {
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     BOOLEAN IsChild;
-    PACCESS_TOKEN NewToken = Token;
     NTSTATUS Status, AccessStatus;
     BOOLEAN Result, SdAllocated;
     PSECURITY_DESCRIPTOR SecurityDescriptor;
@@ -233,17 +218,17 @@ PspSetPrimaryToken(IN PEPROCESS Process,
                                            TOKEN_ASSIGN_PRIMARY,
                                            SepTokenObjectType,
                                            PreviousMode,
-                                           (PVOID*)&NewToken,
+                                           (PVOID*)&Token,
                                            NULL);
         if (!NT_SUCCESS(Status)) return Status;
     }
 
     /* Check if this is a child */
-    Status = SeIsTokenChild(NewToken, &IsChild);
+    Status = SeIsTokenChild(Token, &IsChild);
     if (!NT_SUCCESS(Status))
     {
         /* Failed, dereference */
-        if (TokenHandle) ObDereferenceObject(NewToken);
+        if (TokenHandle) ObDereferenceObject(Token);
         return Status;
     }
 
@@ -261,7 +246,7 @@ PspSetPrimaryToken(IN PEPROCESS Process,
     }
 
     /* Assign the token */
-    Status = PspAssignPrimaryToken(Process, NULL, NewToken);
+    Status = PspAssignPrimaryToken(Process, Token);
     if (NT_SUCCESS(Status))
     {
         /*
@@ -279,6 +264,7 @@ PspSetPrimaryToken(IN PEPROCESS Process,
             SubjectContext.ClientToken = NULL;
 
             /* Do the access check */
+            if (!SecurityDescriptor) DPRINT1("FIX PS SDs!!\n");
             Result = SeAccessCheck(SecurityDescriptor,
                                    &SubjectContext,
                                    FALSE,
@@ -297,19 +283,6 @@ PspSetPrimaryToken(IN PEPROCESS Process,
 
             /* Remove access if it failed */
             if (!Result) Process->GrantedAccess = 0;
-
-            /* Setup granted access */
-            Process->GrantedAccess |= (PROCESS_VM_OPERATION |
-                                       PROCESS_VM_READ |
-                                       PROCESS_VM_WRITE |
-                                       PROCESS_QUERY_INFORMATION |
-                                       PROCESS_TERMINATE |
-                                       PROCESS_CREATE_THREAD |
-                                       PROCESS_DUP_HANDLE |
-                                       PROCESS_CREATE_PROCESS |
-                                       PROCESS_SET_INFORMATION |
-                                       STANDARD_RIGHTS_ALL |
-                                       PROCESS_SET_QUOTA);
         }
 
         /* Dereference the process */
@@ -317,7 +290,7 @@ PspSetPrimaryToken(IN PEPROCESS Process,
     }
 
     /* Dereference the token */
-    if (Token) ObDereferenceObject(NewToken);
+    if (TokenHandle) ObDereferenceObject(Token);
     return Status;
 }
 
@@ -379,7 +352,7 @@ NtOpenProcessTokenEx(IN HANDLE ProcessHandle,
 
     /* Open the process token */
     Status = PsOpenTokenOfProcess(ProcessHandle, &Token);
-    if (NT_SUCCESS(Status))
+    if(NT_SUCCESS(Status))
     {
         /* Reference it by handle and dereference the pointer */
         Status = ObOpenObjectByPointer(Token,
@@ -392,7 +365,7 @@ NtOpenProcessTokenEx(IN HANDLE ProcessHandle,
         ObDereferenceObject(Token);
 
         /* Make sure we got a handle */
-        if (NT_SUCCESS(Status))
+        if(NT_SUCCESS(Status))
         {
             /* Enter SEH for write */
             _SEH_TRY
@@ -514,7 +487,10 @@ PsAssignImpersonationToken(IN PETHREAD Thread,
         return STATUS_BAD_TOKEN_TYPE;
     }
 
-    /* Get the impersonation level */
+    /* Check if this is a job, which we don't support yet */
+    if (Thread->ThreadsProcess->Job) KEBUGCHECK(0);
+
+    /* Get the impersionation level */
     ImpersonationLevel = SeTokenImpersonationLevel(Token);
 
     /* Call the impersonation API */
@@ -525,7 +501,7 @@ PsAssignImpersonationToken(IN PETHREAD Thread,
                                  ImpersonationLevel);
 
     /* Dereference the token and return status */
-    ObDereferenceObject(Token);
+    if (Token) ObDereferenceObject(Token);
     return Status;
 }
 
@@ -570,17 +546,13 @@ PsRevertThreadToSelf(IN PETHREAD Thread)
 
         /* Release thread security */
         PspUnlockThreadSecurityExclusive(Thread);
+    }
 
-        /* Check if we had a token */
-        if (Token)
-        {
-            /* Dereference the impersonation token */
-            ObDereferenceObject(Token);
+    /* Dereference the impersonation token */
+    if (Token) ObDereferenceObject(Token);
 
-            /* Write impersonation info to the TEB */
-            PspWriteTebImpersonationInfo(Thread, PsGetCurrentThread());
-        }
-    }
+    /* Write impersonation info to the TEB */
+    PspWriteTebImpersonationInfo(Thread, PsGetCurrentThread());
 }
 
 /*
@@ -594,7 +566,7 @@ PsImpersonateClient(IN PETHREAD Thread,
                     IN BOOLEAN EffectiveOnly,
                     IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel)
 {
-    PPS_IMPERSONATION_INFORMATION Impersonation, OldData;
+    PPS_IMPERSONATION_INFORMATION Impersonation;
     PTOKEN OldToken = NULL;
     PAGED_CODE();
     PSTRACE(PS_SECURITY_DEBUG, "Thread: %p, Token: %p\n", Thread, Token);
@@ -619,9 +591,8 @@ PsImpersonateClient(IN PETHREAD Thread,
                 OldToken = Thread->ImpersonationInfo->Token;
             }
 
-            /* Unlock the process and write TEB information */
+            /* Unlock the process */
             PspUnlockThreadSecurityExclusive(Thread);
-            PspWriteTebImpersonationInfo(Thread, PsGetCurrentThread());
         }
     }
     else
@@ -637,15 +608,12 @@ PsImpersonateClient(IN PETHREAD Thread,
             if (!Impersonation) return STATUS_INSUFFICIENT_RESOURCES;
 
             /* Update the pointer */
-            OldData = InterlockedCompareExchangePointer(&Thread->
-                                                        ImpersonationInfo,
-                                                        Impersonation,
-                                                        NULL);
-            if (OldData)
+            if (InterlockedCompareExchangePointer(&Thread->ImpersonationInfo,
+                                                  Impersonation,
+                                                  NULL))
             {
                 /* Someone beat us to it, free our copy */
                 ExFreePool(Impersonation);
-                Impersonation = OldData;
             }
         }
 
@@ -676,13 +644,13 @@ PsImpersonateClient(IN PETHREAD Thread,
 
         /* Unlock the thread */
         PspUnlockThreadSecurityExclusive(Thread);
-
-        /* Write impersonation info to the TEB */
-        PspWriteTebImpersonationInfo(Thread, PsGetCurrentThread());
     }
 
+    /* Write impersonation info to the TEB */
+    PspWriteTebImpersonationInfo(Thread, PsGetCurrentThread());
+
     /* Dereference the token and return success */
-    if (OldToken) PsDereferenceImpersonationToken(OldToken);
+    if (OldToken) ObDereferenceObject(OldToken);
     return STATUS_SUCCESS;
 }
 
@@ -706,6 +674,9 @@ PsReferenceEffectiveToken(IN PETHREAD Thread,
     Process = Thread->ThreadsProcess;
     if (!Thread->ActiveImpersonationInfo)
     {
+        *TokenType = TokenPrimary;
+        *EffectiveOnly = FALSE;
+
         /* Fast Reference the Token */
         Token = ObFastReferenceObject(&Process->Token);
 
@@ -738,10 +709,6 @@ PsReferenceEffectiveToken(IN PETHREAD Thread,
             *TokenType = TokenImpersonation;
             *EffectiveOnly = Thread->ImpersonationInfo->EffectiveOnly;
             *Level = Thread->ImpersonationInfo->ImpersonationLevel;
-
-            /* Unlock the Process */
-            PspUnlockProcessSecurityShared(Process);
-            return Token;
         }
 
         /* Unlock the Process */
@@ -749,8 +716,6 @@ PsReferenceEffectiveToken(IN PETHREAD Thread,
     }
 
     /* Return the token */
-    *TokenType = TokenPrimary;
-    *EffectiveOnly = FALSE;
     return Token;
 }
 
index 4814b52..c8ac1fc 100644 (file)
@@ -51,8 +51,9 @@ PspUserThreadStartup(IN PKSTART_ROUTINE StartRoutine,
         Teb->IdealProcessor = Thread->Tcb.IdealProcessor;
     }
 
-    /* Check if this is a dead thread, or if we're hiding */
-    if (!(Thread->DeadThread) && !(Thread->HideFromDebugger))
+    /* Check if this is a system thread, or if we're hiding */
+    PSREFTRACE(Thread);
+    if (!(Thread->SystemThread) && !(Thread->HideFromDebugger))
     {
         /* We're not, so notify the debugger */
         DbgkCreateThread(StartContext);
@@ -112,30 +113,6 @@ PspUserThreadStartup(IN PKSTART_ROUTINE StartRoutine,
     }
 }
 
-_SEH_FILTER(PspUnhandledExceptionInSystemThread)
-{
-    PEXCEPTION_POINTERS ExceptionPointers= _SEH_GetExceptionPointers();
-
-    /* Print debugging information */
-    DPRINT1("PS: Unhandled Kernel Mode Exception Pointers = 0x%p\n",
-            ExceptionPointers);
-    DPRINT1("Code %x Addr %p Info0 %p Info1 %p Info2 %p Info3 %p\n",
-            ExceptionPointers->ExceptionRecord->ExceptionCode,
-            ExceptionPointers->ExceptionRecord->ExceptionAddress,
-            ExceptionPointers->ExceptionRecord->ExceptionInformation[0],
-            ExceptionPointers->ExceptionRecord->ExceptionInformation[1],
-            ExceptionPointers->ExceptionRecord->ExceptionInformation[2],
-            ExceptionPointers->ExceptionRecord->ExceptionInformation[3]);
-
-    /* Bugcheck the system */
-    KeBugCheckEx(0x7E,
-                 ExceptionPointers->ExceptionRecord->ExceptionCode,
-                 (ULONG_PTR)ExceptionPointers->ExceptionRecord->ExceptionAddress,
-                 (ULONG_PTR)ExceptionPointers->ExceptionRecord,
-                 (ULONG_PTR)ExceptionPointers->ContextRecord);
-    return 0;
-}
-
 VOID
 NTAPI
 PspSystemThreadStartup(IN PKSTART_ROUTINE StartRoutine,
@@ -150,20 +127,12 @@ PspSystemThreadStartup(IN PKSTART_ROUTINE StartRoutine,
     Thread = PsGetCurrentThread();
 
     /* Make sure the thread isn't gone */
-    _SEH_TRY
-    {
-        if (!(Thread->Terminated) && !(Thread->DeadThread))
-        {
-            /* Call it the Start Routine */
-            StartRoutine(StartContext);
-        }
-    }
-    _SEH_EXCEPT(PspUnhandledExceptionInSystemThread)
+    PSREFTRACE(Thread);
+    if (!(Thread->Terminated) && !(Thread->DeadThread))
     {
-        /* Bugcheck if we got here */
-        KeBugCheck(KMODE_EXCEPTION_NOT_HANDLED);
+        /* Call it the Start Routine */
+        StartRoutine(StartContext);
     }
-    _SEH_END;
 
     /* Exit the thread */
     PspTerminateThreadByPointer(Thread, STATUS_SUCCESS, TRUE);
@@ -223,6 +192,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
         {
             /* Reference the Process by Pointer */
             ObReferenceObject(TargetProcess);
+            PSREFTRACE(TargetProcess);
             Process = TargetProcess;
             Status = STATUS_SUCCESS;
         }
@@ -262,6 +232,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
     }
 
     /* Zero the Object entirely */
+    PSREFTRACE(Thread);
     RtlZeroMemory(Thread, sizeof(ETHREAD));
 
     /* Initialize rundown protection */
@@ -299,12 +270,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
     KeInitializeSpinLock(&Thread->ActiveTimerListLock);
 
     /* Acquire rundown protection */
-    if (!ExAcquireRundownProtection (&Process->RundownProtect))
-    {
-        /* Fail */
-        ObDereferenceObject(Thread);
-        return STATUS_PROCESS_IS_TERMINATING;
-    }
+    ExAcquireRundownProtection(&Process->RundownProtect);
 
     /* Now let the kernel initialize the context */
     if (ThreadContext)
@@ -351,6 +317,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
     }
 
     /* Check if we failed */
+    PSREFTRACE(Thread);
     if (!NT_SUCCESS(Status))
     {
         /* Delete the TEB if we had done */
@@ -433,7 +400,6 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
 
         /* Dereference completely to kill it */
         ObDereferenceObjectEx(Thread, 2);
-        return Status;
     }
 
     /* Insert the Thread into the Object Manager */
@@ -445,6 +411,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
                             &hThread);
 
     /* Delete the access state if we had one */
+    PSREFTRACE(Thread);
     if (AccessState) SeDeleteAccessState(AccessState);
 
     /* Check for success */
@@ -494,6 +461,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
     ASSERT(!(Thread->CreateTime.HighPart & 0xF0000000));
 
     /* Make sure the thread isn't dead */
+    PSREFTRACE(Thread);
     if (!Thread->DeadThread)
     {
         /* Get the thread's SD */
@@ -525,6 +493,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
         SubjectContext.ClientToken = NULL;
 
         /* Do the access check */
+        if (!SecurityDescriptor) DPRINT1("FIX PS SDs!!\n");
         Result = SeAccessCheck(SecurityDescriptor,
                                &SubjectContext,
                                FALSE,
@@ -556,12 +525,14 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
     }
 
     /* Dispatch thread */
+    PSREFTRACE(Thread);
     KeReadyThread(&Thread->Tcb);
 
     /* Dereference it, leaving only the keep-alive */
     ObDereferenceObject(Thread);
 
     /* Return */
+    PSREFTRACE(Thread);
     return Status;
 
     /* Most annoying failure case ever, where we undo almost all manually */
@@ -570,6 +541,7 @@ Quickie:
     ExReleasePushLockExclusive(&Process->ProcessLock);
 
     /* Uninitailize it */
+    PSREFTRACE(Thread);
     KeUninitThread(&Thread->Tcb);
 
     /* If we had a TEB, delete it */
@@ -580,6 +552,7 @@ Quickie:
 
     /* Dereference the thread and return failure */
     ObDereferenceObject(Thread);
+    PSREFTRACE(Thread);
     return STATUS_PROCESS_IS_TERMINATING;
 }
 
@@ -868,7 +841,7 @@ NtCreateThread(OUT PHANDLE ThreadHandle,
             "ProcessHandle: %p Context: %p\n", ProcessHandle, ThreadContext);
 
     /* Check if this was from user-mode */
-    if (KeGetPreviousMode() != KernelMode)
+    if(KeGetPreviousMode() != KernelMode)
     {
         /* Make sure that we got a context */
         if (!ThreadContext) return STATUS_INVALID_PARAMETER;
@@ -892,12 +865,14 @@ NtCreateThread(OUT PHANDLE ThreadHandle,
             /* Check the Initial TEB */
             ProbeForRead(InitialTeb, sizeof(INITIAL_TEB), sizeof(ULONG));
             SafeInitialTeb = *InitialTeb;
-        }
+            }
         _SEH_HANDLE
         {
             Status = _SEH_GetExceptionCode();
         }
         _SEH_END;
+
+        /* Handle any failures in our SEH checks */
         if (!NT_SUCCESS(Status)) return Status;
     }
     else
index 5f8a461..78f3692 100644 (file)
@@ -259,7 +259,7 @@ RtlpDestroyAtomHandleTable(PRTL_ATOM_TABLE AtomTable)
       ExSweepHandleTable(AtomTable->ExHandleTable,
                          NULL,
                          NULL);
-      ExDestroyHandleTable(AtomTable->ExHandleTable, NULL);
+      ExDestroyHandleTable(AtomTable->ExHandleTable);
       AtomTable->ExHandleTable = NULL;
    }
 }
@@ -308,8 +308,7 @@ VOID
 RtlpFreeAtomHandle(PRTL_ATOM_TABLE AtomTable, PRTL_ATOM_TABLE_ENTRY Entry)
 {
    ExDestroyHandle(AtomTable->ExHandleTable,
-                   (HANDLE)((ULONG_PTR)Entry->HandleIndex << 2),
-                   NULL);
+                   (HANDLE)((ULONG_PTR)Entry->HandleIndex << 2));
 }
 
 BOOLEAN
@@ -337,8 +336,7 @@ RtlpCreateAtomHandle(PRTL_ATOM_TABLE AtomTable, PRTL_ATOM_TABLE_ENTRY Entry)
       }
       else
          ExDestroyHandle(AtomTable->ExHandleTable,
-                         Handle,
-                         NULL);
+                         Handle);
    }
    
    return FALSE;
index 0e8267a..fcbb210 100644 (file)
@@ -20,95 +20,58 @@ PSE_EXPORTS SeExports = NULL;
 SE_EXPORTS SepExports;
 
 static ERESOURCE SepSubjectContextLock;
-extern ULONG ExpInitializationPhase;
 
 
 /* PROTOTYPES ***************************************************************/
 
 static BOOLEAN SepInitExports(VOID);
 
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, SeInit)
+#pragma alloc_text(INIT, SepInitExports)
+#endif
+
 /* FUNCTIONS ****************************************************************/
 
-BOOLEAN
+BOOLEAN 
+INIT_FUNCTION
 NTAPI
-SepInitializationPhase0(VOID)
+SeInit(VOID)
 {
     DPRINT1("FIXME: SeAccessCheck has been HACKED to always grant access!\n");
     DPRINT1("FIXME: Please fix all the code that doesn't get proper rights!\n");
 
-    SepInitLuid();
-    if (!SepInitSecurityIDs()) return FALSE;
-    if (!SepInitDACLs()) return FALSE;
-    if (!SepInitSDs()) return FALSE;
-    SepInitPrivileges();
-    if (!SepInitExports()) return FALSE;
-
-    /* Initialize the subject context lock */
-    ExInitializeResource(&SepSubjectContextLock);
-
-    /* Initialize token objects */
-    SepInitializeTokenImplementation();
-
-    /* Clear impersonation info for the idle thread */
-    PsGetCurrentThread()->ImpersonationInfo = NULL;
-    PspClearCrossThreadFlag(PsGetCurrentThread(),
-                            CT_ACTIVE_IMPERSONATION_INFO_BIT);
-
-    /* Initialize the boot token */
-    ObInitializeFastReference(&PsGetCurrentProcess()->Token, NULL);
-    ObInitializeFastReference(&PsGetCurrentProcess()->Token,
-                              SepCreateSystemProcessToken());
-    return TRUE;
-}
+  SepInitLuid();
 
-BOOLEAN
-NTAPI
-SepInitializationPhase1(VOID)
-{
-    NTSTATUS Status;
-    PAGED_CODE();
+  if (!SepInitSecurityIDs())
+    return FALSE;
 
-    /* Insert the system token into the tree */
-    Status = ObInsertObject((PVOID)(PsGetCurrentProcess()->Token.Value &
-                                    ~MAX_FAST_REFS),
-                            NULL,
-                            0,
-                            0,
-                            NULL,
-                            NULL);
-    ASSERT(NT_SUCCESS(Status));
-
-    /* FIXME: TODO \\ Security directory */
-    return TRUE;
-}
+  if (!SepInitDACLs())
+    return FALSE;
 
-BOOLEAN
-NTAPI
-SeInit(VOID)
-{
-    /* Check the initialization phase */
-    switch (ExpInitializationPhase)
-    {
-    case 0:
+  if (!SepInitSDs())
+    return FALSE;
 
-        /* Do Phase 0 */
-        return SepInitializationPhase0();
+  SepInitPrivileges();
 
-    case 1:
+  if (!SepInitExports())
+    return FALSE;
 
-        /* Do Phase 1 */
-        return SepInitializationPhase1();
+  /* Initialize the subject context lock */
+  ExInitializeResource(&SepSubjectContextLock);
 
-    default:
+  /* Initialize token objects */
+  SepInitializeTokenImplementation();
 
-        /* Don't know any other phase! Bugcheck! */
-        KeBugCheckEx(UNEXPECTED_INITIALIZATION_CALL,
-                     0,
-                     ExpInitializationPhase,
-                     0,
-                     0);
-        return FALSE;
-    }
+  /* Clear impersonation info for the idle thread */
+  PsGetCurrentThread()->ImpersonationInfo = NULL;
+  PspClearCrossThreadFlag(PsGetCurrentThread(), CT_ACTIVE_IMPERSONATION_INFO_BIT);
+
+  /* Initailize the boot token */
+  ObInitializeFastReference(&PsGetCurrentProcess()->Token, NULL);
+  ObInitializeFastReference(&PsGetCurrentProcess()->Token,
+      SepCreateSystemProcessToken());
+  return TRUE;
 }
 
 BOOLEAN
index 7b53bfd..b50e780 100644 (file)
@@ -350,7 +350,7 @@ SeSubProcessToken(IN PTOKEN ParentToken,
         Status = ObInsertObject(NewToken,
                                 NULL,
                                 0,
-                                0,
+                                1,
                                 NULL,
                                 NULL);
         if (NT_SUCCESS(Status))
@@ -658,8 +658,6 @@ SepInitializeTokenImplementation(VOID)
     RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
     RtlInitUnicodeString(&Name, L"Token");
     ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
-    ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK;
-    ObjectTypeInitializer.SecurityRequired = TRUE;
     ObjectTypeInitializer.DefaultPagedPoolCharge = sizeof(TOKEN);
     ObjectTypeInitializer.GenericMapping = SepTokenMapping;
     ObjectTypeInitializer.PoolType = PagedPool;
diff --git a/reactos/ntoskrnl/tests/fsrtl.c b/reactos/ntoskrnl/tests/fsrtl.c
deleted file mode 100644 (file)
index 6624646..0000000
+++ /dev/null
@@ -1,664 +0,0 @@
-#include <ntifs.h>\r
-#include "ntndk.h"\r
-#include "fsrtl_glue.h"\r
-\r
-#include "fastio.h"\r
-#include "fsrtl.h"\r
-\r
-/* \r
-    This is the main test function. It is called from DriverEntry.\r
-\r
-    There is a DbgBreakPoint() call at the beginning of DriverEntry.\r
-    In order to run the test again, simply type\r
-        net stop fsrtl\r
-        net start fsrtl\r
-    \r
-    Author: Dom Cote\r
-*/\r
-\r
-BOOLEAN FsRtlTest_StartTest() {\r
-    HANDLE Fh = NULL;\r
-    PFILE_OBJECT Pfo = NULL;\r
-\r
-    HANDLE DirFh = NULL;\r
-    PFILE_OBJECT DirPfo = NULL;\r
-    \r
-    \r
-    IO_STATUS_BLOCK IoStatus;\r
-    BOOLEAN Return;\r
-    NTSTATUS  Status = STATUS_SUCCESS;\r
-    LONGLONG i = 0;\r
-\r
-    PCHAR Buffer;\r
-    PMDL MdlChain = 0;\r
-\r
-    LARGE_INTEGER Offset;\r
-    ULONG Length = 0;\r
-    LARGE_INTEGER OldSize;\r
-\r
-    /* Parameters we are going to use in the test from the FCB */\r
-    PFSRTL_COMMON_FCB_HEADER FcbHeader;\r
-    PLARGE_INTEGER AllocationSize;\r
-    PLARGE_INTEGER ValidDataLength;\r
-    PLARGE_INTEGER   FileSize;\r
-\r
-    /* Allocate a 100KB buffer to do IOs */\r
-    Buffer = ExAllocatePool(PagedPool,100*_1KB);\r
-    \r
-    /*  ------------------------------------------------------------------------\r
-            TESTING:\r
-                BOOLEAN\r
-                NTAPI\r
-                FsRtlCopyWrite(IN PFILE_OBJECT FileObject,\r
-                               IN PLARGE_INTEGER FileOffset,\r
-                               IN ULONG Length,\r
-                               IN BOOLEAN Wait,\r
-                               IN ULONG LockKey,\r
-                               OUT PVOID Buffer,\r
-                               OUT PIO_STATUS_BLOCK IoStatus,\r
-                               IN PDEVICE_OBJECT DeviceObject)\r
-\r
-               with Wait = TRUE\r
-\r
-        ------------------------------------------------------------------------  */\r
-    FsRtlTest_OpenTestFile(&Fh, &Pfo);\r
-    FSRTL_TEST("Opening Test File.",((Pfo != NULL) && (Fh != NULL)));\r
-    \r
-    /* Extract the test variable from the FCB struct */\r
-    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;\r
-    AllocationSize = &FcbHeader->AllocationSize;\r
-    ValidDataLength = &FcbHeader->ValidDataLength;\r
-    FileSize = &FcbHeader->FileSize;\r
-    \r
-    /* Try to cache without caching having been initialized. This should fail.*/\r
-    Length = 10*_1KB;\r
-    FSRTL_TEST("FsRtlCopyWrite() - No cache map test.",!FsRtlCopyWrite(Pfo,AllocationSize,Length,TRUE,0,Buffer,&IoStatus,NULL));\r
-\r
-    /* We are going to build a 100k file */\r
-    /* This will inititate caching and build some size */\r
-    Offset.QuadPart = 0;\r
-    Length = 100*_1KB;\r
-    Return = FsRltTest_WritefileZw(Fh,&Offset,Length, Buffer, &IoStatus);\r
-    FSRTL_TEST("FsRtlCopyWrite() - Building 100k filesize.",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    Return = TRUE;\r
-\r
-    /* Extending the file by 1/2 sector, 256 bytes. */\r
-    Offset.QuadPart = 0x7fffffffffff;\r
-    Length = 0x100;\r
-    Return = FsRltTest_WritefileZw(Fh,NULL,Length, Buffer, &IoStatus);\r
-    FSRTL_TEST("FsRtlCopyWrite() - Extending by 1/2 sector.",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    Return = TRUE;\r
-    \r
-    /* Append to the file past the allocation size*/\r
-    Offset.LowPart = 0xFFFFFFFF;\r
-    Offset.HighPart = 0xFFFFFFFF;\r
-    OldSize.QuadPart = FileSize->QuadPart;\r
-    Length = (ULONG) (AllocationSize->QuadPart -ValidDataLength->QuadPart);\r
-    FSRTL_TEST("FsRtlCopyWrite() - Testing extending past allocation size",!FsRtlCopyWrite(Pfo,&Offset,Length+1,TRUE,0,Buffer,&IoStatus,NULL));\r
-    FSRTL_TEST("FsRtlCopyWrite() - Testing extending not past allocation size",FsRtlCopyWrite(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL));\r
-    FSRTL_TEST("FsRtlCopyWrite() - Check filesize",(FileSize->QuadPart = (OldSize.QuadPart+Length)));\r
-    \r
-    /* Try do write a 65kb IO and check that if fails. Maximum IO size for thus function is 64KB */\r
-    Offset.QuadPart = 0;\r
-    Length = 65*_1KB;\r
-    FSRTL_TEST("FsRtlCopyWrite() - 65KB IO Test",!FsRtlCopyWrite(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL));\r
-\r
-    /* Try do write a 64kb IO. Maximum IO size for thus function is 64KB */\r
-    Length = 64*_1KB;\r
-    FSRTL_TEST("FsRtlCopyWrite() - 64KB IO Test",FsRtlCopyWrite(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL))\r
-\r
-    /* Test the fast Io questionable flag\r
-         This test fails and should succeed. I am not sure why. When FsRtlCopyWrite() queries the FastIoTable of the related\r
-         device object, it comes back with no.\r
-    FcbHeader->IsFastIoPossible = FastIoIsQuestionable;\r
-    FSRTL_TEST("FastIo is questionable flag",FsRtlCopyWrite(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL))\r
-    */\r
-    \r
-    /* Test the fast Io not possible flag */\r
-    FcbHeader->IsFastIoPossible = FastIoIsNotPossible;\r
-    FSRTL_TEST("FsRtlCopyWrite() - FastIo is not possible flag",!FsRtlCopyWrite(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL))\r
-    /* Set the flag back to what it was */\r
-    FcbHeader->IsFastIoPossible = FastIoIsPossible;\r
-    FSRTL_TEST("FsRtlCopyWrite() - FastIo is possbile flag",FsRtlCopyWrite(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL))\r
-\r
-    if (Pfo) \r
-    {\r
-        ObDereferenceObject(Pfo);\r
-        Pfo = NULL;\r
-    }\r
-\r
-    if (Fh)\r
-    {\r
-        ZwClose(Fh);\r
-        Fh = NULL;\r
-     }\r
-    \r
-    /*  ------------------------------------------------------------------------\r
-            TESTING:\r
-                BOOLEAN\r
-                NTAPI\r
-                FsRtlCopyWrite(IN PFILE_OBJECT FileObject,\r
-                               IN PLARGE_INTEGER FileOffset,\r
-                               IN ULONG Length,\r
-                               IN BOOLEAN Wait,\r
-                               IN ULONG LockKey,\r
-                               OUT PVOID Buffer,\r
-                               OUT PIO_STATUS_BLOCK IoStatus,\r
-                               IN PDEVICE_OBJECT DeviceObject)\r
-\r
-               with Wait = FALSE\r
-\r
-        ------------------------------------------------------------------------  */\r
-\r
-    /* We are going to repeat the same bunch of tests but with Wait = FALSE. So we exercise the second part of the function. */\r
-    FsRtlTest_OpenTestFile(&Fh, &Pfo);\r
-\r
-    /* Extract the test variable from the FCB struct */\r
-    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;\r
-    AllocationSize = &FcbHeader->AllocationSize;\r
-    ValidDataLength = &FcbHeader->ValidDataLength;\r
-    FileSize = &FcbHeader->FileSize;\r
-    \r
-    /* Try to cache without caching having been initialized. This should fail.*/\r
-    Length = 10*_1KB;\r
-    FSRTL_TEST("FsRtlCopyWrite() - No cache map test. Wait = FALSE",!FsRtlCopyWrite(Pfo,AllocationSize,Length,FALSE,0,Buffer,&IoStatus,NULL));\r
-\r
-    /* We are going to build a 100k file */\r
-    /* This will inititate caching and build some size */\r
-    Offset.QuadPart = 0;\r
-    Length = 100*_1KB;\r
-    Return = FsRltTest_WritefileZw(Fh,&Offset,Length, Buffer, &IoStatus);\r
-    FSRTL_TEST("FsRtlCopyWrite() - Building 100k filesize. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    Return = TRUE;\r
-\r
-    /* Extending the file by 1/2 sector, 256 bytes. */\r
-    Offset.QuadPart = 0x7fffffffffff;\r
-    Length = 0x100;\r
-    Return = FsRltTest_WritefileZw(Fh,NULL,Length, Buffer, &IoStatus);\r
-    FSRTL_TEST("FsRtlCopyWrite() - Extending by 1/2 sector. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    Return = TRUE;\r
-    \r
-    /* Append to the file past the allocation size*/\r
-    Offset.LowPart = 0xFFFFFFFF;\r
-    Offset.HighPart = 0xFFFFFFFF;\r
-    OldSize.QuadPart = FileSize->QuadPart;\r
-    Length = (ULONG) (AllocationSize->QuadPart -ValidDataLength->QuadPart);\r
-    FSRTL_TEST("FsRtlCopyWrite() - Testing extending past allocation size Wait = FALSE",!FsRtlCopyWrite(Pfo,&Offset,Length+1,FALSE,0,Buffer,&IoStatus,NULL));\r
-    FSRTL_TEST("FsRtlCopyWrite() - Testing extending not past allocation size. Wait = FALSE",FsRtlCopyWrite(Pfo,&Offset,Length,FALSE,0,Buffer,&IoStatus,NULL));\r
-    FSRTL_TEST("FsRtlCopyWrite() - Check filesize",(FileSize->QuadPart = (OldSize.QuadPart+Length)));\r
-    \r
-    /* Try do write a 65kb IO and check that if fails. Maximum IO size for thus function is 64KB */\r
-    Offset.QuadPart = 0;\r
-    Length = 65*_1KB;\r
-    FSRTL_TEST("FsRtlCopyWrite() - 65KB IO Test. Wait = FALSE",!FsRtlCopyWrite(Pfo,&Offset,Length,FALSE,0,Buffer,&IoStatus,NULL));\r
-\r
-    /* Try do write a 64kb IO. Maximum IO size for thus function is 64KB */\r
-    Length = 64*_1KB;\r
-    FSRTL_TEST("FsRtlCopyWrite() - 64KB IO Test. Wait = FALSE",FsRtlCopyWrite(Pfo,&Offset,Length,FALSE,0,Buffer,&IoStatus,NULL))\r
-\r
-    /* Test the fast Io questionable flag\r
-         This test fails and should succeed. I am not sure why. When FsRtlCopyWrite() queries the FastIoTable of the related\r
-         device object, it comes back with no.\r
-    FcbHeader->IsFastIoPossible = FastIoIsQuestionable;\r
-    FSRTL_TEST("FastIo is questionable flag",FsRtlCopyWrite(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL))\r
-    */\r
-    \r
-    /* Test the fast Io not possible flag */\r
-    FcbHeader->IsFastIoPossible = FastIoIsNotPossible;\r
-    FSRTL_TEST("FsRtlCopyWrite() - FastIo is not possible flag. Wait = FALSE",!FsRtlCopyWrite(Pfo,&Offset,Length,FALSE,0,Buffer,&IoStatus,NULL))\r
-    /* Set the flag back to what it was */\r
-    FcbHeader->IsFastIoPossible = FastIoIsPossible;\r
-    FSRTL_TEST("FsRtlCopyWrite() - FastIo is possbile flag. Wait = FALSE",FsRtlCopyWrite(Pfo,&Offset,Length,FALSE,0,Buffer,&IoStatus,NULL))\r
-\r
-\r
-    /*  ------------------------------------------------------------------------------------------\r
-            TESTING:\r
-            \r
-                BOOLEAN\r
-                NTAPI\r
-                FsRtlCopyRead(IN PFILE_OBJECT FileObject,\r
-                              IN PLARGE_INTEGER FileOffset,\r
-                              IN ULONG Length,\r
-                              IN BOOLEAN Wait,\r
-                              IN ULONG LockKey,\r
-                              OUT PVOID Buffer,\r
-                              OUT PIO_STATUS_BLOCK IoStatus,\r
-                              IN PDEVICE_OBJECT DeviceObject)\r
-\r
-        ------------------------------------------------------------------------------------------  */\r
-\r
-    Offset.LowPart = 0x0;\r
-    Offset.HighPart = 0x0;\r
-    Length  = 0x10000;\r
-\r
-    /* Testing a 64KB read with Wait = TRUE */\r
-    Return = FsRtlCopyRead(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL);\r
-    FSRTL_TEST("FsRtlCopyRead() - Testing 64k IO Wait=TRUE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    Return = TRUE;\r
-    \r
-    /* Testing a 64KB read with Wait = FALSE */\r
-    Return = FsRtlCopyRead(Pfo,&Offset,Length,FALSE,0,Buffer,&IoStatus,NULL);\r
-    FSRTL_TEST("FsRtlCopyRead() - Testing 64k IO Wait=FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    Return = TRUE;\r
-\r
-    /* Testing read past the end of the file */\r
-    Offset.QuadPart = FileSize->QuadPart - (5 * _1KB);\r
-    Length = 10 * _1KB;\r
-    Return = FsRtlCopyRead(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL);\r
-    FSRTL_TEST("FsRtlCopyRead() - Testing reading past end of file but starting before EOF",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status) && IoStatus.Information == (FileSize->QuadPart-Offset.QuadPart)));\r
-    \r
-    Offset.QuadPart = FileSize->QuadPart + 1;\r
-    Length = 10 * _1KB;\r
-    Return = FsRtlCopyRead(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL);\r
-    FSRTL_TEST("FsRtlCopyRead() - Testing reading past end of file but starting after EOF",(NT_SUCCESS(Return) && (IoStatus.Status == STATUS_END_OF_FILE) && IoStatus.Information == 0));\r
-    \r
-\r
-    /* Testing a 64KB read with Wait = TRUE */\r
-    Offset.LowPart = 0x0;\r
-    Offset.HighPart = 0x0;\r
-    Length  = 0x10000;\r
-    FcbHeader->IsFastIoPossible = FastIoIsNotPossible;\r
-    FSRTL_TEST("FsRtlCopyRead() - FastIo is not possible flag. Wait = FALSE",!FsRtlCopyRead(Pfo,&Offset,Length,FALSE,0,Buffer,&IoStatus,NULL));\r
-    FSRTL_TEST("FsRtlCopyRead() - FastIo is not possible flag. Wait = TRUE",!FsRtlCopyRead(Pfo,&Offset,Length,TRUE,0,Buffer,&IoStatus,NULL));\r
-    FcbHeader->IsFastIoPossible = FastIoIsPossible;\r
-    Return = TRUE;\r
-\r
-    if (Pfo) \r
-    {\r
-        ObDereferenceObject(Pfo);\r
-        Pfo = NULL;\r
-    }\r
-\r
-    if (Fh)\r
-    {\r
-        ZwClose(Fh);\r
-        Fh = NULL;\r
-     }\r
-\r
-    \r
-    /*  ------------------------------------------------------------------------------------------\r
-        TESTING:\r
-        \r
-            FsRtlMdlReadDev(IN PFILE_OBJECT FileObject,\r
-                        IN PLARGE_INTEGER FileOffset,\r
-                        IN ULONG Length,\r
-                        IN ULONG LockKey,\r
-                        OUT PMDL *MdlChain,\r
-                        OUT PIO_STATUS_BLOCK IoStatus,\r
-                        IN PDEVICE_OBJECT DeviceObject)\r
-\r
-            FsRtlMdlReadCompleteDev(IN PFILE_OBJECT FileObject,\r
-                                    IN PMDL MemoryDescriptorList,\r
-                                    IN PDEVICE_OBJECT DeviceObject)\r
-                        \r
-        ------------------------------------------------------------------------------------------\r
-    */\r
-\r
-    FsRtlTest_OpenTestFile(&Fh, &Pfo);\r
-\r
-    /* Extract the test variable from the FCB struct */\r
-    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;\r
-    AllocationSize = &FcbHeader->AllocationSize;\r
-    ValidDataLength = &FcbHeader->ValidDataLength;\r
-    FileSize = &FcbHeader->FileSize;\r
-    \r
-\r
-    /* We are going to build a 100k file */\r
-    /* This will inititate caching and build some size */\r
-    Offset.QuadPart = 0;\r
-    Length = 100*_1KB;\r
-    Return = FsRltTest_WritefileZw(Fh,&Offset,Length, Buffer, &IoStatus);\r
-    FSRTL_TEST("FsRtlMdlReadDev() - Building 100k filesize.",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    Return = TRUE;\r
-    \r
-\r
-    Offset.LowPart = 0x0;\r
-    Offset.HighPart = 0x0;\r
-    Length  = 0x10000;\r
-\r
-    /* Testing a 64KB read */\r
-    MdlChain = NULL;\r
-    Return = FsRtlMdlReadDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,NULL);\r
-    FSRTL_TEST("FsRtlMdlReadDev() - Testing 64k IO",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    FSRTL_TEST("FsRtlMdlReadDev() - Releasing the MDL",FsRtlMdlReadCompleteDev(Pfo,MdlChain,NULL));\r
-    \r
-\r
-    /* Testing read past the end of the file */\r
-    Offset.QuadPart = FileSize->QuadPart - (5 * _1KB);\r
-    Length = 10 * _1KB;\r
-    MdlChain = NULL;\r
-    Return = FsRtlMdlReadDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,NULL);\r
-    FSRTL_TEST("FsRtlMdlReadDev() - Testing reading past end of file but starting before EOF",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status) && IoStatus.Information == (FileSize->QuadPart-Offset.QuadPart)));\r
-    FSRTL_TEST("FsRtlMdlReadDev() - Releasing the MDL",FsRtlMdlReadCompleteDev(Pfo,MdlChain,NULL));\r
-    \r
-    Offset.QuadPart = FileSize->QuadPart + 1;\r
-    Length = 10 * _1KB;\r
-    MdlChain = NULL;\r
-    Return = FsRtlMdlReadDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,NULL);\r
-    FSRTL_TEST("FsRtlMdlReadDev() - Testing reading past end of file but starting after EOF",(NT_SUCCESS(Return) && (IoStatus.Status == STATUS_END_OF_FILE) && IoStatus.Information == 0));\r
-    \r
-    /* Testing FastIoIsNotPossible */\r
-    Offset.LowPart = 0x0;\r
-    Offset.HighPart = 0x0;\r
-    MdlChain = NULL;\r
-    Length  = 0x10000;\r
-    FcbHeader->IsFastIoPossible = FastIoIsNotPossible;\r
-    FSRTL_TEST("FsRtlMdlReadDev() - FastIo is not possible flag. Wait = TRUE",!FsRtlMdlReadDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,NULL));\r
-\r
-    Return = TRUE;\r
-\r
-    if (Pfo) \r
-    {\r
-        ObDereferenceObject(Pfo);\r
-        Pfo = NULL;\r
-    }\r
-\r
-    if (Fh)\r
-    {\r
-        ZwClose(Fh);\r
-        Fh = NULL;\r
-    }\r
-\r
-    /*  ------------------------------------------------------------------------------------------\r
-        TESTING:\r
-        \r
-            FsRtlMdlRead(IN PFILE_OBJECT FileObject,\r
-                        IN PLARGE_INTEGER FileOffset,\r
-                        IN ULONG Length,\r
-                        IN ULONG LockKey,\r
-                        OUT PMDL *MdlChain,\r
-                        OUT PIO_STATUS_BLOCK IoStatus)\r
-\r
-            FsRtlMdlReadComplete(IN PFILE_OBJECT FileObject,\r
-                                    IN PMDL MemoryDescriptorList)\r
-                        \r
-        ------------------------------------------------------------------------------------------\r
-    */\r
-\r
-    FsRtlTest_OpenTestFile(&Fh, &Pfo);\r
-\r
-    /* Extract the test variable from the FCB struct */\r
-    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;\r
-    AllocationSize = &FcbHeader->AllocationSize;\r
-    ValidDataLength = &FcbHeader->ValidDataLength;\r
-    FileSize = &FcbHeader->FileSize;\r
-    \r
-\r
-    /* We are going to build a 100k file */\r
-    /* This will inititate caching and build some size */\r
-    Offset.QuadPart = 0;\r
-    Length = 100*_1KB;\r
-    Return = FsRltTest_WritefileZw(Fh,&Offset,Length, Buffer, &IoStatus);\r
-    FSRTL_TEST("FsRtlMdlRead() - Building 100k filesize.",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    Return = TRUE;\r
-    \r
-\r
-    Offset.LowPart = 0x0;\r
-    Offset.HighPart = 0x0;\r
-    Length  = 0x10000;\r
-\r
-    /* Testing a 64KB read */\r
-    MdlChain = NULL;\r
-    Return = FsRtlMdlRead(Pfo,&Offset,Length,0,&MdlChain,&IoStatus);\r
-    FSRTL_TEST("FsRtlMdlRead() - Testing 64k IO",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
-    FSRTL_TEST("FsRtlMdlRead() - Releasing the MDL",FsRtlMdlReadComplete(Pfo,MdlChain));\r
-    \r
-\r
-    /* Testing read past the end of the file */\r
-    Offset.QuadPart = FileSize->QuadPart - (5 * _1KB);\r
-    Length = 10 * _1KB;\r
-    MdlChain = NULL;\r
-    Return = FsRtlMdlRead(Pfo,&Offset,Length,0,&MdlChain,&IoStatus);\r
-    FSRTL_TEST("FsRtlMdlRead() - Testing reading past end of file but starting before EOF",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status) && IoStatus.Information == (FileSize->QuadPart-Offset.QuadPart)));\r
-    FSRTL_TEST("FsRtlMdlRead() - Releasing the MDL",FsRtlMdlReadComplete(Pfo,MdlChain));\r
-    \r
-    Offset.QuadPart = FileSize->QuadPart + 1;\r
-    Length = 10 * _1KB;\r
-    MdlChain = NULL;\r
-    Return = FsRtlMdlRead(Pfo,&Offset,Length,0,&MdlChain,&IoStatus);\r
-    FSRTL_TEST("FsRtlMdlRead() - Testing reading past end of file but starting after EOF",(NT_SUCCESS(Return) && (IoStatus.Status == STATUS_END_OF_FILE) && IoStatus.Information == 0));\r
-    \r
-    /* Testing FastIoIsNotPossible */\r
-    Offset.LowPart = 0x0;\r
-    Offset.HighPart = 0x0;\r
-    MdlChain = NULL;\r
-    Length  = 0x10000;\r
-    FcbHeader->IsFastIoPossible = FastIoIsNotPossible;\r
-    FSRTL_TEST("FsRtlMdlRead() - FastIo is not possible flag. Wait = TRUE",!FsRtlMdlRead(Pfo,&Offset,Length,0,&MdlChain,&IoStatus));\r
-\r
-    Return = TRUE;\r
-\r
-    if (Pfo) \r
-    {\r
-        ObDereferenceObject(Pfo);\r
-        Pfo = NULL;\r
-    }\r
-\r
-    if (Fh)\r
-    {\r
-        ZwClose(Fh);\r
-        Fh = NULL;\r
-    }\r
-    \r
-\r
-\r
-    /*  ------------------------------------------------------------------------------------------\r
-        TESTING:\r
-        \r
-                    FsRtlGetFileSize(IN PFILE_OBJECT  FileObject,\r
-                                     IN OUT PLARGE_INTEGER FileSize)\r
-                        \r
-        ------------------------------------------------------------------------------------------\r
-    */\r
-    FsRtlTest_OpenTestFile(&Fh, &Pfo);\r
-    FSRTL_TEST("FsRtlGetFileSize() - Opening Test File.",((Pfo != NULL) && (Fh != NULL)));\r
-    \r
-    FsRtlTest_OpenTestDirectory(&DirFh, &DirPfo);\r
-    FSRTL_TEST("FsRtlGetFileSize() - Opening Test Directory.",((DirPfo != NULL) && (DirFh != NULL)));\r
-\r
-    Status = FsRtlGetFileSize(Pfo,&OldSize);\r
-    FSRTL_TEST("FsRtlGetFileSize() - Get the size of a real file",NT_SUCCESS(Status));\r
-    \r
-    Status = FsRtlGetFileSize(DirPfo,&OldSize);\r
-    FSRTL_TEST("FsRtlGetFileSize() - Get the size of a directory file",(Status == STATUS_FILE_IS_A_DIRECTORY));\r
-    \r
-    \r
-    /* The test if over. Do clean up */ \r
-\r
-Cleanup:\r
-\r
-    if (DirPfo) \r
-    {\r
-        ObDereferenceObject(DirPfo);\r
-        DirPfo = NULL;\r
-    }\r
-\r
-    if (DirFh)\r
-    {\r
-        ZwClose(DirFh);\r
-        DirFh = NULL;\r
-     }\r
-    if (Pfo) \r
-    {\r
-        ObDereferenceObject(Pfo);\r
-        Pfo = NULL;\r
-    }\r
-\r
-    if (Fh)\r
-    {\r
-        ZwClose(Fh);\r
-        Fh = NULL;\r
-     }\r
-        \r
-    if (Buffer != NULL) {\r
-        ExFreePool(Buffer);\r
-        Buffer = NULL;\r
-    }\r
-\r
-    return Return;\r
-\r
-}\r
-\r
-/*  This function is just a wrapper around ZwWriteFile */\r
-NTSTATUS FsRltTest_WritefileZw(HANDLE fh, PLARGE_INTEGER Offset, ULONG Length, PVOID Buffer, PIO_STATUS_BLOCK pIoStatus){\r
-    NTSTATUS Return;\r
-\r
-    Return = ZwWriteFile(\r
-        fh,\r
-        NULL,\r
-        NULL,\r
-        NULL,\r
-        pIoStatus,\r
-        Buffer,\r
-        Length,\r
-        Offset,\r
-        NULL\r
-        );\r
-\r
-    return Return;\r
-}\r
-\r
-/* This function fills the buffer with a test pattern */\r
-void FsRtlTest_FillBuffer(LARGE_INTEGER Start, ULONG Length, PVOID Buffer) {\r
-    ULONG i = 0;\r
-    PULONGLONG Index = (PULONGLONG) Buffer;\r
-    \r
-    for (i=0; i<Length/sizeof(ULONGLONG); i++) {\r
-        Index[i] = Start.QuadPart + i;\r
-    }\r
-    \r
-    return;\r
- }\r
-\r
-/*  This function opens a test file with the FILE_DELETE_ON_CLOSE flag\r
-    and reference the file object\r
-*/\r
- NTSTATUS FsRtlTest_OpenTestFile(PHANDLE Pfh, PFILE_OBJECT *Ppfo) {\r
-    UNICODE_STRING FileName;\r
-    OBJECT_ATTRIBUTES oa;\r
-    IO_STATUS_BLOCK IoStatus;\r
-    NTSTATUS  Return;\r
-    \r
-    RtlInitUnicodeString(&FileName,L"\\??\\C:\\fsrtl.bin");\r
-\r
-    InitializeObjectAttributes(\r
-    &oa,\r
-    &FileName,\r
-    OBJ_KERNEL_HANDLE,\r
-    NULL,\r
-    NULL;\r
-    );\r
-\r
-    Return = IoCreateFile(Pfh,\r
-                        GENERIC_WRITE,\r
-                        &oa,\r
-                        &IoStatus,\r
-                        0,\r
-                        FILE_ATTRIBUTE_NORMAL,\r
-                        0,\r
-                        FILE_OVERWRITE_IF      ,\r
-                        FILE_SYNCHRONOUS_IO_ALERT | FILE_DELETE_ON_CLOSE,\r
-                        NULL,\r
-                        0,\r
-                        CreateFileTypeNone,\r
-                        NULL,\r
-                        0);\r
-\r
-      Return = ObReferenceObjectByHandle(\r
-        *Pfh,\r
-        GENERIC_WRITE,\r
-        NULL,\r
-        KernelMode,\r
-        Ppfo,\r
-        NULL\r
-        );\r
-}\r
-\r
- NTSTATUS FsRtlTest_OpenTestDirectory(PHANDLE Pfh, PFILE_OBJECT *Ppfo) {\r
-    UNICODE_STRING FileName;\r
-    OBJECT_ATTRIBUTES oa;\r
-    IO_STATUS_BLOCK IoStatus;\r
-    NTSTATUS  Return;\r
-    \r
-    RtlInitUnicodeString(&FileName,L"\\??\\C:\\testdir01");\r
-\r
-    InitializeObjectAttributes(\r
-    &oa,\r
-    &FileName,\r
-    OBJ_KERNEL_HANDLE,\r
-    NULL,\r
-    NULL;\r
-    );\r
-\r
-    Return = IoCreateFile(Pfh,\r
-                        GENERIC_WRITE,\r
-                        &oa,\r
-                        &IoStatus,\r
-                        0,\r
-                        FILE_ATTRIBUTE_NORMAL,\r
-                        0,\r
-                        FILE_OPEN_IF,\r
-                        FILE_DIRECTORY_FILE,FILE_SYNCHRONOUS_IO_ALERT | FILE_DELETE_ON_CLOSE,\r
-                        NULL,\r
-                        0,\r
-                        CreateFileTypeNone,\r
-                        NULL,\r
-                        0);\r
-\r
-      Return = ObReferenceObjectByHandle(\r
-        *Pfh,\r
-        GENERIC_WRITE,\r
-        NULL,\r
-        KernelMode,\r
-        Ppfo,\r
-        NULL\r
-        );\r
-}\r
-\r
-/* All the testing is done from driver entry */\r
-NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )\r
-{\r
-    PDEVICE_OBJECT DeviceObject;\r
-    NTSTATUS mStatus;\r
-    UNICODE_STRING uniName, uniDOSName;\r
-    PDEVOBJ_EXTENSION  x;\r
-\r
-    DbgPrint("Loading the FSRTL test driver.\n");\r
-    DbgBreakPoint();\r
-\r
-    /* register device functions */\r
-    DriverObject->MajorFunction[IRP_MJ_CREATE] = FsRtlTest_DispatchCreateClose;\r
-    DriverObject->MajorFunction[IRP_MJ_CLOSE] = FsRtlTest_DispatchCreateClose;\r
-    DriverObject->DriverUnload = FsRtlTest_Unload;\r
-\r
-    if (!FsRtlTest_StartTest()) {\r
-        DbgPrint("FsRtl test failed.\n");\r
-    } else {\r
-        DbgPrint("FsRtl test OK.\n");\r
-    }\r
-    \r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-NTSTATUS FsRtlTest_DispatchCreateClose( IN PDEVICE_OBJECT devObj, IN PIRP Irp )\r
-{\r
-  DbgPrint(("FsRtl: Open / Close\n"));\r
-\r
-  Irp->IoStatus.Information = 0;\r
-  Irp->IoStatus.Status = STATUS_SUCCESS;\r
-  IoCompleteRequest( Irp, IO_NO_INCREMENT );\r
-\r
-  return STATUS_SUCCESS;\r
-}\r
-\r
-VOID FsRtlTest_Unload( IN PDRIVER_OBJECT DriverObject )\r
-{\r
-      DbgPrint(("FsRtl: Unloading.\n"));\r
-}\r
-\r
-\r
index d54974a..f95ea1d 100644 (file)
@@ -49,7 +49,7 @@ VdmSwapContext(IN PKTRAP_FRAME TrapFrame,
     ULONG EFlags, OldEFlags;
 
     /* Make sure that we're at APC_LEVEL and that this is a valid frame */
-    ASSERT(KeGetCurrentIrql() == APC_LEVEL);
+    ASSERT_IRQL(APC_LEVEL);
     ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00);
 
     /* Check if this is a V86 frame */
@@ -321,4 +321,3 @@ VdmDispatchBop(IN PKTRAP_FRAME TrapFrame)
     return TRUE;
 }
 
-
index bd350db..1480f77 100755 (executable)
@@ -121,7 +121,7 @@ static DWORD WINAPI threadFunc1(LPVOID p)
    }
 
    /* lstrlenA contains an exception handler so this makes sure exceptions work in threads */
-   //ok( lstrlenA( (char *)0xdeadbeef ) == 0, "lstrlenA: unexpected success\n" );
+   ok( lstrlenA( (char *)0xdeadbeef ) == 0, "lstrlenA: unexpected success\n" );
 
 /* Check that noone changed our tls memory */
    ok((int)TlsGetValue(tlsIndex)-1==tstruct->threadnum,
@@ -185,7 +185,7 @@ static VOID test_CreateThread_basic(void)
    DWORD GLE, ret;
 
    /* lstrlenA contains an exception handler so this makes sure exceptions work in the main thread */
-   //ok( lstrlenA( (char *)0xdeadbeef ) == 0, "lstrlenA: unexpected success\n" );
+   ok( lstrlenA( (char *)0xdeadbeef ) == 0, "lstrlenA: unexpected success\n" );
 
 /* Retrieve current Thread ID for later comparisons */
   curthreadId=GetCurrentThreadId();
index a349271..d92b244 100755 (executable)
@@ -939,7 +939,7 @@ static BOOL RegisterWindowClasses (void)
     text_position.cbWndExtra = 0;
     text_position.hInstance = hinst;
     text_position.hIcon = NULL;
-    text_position.hCursor = LoadCursorA(NULL, (LPCSTR) IDC_ARROW);
+    text_position.hCursor = LoadCursorA(NULL, MAKEINTRESOURCEA(IDC_ARROW));
     text_position.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
     text_position.lpszMenuName = NULL;
     text_position.lpszClassName = szEditTextPositionClass;
index ffde9f8..582b971 100644 (file)
@@ -227,7 +227,7 @@ ClientConnectionThread(HANDLE ServerPort)
         {
             DPRINT("Port died, oh well\n");
             CsrFreeProcessData( Request->Header.ClientId.UniqueProcess );
-            //NtClose()
+            //NtClose();
             Reply = NULL;
             continue;
             //break;
@@ -242,7 +242,7 @@ ClientConnectionThread(HANDLE ServerPort)
 
         if (Request->Header.u2.s2.Type == LPC_CLIENT_DIED)
         {
-            DPRINT("Clietn died, oh well\n");
+            DPRINT("Client died, oh well\n");
             Reply = NULL;
             continue;
         }
index 82d8480..b5d7303 100644 (file)
@@ -36,8 +36,8 @@ int _cdecl _main(int argc,
 {
    NTSTATUS Status = STATUS_SUCCESS;
    
-   //PrintString("ReactOS Client/Server Run-Time (Build %s)\n",
-            //KERNEL_VERSION_BUILD_STR);
+   PrintString("ReactOS Client/Server Run-Time (Build %s)\n",
+            KERNEL_VERSION_BUILD_STR);
 
    /*==================================================================
     *  Initialize the Win32 environment subsystem server.
index e80de4c..e84e06b 100644 (file)
@@ -168,7 +168,7 @@ CsrpCreateObjectDirectory (int argc, char ** argv, char ** envp)
                                    NULL);
 
        Status = NtOpenDirectoryObject(&CsrObjectDirectory,
-                                      DIRECTORY_ALL_ACCESS,
+                                      0xF000F, /* ea:??? */
                                       &Attributes);
        return Status;
 }
index da53515..2ddda23 100644 (file)
@@ -1874,7 +1874,7 @@ GuiInit(VOID)
   wc.style = 0;
   wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL);
   wc.hIcon = LoadIconW(Win32CsrDllHandle, MAKEINTRESOURCEW(1));
-  wc.hCursor = LoadCursorW(NULL, (LPCWSTR) IDC_ARROW);
+  wc.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_ARROW));
   wc.hbrBackground = NULL;
   wc.lpszMenuName = NULL;
   wc.cbClsExtra = 0;
index 1d1ef29..a721bde 100644 (file)
@@ -73,62 +73,56 @@ typedef struct _USER_REFERENCE_ENTRY
 
 #include <malloc.h>
 
-#define USER_ASSERT(exp,file,line) \
-    if (!(exp)) {RtlAssert(#exp,(PVOID)file,line,"");}
-
-static __inline VOID
-UserAssertLastRef(PVOID obj, const char *file, int line)
-{
-    PW32THREAD W32Thread;
-    PSINGLE_LIST_ENTRY ReferenceEntry;
-    PUSER_REFERENCE_ENTRY UserReferenceEntry;
-
-    USER_ASSERT(obj != NULL, file, line);
-    W32Thread = PsGetCurrentThreadWin32Thread();
-    USER_ASSERT(W32Thread != NULL, file, line);
-    ReferenceEntry = W32Thread->ReferencesList.Next;
-    USER_ASSERT(ReferenceEntry != NULL, file, line);
-    UserReferenceEntry = CONTAINING_RECORD(ReferenceEntry, USER_REFERENCE_ENTRY, Entry);
-    USER_ASSERT(UserReferenceEntry != NULL, file, line);
-    USER_ASSERT(obj == UserReferenceEntry->obj, file, line);
+#define ASSERT_LAST_REF(_obj_) \
+{ \
+   PW32THREAD t; \
+   PSINGLE_LIST_ENTRY e; \
+   PUSER_REFERENCE_ENTRY ref; \
+   \
+   ASSERT(_obj_); \
+   t = PsGetCurrentThreadWin32Thread(); \
+   ASSERT(t); \
+   e = t->ReferencesList.Next; \
+   ASSERT(e); \
+   ref = CONTAINING_RECORD(e, USER_REFERENCE_ENTRY, Entry); \
+   ASSERT(ref); \
+   \
+   ASSERT(_obj_ == ref->obj); \
+   \
 }
-#define ASSERT_LAST_REF(_obj_) UserAssertLastRef(_obj,__FILE__,__LINE__)
-
-#undef USER_ASSERT
-
-VOID FASTCALL ObmReferenceObject(PVOID obj);
-BOOL FASTCALL ObmDereferenceObject2(PVOID obj);
-
-static __inline VOID
-UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
-{
-    PW32THREAD W32Thread;
-
-    W32Thread = PsGetCurrentThreadWin32Thread();
-    ASSERT(W32Thread != NULL);
-    ASSERT(UserReferenceEntry != NULL);
-    UserReferenceEntry->obj = obj;
-    ObmReferenceObject(obj);
-    PushEntryList(&W32Thread->ReferencesList, &UserReferenceEntry->Entry);
+#define UserRefObjectCo(_obj_, _ref_) \
+{ \
+   PW32THREAD t; \
+   \
+   ASSERT(_obj_); \
+   t = PsGetCurrentThreadWin32Thread(); \
+   ASSERT(t); \
+   ASSERT(_ref_); \
+   (_ref_)->obj = _obj_; \
+   ObmReferenceObject(_obj_); \
+ \
+   PushEntryList(&t->ReferencesList, &(_ref_)->Entry); \
+   \
 }
 
-static __inline VOID
-UserDerefObjectCo(PVOID obj)
-{
-    PW32THREAD W32Thread;
-    PSINGLE_LIST_ENTRY ReferenceEntry;
-    PUSER_REFERENCE_ENTRY UserReferenceEntry;
-
-    ASSERT(obj != NULL);
-    W32Thread = PsGetCurrentThreadWin32Thread();
-    ASSERT(W32Thread != NULL);
-    ReferenceEntry = PopEntryList(&W32Thread->ReferencesList);
-    ASSERT(ReferenceEntry != NULL);
-    UserReferenceEntry = CONTAINING_RECORD(ReferenceEntry, USER_REFERENCE_ENTRY, Entry);
-    ASSERT(UserReferenceEntry != NULL);
-
-    ASSERT(obj == UserReferenceEntry->obj);
-    ObmDereferenceObject2(obj);
+
+#define UserDerefObjectCo(_obj_) \
+{ \
+   PW32THREAD t; \
+   PSINGLE_LIST_ENTRY e; \
+   PUSER_REFERENCE_ENTRY ref; \
+   \
+   ASSERT(_obj_); \
+   t = PsGetCurrentThreadWin32Thread(); \
+   ASSERT(t); \
+   e = PopEntryList(&t->ReferencesList); \
+   ASSERT(e); \
+   ref = CONTAINING_RECORD(e, USER_REFERENCE_ENTRY, Entry); \
+   ASSERT(ref); \
+   \
+   ASSERT(_obj_ == ref->obj); \
+   ObmDereferenceObject(_obj_); \
+   \
 }
 
 HANDLE FASTCALL ObmObjectToHandle(PVOID obj);
index d6975d7..9846ada 100644 (file)
@@ -1400,10 +1400,14 @@ UserDrawIconEx(
       IconSize.cy = bmpMask.bmHeight / 2;
    }
 
-   if (bmpColor.bmBitsPixel == 32)
+   /* A hack to get alpha-blending support for icons.
+      Disabled now because of a bug in alpha blending function
+      (which blends with white background instead of the background).
+    */
+   /*if (bmpColor.bmBitsPixel == 32)
    {
       bAlpha = TRUE;
-   }
+   }*/
 
    if(!diFlags)
       diFlags = DI_NORMAL;
@@ -1514,83 +1518,11 @@ UserDrawIconEx(
    {
         if (bAlpha)
         {
-            BITMAPINFO bi;
-            BITMAP bm;
-            BITMAPOBJ *Bitmap = NULL;
-            PBYTE pBits = NULL;
             BLENDFUNCTION  BlendFunc;
-            BYTE Red, Green, Blue, Alpha;
-            DWORD Count = 0;
-            INT i, j;
-
-            /* Bitmap header */
-            bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
-            bi.bmiHeader.biWidth = cxWidth;
-            bi.bmiHeader.biHeight = cyHeight;
-            bi.bmiHeader.biPlanes = 1;
-            bi.bmiHeader.biBitCount = 32;
-            bi.bmiHeader.biCompression = BI_RGB;
-            bi.bmiHeader.biSizeImage = cxWidth * cyHeight * 4;
-            bi.bmiHeader.biClrUsed = 0;
-            bi.bmiHeader.biClrImportant = 0;
-
-            Bitmap = GDIOBJ_LockObj(GdiHandleTable, hbmOff, GDI_OBJECT_TYPE_BITMAP);
-            if (Bitmap == NULL)
-            {
-                DPRINT1("GDIOBJ_LockObj() failed!\n");
-                goto cleanup;
-            }
-            BITMAP_GetObject(Bitmap, sizeof(BITMAP), &bm);
-
-            /* Buffer */
-            pBits = ExAllocatePoolWithTag(PagedPool, bm.bmWidthBytes * abs(bm.bmHeight), TAG_BITMAP);
-            if (pBits == NULL)
-            {
-                DPRINT1("ExAllocatePoolWithTag() failed!\n");
-                GDIOBJ_UnlockObjByPtr(GdiHandleTable, Bitmap);
-                goto cleanup;
-            }
-
-            /* get icon bits */
-            NtGdiGetBitmapBits(hbmOff, bm.bmWidthBytes * abs(bm.bmHeight), pBits);
-
-            /* premultiply with the alpha channel value */
-            for (i = 0; i < cyHeight; i++)
-            {
-                for (j = 0; j < cxWidth; j++)
-                {
-                    DWORD OrigPixel = 0;
-                    DWORD AlphaPixel = 0;
-                    OrigPixel = *(DWORD *)(pBits + Count);
-                    Red   = (BYTE)((OrigPixel >>  0) & 0xff);
-                    Green = (BYTE)((OrigPixel >>  8) & 0xff);
-                    Blue  = (BYTE)((OrigPixel >> 16) & 0xff);
-                    Alpha = (BYTE)((OrigPixel >> 24) & 0xff);
-                    Red = (Red * Alpha) / 0xff;
-                    Green = (Green * Alpha) / 0xff;
-                    Blue = (Blue * Alpha) / 0xff;
-                    AlphaPixel = (DWORD)(Red | (Green << 8) | (Blue << 16) | (Alpha << 24));
-                    *(DWORD *)(pBits + Count) = AlphaPixel;
-                    Count += sizeof (DWORD);
-                }
-            }
-
-            /* set icon bits */
-            NtGdiSetBitmapBits(hbmOff, bm.bmWidthBytes * abs(bm.bmHeight), pBits);
-            ExFreePool(pBits);
-
-            GDIOBJ_UnlockObjByPtr(GdiHandleTable, Bitmap);
-
-            BlendFunc.BlendOp = AC_SRC_OVER;
+            BlendFunc.BlendOp = AC_SRC_OVER; /* right ? */
             BlendFunc.BlendFlags = 0;
             BlendFunc.SourceConstantAlpha = 255;
             BlendFunc.AlphaFormat = AC_SRC_ALPHA;
-
             NtGdiAlphaBlend(hDc, xLeft, yTop, cxWidth, cyHeight, 
                             hdcOff, 0, 0, cxWidth, cyHeight, BlendFunc);
         }
@@ -1610,6 +1542,7 @@ UserDrawIconEx(
 cleanup:
    if(DoFlickerFree)
    {
+
       if(hOldOffBmp) NtGdiSelectObject(hdcOff, hOldOffBmp);
       if(hOldOffBrush) NtGdiSelectObject(hdcOff, hOldOffBrush);
       if(hbmOff) NtGdiDeleteObject(hbmOff);
index 51ef630..8ed8443 100644 (file)
@@ -297,32 +297,30 @@ IntParseDesktopPath(PEPROCESS Process,
 
    if(!WinStaPresent)
    {
-#if 0
       /* search the process handle table for (inherited) window station
          handles, use a more appropriate one than WinSta0 if possible. */
-      if (!ObFindHandleForObject(Process,
-                                 NULL,
-                                 ExWindowStationObjectType,
-                                 NULL,
-                                 (PHANDLE)hWinSta))
-#endif
+      Status = ObFindHandleForObject(Process,
+                                     NULL,
+                                     ExWindowStationObjectType,
+                                     NULL,
+                                     (PHANDLE)hWinSta);
+      if(!NT_SUCCESS(Status))
       {
-            /* we had no luck searching for opened handles, use WinSta0 now */
-            RtlInitUnicodeString(&WinSta, L"WinSta0");
+         /* we had no luck searching for opened handles, use WinSta0 now */
+         RtlInitUnicodeString(&WinSta, L"WinSta0");
       }
    }
 
    if(!DesktopPresent && hDesktop != NULL)
    {
-#if 0
       /* search the process handle table for (inherited) desktop
          handles, use a more appropriate one than Default if possible. */
-      if (!ObFindHandleForObject(Process,
-                                 NULL,
-                                 ExDesktopObjectType,
-                                 NULL,
-                                 (PHANDLE)hDesktop))
-#endif
+      Status = ObFindHandleForObject(Process,
+                                     NULL,
+                                     ExDesktopObjectType,
+                                     NULL,
+                                     (PHANDLE)hDesktop);
+      if(!NT_SUCCESS(Status))
       {
          /* we had no luck searching for opened handles, use Desktop now */
          RtlInitUnicodeString(&Desktop, L"Default");
@@ -481,11 +479,13 @@ IntGetDesktopObjectHandle(PDESKTOP_OBJECT DesktopObject)
 
    ASSERT(DesktopObject);
 
-   if (!ObFindHandleForObject(PsGetCurrentProcess(),
-                              DesktopObject,
-                              ExDesktopObjectType,
-                              NULL,
-                              (PHANDLE)&Ret))
+   Status = ObFindHandleForObject(PsGetCurrentProcess(),
+                                  DesktopObject,
+                                  ExDesktopObjectType,
+                                  NULL,
+                                  (PHANDLE)&Ret);
+
+   if(!NT_SUCCESS(Status))
    {
       Status = ObOpenObjectByPointer(DesktopObject,
                                      0,
@@ -501,10 +501,6 @@ IntGetDesktopObjectHandle(PDESKTOP_OBJECT DesktopObject)
          return NULL;
       }
    }
-   else
-   {
-       DPRINT1("Got handle: %lx\n", Ret);
-   }
 
    return Ret;
 }
index cf57085..ec20f50 100644 (file)
@@ -963,12 +963,12 @@ IntSystemParametersInfo(
          /* We will change something, so set the flag here */
          bChanged = TRUE;
       case SPI_GETDESKWALLPAPER:
-      case SPI_GETWHEELSCROLLLINES:
-      case SPI_GETWHEELSCROLLCHARS:
-      case SPI_GETSCREENSAVERRUNNING:
-      case SPI_GETSCREENSAVETIMEOUT:
-      case SPI_GETSCREENSAVEACTIVE:
-      case SPI_GETFLATMENU:
+         case SPI_GETWHEELSCROLLLINES:
+         case SPI_GETWHEELSCROLLCHARS:
+         case SPI_GETSCREENSAVERRUNNING:
+         case SPI_GETSCREENSAVETIMEOUT:
+         case SPI_GETSCREENSAVEACTIVE:
+         case SPI_GETFLATMENU:
          {
             PSYSTEM_CURSORINFO CurInfo;
 
@@ -984,43 +984,43 @@ IntSystemParametersInfo(
 
             switch(uiAction)
             {
-               case SPI_GETFLATMENU:
+                          case SPI_GETFLATMENU:
                   ASSERT(pvParam);
                   *((UINT*)pvParam) = WinStaObject->FlatMenu;
-                  break;
-               case SPI_SETFLATMENU:
+                             break;
+               case SPI_SETFLATMENU:                              
                   WinStaObject->FlatMenu = uiParam;
-                  break;
-               case SPI_GETSCREENSAVETIMEOUT:
+                             break;
+                          case SPI_GETSCREENSAVETIMEOUT:
                    ASSERT(pvParam);
                    *((UINT*)pvParam) = WinStaObject->ScreenSaverTimeOut;
                break;
                case SPI_SETSCREENSAVETIMEOUT:
                   WinStaObject->ScreenSaverTimeOut = uiParam;
-                  break;
-               case SPI_GETSCREENSAVERRUNNING:
-                  if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
-                  break;
+                                 break;
+                          case SPI_GETSCREENSAVERRUNNING:
+                     if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
+                                 break;
                case SPI_SETSCREENSAVERRUNNING:
-                  if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
+                                  if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
                   WinStaObject->ScreenSaverRunning = uiParam;
-                  break;
-               case SPI_GETSCREENSAVEACTIVE:
-                  /* FIXME: how to disable the screensaver? */
+                                 break;
+                          case SPI_GETSCREENSAVEACTIVE:
+                                       /* FIXME: how to disable the screensaver? */
                   ASSERT(pvParam);
                   *((BOOL*)pvParam) = TRUE;
-                  break;
-               case SPI_GETWHEELSCROLLLINES:
+                                 break;
+                          case SPI_GETWHEELSCROLLLINES:
                   ASSERT(pvParam);
-                  CurInfo = IntGetSysCursorInfo(WinStaObject);
+                                   CurInfo = IntGetSysCursorInfo(WinStaObject);
                   *((UINT*)pvParam) = CurInfo->WheelScroLines;
-                  /* FIXME add this value to scroll list as scroll value ?? */
+                                       /* FIXME add this value to scroll list as scroll value ?? */
                   break;
                case SPI_GETWHEELSCROLLCHARS:
                   ASSERT(pvParam);
-                  CurInfo = IntGetSysCursorInfo(WinStaObject);
+                                   CurInfo = IntGetSysCursorInfo(WinStaObject);
                   *((UINT*)pvParam) = CurInfo->WheelScroChars;
-                  // FIXME add this value to scroll list as scroll value ?? 
+                                       // FIXME add this value to scroll list as scroll value ?? 
                   break;
                case SPI_SETDOUBLECLKWIDTH:
                   CurInfo = IntGetSysCursorInfo(WinStaObject);
@@ -1264,12 +1264,12 @@ IntSystemParametersInfo(
             {
                return FALSE;
             }
-            Ret = (NtGdiGetDeviceCaps(hDC, BITSPIXEL) > 8) && Ret;
+               Ret = (NtGdiGetDeviceCaps(hDC, BITSPIXEL) > 8) && Ret;
 
-            ASSERT(pvParam);
-            *((PBOOL)pvParam) = Ret;
+               ASSERT(pvParam);
+               *((PBOOL)pvParam) = Ret;
             break;
-         }
+            }
       case SPI_SETFONTSMOOTHING:
          {
             IntEnableFontRendering(uiParam != 0);
@@ -1355,7 +1355,7 @@ IntSystemParametersInfo(
          /* Broadcast WM_SETTINGCHANGE to all toplevel windows */
          /* FIXME: lParam should be pointer to a string containing the reg key */
          UserPostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, (WPARAM)uiAction, 0);
-      }
+}
    }
    return TRUE;
 }
diff --git a/reactos/subsystems/win32/win32k/objects/arc.c b/reactos/subsystems/win32/win32k/objects/arc.c
deleted file mode 100644 (file)
index dedbbdf..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-#include <w32k.h>
-
-#define NDEBUG
-#include <debug.h>
-
-static BOOL FASTCALL
-IntArc( DC *dc, int LeftRect, int TopRect, int RightRect, int BottomRect,
-        int XStartArc, int YStartArc, int XEndArc, int YEndArc, ARCTYPE arctype)
-{
-  return TRUE;
-}
-
-BOOL FASTCALL
-IntGdiArcInternal(
-          ARCTYPE arctype,
-          DC  *dc,
-          int LeftRect,
-          int TopRect,
-          int RightRect,
-          int BottomRect,
-          int XStartArc,
-          int YStartArc,
-          int XEndArc,
-          int YEndArc)
-{
-  INT rx, ry;
-  RECT rc, rc1;
-
-  if(PATH_IsPathOpen(dc->w.path))
-  {
-    INT type = arctype;
-    if (arctype == GdiTypeArcTo) type = GdiTypeArc;
-    return PATH_Arc(dc, LeftRect, TopRect, RightRect, BottomRect,
-                    XStartArc, YStartArc, XEndArc, YEndArc, type);
-  }
-
-  IntGdiSetRect(&rc, LeftRect, TopRect, RightRect, BottomRect);
-  IntGdiSetRect(&rc1, XStartArc, YStartArc, XEndArc, YEndArc);
-
-  if (dc->w.flags & DCX_WINDOW) //window rectangle instead of client rectangle
-  {
-    HWND hWnd;
-    PWINDOW_OBJECT Window;
-
-    hWnd = IntWindowFromDC(dc->hSelf);
-    Window = UserGetWindowObject(hWnd);
-    if(!Window) return FALSE;
-
-    rc.left += Window->ClientRect.left;
-    rc.top += Window->ClientRect.top;
-    rc.right += Window->ClientRect.left;
-    rc.bottom += Window->ClientRect.top;
-
-    rc1.left += Window->ClientRect.left;
-    rc1.top += Window->ClientRect.top;
-    rc1.right += Window->ClientRect.left;
-    rc1.bottom += Window->ClientRect.top;
-  }
-
-  rx = (rc.right - rc.left)/2 - 1;
-  ry = (rc.bottom - rc.top)/2 -1;
-  rc.left += rx;
-  rc.top += ry;
-
-  return  IntArc( dc, rc.left, rc.top, rx, ry,
-          rc1.left, rc1.top, rc1.right, rc1.bottom, arctype);
-}
-
-BOOL
-STDCALL
-NtGdiArcInternal(
-        ARCTYPE arctype,
-        HDC  hDC,
-        int  LeftRect,
-        int  TopRect,
-        int  RightRect,
-        int  BottomRect,
-        int  XStartArc,
-        int  YStartArc,
-        int  XEndArc,
-        int  YEndArc)
-{
-  DC *dc;
-  BOOL Ret;
-
-  dc = DC_LockDc (hDC);
-  if(!dc)
-  {
-    SetLastWin32Error(ERROR_INVALID_HANDLE);
-    return FALSE;
-  }
-  if (dc->IsIC)
-  {
-    DC_UnlockDc(dc);
-    /* Yes, Windows really returns TRUE in this case */
-    return TRUE;
-  }
-
-  if (arctype == GdiTypeArcTo)
-  {
-    // Line from current position to starting point of arc
-    if ( !IntGdiLineTo(dc, XStartArc, YStartArc) )
-    {
-      DC_UnlockDc(dc);
-      return FALSE;
-    }
-  }
-
-  Ret = IntGdiArcInternal(
-                  arctype,
-                  dc,
-                  LeftRect,
-                  TopRect,
-                  RightRect,
-                  BottomRect,
-                  XStartArc,
-                  YStartArc,
-                  XEndArc,
-                  YEndArc);
-
-  if (arctype == GdiTypeArcTo)
-  {
-    // If no error occured, the current position is moved to the ending point of the arc.
-    if(Ret)
-      IntGdiMoveToEx(dc, XEndArc, YEndArc, NULL);
-  }
-
-  DC_UnlockDc( dc );
-  return Ret;
-}
-
index 4ba7d2a..14b6287 100644 (file)
@@ -125,7 +125,7 @@ IntGdiExtEscape(
          &BitmapObj->SurfObj,
          Escape,
          InSize,
-         (PVOID)((ULONG_PTR)InData),
+         (PVOID)InData,
          OutSize,
          (PVOID)OutData);
    }
index e46b422..9e0c125 100644 (file)
@@ -24,9 +24,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <fcntl.h>
-#ifndef _WIN32
-#include <unistd.h>
-#endif
 
 #ifndef O_BINARY
 #define O_BINARY 0
index b9a9b1e..ef3800b 100644 (file)
@@ -151,7 +151,7 @@ DepMapBackend::_generate_depmap ( FILE* OUT )
        \r
        fprintf ( m_DepMapFile, "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\r\n" );\r
        fprintf ( m_DepMapFile, "<?xml-stylesheet type=\"text/xsl\" href=\"depmap.xsl\"?>\r\n" );\r
-       fprintf ( m_DepMapFile, "<components>\r\n" );\r
+       fprintf ( m_DepMapFile, "<components>" );\r
 \r
        for ( size_t i = 0; i < ProjectNode.modules.size(); i++ )\r
        {\r
@@ -162,14 +162,8 @@ DepMapBackend::_generate_depmap ( FILE* OUT )
                {\r
                        module_data * data = it->second;\r
                        \r
+                       fprintf ( m_DepMapFile, "<component name=\"%s\" base=\"%s\" ref_count=\"%u\" library_count=\"%u\">\r\n", module.name.c_str(), module.GetBasePath ().c_str (), data->references.size (), data->libraries.size () );\r
                        \r
-\r
-                       fprintf ( m_DepMapFile, "\t<component>\r\n" );\r
-                       fprintf ( m_DepMapFile, "\t\t<name>%s</name>\r\n", module.name.c_str () );\r
-                       fprintf ( m_DepMapFile, "\t\t<base>%s</base>\r\n", module.GetBasePath ().c_str () );\r
-                       fprintf ( m_DepMapFile, "\t\t<ref_count>%u</ref_count>\r\n", (unsigned int)data->references.size () );\r
-                       fprintf ( m_DepMapFile, "\t\t<lib_count>%u</lib_count>\r\n", (unsigned int)data->libraries.size () );\r
-#if 0                  \r
                        if ( data->references.size () )\r
                        {\r
                                fprintf ( m_DepMapFile, "\t<references>\r\n" );\r
@@ -189,8 +183,8 @@ DepMapBackend::_generate_depmap ( FILE* OUT )
                                }\r
                                fprintf ( m_DepMapFile, "\t</libraries>\r\n" );\r
                        }\r
-#endif\r
-                       fprintf ( m_DepMapFile, "\t</component>\r\n" );\r
+\r
+                       fprintf ( m_DepMapFile, "</component>\r\n" );\r
                }\r
        }\r
 \r
index 89dd42b..a33ee71 100644 (file)
@@ -152,7 +152,7 @@ bool FileExists(string &filename)
 void DevCppBackend::ProcessFile(string &filepath)
 {
        // Remove the .\ at the start of the filenames
-       if ((filepath[0] == '.') && (filepath[1] == '\\')) filepath.erase(0, 2);
+    if ((filepath[0] == '.') && (filepath[1] == '\\')) filepath.erase(0, 2);
 
        if(!FileExists(filepath))
                return;
index dd13928..ef0f8f1 100644 (file)
@@ -106,7 +106,7 @@ MingwBackend::CanEnablePreCompiledHeaderSupportForModule ( const Module& module
        size_t i;
        for ( i = 0; i < compilationUnits.size (); i++ )
        {
-               CompilationUnit& compilationUnit = *compilationUnits[i];
+               CompilationUnit& compilationUnit = *compilationUnits[i];
                if ( compilationUnit.files.size () != 1 )
                        return false;
        }
@@ -148,7 +148,7 @@ MingwBackend::ProcessModules ()
                MingwModuleHandler* h = MingwModuleHandler::InstanciateHandler (
                        module,
                        this );
-               h->AddImplicitLibraries ( module );
+        h->AddImplicitLibraries ( module );
                if ( use_pch && CanEnablePreCompiledHeaderSupportForModule ( module ) )
                        h->EnablePreCompiledHeaderSupport ();
                if ( module.host == HostDefault )
@@ -761,16 +761,16 @@ MingwBackend::GetNetwideAssemblerVersion ( const string& nasmCommand )
        if ( nasmCommand.find("yasm") != std::string::npos )
        {
                versionCommand = ssprintf ( "%s --version",
-                                           nasmCommand.c_str (),
-                                           NUL,
-                                           NUL );
+                                                                                  nasmCommand.c_str (),
+                                                                                  NUL,
+                                                                                  NUL );
        }
        else
        {
                versionCommand = ssprintf ( "%s -v",
-                                           nasmCommand.c_str (),
-                                           NUL,
-                                           NUL );
+                                                                                  nasmCommand.c_str (),
+                                                                                  NUL,
+                                                                                  NUL );
        }
        return GetVersionString( versionCommand );
 }
@@ -871,7 +871,7 @@ MingwBackend::IsSupportedBinutilsVersion ( const string& binutilsVersion )
 
        if ( ( ( strcmp ( binutilsVersion.c_str (), "20040902") >= 0 ) &&
               ( strcmp ( binutilsVersion.c_str (), "20041008") <= 0 ) ) ||
-              ( strcmp ( binutilsVersion.c_str (), "20031001") < 0 ) )
+              ( strcmp ( binutilsVersion.c_str (), "20031001") < 0 ) )
                return false;
        else
                return true;
@@ -1153,7 +1153,7 @@ MingwBackend::GetRegistryTargetFiles ()
                installDirectory ) );
        return system32ConfigDirectory + sSep + "default " +
                system32ConfigDirectory + sSep + "sam " +
-               system32ConfigDirectory + sSep + "security " +
+                system32ConfigDirectory + sSep + "security " +
                system32ConfigDirectory + sSep + "software " +
                system32ConfigDirectory + sSep + "system";
 }
@@ -1181,7 +1181,7 @@ MingwBackend::OutputRegistryInstallTarget ()
        fprintf ( fMakefile,
                  "\t$(MKHIVE_TARGET) boot%cbootdata %s boot%cbootdata%chiveinst.inf\n",
                  cSep, system32ConfigDirectory.c_str (),
-                 cSep, cSep );
+                  cSep, cSep );
        fprintf ( fMakefile,
                  "\n" );
 }
index 9fb6852..f713fcc 100644 (file)
@@ -535,10 +535,10 @@ void
 MingwModuleHandler::GetReferencedObjectLibraryModuleCleanTargets ( vector<string>& moduleNames ) const
 {
        for ( size_t i = 0; i < module.non_if_data.libraries.size (); i++ )
-       {
-               Library& library = *module.non_if_data.libraries[i];
+       {
+               Library& library = *module.non_if_data.libraries[i];
                if ( library.importedModule->type == ObjectLibrary )
-                       moduleNames.push_back ( GetModuleCleanTarget ( *library.importedModule ) );
+                       moduleNames.push_back ( GetModuleCleanTarget ( *library.importedModule ) );
        }
 }
 
@@ -550,7 +550,7 @@ MingwModuleHandler::GenerateCleanTarget () const
        
        fprintf ( fMakefile,
                  ".PHONY: %s_clean\n",
-                 module.name.c_str() );
+                  module.name.c_str() );
        vector<string> referencedModuleNames;
        GetReferencedObjectLibraryModuleCleanTargets ( referencedModuleNames );
        fprintf ( fMakefile,
@@ -1188,7 +1188,7 @@ MingwModuleHandler::GenerateWidlCommandsServer (
        string generatedHeaderFilename = GetRpcServerHeaderFilename ( basename );
        CLEAN_FILE(generatedHeaderFilename);
 
-       string generatedServerFilename = PassThruCacheDirectory (
+       string generatedServerFilename = PassThruCacheDirectory (
                basename + "_s.c",
                backend->intermediateDirectory );
        CLEAN_FILE(generatedServerFilename);
@@ -1239,7 +1239,7 @@ MingwModuleHandler::GenerateWidlCommandsClient (
        string generatedHeaderFilename = GetRpcClientHeaderFilename ( basename );
        CLEAN_FILE(generatedHeaderFilename);
 
-       string generatedClientFilename = PassThruCacheDirectory (
+       string generatedClientFilename = PassThruCacheDirectory (
                basename + "_c.c",
                backend->intermediateDirectory );
        CLEAN_FILE(generatedClientFilename);
@@ -1493,10 +1493,10 @@ MingwModuleHandler::GenerateCleanObjectsAsYouGoCode () const
        {
                vector<string> objectFiles;
                GetObjectsVector ( module.non_if_data,
-                                  objectFiles );
+                           objectFiles );
                vector<string> lines;
                MergeStringVector ( objectFiles,
-                                   lines );
+                               lines );
                for ( size_t i = 0; i < lines.size (); i++ )
                {
                        fprintf ( fMakefile,
@@ -1518,14 +1518,14 @@ MingwModuleHandler::GenerateRunRsymCode () const
 void
 MingwModuleHandler::GenerateRunStripCode () const
 {
-       fprintf ( fMakefile,
-                 "ifeq ($(ROS_LEAN_AND_MEAN),yes)\n" );
+    fprintf ( fMakefile,
+        "ifeq ($(ROS_LEAN_AND_MEAN),yes)\n" );
        fprintf ( fMakefile,
                  "\t$(ECHO_STRIP)\n" );
        fprintf ( fMakefile,
                  "\t${strip} -s -x -X $@\n\n" );
-       fprintf ( fMakefile,
-                 "endif\n" );
+    fprintf ( fMakefile,
+        "endif\n" );
 }
 
 void
@@ -2331,7 +2331,7 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ()
 
                string linkerParameters = ssprintf ( "-Wl,-T,%s%cntoskrnl.lnk -Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -shared",
                                                     module.GetBasePath ().c_str (),
-                                                    cSep,
+                                                     cSep,
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -3232,8 +3232,8 @@ MingwLiveIsoModuleHandler::OutputProfilesDirectoryCommands ( string& livecdDirec
 
        string livecdIni = "boot" + sSep + "bootdata" + sSep + "livecd.ini";
        OutputCopyCommand ( livecdIni,
-                           "freeldr.ini",
-                           livecdDirectory );
+                        "freeldr.ini",
+                        livecdDirectory );
 }
 
 void
@@ -3244,8 +3244,8 @@ MingwLiveIsoModuleHandler::OutputLoaderCommands ( string& livecdDirectory )
                backend->outputDirectory );
        CreateDirectory ( livecdDirectory + sSep + "loader" );
        OutputCopyCommand ( freeldr,
-                          "setupldr.sys",
-                          livecdDirectory + sSep + "loader" );
+                        "setupldr.sys",
+                        livecdDirectory + sSep + "loader" );
 }
 
 void
@@ -3260,7 +3260,7 @@ MingwLiveIsoModuleHandler::OutputRegistryCommands ( string& livecdDirectory )
        fprintf ( fMakefile,
                  "\t$(MKHIVE_TARGET) boot%cbootdata %s boot%cbootdata%clivecd.inf boot%cbootdata%chiveinst.inf\n",
                  cSep, reactosSystem32ConfigDirectory.c_str (),
-                 cSep, cSep, cSep, cSep );
+                  cSep, cSep, cSep, cSep );
 }
 
 void
index 4597f5f..0e90366 100644 (file)
@@ -791,9 +791,9 @@ MSVCBackend::_generate_dsp ( const Module& module )
 void
 MSVCBackend::_generate_dsw_header ( FILE* OUT )
 {
-       fprintf ( OUT, "Microsoft Developer Studio Workspace File, Format Version 6.00\r\n" );
-       fprintf ( OUT, "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r\n" );
-       fprintf ( OUT, "\r\n" );
+    fprintf ( OUT, "Microsoft Developer Studio Workspace File, Format Version 6.00\r\n" );
+    fprintf ( OUT, "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r\n" );
+    fprintf ( OUT, "\r\n" );
 }
 
 void
@@ -803,21 +803,21 @@ MSVCBackend::_generate_dsw_project (
        std::string dsp_file,
        const std::vector<Dependency*>& dependencies )
 {
-       dsp_file = DosSeparator ( std::string(".\\") + dsp_file );
-
+    dsp_file = DosSeparator ( std::string(".\\") + dsp_file );
+    
        // TODO FIXME - must they be sorted?
-       //@dependencies = sort(@dependencies);
-
-       fprintf ( OUT, "###############################################################################\r\n" );
-       fprintf ( OUT, "\r\n" );
-       fprintf ( OUT, "Project: \"%s\"=%s - Package Owner=<4>\r\n", module.name.c_str(), dsp_file.c_str() );
-       fprintf ( OUT, "\r\n" );
-       fprintf ( OUT, "Package=<5>\r\n" );
-       fprintf ( OUT, "{{{\r\n" );
-       fprintf ( OUT, "}}}\r\n" );
-       fprintf ( OUT, "\r\n" );
-       fprintf ( OUT, "Package=<4>\r\n" );
-       fprintf ( OUT, "{{{\r\n" );
+    //@dependencies = sort(@dependencies);
+
+    fprintf ( OUT, "###############################################################################\r\n" );
+    fprintf ( OUT, "\r\n" );
+    fprintf ( OUT, "Project: \"%s\"=%s - Package Owner=<4>\r\n", module.name.c_str(), dsp_file.c_str() );
+    fprintf ( OUT, "\r\n" );
+    fprintf ( OUT, "Package=<5>\r\n" );
+    fprintf ( OUT, "{{{\r\n" );
+    fprintf ( OUT, "}}}\r\n" );
+    fprintf ( OUT, "\r\n" );
+    fprintf ( OUT, "Package=<4>\r\n" );
+    fprintf ( OUT, "{{{\r\n" );
        for ( size_t i = 0; i < dependencies.size(); i++ )
        {
                Dependency& dependency = *dependencies[i];
@@ -860,7 +860,7 @@ MSVCBackend::_generate_wine_dsw ( FILE* OUT )
                std::string dsp_file = DspFileName ( module );
 
                // TODO FIXME - more wine hacks?
-               /*if ( module.name == "gdi32" )
+        /*if ( module.name == "gdi32" )
                {
                        for ( size_t idir = 0; idir < gdi32_dirs.size(); idir++ )
                        {
@@ -869,9 +869,9 @@ MSVCBackend::_generate_wine_dsw ( FILE* OUT )
 
                                dependencies.push_back ( Replace ( "gdi32_" + dir2, "/", "_" ) );
                        }
-               }*/
+        }*/
 
                _generate_dsw_project ( OUT, module, dsp_file, module.dependencies );
-       }
-       _generate_dsw_footer ( OUT );
+    }
+    _generate_dsw_footer ( OUT );
 }
index 31f6f63..718ee50 100644 (file)
@@ -70,7 +70,7 @@ MSVCBackend::_generate_vcproj ( const Module& module )
 {
        size_t i;
 
-       string vcproj_file = VcprojFileName(module);
+       string vcproj_file = VcprojFileName(module);
 
        string username = getenv ( "USERNAME" );
        string computername = getenv ( "COMPUTERNAME" );
@@ -345,7 +345,7 @@ MSVCBackend::_generate_vcproj ( const Module& module )
                        fprintf ( OUT, "%s", escaped.c_str() );
                }
                fprintf ( OUT, "\"\r\n" );
-               fprintf ( OUT, "\t\t\t\tForcedIncludeFiles=\"%s\"\r\n", "warning.h");
+        fprintf ( OUT, "\t\t\t\tForcedIncludeFiles=\"%s\"\r\n", "warning.h");
                fprintf ( OUT, "\t\t\t\tMinimalRebuild=\"%s\"\r\n", speed ? "FALSE" : "TRUE" );
                fprintf ( OUT, "\t\t\t\tBasicRuntimeChecks=\"%s\"\r\n", sys ? 0 : (debug ? "3" : "0") );
                fprintf ( OUT, "\t\t\t\tRuntimeLibrary=\"%d\"\r\n", debug ? 1 : 5 );    // 1=/MTd 5=/MT
@@ -630,12 +630,12 @@ MSVCBackend::_generate_vcproj ( const Module& module )
                                                fprintf ( OUT, "\t\t\t\t\t\tCommandLine=\"nasmw $(InputPath) -f coff -o &quot;$(OutDir)\\$(InputName).obj&quot;\"\r\n");
                                                fprintf ( OUT, "\t\t\t\t\t\tOutputs=\"$(OutDir)\\$(InputName).obj\"/>\r\n" );
                                        }
-                                       else if ((tolower(source_file.at(source_file.size() - 1)) == 's'))
-                                       {
-                                               fprintf ( OUT, "\t\t\t\t\t\tName=\"VCCustomBuildTool\"\r\n" );
-                                               fprintf ( OUT, "\t\t\t\t\t\tCommandLine=\"cl /E &quot;$(InputPath)&quot; %s /D__ASM__ | as -o &quot;$(OutDir)\\$(InputName).obj&quot;\"\r\n",include_string.c_str() );
-                                               fprintf ( OUT, "\t\t\t\t\t\tOutputs=\"$(OutDir)\\$(InputName).obj\"/>\r\n" );
-                                       }
+                    else if ((tolower(source_file.at(source_file.size() - 1)) == 's'))
+                    {
+                        fprintf ( OUT, "\t\t\t\t\t\tName=\"VCCustomBuildTool\"\r\n" );
+                        fprintf ( OUT, "\t\t\t\t\t\tCommandLine=\"cl /E &quot;$(InputPath)&quot; %s /D__ASM__ | as -o &quot;$(OutDir)\\$(InputName).obj&quot;\"\r\n",include_string.c_str() );
+                        fprintf ( OUT, "\t\t\t\t\t\tOutputs=\"$(OutDir)\\$(InputName).obj\"/>\r\n" );
+                    }
                                        fprintf ( OUT, "\t\t\t\t</FileConfiguration>\r\n" );
                                }
                        //}
index 7c00a32..bc6a33f 100644 (file)
@@ -43,7 +43,7 @@ Bootstrap::IsSupportedModuleType ( ModuleType type )
        {
                case Kernel:
                case KernelModeDLL:
-               case ExportDriver:
+        case ExportDriver:
                case NativeDLL:
                case NativeCUI:
                case Win32DLL:
index ec7c211..2b521fd 100644 (file)
@@ -31,40 +31,40 @@ char cBadSep;
 void
 InitializeEnvironment ()
 {
-       char *SepValue, *ExePostfixValue, *ExePrefixValue;;
+        char *SepValue, *ExePostfixValue, *ExePrefixValue;;
 
-       SepValue = getenv ( "SEP" );
-       if ( SepValue && ( 0 == strcmp ( SepValue, DEF_SSEP ) || 0 == strcmp ( SepValue, DEF_SBAD_SEP ) ) )
-       {
-               cSep = SepValue[0];
-               sSep = SepValue;
-       }
-       else
-       {
-               cSep = DEF_CSEP;
-               sSep = DEF_SSEP;
-       }
-       if ( cSep == DEF_CSEP )
-       {
-               cBadSep = DEF_CBAD_SEP;
-               sBadSep = DEF_SBAD_SEP;
-       }
-       else
-       {
-               cBadSep = DEF_CSEP;
-               sBadSep = DEF_SSEP;
-       }
-       ExePostfixValue = getenv ( "EXEPOSTFIX" );
-       ExePrefixValue = getenv ( "EXEPREFIX" );
-       if ( ( ExePostfixValue == NULL || 0 == strlen ( ExePostfixValue ) ) &&
-            ( ExePrefixValue == NULL || 0 == strlen ( ExePrefixValue ) ) )
-       {
-               ExePostfix = DEF_EXEPOSTFIX;
-               ExePrefix = DEF_EXEPREFIX;
-       }
-       else
-       {
-               ExePostfix = ExePostfixValue ? ExePostfixValue : "";
-               ExePrefix = ExePrefixValue ? ExePrefixValue : "";
-       }
+        SepValue = getenv ( "SEP" );
+        if ( SepValue && ( 0 == strcmp ( SepValue, DEF_SSEP ) || 0 == strcmp ( SepValue, DEF_SBAD_SEP ) ) )
+        {
+            cSep = SepValue[0];
+            sSep = SepValue;
+        }
+        else
+        {
+            cSep = DEF_CSEP;
+            sSep = DEF_SSEP;
+        }
+        if ( cSep == DEF_CSEP )
+        {
+            cBadSep = DEF_CBAD_SEP;
+            sBadSep = DEF_SBAD_SEP;
+        }
+        else
+        {
+            cBadSep = DEF_CSEP;
+            sBadSep = DEF_SSEP;
+        }
+        ExePostfixValue = getenv ( "EXEPOSTFIX" );
+        ExePrefixValue = getenv ( "EXEPREFIX" );
+        if ( ( ExePostfixValue == NULL || 0 == strlen ( ExePostfixValue ) ) &&
+             ( ExePrefixValue == NULL || 0 == strlen ( ExePrefixValue ) ) )
+        {
+            ExePostfix = DEF_EXEPOSTFIX;
+            ExePrefix = DEF_EXEPREFIX;
+        }
+        else
+        {
+            ExePostfix = ExePostfixValue ? ExePostfixValue : "";
+            ExePrefix = ExePrefixValue ? ExePrefixValue : "";
+        }
 }
index 0b1e1a3..4fee8b0 100644 (file)
@@ -785,8 +785,8 @@ Module::GetModuleType ( const string& location, const XMLAttribute& attribute )
                return Kernel;
        if ( attribute.value == "kernelmodedll" )
                return KernelModeDLL;
-       if ( attribute.value == "exportdriver" )
-               return ExportDriver;
+    if ( attribute.value == "exportdriver" )
+        return ExportDriver;
        if ( attribute.value == "kernelmodedriver" )
                return KernelModeDriver;
        if ( attribute.value == "nativedll" )
@@ -855,7 +855,7 @@ Module::GetDefaultModuleExtension () const
                        return ".dll";
                case KernelModeDriver:
                case BootLoader:
-               case ExportDriver:
+        case ExportDriver:
                        return ".sys";
                case BootSector:
                        return ".o";
@@ -887,8 +887,8 @@ Module::GetDefaultModuleEntrypoint () const
                case Kernel:
                        return "NtProcessStartup";
                case KernelModeDLL:
-               case KernelModeDriver:
-               case ExportDriver:
+        case KernelModeDriver:
+        case ExportDriver:
                        return "DriverEntry@8";
                case NativeDLL:
                        return "DllMainCRTStartup@12";
@@ -947,7 +947,7 @@ Module::GetDefaultModuleBaseaddress () const
                        return "0x00400000";
                case KernelModeDLL:
                case KernelModeDriver:
-               case ExportDriver:
+        case ExportDriver:
                        return "0x00010000";
                case BuildTool:
                case StaticLibrary:
@@ -982,10 +982,10 @@ Module::IsDLL () const
        {
                case Kernel:
                case KernelModeDLL:
-               case ExportDriver:
+        case ExportDriver:
                case NativeDLL:
                case Win32DLL:
-                       return true;
+            return true;
                case KernelModeDriver:
                case NativeCUI:
                case Win32CUI:
@@ -1019,7 +1019,7 @@ Module::GenerateInOutputTree () const
        {
                case Kernel:
                case KernelModeDLL:
-               case ExportDriver:
+        case ExportDriver:
                case NativeDLL:
                case Win32DLL:
                case KernelModeDriver:
@@ -1514,7 +1514,7 @@ AutoRegister::IsSupportedModuleType ( ModuleType type )
                        return true;
                case Kernel:
                case KernelModeDLL:
-               case ExportDriver:
+        case ExportDriver:
                case NativeDLL:
                case NativeCUI:
                case Win32CUI:
index b38eee6..181defe 100644 (file)
@@ -227,6 +227,7 @@ Project::WriteConfigurationFile ()
 void
 Project::ExecuteInvocations ()
 {
+       fprintf( stderr, "ExecuteInvocations\n" );
        for ( size_t i = 0; i < modules.size (); i++ )
                modules[i]->InvokeModule ();
 }
index e844727..e49f3ad 100644 (file)
@@ -256,13 +256,13 @@ main ( int argc, char** argv )
                printf ( "  -vo{version|configuration} Adds subdirectory path to the default Intermediate-Outputdirectory.\n" );
                printf ( "\n" );
                printf ( "  buildsystem   Target build system. Can be one of:\n" );
-
-               std::map<std::string,Backend::Factory*>::iterator iter;
-               for (iter = Backend::Factory::map_begin(); iter != Backend::Factory::map_end(); iter++)
-               {
-                       Backend::Factory *factory = iter->second;
-                       printf ( "                %-10s %s\n", factory->Name(), factory->Description());
-               }
+               std::map<std::string,Backend::Factory*>::iterator iter;
+               for (iter = Backend::Factory::map_begin(); iter != Backend::Factory::map_end(); iter++)
+               {
+                       Backend::Factory *factory = iter->second;
+                       printf ( "                %-10s %s\n", factory->Name(), factory->Description());
+               }
                return 1;
        }
        try
index ce89155..a60f960 100644 (file)
@@ -101,12 +101,12 @@ SysSetupGenerator::Generate ( HINF inf,
                InfHostCloseFile ( inf );
        }
 
-       if ( 0 != InfHostAddLine ( context, NULL ) ||
-            0 != InfHostAddField ( context, GetDirectoryId ( module ).c_str () ) ||
-            0 != InfHostAddField ( context, "" ) ||
-            0 != InfHostAddField ( context, module.installName.c_str () ) ||
-            0 != InfHostAddField ( context, GetFlags ( module ).c_str () ) )
-       {
+      if ( 0 != InfHostAddLine ( context, NULL ) ||
+           0 != InfHostAddField ( context, GetDirectoryId ( module ).c_str () ) ||
+           0 != InfHostAddField ( context, "" ) ||
+           0 != InfHostAddField ( context, module.installName.c_str () ) ||
+           0 != InfHostAddField ( context, GetFlags ( module ).c_str () ) )
+        {
                InfHostFreeContext ( context );
                InfHostCloseFile ( inf );
                throw InvalidOperationException ( __FILE__,
index c27cf7e..bf7442c 100644 (file)
@@ -409,7 +409,7 @@ TestSupportCode::WriteStartupFile ( Module& module )
        s = s + sprintf ( s, "{\n" );
        s = s + sprintf ( s, "  _SetPriorityClass(_GetCurrentProcess(), HIGH_PRIORITY_CLASS);\n" );
        s = s + sprintf ( s, "  _SetThreadPriority(_GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);\n" );
-       s = s + sprintf ( s, "  InitializeTests();\n" );
+       s = s + sprintf ( s, "  InitializeTests();\n" );
        s = s + sprintf ( s, "  RegisterTests();\n" );
        s = s + sprintf ( s, "  SetupOnce();\n" );
        s = s + sprintf ( s, "  PerformTests(ConsoleWrite, NULL);\n" );
index 4eb0143..7812917 100755 (executable)
@@ -47,8 +47,8 @@
                                                        <TD> Implemented </TD>
                                                        <TD> <IMG src="sc.gif"/> </TD>
                                                        <TD> Complete </TD>
-                                               </TR>
                                                <TR>
+                                               </TR>
                                                        <TD> <IMG src="f.gif"/> </TD>
                                                        <TD> Function </TD>
                                                        <TD> <IMG src="u.gif"/> </TD>
index 0942b44..9b5f9eb 100644 (file)
@@ -133,9 +133,9 @@ namespace System_
                        TCHAR * offset = szBuffer;
 #endif
                        total_length = 0;
-                       while((ptr = _tcsstr(offset, _T("\x0D\x0A"))) != NULL)
+                       while(ptr = _tcsstr(offset, _T("\x0D\x0A")))
                        {
-                               long long length = ((long long)ptr - (long long)offset);
+                               int length = ((unsigned)ptr - (unsigned)offset);
                                length /= sizeof(TCHAR);
 
                                offset[length] = _T('\0');
index c42df19..08aef12 100644 (file)
@@ -5,7 +5,7 @@
  * FILE:        tools/sysreg/namedpipe_reader.cpp
  * PURPOSE:     pipe reader support
  * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
- *              Christoph von Wittich (Christoph_vW@ReactOS.org)
+ *                             Christoph von Wittich (Christoph@ApiViewer.de)
  */
 
 #include "namedpipe_reader.h"
@@ -20,7 +20,7 @@ namespace System_
 
        using std::vector;
 //---------------------------------------------------------------------------------------
-       NamedPipeReader::NamedPipeReader() : h_Pipe(NULLVAL)
+       NamedPipeReader::NamedPipeReader() : h_Pipe(NULL)
        {
 
        }
@@ -35,13 +35,15 @@ namespace System_
 
        bool NamedPipeReader::openPipe(string const & PipeCmd)
        {
-               if (h_Pipe != NULLVAL)
+               if (h_Pipe != NULL)
                {
                        cerr << "NamedPipeReader::openPipe> pipe already open" << endl;
                        return false;
                }
 
-#ifdef WIN32
+#ifdef __LINUX__
+
+#else
                h_Pipe = CreateFile(PipeCmd.c_str(),
                        GENERIC_WRITE | GENERIC_READ,
                        0,
@@ -53,7 +55,6 @@ namespace System_
 
                if(INVALID_HANDLE_VALUE == h_Pipe) {
                        cerr << "NamedPipeReader::openPipe> failed to open pipe " << PipeCmd << GetLastError() << endl;
-                       h_Pipe = NULLVAL;
                        return false;
                }
                else
@@ -65,19 +66,7 @@ namespace System_
                ConnectNamedPipe(
                        h_Pipe,
                        0);
-#else
-               h_Pipe = open("PipeCmd.c_str()", O_RDONLY);
 
-               if(INVALID_HANDLE_VALUE == h_Pipe) {
-                       cerr << "NamedPipeReader::openPipe> failed to open pipe " << PipeCmd << endl;
-                       h_Pipe = NULLVAL;
-                       return false;
-               }
-               else
-               {
-                       cout << "NamedPipeReader::openPipe> successfully opened pipe" << endl;
-                       return true;
-               }
 #endif
 
        }
@@ -93,14 +82,14 @@ namespace System_
                }
 
 
-#ifndef WIN32
-               close(h_Pipe);
+#ifdef __LINUX__
+
 #else
                DisconnectNamedPipe(h_Pipe);
                CloseHandle(h_Pipe);
 #endif
 
-               h_Pipe = NULLVAL;
+               h_Pipe = NULL;
                return true;
        }
 //---------------------------------------------------------------------------------------
@@ -204,7 +193,7 @@ namespace System_
                localbuf = (char*) HeapAlloc(GetProcessHeap(), 0, localsize * sizeof(char));
 #ifdef UNICODE
                wchar_t * wbuf = (WCHAR*) HeapAlloc(GetProcessHeap(), 0, localsize * sizeof(wchar_t));
-#endif /* UNICODE */
+#endif
                if (localbuf != NULL)
                {
                        bool append_line = false;
@@ -216,7 +205,7 @@ namespace System_
                                        ZeroMemory(localbuf, localsize * sizeof(char));
 #ifdef UNICODE
                                        ZeroMemory(wbuf, localsize * sizeof(wchar_t));
-#endif /* UNICODE */
+#endif
 
                                        fSuccess = ReadFile( 
                                                h_Pipe,
@@ -233,9 +222,9 @@ namespace System_
                                        {
                                                extractLines(wbuf, vect, append_line, cbRead);
                                        }
-#else /* UNICODE */
+#else
                                        extractLines(localbuf, vect, append_line, cbRead);
-#endif /* UNICODE */
+#endif
 
                                } while (!fSuccess);  // repeat loop if ERROR_MORE_DATA 
                        } while (append_line);
@@ -246,52 +235,13 @@ namespace System_
                        HeapFree(GetProcessHeap(), 0, localbuf);
 #ifdef UNICODE
                        HeapFree(GetProcessHeap(), 0, wbuf);
-#endif /* UNICODE */
+#endif
                }
                else
                {
                        return 0;
                }
-
-#else /* WIN32 */
-
-       localbuf = (char*) malloc(localsize * sizeof(char));            
-       if (localbuf != NULL)
-       {
-
-               DWORD cbRead;
-
-               bool append_line = false;
-               do
-               {
-                       do 
-                       { 
-                               memset(localbuf, 0, localsize * sizeof(char));
-
-                               cbRead = read(h_Pipe,
-                                               localbuf,
-                                               (localsize-1) * sizeof(char));
-                                
-                               if (cbRead > 0)
-                               {
-                                       extractLines(localbuf, vect, append_line, cbRead);
-                               }
-
-                       } while (!cbRead);  // repeat loop as long as there is data to read 
-               } while (append_line);
-
-               if (cbRead < 0)
-                       return 0;
-
-
-               free(localbuf);
-       }
-       else
-       {
-               return 0;
-       }
-
-#endif /* WIN32 */
+#endif
 
        return (vect.size () - lines);
        }
index bf95c69..8b3dccc 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 
-#if defined(WIN32)
-#include <windows.h>
-#define NULLVAL NULL
-#else
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#define NULLVAL 0
-#define DWORD unsigned long
-#define HANDLE long
-#ifndef INVALID_HANDLE_VALUE
-#define INVALID_HANDLE_VALUE -1
-#endif
+#ifdef __LINUX__
+
+#elif defined(WIN32)
+       #include <windows.h>
 #endif
 
 namespace System_
@@ -120,6 +110,8 @@ protected:
        void extractLines(TCHAR * buffer, std::vector<string> & vect, bool & append_line, unsigned long cbRead);
 
 
+
+
        HANDLE h_Pipe;
 
        }; // end of class NamedPipeReader
index 8c5b183..19f0326 100644 (file)
@@ -11,7 +11,7 @@
 
 #include "rosboot_test.h"
 #include "pipe_reader.h"
-#include "namedpipe_reader.h"
+//#include "namedpipe_reader.h"
 //#include "sym_file.h"
 #include "file_reader.h"
 #include "os_support.h"
@@ -31,8 +31,10 @@ namespace Sysreg_
 {
        using std::vector;
        using System_::PipeReader;
+#if 0
        using System_::NamedPipeReader;
-/*     using System_::SymbolFile; */
+       using System_::SymbolFile;
+#endif
        using System_::FileReader;
        using System_::OsSupport;
 
@@ -347,8 +349,8 @@ namespace Sysreg_
                /// FIXME
                /// split up arguments
 
-
                OsSupport::ProcessID pid = OsSupport::createProcess ((TCHAR*)boot_cmd.c_str (), 0, NULL); 
+#if 0          
                string::size_type pipe_pos = boot_cmd.find (_T("serial pipe:"));
 
                NamedPipeReader namedpipe_reader;
@@ -438,7 +440,7 @@ namespace Sysreg_
                }
                _sleep(3* CLOCKS_PER_SEC);
                OsSupport::terminateProcess (pid);
-
+#endif
                return ret;
        }
 //---------------------------------------------------------------------------------------
index 9f8f889..17b2a4a 100644 (file)
 
 #include "reg_test.h"
 #include <vector>
-#ifndef WIN32
-#include <unistd.h>
-#define _sleep sleep
-#endif
 
 namespace Sysreg_
 {
index e50085e..ee36f7f 100644 (file)
@@ -22,7 +22,6 @@ SYSREGBUILD_SOURCES = $(addprefix $(SYSREGBUILD_BASE_),\
        conf_parser.cpp \
        env_var.cpp \
        pipe_reader.cpp \
-       namedpipe_reader.cpp \
        rosboot_test.cpp \
        sysreg.cpp \
        file_reader.cpp \
@@ -88,4 +87,4 @@ $(SYSREGBUILD_INT_)unicode.o: $(SYSREGBUILD_BASE_)unicode.cpp | $(SYSREGBUILD_IN
 .PHONY: sysregbuild_clean
 sysreg_clean:
        -@$(rm) $(SYSREGBUILD_TARGET) $(SYSREGBUILD_OBJECTS) 2>$(NUL)
-clean: sysreg_clean
+clean: sysreg_clean
\ No newline at end of file
index cbc5f41..1ef5a12 100644 (file)
@@ -56,8 +56,8 @@ include tools/rgenstat/rgenstat.mak
 include tools/rsym.mak
 include tools/sysreg/sysreg.mak
 include tools/unicode/unicode.mak
-include tools/wpp/wpp.mak
 include tools/widl/widl.mak
 include tools/winebuild/winebuild.mak
 include tools/wmc/wmc.mak
+include tools/wpp/wpp.mak
 include tools/wrc/wrc.mak
\ No newline at end of file
index 4786e9a..8589b3c 100644 (file)
@@ -819,7 +819,7 @@ static void handle_ani_list(riff_tag_t *lst, enum res_e type, int isswapped)
                                       isprint(rtp->tag[2]) ? rtp->tag[2] : '.',
                                       isprint(rtp->tag[3]) ? rtp->tag[3] : '.');
 
-               if((LONG_PTR)rtp & 1)
+               if((UINT_PTR)rtp & 1)
                        rtp = SKIP_TAG(rtp,1);
        }
 }
@@ -929,7 +929,7 @@ ani_curico_t *new_ani_curico(enum res_e type, raw_data_t *rd, int *memopt)
                                       isprint(rtp->tag[2]) ? rtp->tag[2] : '.',
                                       isprint(rtp->tag[3]) ? rtp->tag[3] : '.');
 
-                       if((LONG_PTR)rtp & 1)
+                       if((UINT_PTR)rtp & 1)
                                rtp = SKIP_TAG(rtp,1);
                }
 
diff --git a/rosapps/devutils/cputointel/AnyalsingProcess.c b/rosapps/devutils/cputointel/AnyalsingProcess.c
deleted file mode 100644 (file)
index cf3190a..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "misc.h"
-#include "any_op.h"
-
-
-CPU_INT AnyalsingProcess()
-{
-    /* FIXME it will set a name to the memory if we got one */
-
-    /* FIXME build the jump table */
-
-    return 0;
-}
-
-
diff --git a/rosapps/devutils/cputointel/ConvertToIA32Process.c b/rosapps/devutils/cputointel/ConvertToIA32Process.c
deleted file mode 100644 (file)
index c0df5e5..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-
-#include <windows.h>
-#include <winnt.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "misc.h"
-#include "any_op.h"
-
-/*
- * eax = register 3
- * edx = register 4
- * esp = register 1
- * ebp = register 31
-
- * ecx = 8
- * ebx = 9
- * esi = 10
- * edi = 11
- * mmx/sse/fpu 0 = 12
- * mmx/sse/fpu 1 = 14
- * mmx/sse/fpu 2 = 16
- * mmx/sse/fpu 3 = 18
- * mmx/sse/fpu 4 = 20
- * mmx/sse/fpu 5 = 22
- * mmx/sse/fpu 6 = 24
- * mmx/sse/fpu 7 = 28
- */
-
-static void standardreg(CPU_INT *RegTableCount, CPU_INT reg, CPU_INT setup_ebp, FILE *outfp)
-{
-    /* eax */
-    if (reg == RegTableCount[3])
-    {
-        fprintf(outfp,"eax");
-    }
-    /* ebp */
-    else if (reg == RegTableCount[31])
-    {
-        fprintf(outfp,"ebp");
-    }
-    /* edx */
-    else if (reg == RegTableCount[4])
-    {
-        fprintf(outfp,"edx");
-    }
-    /* esp */
-    else if (reg == RegTableCount[1])
-    {
-        fprintf(outfp,"esp");
-    }
-    /* ecx */
-    else if (reg == RegTableCount[8])
-    {
-        fprintf(outfp,"ecx");
-    }
-    /* ebx */
-    else if (reg == RegTableCount[9])
-    {
-        fprintf(outfp,"ebx");
-    }
-    /* esi */
-    else if (reg == RegTableCount[10])
-    {
-        fprintf(outfp,"esi");
-    }
-    /* edi */
-    else if (reg == RegTableCount[11])
-    {
-        fprintf(outfp,"edi");
-    }
-    else
-    {
-        if (setup_ebp == 1)
-            fprintf(outfp,"dword [ebx - %d]");
-        else
-            fprintf(outfp,"; unsuported should not happen it happen :(\n");
-    }
-}
-
-CPU_INT ConvertToIA32Process( FILE *outfp,
-                               PMYBrainAnalys pMystart, 
-                               PMYBrainAnalys pMyend, CPU_INT regbits,
-                               CPU_INT HowManyRegInUse,
-                               CPU_INT *RegTableCount)
-{
-
-    CPU_INT stack = 0;
-    CPU_UNINT tmp;
-    CPU_INT setup_ebp = 0 ; /* 0 = no, 1 = yes */
-    CPU_INT t=0;
-
-    /* Fixme optimze the RegTableCount table  */
-
-    //if (HowManyRegInUse > 9)
-    if (HowManyRegInUse > 8)
-    {
-        setup_ebp =1; /* we will use ebx as ebp */
-        stack = HowManyRegInUse * regbits;
-    }
-
-    if (RegTableCount[1]!=0)
-        t++;
-    if (RegTableCount[3]!=0)
-        t++;
-    if (RegTableCount[4]!=0)
-        t++;
-    if (RegTableCount[8]!=0)
-        t++;
-    if (RegTableCount[9]!=0)
-        t++;
-    if (RegTableCount[10]!=0)
-        t++;
-    if (RegTableCount[11]!=0)
-        t++;
-    if (RegTableCount[31]!=0)
-        t++;
-
-    if (HowManyRegInUse != t)
-    {
-        /* fixme optimze the table or active the frame pointer */
-        setup_ebp =1; /* we will use ebx as ebp */
-        stack = HowManyRegInUse * regbits;
-    }
-
-    fprintf(outfp,"BITS 32\n");
-    fprintf(outfp,"GLOBAL _main\n");
-    fprintf(outfp,"SECTION .text\n\n");
-    fprintf(outfp,"; compile with nasm filename.asm -f win32, ld filename.obj -o filename.exe\n\n");
-    fprintf(outfp,"_main:\n");
-
-    /* setup a frame pointer */
-
-    if (setup_ebp == 1)
-    {
-        fprintf(outfp,"\n; Setup frame pointer \n");
-        fprintf(outfp,"push ebx\n");
-        fprintf(outfp,"mov  ebx,esp\n");
-        fprintf(outfp,"sub  esp, %d ; Alloc %d bytes for reg\n\n",stack,stack);
-    }
-
-
-    fprintf(outfp,"; Start the program \n");
-    while (pMystart!=NULL)
-    {
-        /* fixme the line lookup from anaylysing process */
-
-        /* mov not full implement */
-        if (pMystart->op == OP_ANY_mov)
-        {
-            printf("waring OP_ANY_mov are not full implement\n");
-
-            if ((pMystart->type & 8)== 8)
-            {
-                /* dst are register */
-                tmp = stack - (pMystart->dst*regbits);
-
-                if ((pMystart->type & 2)== 2)
-                {
-                        fprintf(outfp,"mov ");
-                        standardreg( RegTableCount,
-                                     pMystart->dst,
-                                     setup_ebp, outfp);
-                        fprintf(outfp," , ");
-                        standardreg( RegTableCount,
-                                     pMystart->src,
-                                     setup_ebp, outfp);
-                        fprintf(outfp,"\n");
-
-                }
-                if ((pMystart->type & 16)== 16)
-                {
-                    /* source are imm */
-                    if ((pMystart->src == 0) &&
-                        (setup_ebp == 0))
-                    {
-                        /* small optimze */
-                        fprintf(outfp,"xor ");
-                        standardreg( RegTableCount,
-                                     pMystart->dst,
-                                     setup_ebp, outfp);
-                        fprintf(outfp,",");
-                        standardreg( RegTableCount,
-                                     pMystart->dst,
-                                     setup_ebp, outfp);
-                        fprintf(outfp,"\n");
-                    }
-                    else
-                    {
-                        fprintf(outfp,"mov ");
-                        standardreg( RegTableCount,
-                                     pMystart->dst,
-                                     setup_ebp, outfp);
-                        fprintf(outfp,",%llu\n",pMystart->src);
-                    }
-                } /* end "source are imm" */
-            } /* end pMyBrainAnalys->type & 8 */
-
-            if ((pMystart->type & 64)== 64)
-            {
-                if ((pMystart->type & 2)== 2)
-                {
-                    /* dest [eax - 0x20], source reg */
-                    
-                    fprintf(outfp,"mov dword [");
-                    standardreg( RegTableCount,
-                                 pMystart->dst,
-                                 setup_ebp, outfp);
-                    if (pMystart->dst_extra>=0)
-                        fprintf(outfp," +%d], ",pMystart->dst_extra);
-                    else
-                        fprintf(outfp," %d], ",pMystart->dst_extra);
-
-                    standardreg( RegTableCount,
-                                 pMystart->src,
-                                 setup_ebp, outfp);
-                    fprintf(outfp,"\n");
-
-                   if ((pMystart->type & 128)== 128)
-                   {
-                        fprintf(outfp,"mov ");
-                        standardreg( RegTableCount,
-                                     pMystart->src,
-                                     setup_ebp, outfp);
-                        fprintf(outfp," , ");
-                        standardreg( RegTableCount,
-                                     pMystart->dst,
-                                     setup_ebp, outfp);
-                        fprintf(outfp," %d\n",pMystart->dst_extra);
-                   }
-                }
-            }
-
-
-
-
-        }
-
-        /* return */
-        if (pMystart->op == OP_ANY_ret)
-        {
-            if (pMyBrainAnalys->ptr_next == NULL)
-            {
-               if (setup_ebp == 1)
-               {
-                    fprintf(outfp,"\n; clean up after the frame \n");
-                    fprintf(outfp,"mov esp, ebx\n");
-                    fprintf(outfp,"pop ebx\n");
-               }
-            }
-            fprintf(outfp,"ret\n");
-        }
-        if (pMystart == pMyend)
-            pMystart=NULL;
-        else
-            pMystart = (PMYBrainAnalys) pMystart->ptr_next;
-        
-    }
-    return 0;
-}
diff --git a/rosapps/devutils/cputointel/ConvertToPPCProcess.c b/rosapps/devutils/cputointel/ConvertToPPCProcess.c
deleted file mode 100644 (file)
index d8b3ad0..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-
-#include <windows.h>
-#include <winnt.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "misc.h"
-#include "any_op.h"
-
-static void standardreg(CPU_INT *RegTableCount, CPU_UNINT reg,
-                        CPU_INT setup_ebp, FILE *outfp)
-{
-    CPU_INT t, found = 0;
-    for (t=0;t<31;t++)
-    {
-        if (reg == RegTableCount[t])
-        {
-            fprintf(outfp,"r%d",t);
-            found++;
-            break;
-        }
-    }
-
-    if (found == 0)
-    {
-        fprintf(outfp,"r%d",reg);
-    }
-}
-
-CPU_INT ConvertToPPCProcess( FILE *outfp, 
-                               PMYBrainAnalys pMystart, 
-                               PMYBrainAnalys pMyend, CPU_INT regbits,
-                               CPU_INT HowManyRegInUse,
-                               CPU_INT *RegTableCount)
-{
-
-    CPU_INT stack = 0;
-    //CPU_UNINT tmp;
-    CPU_INT setup_ebp = 0 ; /* 0 = no, 1 = yes */
-    CPU_INT t=0;
-
-    if (HowManyRegInUse > 31)
-    {
-        setup_ebp =1; /* we will use ebx as ebp */
-        stack = HowManyRegInUse * regbits;
-    }
-
-    if (RegTableCount[1]!=0)
-        t++;
-    if (RegTableCount[3]!=0)
-        t++;
-    if (RegTableCount[4]!=0)
-        t++;
-    if (RegTableCount[8]!=0)
-        t++;
-    if (RegTableCount[9]!=0)
-        t++;
-    if (RegTableCount[10]!=0)
-        t++;
-    if (RegTableCount[11]!=0)
-        t++;
-    if (RegTableCount[31]!=0)
-        t++;
-
-    if (HowManyRegInUse != t)
-    {
-        /* fixme optimze the table or active the frame pointer */
-        setup_ebp =1; /* we will use ebx as ebp */
-        stack = HowManyRegInUse * regbits;
-    }
-
-
-/*  fixme gas compatible 
-    fprintf(outfp,"BITS 32\n");
-    fprintf(outfp,"GLOBAL _main\n");
-    fprintf(outfp,"SECTION .text\n\n");
-    fprintf(outfp,"; compile with nasm filename.asm -f win32, ld filename.obj -o filename.exe\n\n");
-    fprintf(outfp,"_main:\n");
-*/
-
-    /* setup a frame pointer */
-    if (setup_ebp == 1)
-    {
-        /* fixme ppc frame pointer */
-        // fprintf(outfp,"\n; Setup frame pointer \n");
-    }
-
-    fprintf(outfp,"; Start the program \n");
-    while (pMystart!=NULL)
-    {
-        /* fixme the line lookup from anaylysing process */
-
-        /* mov not full implement */
-        if (pMystart->op == OP_ANY_mov)
-        {
-            printf("waring OP_ANY_mov are not full implement\n");
-
-            if ((pMystart->type & 8)== 8)
-            {
-                /* dst are register */
-                // FIXME frame pointer setup
-                // tmp = stack - (pMystart->dst*regbits);
-
-                if ((pMystart->type & 2)== 2)
-                {
-                    fprintf(outfp,"mr ");
-                    standardreg( RegTableCount,
-                                 pMystart->dst,
-                                 setup_ebp, outfp);
-                    fprintf(outfp,",");
-                    standardreg( RegTableCount,
-                                 pMystart->src,
-                                 setup_ebp, outfp);
-                    fprintf(outfp,"\n");
-                }
-
-                if ((pMystart->type & 16)== 16)
-                {
-                    /* source are imm */
-                    if (setup_ebp == 1)
-                        fprintf(outfp,"not supporet\n");
-                    else
-                    {
-                        fprintf(outfp,"li ");
-                        standardreg( RegTableCount,
-                                     pMystart->dst,
-                                     setup_ebp, outfp);
-                        fprintf(outfp," , %llu\n",pMystart->src);
-                    }
-                }
-            } /* end pMyBrainAnalys->type & 8 */
-            
-            if ((pMystart->type & 64)== 64)
-            {
-                if ((pMystart->type & 2)== 2)
-                {
-                    /* dest [eax - 0x20], source reg */
-                    if ((pMystart->type & 128)== 128)
-                    {
-                         fprintf(outfp,"stwu ");
-                    }
-                    else
-                    {
-                        fprintf(outfp,"stw ");
-                    }
-
-                    standardreg( RegTableCount,
-                                 pMystart->src,
-                                 setup_ebp, outfp);
-                    fprintf(outfp,", %d(",pMystart->dst_extra);
-                    
-                    standardreg( RegTableCount,
-                                 pMystart->dst,
-                                 setup_ebp, outfp);
-                    fprintf(outfp,")\n");
-                }
-            } /* end pMyBrainAnalys->type & 64 */
-        }
-
-        /* return */
-        if (pMystart->op == OP_ANY_ret)
-        {
-            if (pMyBrainAnalys->ptr_next == NULL)
-            {
-               if (setup_ebp == 1)
-               {
-                    // FIXME end our own frame pointer 
-                    fprintf(outfp,"\n; clean up after the frame \n");
-               }
-            }
-            fprintf(outfp,"blr\n");
-        }
-        if (pMystart == pMyend)
-            pMystart=NULL;
-        else
-            pMystart = (PMYBrainAnalys) pMystart->ptr_next;
-    }
-    return 0;
-}
diff --git a/rosapps/devutils/cputointel/ConvertingProcess.c b/rosapps/devutils/cputointel/ConvertingProcess.c
deleted file mode 100644 (file)
index a775b7c..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-#include <windows.h>
-#include <winnt.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "misc.h"
-#include "any_op.h"
-
-/* hack should be in misc.h*/
-
-
-CPU_INT ConvertProcess(FILE *outfp, CPU_INT FromCpuid, CPU_INT ToCpuid)
-{
-    CPU_INT ret=0;
-   CPU_INT regbits=-1;
-   CPU_INT HowManyRegInUse = 0;
-   CPU_INT RegTableCount[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-   CPU_INT t;
-   PMYBrainAnalys pMystart = pStartMyBrainAnalys;
-   PMYBrainAnalys pMyend = pMyBrainAnalys;
-
-   PMYBrainAnalys ptmpMystart = pStartMyBrainAnalys;
-   PMYBrainAnalys ptmpMyend = pMyBrainAnalys;
-
-   if ( (FromCpuid == IMAGE_FILE_MACHINE_POWERPC) ||
-        (FromCpuid == IMAGE_FILE_MACHINE_I386))
-    {
-        regbits = 32 / 8;
-    }
-
-    /* FIXME calc where todo first split */
-
-   /* count how many register we got */
-    ptmpMystart = pMystart;
-    ptmpMyend = pMyend;
-    while (ptmpMystart!=NULL)
-    {
-        if ((ptmpMystart->type & 2) == 2)
-            RegTableCount[ptmpMystart->src]++;
-
-        if ((ptmpMystart->type & 8) == 8)
-            RegTableCount[ptmpMystart->dst]++;
-
-        if ((ptmpMystart->type & 32) == 32)
-            RegTableCount[ptmpMystart->src]++;
-
-        if ((ptmpMystart->type & 64) == 64)
-            RegTableCount[ptmpMystart->dst]++;
-
-        if (ptmpMystart == ptmpMyend)
-            ptmpMystart=NULL;
-        else
-            ptmpMystart = (PMYBrainAnalys) ptmpMystart->ptr_next;
-    }
-
-    for (t=0;t<=31;t++)
-    {
-        if (RegTableCount[t]!=0)
-        {
-            HowManyRegInUse++;
-            RegTableCount[t]=t;
-        }
-    }
-
-
-    /* switch to the acual converting now */
-    switch (ToCpuid)
-    {
-        case IMAGE_FILE_MACHINE_I386:
-             ret = ConvertToIA32Process( outfp, pMystart, 
-                                         pMyend, regbits,
-                                         HowManyRegInUse,
-                                         RegTableCount);
-             if (ret !=0)
-             {
-                 printf("should not happen contact a devloper, x86 fail\n");
-                 return -1;
-             }
-             break;
-
-        case IMAGE_FILE_MACHINE_POWERPC:
-             ret = ConvertToPPCProcess( outfp, pMystart, 
-                                        pMyend, regbits,
-                                        HowManyRegInUse,
-                                        RegTableCount);
-             if (ret !=0)
-             {
-                 printf("should not happen contact a devloper, x86 fail\n");
-                 return -1;
-             }
-             break;
-
-        default:
-            printf("should not happen contact a devloper, unknown fail\n");
-            return -1;
-    }
-
-    return ret;
-}
index 7d6c295..e018c1b 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include "ARM/ARM.h"
+#include "m68k/m68k.h"
+#include "PPC/PPC.h"
 #include "misc.h"
-#include "any_op.h"
-
-PMYBrainAnalys pMyBrainAnalys = NULL;
-PMYBrainAnalys pStartMyBrainAnalys = NULL;
-
 
 int main(int argc, char * argv[])
 {
-    //CPU_UNINT BaseAddress=0;
-    //int t=0;
-    //char *infile=NULL;
-    //char *outfile=NULL;
-    //char *cpuid=NULL;
-    //CPU_INT type=0;
-    //CPU_INT mode = 1;
-
-
-    //printf("Usage :\n");
-    //printf(" need for -inbin and autodetect  if it does not found a PE header \n");
-    //printf("       -cpu m68000      : convert motorala 68000/68008 to intel asm \n");
-    //printf("       -cpu m68010      : convert motorala 68010 to intel asm \n");
-    //printf("       -cpu m68020      : convert motorala 68020 to intel asm \n");
-    //printf("       -cpu m68030      : convert motorala 68030 to intel asm \n");
-    //printf("       -cpu m68040      : convert motorala 68040 to intel asm \n");
-    //printf("       -cpu ppc         : convert PowerPC to intel asm \n");
-    //printf("       -cpu ARM4        : convert ARM4 to intel asm \n");
-    //printf("------------------------------------------------------------------\n");
-    //printf(" for -inbin and autodetect  if it does not found a PE header or do\n");
-    //printf(" not set at all, this options are free to use     \n");
-    //printf(".......-BaseAddress adr : the start base address only accpect \n");
-    //printf(".......                   dec value");
-    //printf("------------------------------------------------------------------\n");
-    //printf("       -in filename     : try autodetect file type for you");
-    //printf("                          whant convert\n");
-    //printf("       -inBin filename  : the bin file you whant convert\n");
-    //printf("       -inExe filename  : the PE file you whant convert\n");
-    //printf("       -OutAsm filename : the Asm file you whant create\n");
-    //printf("       -OutDis filename : Do disambler of the source file\n");
-    //printf("------------------------------------------------------------------\n");
-    //printf("More cpu will be added with the time or options, this is      \n");
-    //printf("version 0.0.1 of the cpu to intel converter writen by         \n");
-    //printf("Magnus Olsen (magnus@greatlord.com), it does not do anything  \n");
-    //printf("yet, more that basic desgin how it should be writen.          \n");
-    //printf("Copyright 2006 by Magnus Olsen, licen under GPL 2.0 for now.  \n");
-
-
-    //if (argc <4)
-    //    return 110;
-
-    ///* fixme better error checking for the input param */
-    //for (t=1; t<argc;t+=2)
-    //{
-    //    if (stricmp(argv[t],"-in"))
-    //    {
-    //        infile = argv[t+1];
-    //        type=0;
-    //    }
-
-    //    if (stricmp(argv[t],"-inBin"))
-    //    {
-    //        infile = argv[t+1];
-    //        type=1;
-    //    }
-
-    //    if (stricmp(argv[t],"-inExe"))
-    //    {
-    //        infile = argv[t+1];
-    //        type=1;
-    //    }
-
-    //    if (stricmp(argv[t],"-OutAsm"))
-    //    {
-    //        outfile = argv[t+1];
-    //    }
-    //    if (stricmp(argv[t],"-OutDis"))
-    //    {
-    //        outfile = argv[t+1];
-    //        mode = 0;
-    //    }
-    //    if (stricmp(argv[t],"-BaseAddress"))
-    //    {
-    //        BaseAddress = atol(argv[t+1]);
-    //    }
-    //    if (stricmp(argv[t],"-cpu"))
-    //    {
-    //        cpuid = argv[t+1];
-    //    }
-
-    //}
-
-    //                                                    mode 0 disambler
-    //                                                    mode 1 convert to intel 
-    //                                                    mode 2 convert to ppc
-    //return LoadPFileImage(infile,outfile,BaseAddress,cpuid,type, mode);
-   //LoadPFileImage("e:\\testppc.exe","e:\\cputointel.asm",0,0,0,1); 
-    LoadPFileImage("e:\\testppc.exe","e:\\cputointel.asm",0,0,0,1); 
-   //pMyBrainAnalys = NULL;
-   //pStartMyBrainAnalys = NULL;
-   //LoadPFileImage("e:\\testppc.exe","e:\\cputoppc.asm",0,0,0,2); 
-
-   // return LoadPFileImage("e:\\testms.exe","e:\\cputointel.asm",0,0,0,1); // convert
-  return 0;
+    CPU_UNINT BaseAddress=0;
+    int t=0;
+    char *infile=NULL;
+    char *outfile=NULL;
+    char *cpuid=NULL;
+    CPU_INT type=0;
+
+
+    printf("Usage :\n");
+    printf(" need for -inbin and autodetect  if it does not found a PE header \n");
+    printf("       -cpu m68000      : convert motorala 68000/68008 to intel asm \n");
+    printf("       -cpu m68010      : convert motorala 68010 to intel asm \n");
+    printf("       -cpu m68020      : convert motorala 68020 to intel asm \n");
+    printf("       -cpu m68030      : convert motorala 68030 to intel asm \n");
+    printf("       -cpu m68040      : convert motorala 68040 to intel asm \n");
+    printf("       -cpu ppc         : convert PowerPC to intel asm \n");
+    printf("       -cpu ARM4        : convert ARM4 to intel asm \n");
+    printf("------------------------------------------------------------------\n");
+    printf(" for -inbin and autodetect  if it does not found a PE header or do\n");
+    printf(" not set at all, this options are free to use     \n");
+    printf(".......-BaseAddress adr : the start base address only accpect \n");
+    printf(".......                   dec value");
+    printf("------------------------------------------------------------------\n");
+    printf("       -in filename     : try autodetect file type for you");
+    printf("                          whant convert\n");
+    printf("       -inBin filename  : the bin file you whant convert\n");
+    printf("       -inExe filename  : the PE file you whant convert\n");
+    printf("       -OutAsm filename : the Asm file you whant create\n");
+    printf("------------------------------------------------------------------\n");
+    printf("More cpu will be added with the time or options, this is      \n");
+    printf("version 0.0.1 of the cpu to intel converter writen by         \n");
+    printf("Magnus Olsen (magnus@greatlord.com), it does not do anything  \n");
+    printf("yet, more that basic desgin how it should be writen.          \n");
+    printf("Copyright 2006 by Magnus Olsen, licen under GPL 2.0 for now.  \n");
+
+    if (argc < 7)
+        return .110;
+
+    for (t=1; t<7;t+=2)
+    {
+        if (stricmp(argv[t],"-in"))
+        {
+            infile = argv[t+1];
+            type=0;
+        }
+
+        if (stricmp(argv[t],"-inBin"))
+        {
+            infile = argv[t+1];
+            type=1;
+        }
+
+        if (stricmp(argv[t],"-inExe"))
+        {
+            infile = argv[t+1];
+            type=1;
+        }
+
+        if (stricmp(argv[t],"-OutAsm"))
+        {
+            outfile = argv[t+1];
+        }
+        if (stricmp(argv[t],"-BaseAddress"))
+        {
+            BaseAddress = atol(argv[t+1]);
+        }
+        if (stricmp(argv[t],"-cpu"))
+        {
+            cpuid = argv[t+1];
+        }
+
+    }
+
+    return LoadPFileImage(infile,outfile,BaseAddress,cpuid,type);
 }
 
 
diff --git a/rosapps/devutils/cputointel/From/ARM/ARM.h b/rosapps/devutils/cputointel/From/ARM/ARM.h
deleted file mode 100644 (file)
index 9ed48f2..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-
-#include "../../misc.h"
-
-CPU_INT ARMBrain(    CPU_BYTE *cpu_buffer,
-                     CPU_UNINT cpu_pos,
-                     CPU_UNINT cpu_size,
-                     CPU_UNINT BaseAddress,
-                     CPU_UNINT cpuarch,
-                     FILE *outfp);
-
-/* here we put the prototype for the opcode api that brain need we show a example for it */
-CPU_INT ARM_(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch);
-
-
-/* Export comment thing see m68k for example 
- * in dummy we do not show it, for it is diffent for each cpu
- */
diff --git a/rosapps/devutils/cputointel/From/ARM/ARMBrain.c b/rosapps/devutils/cputointel/From/ARM/ARMBrain.c
deleted file mode 100644 (file)
index 2df7405..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-
-#include <stdio.h>
-#include <stdlib.h> 
-#include "ARMBrain.h"
-#include "ARM.h"
-#include "../../misc.h"
-
-/* 
- * DummyBrain is example how you create you own cpu brain to translate from 
- * cpu to intel assembler, I have not add DummyBrain to the loader it is not
- * need it in our example. When you write you own brain, it must be setup in
- * misc.c function LoadPFileImage and PEFileStart, PEFileStart maybe does not
- * need the brain you have writen so you do not need setup it there then.
- *
- * input param: 
- *         cpu_buffer   : the memory buffer with loaded program we whant translate
- *         cpu_pos      : the positions in the cpu_buffer 
- *         cpu_size     : the alloced memory size of the cpu_buffer
- *         BaseAddress  : the virtual memory address we setup to use.
- *         cpuarch      : the sub arch for the brain, example if it exists more one
- *                        cpu with same desgin but few other opcode or extend opcode
- *         outfp        : the output file pointer
- *
- *           mode       : if we should run disambler of this binary or
- *                        translate it, Disambler will not calc the
- *                        the row name right so we simple give each
-                          row a name. In translations mode we run a 
- *                        analys so we getting better optimzing and 
- *                        only row name there we need.
- *                        value for mode are :
- *                                             0 = disambler mode
- *                                             1 = translate mode intel
- *
- * return value
- *         0            : Ok 
- *         1            : unimplemt 
- *         2            : Unkonwn Opcode
- *         3            : unimplement cpu
- *         4            : unknown machine
- */
-
-CPU_INT ARMBrain(  CPU_BYTE *cpu_buffer,
-                   CPU_UNINT cpu_pos,
-                   CPU_UNINT cpu_size,
-                   CPU_UNINT BaseAddress,
-                   CPU_UNINT cpuarch,
-                   FILE *outfp)
-{
-    CPU_UNINT cpu_oldpos;
-    CPU_INT cpuint;
-    CPU_INT retcode = 0;
-    CPU_INT retsize;
-
-
-    /* now we start the process */    
-    while (cpu_pos<cpu_size)
-    {
-        cpu_oldpos = cpu_pos;
-
-        cpuint = cpu_buffer[cpu_pos];
-    
-        /* Add */
-        if ((cpuint - (cpuint & GetMaskByte32(cpuARMInit_))) == ConvertBitToByte32(cpuARMInit_))
-        {
-            retsize = ARM_( outfp, cpu_buffer, cpu_pos, cpu_size,
-                                 BaseAddress, cpuarch);
-            if (retsize<0)
-                 retcode = 1;
-            else
-                 cpu_pos += retsize;
-        }
-    
-        /* Found all Opcode and breakout and return no error found */
-        if (cpu_pos >=cpu_size)
-        {
-            break;
-        }
-
-        /* Check if we have found a cpu opcode */
-        if (cpu_oldpos == cpu_pos)
-        {            
-            if (retcode == 0)
-            {              
-                /* no unimplement error where found so we return a msg for unknown opcode */
-                printf("Unkonwn Opcode found at 0x%8x opcode 0x%2x\n",cpu_oldpos+BaseAddress,(unsigned int)cpu_buffer[cpu_oldpos]);                
-                retcode = 2;
-            }
-        }
-
-        /* Erorro Found ? */
-        if (retcode!=0)
-        {
-            /* Erorro Found break and return the error code */
-            break;
-        }
-    }
-    return retcode;    
-}
diff --git a/rosapps/devutils/cputointel/From/ARM/ARMBrain.h b/rosapps/devutils/cputointel/From/ARM/ARMBrain.h
deleted file mode 100644 (file)
index 93ef2b8..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-
-#include "../../misc.h"
-
-
-/* example how setup a opcode, this opcode is 16bit long (taken from M68K) 
- * 0 and 1 mean normal bit, 2 mean mask bit the bit that are determent diffent 
- * thing in the opcode, example which reg so on, it can be etither 0 or 1 in 
- * the opcode. but a opcode have also normal bit that is always been set to 
- * same. thuse bit are always 0 or 1
- */
-CPU_BYTE cpuARMInit_[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
-
diff --git a/rosapps/devutils/cputointel/From/IA32/IA32Brain.c b/rosapps/devutils/cputointel/From/IA32/IA32Brain.c
deleted file mode 100644 (file)
index fc24755..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-
-#include <stdio.h>
-#include <stdlib.h> 
-#include "IA32Brain.h"
-#include "IA32.h"
-#include "../../any_op.h"
-#include "../../misc.h"
-
-
-
-
-/* 
- * DummyBrain is example how you create you own cpu brain to translate from 
- * cpu to intel assembler, I have not add DummyBrain to the loader it is not
- * need it in our example. When you write you own brain, it must be setup in
- * misc.c function LoadPFileImage and PEFileStart, PEFileStart maybe does not
- * need the brain you have writen so you do not need setup it there then.
- *
- * input param: 
- *         cpu_buffer   : the memory buffer with loaded program we whant translate
- *         cpu_pos      : the positions in the cpu_buffer 
- *         cpu_size     : the alloced memory size of the cpu_buffer
- *         BaseAddress  : the virtual memory address we setup to use.
- *         cpuarch      : the sub arch for the brain, example if it exists more one
- *                        cpu with same desgin but few other opcode or extend opcode
- *         outfp        : the output file pointer
- *
- *           mode       : if we should run disambler of this binary or
- *                        translate it, Disambler will not calc the
- *                        the row name right so we simple give each
-                          row a name. In translations mode we run a 
- *                        analys so we getting better optimzing and 
- *                        only row name there we need.
- *                        value for mode are :
- *                                             0 = disambler mode
- *                                             1 = translate mode intel
- *
- * return value
- *         0            : Ok 
- *         1            : unimplemt 
- *         2            : Unkonwn Opcode
- *         3            : unimplement cpu
- *         4            : unknown machine
- */
-
-CPU_INT IA32Brain(  CPU_BYTE *cpu_buffer,
-                     CPU_UNINT cpu_pos,
-                     CPU_UNINT cpu_size,
-                     CPU_UNINT BaseAddress,
-                     CPU_UNINT cpuarch,
-                     FILE *outfp)
-{
-    CPU_UNINT cpu_oldpos;
-    CPU_INT cpuint;
-    CPU_INT retcode = 0;
-    CPU_INT retsize;
-
-    /* now we start the process */
-    while (cpu_pos<cpu_size)
-    {
-        cpu_oldpos = cpu_pos;
-
-        /* use the GetData32Be or GetData32Le
-           to read from the memory the
-           Le is for small endian and the
-           Be is for big endian
-           the 32 is how many bits we should read 
-         */
-        cpuint = GetData32Be(&cpu_buffer[cpu_pos]);
-    
-        /* Add */
-        if ((cpuint - (cpuint & GetMaskByte(cpuIA32Init_Add))) == ConvertBitToByte(cpuIA32Init_Add))
-        {
-            retsize = IA32_Add( outfp, cpu_buffer, cpu_pos, cpu_size,
-                                 BaseAddress, cpuarch);
-            if (retsize<0)
-                 retcode = 1;
-            else
-                 cpu_pos += retsize;
-        }
-    
-        /* Found all Opcode and breakout and return no error found */
-        if (cpu_pos >=cpu_size)
-        {
-            break;
-        }
-
-        /* Check if we have found a cpu opcode */
-        if (cpu_oldpos == cpu_pos)
-        {            
-            if (retcode == 0)
-            {              
-                /* no unimplement error where found so we return a msg for unknown opcode */
-                printf("Unkonwn Opcode found at 0x%8x opcode 0x%2x\n",cpu_oldpos+BaseAddress,(unsigned int)cpu_buffer[cpu_oldpos]);                
-                retcode = 2;
-            }
-        }
-
-        /* Erorro Found ? */
-        if (retcode!=0)
-        {
-            /* Erorro Found break and return the error code */
-            break;
-        }
-    }
-    return retcode;
-}
diff --git a/rosapps/devutils/cputointel/From/IA32/IA32opcode.c b/rosapps/devutils/cputointel/From/IA32/IA32opcode.c
deleted file mode 100644 (file)
index c873add..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-
-#include <stdio.h>
-#include <stdlib.h> 
-#include "IA32.h"
-#include "../../misc.h"
-
-
-/* cpuDummyInit_Add
- * Input param : 
- *               out         : The file pointer that we write to (the output file to intel asm) 
- *               cpu_buffer  : The memory buffer we have our binary code that we whant convert
- *               cpu_pos     : Current positions in the cpu_buffer 
- *               cpu_size    : The memory size of the cpu_buffer
- *               BaseAddress : The base address you whant the binay file should run from 
- *               cpuarch     : if it exists diffent cpu from a manufactor like pentium,
- *                             pentinum-mmx so on, use this flag to specify which type 
- *                             of cpu you whant or do not use it if it does not exists
- *                             other or any sub model.
- *
- *                mode       : if we should run disambler of this binary or
- *                             translate it, Disambler will not calc the
- *                             the row name right so we simple give each
-                               row a name. In translations mode we run a 
- *                             analys so we getting better optimzing and 
- *                             only row name there we need.
- *                             value for mode are :
- *                                                  0 = disambler mode
- *                                                  1 = translate mode intel
- *
- * Return value :
- *               value -1            : unimplement 
- *               value  0            : wrong opcode or not vaild opcode
- *               value +1 and higher : who many byte we should add to cpu_pos
- */
-CPU_INT IA32_Add( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos,
-                   CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch)
-
-{
-    /* 
-     * ConvertBitToByte() is perfect to use to get the bit being in use from a bit array
-     * GetMaskByte() is perfect if u whant known which bit have been mask out 
-     * see M68kopcode.c and how it use the ConvertBitToByte()
-     */
-
-    fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos);
-
-    printf(";Add unimplement\n");
-    return -1;
-}
diff --git a/rosapps/devutils/cputointel/From/PPC/PPC.h b/rosapps/devutils/cputointel/From/PPC/PPC.h
deleted file mode 100644 (file)
index dd3a39c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-
-#include "../../misc.h"
-
-CPU_INT PPCBrain(    CPU_BYTE *cpu_buffer,
-                     CPU_UNINT cpu_pos,
-                     CPU_UNINT cpu_size,
-                     CPU_UNINT BaseAddress,
-                     CPU_UNINT cpuarch,
-                     FILE *outfp);
-
-
-/* here we put the prototype for the opcode api that brain need we show a example for it */
-CPU_INT PPC_Blr( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch);
-CPU_INT PPC_Li( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch);
-CPU_INT PPC_mr( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch);
-CPU_INT PPC_Stw( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch);
-CPU_INT PPC_Stwu( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch);
-
-/* Export comment thing see m68k for example 
- * in dummy we do not show it, for it is diffent for each cpu
- */
-
-
diff --git a/rosapps/devutils/cputointel/From/PPC/PPCBrain.c b/rosapps/devutils/cputointel/From/PPC/PPCBrain.c
deleted file mode 100644 (file)
index 9a5fd2c..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-
-#include <stdio.h>
-#include <stdlib.h> 
-#include "PPCBrain.h"
-#include "PPC.h"
-#include "../../misc.h"
-
-/* 
- * DummyBrain is example how you create you own cpu brain to translate from 
- * cpu to intel assembler, I have not add DummyBrain to the loader it is not
- * need it in our example. When you write you own brain, it must be setup in
- * misc.c function LoadPFileImage and PEFileStart, PEFileStart maybe does not
- * need the brain you have writen so you do not need setup it there then.
- *
- * input param: 
- *         cpu_buffer   : the memory buffer with loaded program we whant translate
- *         cpu_pos      : the positions in the cpu_buffer 
- *         cpu_size     : the alloced memory size of the cpu_buffer
- *         BaseAddress  : the virtual memory address we setup to use.
- *         cpuarch      : the sub arch for the brain, example if it exists more one
- *                        cpu with same desgin but few other opcode or extend opcode
- *         outfp        : the output file pointer
- *
- *           mode       : if we should run disambler of this binary or
- *                        translate it, Disambler will not calc the
- *                        the row name right so we simple give each
-                          row a name. In translations mode we run a 
- *                        analys so we getting better optimzing and 
- *                        only row name there we need.
- *                        value for mode are :
- *                                             0 = disambler mode
- *                                             1 = translate mode intel
- *
- * return value
- *         0            : Ok 
- *         1            : unimplemt 
- *         2            : Unkonwn Opcode
- *         3            : unimplement cpu
- *         4            : unknown machine
- */
-
-CPU_INT PPCBrain(    CPU_BYTE *cpu_buffer,
-                     CPU_UNINT cpu_pos,
-                     CPU_UNINT cpu_size,
-                     CPU_UNINT BaseAddress,
-                     CPU_UNINT cpuarch,
-                     FILE *outfp)
-{
-    CPU_UNINT cpu_oldpos;
-    CPU_INT cpuint;
-    CPU_INT retcode = 0;
-    CPU_INT retsize;
-
-    /* now we start the process */
-    while (cpu_pos<cpu_size)
-    {
-        cpu_oldpos = cpu_pos;
-
-        cpuint = GetData32Le(&cpu_buffer[cpu_pos]);
-
-        /* blr */
-        if ((cpuint - (cpuint & GetMaskByte32(cpuPPCInit_Blr))) == ConvertBitToByte32(cpuPPCInit_Blr))
-        {
-            retsize = PPC_Blr( outfp, cpu_buffer, cpu_pos, cpu_size,
-                                 BaseAddress, cpuarch);
-            if (retsize<0)
-                 retcode = 1;
-            else
-                 cpu_pos += retsize;
-        }
-
-         /* Li*/
-        if ((cpuint - (cpuint & GetMaskByte32(cpuPPCInit_Li))) == ConvertBitToByte32(cpuPPCInit_Li))
-        {
-            retsize = PPC_Li( outfp, cpu_buffer, cpu_pos, cpu_size,
-                                 BaseAddress, cpuarch);
-            if (retsize<0)
-                 retcode = 1;
-            else
-                 cpu_pos += retsize;
-        }
-
-        /* mr */
-        if ((cpuint - (cpuint & GetMaskByte32(cpuPPCInit_mr))) == ConvertBitToByte32(cpuPPCInit_mr))
-        {
-            retsize = PPC_mr( outfp, cpu_buffer, cpu_pos, cpu_size,
-                                 BaseAddress, cpuarch);
-            if (retsize<0)
-                 retcode = 1;
-            else
-                 cpu_pos += retsize;
-        }
-
-        /* stw */
-        if ((cpuint - (cpuint & GetMaskByte32(cpuPPCInit_stw))) == ConvertBitToByte32(cpuPPCInit_stw))
-        {
-            retsize = PPC_Stw( outfp, cpu_buffer, cpu_pos, cpu_size,
-                                 BaseAddress, cpuarch);
-            if (retsize<0)
-                 retcode = 1;
-            else
-                 cpu_pos += retsize;
-        }
-
-        /* stwu */
-        if ((cpuint - (cpuint & GetMaskByte32(cpuPPCInit_stwu))) == ConvertBitToByte32(cpuPPCInit_stwu))
-        {
-            retsize = PPC_Stwu( outfp, cpu_buffer, cpu_pos, cpu_size,
-                                 BaseAddress, cpuarch);
-            if (retsize<0)
-                 retcode = 1;
-            else
-                 cpu_pos += retsize;
-        }
-
-        /* Found all Opcode and breakout and return no error found */
-        if (cpu_pos >=cpu_size)
-        {
-            break;
-        }
-
-        /* Check if we have found a cpu opcode */
-        if (cpu_oldpos == cpu_pos)
-        {            
-            if (retcode == 0)
-            {              
-                /* no unimplement error where found so we return a msg for unknown opcode */
-                printf("Unkonwn Opcode found at 0x%8x opcode 0x%2x\n",cpu_oldpos+BaseAddress,(unsigned int)cpu_buffer[cpu_oldpos]);                
-                retcode = 2;
-            }
-        }
-
-        /* Erorro Found ? */
-        if (retcode!=0)
-        {
-            /* Erorro Found break and return the error code */
-            break;
-        }
-    }
-
-    return 0; // hack getting dismabler working or converting working
-    return retcode;
-}
diff --git a/rosapps/devutils/cputointel/From/PPC/PPCBrain.h b/rosapps/devutils/cputointel/From/PPC/PPCBrain.h
deleted file mode 100644 (file)
index 5cf50ef..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-
-#include "../../misc.h"
-
-
-/* example how setup a opcode, this opcode is 16bit long (taken from M68K) 
- * 0 and 1 mean normal bit, 2 mean mask bit the bit that are determent diffent 
- * thing in the opcode, example which reg so on, it can be etither 0 or 1 in 
- * the opcode. but a opcode have also normal bit that is always been set to 
- * same. thuse bit are always 0 or 1
- */
-
-/* FIXME RA should be 0 in stwu */
-CPU_BYTE cpuPPCInit_Blr[32]   = {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,1,0,0,1,1, 1,0};
-/* addi */
-CPU_BYTE cpuPPCInit_Li[32]    = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0, 0,0,1,1,1,0, 2,2};
-CPU_BYTE cpuPPCInit_stw[32]   = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,0,0,1,0,0, 2,2};
-CPU_BYTE cpuPPCInit_stwu[32]  = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,0,0,1,0,1, 2,2};
-CPU_BYTE cpuPPCInit_mr[32]    = {0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,2,2,2,2,2,2,2,2, 0,1,1,1,1,1, 2,2};
-CPU_BYTE cpuPPCInit_lwz[32]   = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,0,0,0,0,0, 2,2};
-
-
-
-/* mask */
-/*
- * no mask  we implement function getting the reg right 
- */
-
-/* bit index
-                          3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
-                          1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
-*/
-
diff --git a/rosapps/devutils/cputointel/From/PPC/PPCopcode.c b/rosapps/devutils/cputointel/From/PPC/PPCopcode.c
deleted file mode 100644 (file)
index ffe7157..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-
-#include <stdio.h>
-#include <stdlib.h> 
-#include "PPC.h"
-#include "../../misc.h"
-#include "../../any_op.h"
-
-/* reg r0-r31 
-  r3 = eax
- */
-
-/* cpuDummyInit_Add
- * Input param : 
- *               out         : The file pointer that we write to (the output file to intel asm) 
- *               cpu_buffer  : The memory buffer we have our binary code that we whant convert
- *               cpu_pos     : Current positions in the cpu_buffer 
- *               cpu_size    : The memory size of the cpu_buffer
- *               BaseAddress : The base address you whant the binay file should run from 
- *               cpuarch     : if it exists diffent cpu from a manufactor like pentium,
- *                             pentinum-mmx so on, use this flag to specify which type 
- *                             of cpu you whant or do not use it if it does not exists
- *                             other or any sub model.
- *
- * Return value :
- *               value -1            : unimplement 
- *               value  0            : wrong opcode or not vaild opcode
- *               value +1 and higher : who many byte we should add to cpu_pos
- */
-
-/* Get Dest register */
-#define PPC_GetBitArraySrcReg(opcode) (((opcode & 0x3) << 3) | ((opcode & 0xE000) >> 13))
-
-/* Get Source register */
-CPU_UNINT PPC_GetBitArrayBto31xx(CPU_UNINT opcode)
-{
-    CPU_INT x1;
-
-   /* FIXME make it to a macro
-    * not tested to 100% yet */
-    x1 = ((opcode & 0x1F00)>>8);
-    return  x1;
-}
-
-
-CPU_UNINT PPC_GetBitArrayBto31(CPU_UNINT opcode)
-{
-    CPU_INT x1;
-   /* FIXME make it to a macro
-    * not tested to 100% yet */
-   x1 = ((opcode & 0xFFFF0000)>>16);
-    return  x1;
-}
-
-
-CPU_INT PPC_Blr( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos,
-                   CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch)
-{
-
-    BaseAddress +=cpu_pos;
-
-    /* own translatons langues */
-    if (AllocAny()!=0)  /* alloc memory for pMyBrainAnalys */
-    {
-       return -1;
-    }
-    pMyBrainAnalys->op = OP_ANY_ret;
-    pMyBrainAnalys->memAdr=BaseAddress;
-
-    return 4;
-}
-
-
-CPU_INT PPC_Li( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos,
-                   CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch)
-{
-    CPU_UNINT opcode;
-
-    opcode = GetData32Le(&cpu_buffer[cpu_pos]);
-
-    BaseAddress +=cpu_pos;
-
-    /* own translatons langues */
-    if (AllocAny()!=0)  /* alloc memory for pMyBrainAnalys */
-    {
-        return -1;
-    }
-    pMyBrainAnalys->op = OP_ANY_mov;
-    pMyBrainAnalys->type= 8 + 16; /* 8 dst reg, 16 imm */
-    pMyBrainAnalys->src_size = 16;
-    pMyBrainAnalys->src = PPC_GetBitArraySrcReg(opcode);
-    pMyBrainAnalys->dst = PPC_GetBitArrayBto31(opcode);
-    pMyBrainAnalys->memAdr=BaseAddress;
-
-    return 4;
-}
-
-
-CPU_INT PPC_mr( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos,
-                   CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch)
-{
-    CPU_UNINT opcode;
-
-    opcode = GetData32Le(&cpu_buffer[cpu_pos]);
-
-    BaseAddress +=cpu_pos;
-
-    /* own translatons langues */
-    if (AllocAny()!=0)  /* alloc memory for pMyBrainAnalys */
-    {
-        return -1;
-    }
-    pMyBrainAnalys->op = OP_ANY_mov;
-    pMyBrainAnalys->type= 2 + 8; /* 8 dst reg, 2 src reg */
-    pMyBrainAnalys->src_size = 32;
-    pMyBrainAnalys->src = PPC_GetBitArraySrcReg(opcode);
-    pMyBrainAnalys->dst = PPC_GetBitArrayBto31xx(opcode);
-    pMyBrainAnalys->memAdr=BaseAddress;
-
-    return 4;
-}
-
-
-CPU_INT PPC_Stw( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos,
-                  CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch)
-{
-    /* r1 store at -0x20(r1) */
-
-    CPU_UNINT opcode;
-    CPU_SHORT tmp = 0;
-
-    opcode = GetData32Le(&cpu_buffer[cpu_pos]);
-
-    BaseAddress +=cpu_pos;
-
-    /* own translatons langues */
-    if (AllocAny()!=0)  /* alloc memory for pMyBrainAnalys */
-    {
-        return -1;
-    }
-
-    tmp =  _byteswap_ushort( ((CPU_SHORT)((opcode >> 16) & 0xffff)));
-
-    pMyBrainAnalys->op = OP_ANY_mov;
-    pMyBrainAnalys->type= 2 + 64;
-    pMyBrainAnalys->src_size = 32;
-    pMyBrainAnalys->dst_size = 32;
-    pMyBrainAnalys->src = PPC_GetBitArraySrcReg(opcode);
-    pMyBrainAnalys->dst = PPC_GetBitArrayBto31xx(opcode);
-    pMyBrainAnalys-> dst_extra = tmp;
-    pMyBrainAnalys->memAdr=BaseAddress;
-
-    return 4;
-}
-
-CPU_INT PPC_Stwu( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos,
-                  CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch)
-{
-    /* r1 store at -0x20(r1) */
-
-    CPU_UNINT opcode;
-    CPU_INT DstReg;
-    CPU_SHORT tmp = 0;
-
-    opcode = GetData32Le(&cpu_buffer[cpu_pos]);
-
-    DstReg = PPC_GetBitArrayBto31xx(opcode);
-    if (DstReg == 0)
-    {
-        return 0;
-    }
-
-    BaseAddress +=cpu_pos;
-
-    /* own translatons langues */
-    if (AllocAny()!=0)  /* alloc memory for pMyBrainAnalys */
-    {
-        return -1;
-    }
-
-    tmp =  _byteswap_ushort( ((CPU_SHORT)((opcode >> 16) & 0xffff)));
-
-    pMyBrainAnalys->op = OP_ANY_mov;
-    pMyBrainAnalys->type= 2 + 64 + 128;
-    pMyBrainAnalys->src_size = 32;
-    pMyBrainAnalys->dst_size = 32;
-    pMyBrainAnalys->src = PPC_GetBitArraySrcReg(opcode);
-    pMyBrainAnalys->dst = DstReg;
-    pMyBrainAnalys-> dst_extra = tmp;
-    pMyBrainAnalys->memAdr=BaseAddress;
-
-    return 4;
-}
diff --git a/rosapps/devutils/cputointel/ImageLoader.c b/rosapps/devutils/cputointel/ImageLoader.c
deleted file mode 100644 (file)
index 926be30..0000000
+++ /dev/null
@@ -1,563 +0,0 @@
-#include <windows.h>\r
-#include <winnt.h>\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include "misc.h"\r
-#include "From/ARM/ARM.h"\r
-#include "From/m68k/m68k.h"\r
-#include "From/PPC/PPC.h"\r
-\r
-static  CPU_INT machine_type = 0;\r
-//static  CPU_INT ToMachine_type = IMAGE_FILE_MACHINE_I386;\r
-static  CPU_INT ToMachine_type = IMAGE_FILE_MACHINE_POWERPC;\r
-/*\r
- * infileName       file name to convert or disambler \r
- * outputfileName   file name to save to\r
- * BaseAddress      the address we should emulate\r
- * cpuid            the cpu we choice not vaild for pe loader\r
- * type             the loading mode Auto, PE, bin\r
- * mode             disambler mode : 0 the arch cpu.\r
- *                  translate mode : 1 intel\r
- *                  translate mode : 2 ppc\r
- * \r
- */\r
-\r
-static void SetCPU(CPU_INT FromCpu, CPU_INT mode)\r
-{\r
-    machine_type = FromCpu;\r
-    switch(mode)\r
-    {\r
-        case 0:\r
-            ToMachine_type = machine_type;\r
-            break;\r
-\r
-        case 1:\r
-            ToMachine_type = IMAGE_FILE_MACHINE_I386;\r
-            break;\r
-\r
-        case 2:\r
-            ToMachine_type = IMAGE_FILE_MACHINE_POWERPC;\r
-            break;\r
-\r
-        default:\r
-            printf("Not supported mode\n");\r
-            break;\r
-\r
-    }\r
-}\r
-\r
-static void Convert(FILE *outfp, CPU_INT FromCpu, CPU_INT mode)\r
-{\r
-    SetCPU(machine_type,mode);\r
-    AnyalsingProcess();\r
-    ConvertProcess(outfp, machine_type, ToMachine_type);\r
-    FreeAny();\r
-}\r
-\r
-\r
-CPU_INT LoadPFileImage( char *infileName, char *outputfileName, \r
-                     CPU_UNINT BaseAddress, char *cpuid,\r
-                     CPU_UNINT type, CPU_INT mode)\r
-{\r
-    FILE *infp;\r
-    FILE *outfp;\r
-    CPU_BYTE *cpu_buffer;   \r
-    CPU_UNINT cpu_pos = 0;\r
-    CPU_UNINT cpu_size=0;\r
-    CPU_INT ret;\r
-     //fopen("testms.exe","RB");\r
-    \r
-\r
-    /* Open file for read */\r
-\r
-    if (!(infp = fopen(infileName, "rb")))\r
-    {\r
-        printf("Can not open file %s\n",infileName);\r
-        return 3;\r
-    }\r
-\r
-    /* Open file for write */\r
-    if (!(outfp = fopen(outputfileName,"wb")))\r
-    {\r
-        printf("Can not open file %s\n",outputfileName);\r
-        return 4;\r
-    }\r
-\r
-    /* Load the binary file to a memory buffer */\r
-    fseek(infp,0,SEEK_END);\r
-    if (ferror(infp))\r
-    {\r
-        printf("error can not seek in the read file");\r
-        fclose(infp);\r
-        fclose(outfp);\r
-        return 5;\r
-    }\r
-    \r
-    /* get the memory size buffer */\r
-    cpu_size = ftell(infp);\r
-    if (ferror(infp))\r
-    {\r
-        printf("error can not get file size of the read file");\r
-        fclose(infp);\r
-        fclose(outfp);\r
-        return 6;\r
-    }\r
-\r
-    /* Load the binary file to a memory buffer */\r
-    fseek(infp,0,SEEK_SET);\r
-    if (ferror(infp))\r
-    {\r
-        printf("error can not seek in the read file");\r
-        fclose(infp);\r
-        fclose(outfp);\r
-        return 5;\r
-    }\r
-\r
-    if (cpu_size==0)\r
-    {\r
-        printf("error file size is Zero lenght of the read file");\r
-        fclose(infp);\r
-        fclose(outfp);\r
-        return 7;\r
-    }\r
-\r
-    /* alloc memory now */\r
-   ;\r
-    if (!(cpu_buffer = (unsigned char *) malloc(cpu_size+1)))\r
-    {\r
-        printf("error can not alloc %uld size for memory buffer",cpu_size);\r
-        fclose(infp);\r
-        fclose(outfp);\r
-        return 8;\r
-    }\r
-    ZeroMemory(cpu_buffer,cpu_size);\r
-\r
-    /* read from the file now in one sweep */\r
-    fread((void *)cpu_buffer,1,cpu_size,infp);\r
-    if (ferror(infp))\r
-    {\r
-        printf("error can not read file ");\r
-        fclose(infp);\r
-        fclose(outfp);\r
-        return 9;\r
-    }\r
-    fclose(infp);\r
-\r
-    if (type==0) \r
-    {\r
-       if ( PEFileStart(cpu_buffer, 0, BaseAddress, cpu_size, outfp, mode) !=0)\r
-       {\r
-            type=1;\r
-       }\r
-       else\r
-       {\r
-            if (mode > 0)\r
-            {\r
-                Convert(outfp,machine_type,mode);\r
-            }\r
-            fclose(outfp);\r
-            return 0;\r
-       }\r
-\r
-       /* fixme */\r
-       return -1;\r
-    }\r
-\r
-    if (type== 1)\r
-    {\r
-        if (stricmp(cpuid,"m68000"))\r
-        {\r
-            ret = M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68000,outfp);\r
-            if (mode > 1)\r
-            {\r
-                Convert(outfp,machine_type,mode);\r
-            }\r
-            fclose(outfp);\r
-        }\r
-        else if (stricmp(cpuid,"m68010"))\r
-        {\r
-            ret = M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68010,outfp);\r
-            if (mode > 1)\r
-            {\r
-                Convert(outfp,machine_type,mode);\r
-            }\r
-            fclose(outfp);\r
-            return ret;\r
-        }\r
-        else if (stricmp(cpuid,"m68020"))\r
-        {\r
-            ret = M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68020,outfp);\r
-            if (mode > 1)\r
-            {\r
-                Convert(outfp,machine_type,mode);\r
-            }\r
-            fclose(outfp);\r
-            return ret;\r
-        }\r
-        else if (stricmp(cpuid,"m68030"))\r
-        {\r
-            ret = M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68030,outfp);\r
-            if (mode > 1)\r
-            {\r
-                Convert(outfp,machine_type,mode);\r
-            }\r
-            fclose(outfp);\r
-            return ret;\r
-        }\r
-        else if (stricmp(cpuid,"m68040"))\r
-        {\r
-            ret = M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68040,outfp);\r
-            if (mode > 1)\r
-            {\r
-                Convert(outfp,machine_type,mode);\r
-            }\r
-            fclose(outfp);\r
-            return ret;\r
-        }\r
-        else if (stricmp(cpuid,"ppc"))\r
-        {\r
-            ret = PPCBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,0,outfp);\r
-            if (mode > 1)\r
-            {\r
-                Convert(outfp,machine_type,mode);\r
-            }\r
-            fclose(outfp);\r
-            return ret;\r
-        }\r
-        else if (stricmp(cpuid,"arm4"))\r
-        {\r
-            ret = ARMBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,4,outfp);\r
-            if (mode > 1)\r
-            {\r
-                Convert(outfp,machine_type,mode);\r
-            }\r
-            fclose(outfp);\r
-            return ret;\r
-        }\r
-    }\r
-\r
-    if (type==2) \r
-    {\r
-\r
-       ret = PEFileStart(cpu_buffer, 0, BaseAddress, cpu_size, outfp, mode);\r
-       if (mode > 1)\r
-       {\r
-           Convert(outfp,machine_type,mode);\r
-       }\r
-       fclose(outfp);\r
-       return ret;\r
-    }\r
-\r
-    return 0;\r
-}\r
-\r
-#define  MAXSECTIONNUMBER 16\r
-\r
-CPU_INT PEFileStart( CPU_BYTE *memory, CPU_UNINT pos,\r
-                     CPU_UNINT base,  CPU_UNINT size,\r
-                     FILE *outfp, CPU_INT mode)\r
-{\r
-    PIMAGE_DOS_HEADER DosHeader;\r
-    PIMAGE_NT_HEADERS NtHeader;\r
-    IMAGE_SECTION_HEADER SectionHeader[MAXSECTIONNUMBER] = {NULL};\r
-    PIMAGE_SECTION_HEADER pSectionHeader;\r
-    PIMAGE_EXPORT_DIRECTORY ExportEntry;\r
-    INT NumberOfSections;\r
-    INT NumberOfSectionsCount=0;\r
-    INT i;\r
-\r
-    DosHeader = (PIMAGE_DOS_HEADER)memory;\r
-    if ( (DosHeader->e_magic != IMAGE_DOS_SIGNATURE) ||\r
-         (size < 0x3c+2) )\r
-    {\r
-        printf("No MZ file \n");\r
-        return -1;\r
-    }\r
-\r
-    NtHeader = (PIMAGE_NT_HEADERS) (((ULONG)memory) + ((ULONG)DosHeader->e_lfanew));\r
-    if (NtHeader->Signature != IMAGE_NT_SIGNATURE)\r
-    {\r
-        printf("No PE header found \n");\r
-    }\r
-\r
-    if (!(NtHeader->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE))\r
-    {\r
-        printf("No execute image found \n");\r
-        return -1;\r
-    }\r
-\r
-    switch(NtHeader->OptionalHeader.Subsystem)\r
-    {\r
-        case IMAGE_SUBSYSTEM_EFI_APPLICATION:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_EFI_APPLICATION\n");\r
-             printf("This exe file is desgin run in EFI bios as applactions\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER\n");\r
-             printf("This exe file is desgin run in EFI bios as service driver\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_EFI_ROM:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_EFI_ROM\n");\r
-             printf("This exe file is EFI ROM\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER\n");\r
-             printf("This exe file is desgin run in EFI bios as driver\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_NATIVE:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_NATIVE\n");\r
-             printf("This exe file does not need any subsystem\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_NATIVE_WINDOWS:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_NATIVE_WINDOWS\n");\r
-             printf("This exe file is desgin run on Windows 9x as driver \n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_OS2_CUI:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_OS2_CUI\n");\r
-             printf("This exe file is desgin run on OS2 as CUI\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_POSIX_CUI:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_POSIX_CUI\n");\r
-             printf("This exe file is desgin run on POSIX as CUI\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_WINDOWS_CE_GUI\n");\r
-             printf("This exe file is desgin run on Windows CE as GUI\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_WINDOWS_CUI:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_WINDOWS_CUI\n");\r
-             printf("This exe file is desgin run on Windows as CUI\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_WINDOWS_GUI:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_WINDOWS_GUI\n");\r
-             printf("This exe file is desgin run on Windows as GUI\n");\r
-             break;\r
-        case IMAGE_SUBSYSTEM_XBOX:\r
-             fprintf(outfp,"; OS type : IMAGE_SUBSYSTEM_XBOX\n");\r
-             printf("This exe file is desgin run on X-Box\n");\r
-             break;\r
-        default:\r
-            fprintf(outfp,"; OS type : Unknown\n");\r
-            printf("Unknown OS : SubID : %d\n",NtHeader->OptionalHeader.Subsystem);\r
-            break;\r
-    }\r
-\r
-\r
-    printf("Number of object : %d\n",NtHeader->FileHeader.NumberOfSections);\r
-    printf("Base Address : %8x\n\n",NtHeader->OptionalHeader.ImageBase);\r
-\r
-    pSectionHeader = IMAGE_FIRST_SECTION(NtHeader);\r
-\r
-    NumberOfSections = NtHeader->FileHeader.NumberOfSections;\r
-\r
-    for (i = 0; i < NumberOfSections; i++)\r
-    {\r
-        SectionHeader[i] = *pSectionHeader++;\r
-        printf("Found Sector : %s \n ",SectionHeader[i].Name);\r
-        printf("RVA: %08lX ",SectionHeader[i].VirtualAddress);\r
-        printf("Offset: %08lX ",SectionHeader[i].PointerToRawData);\r
-        printf("Size: %08lX ",SectionHeader[i].SizeOfRawData);\r
-        printf("Flags: %08lX \n\n",SectionHeader[i].Characteristics);\r
-    }\r
-\r
-    /* Get export data */\r
-    if (NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size != 0)\r
-    {\r
-        for (i = 0; i < NumberOfSections; i++)\r
-        {\r
-            if ( SectionHeader[i].VirtualAddress <= (ULONG) NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress &&\r
-                 SectionHeader[i].VirtualAddress + SectionHeader[i].SizeOfRawData > (ULONG)NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)\r
-            {\r
-                  ExportEntry = (PIMAGE_NT_HEADERS) (((ULONG)memory) +\r
-                                (ULONG)(NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress - \r
-                                SectionHeader[i].VirtualAddress + \r
-                                SectionHeader[i].PointerToRawData));\r
-            }\r
-        }\r
-    }\r
-\r
-\r
-/* start decoding */\r
-\r
-for (i=0;i < NumberOfSections; i++)\r
-{\r
-       if (strnicmp((PCHAR) SectionHeader[i].Name,".text\0",6)==0)\r
-       {\r
-            switch (NtHeader->FileHeader.Machine)\r
-            {\r
-                case IMAGE_FILE_MACHINE_ALPHA:\r
-                     printf("CPU ALPHA Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found Alpha\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_ALPHA;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_ALPHA64:\r
-                     printf("CPU ALPHA64/AXP64 Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found Alpha64/AXP64\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_ALPHA64;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_AM33:\r
-                     printf("CPU AM33 Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found AM33\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_AM33;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_AMD64:\r
-                     printf("CPU AMD64 Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found AMD64\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_AMD64;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_ARM:\r
-                     printf("CPU ARM Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found ARM\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_ARM;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_CEE:\r
-                     printf("CPU CEE Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found CEE\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_CEE;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_CEF:\r
-                     printf("CPU CEF Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found CEF\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_CEF;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_EBC:\r
-                     printf("CPU EBC Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found EBC\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_EBC;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_I386:\r
-                     printf("CPU I386 Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found I386\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_I386;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_IA64:\r
-                     printf("CPU IA64 Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found IA64\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_IA64;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_M32R:\r
-                     printf("CPU M32R Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found M32R\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_M32R;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_MIPS16:\r
-                     printf("CPU MIPS16 Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found MIPS16\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_MIPS16;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_MIPSFPU:\r
-                     printf("CPU MIPSFPU Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found MIPSFPU\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_MIPSFPU;\r
-                     return 3;\r
-\r
-                case IMAGE_FILE_MACHINE_MIPSFPU16:\r
-                     printf("CPU MIPSFPU16 Detected no CPUBrain implement for it\n");\r
-                     fprintf(outfp,"; CPU found MIPSFPU16\n");\r
-                     machine_type = IMAGE_FILE_MACHINE_MIPSFPU16;\r
-                     return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_POWERPC:\r
-                    printf("CPU POWERPC Detected partily CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found POWERPC\n");\r
-                         //PPCBrain(memory, pos, cpu_size, base, 0, outfp);\r
-                    machine_type = IMAGE_FILE_MACHINE_POWERPC;\r
-                    PPCBrain(memory+SectionHeader[i].PointerToRawData,  0, SectionHeader[i].SizeOfRawData, NtHeader->OptionalHeader.ImageBase, 0, outfp);\r
-                    break;\r
-\r
-\r
-               case IMAGE_FILE_MACHINE_POWERPCFP:\r
-                    printf("CPU POWERPCFP Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found POWERPCFP\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_POWERPCFP;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_R10000:\r
-                    printf("CPU R10000 Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found R10000\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_R10000;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_R3000:\r
-                    printf("CPU R3000 Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found R3000\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_R3000;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_R4000:\r
-                    printf("CPU R4000 Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found R4000\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_R4000;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_SH3:\r
-                    printf("CPU SH3 Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found SH3\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_SH3;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_SH3DSP:\r
-                    printf("CPU SH3DSP Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found SH3DSP\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_SH3DSP;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_SH3E:\r
-                    printf("CPU SH3E Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found SH3E\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_SH3E;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_SH4:\r
-                    printf("CPU SH4 Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found SH4\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_SH4;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_SH5:\r
-                    printf("CPU SH5 Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found SH5\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_SH5;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_THUMB:\r
-                    printf("CPU THUMB Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found THUMB\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_THUMB;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_TRICORE:\r
-                    printf("CPU TRICORE Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found TRICORE\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_TRICORE;\r
-                    return 3;\r
-\r
-               case IMAGE_FILE_MACHINE_WCEMIPSV2:\r
-                    printf("CPU WCEMIPSV2 Detected no CPUBrain implement for it\n");\r
-                    fprintf(outfp,"; CPU found WCEMIPSV2\n");\r
-                    machine_type = IMAGE_FILE_MACHINE_WCEMIPSV2;\r
-                    return 3;\r
-\r
-               default:\r
-                    printf("Unknown Machine : %d",NtHeader->FileHeader.Machine);\r
-                    return 4;\r
-            }  /* end case switch*/\r
-      } /* end if text sector */\r
-} /* end for */\r
-\r
-   return 0;\r
-}\r
diff --git a/rosapps/devutils/cputointel/OpCodePPC.txt b/rosapps/devutils/cputointel/OpCodePPC.txt
deleted file mode 100644 (file)
index 9593bf5..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-
-PowerPC 32bits
-
-reg = R0-R31
-#imm = a value you set 
-
-Bit expain 
-0 = mean bit is zero
-1 = mean bit is set
-2 = mean this bit can be 0 or 1
-
-opcode                                     Name          Desciptions                                                   
-0010 0000 0000 0000 1000 0000 0100 1110    blr           return from a functions
-
-0222 2222 2222 2222 2222 2222 0011 1000    Li   reg,#imm  move a value to a register
-
-2222 2222 2222 2222 2222 2222 1001 0022    stw  reg,mem   store a value into memory 
-
-2222 2222 2222 2222 2222 2222 1001 0122    stwu reg,mem   store contain of reg to memory and 
-                                                          move reg to that memory position
-
-
-
-Here how the primary opcode work 
-xxxx xxxx xxxx xxxx DDDS SSSS 3333 33DD          
-   
-
-3 = it is the primary opcode
-D = Destions register
-S = Source reigters   
-                                                                        opcode
-                                                           -------------------------
-                                                           |bit order: 5432 10   67 |
-     -------   -------                                      -----------         ----                                                                        
-34: | 0c 00 | | e1 93 | stw r31,12(r1) 0000 1100 0000 0000 1110 0001 | 1001 00 | 00
-38: | 14 00 | | 01 90 | stw r0,20(r1)  0001 0100 0000 0000 0000 0001 | 1001 00 | 11
-     -------   -------                                                ---------  
-        |         |
-        |         |--> Get source register R0-R31 (0xE1 & 0x1F) = 1
-        |         |
-        |         |--> Get Dest register R0-R31 ((0xE1 & 0xE0)>>5) | ((0x90 & 0x3)<<3)  = 31 or 0      
-        |         |     (The adding the two last bit on the end is maybe wrong need examine it)
-        |         |
-        |          --> Get the opcpde (0x90 & 0xFC)
-       \ /        
-                   
- The address offset 12 or 20
-    
-opcode                                 
- ---------------------------------------------------------
-|bit order: pos   1111 1111 1111 1111 0000 0000 0000 0000 |
-|                                              5432 10   |
-|---------------------------------------------------------|
-|           bits  0000 1100 0000 0000 1110 0001 1001 0000 |
- ---------------------------------------------------------
-| math    (opcode>>2) & 0x3F                              |
- ---------------------------------------------------------
-
-Dest Register
- ---------------------------------------------------------
-|bit order: pos   1111 1111 1111 1111 0000 0000 0000 0000 |
-|                                     210              43 |
-|---------------------------------------------------------|
-|           bits  0000 1100 0000 0000 1110 0001 1001 0000 |
- ---------------------------------------------------------
-| math (((opcode & 0x3) << 3) | ((opcode & 0xE000) >> 13))|
- ---------------------------------------------------------
-
-source Register
- ---------------------------------------------------------
-|bit order: pos   1111 1111 1111 1111 0000 0000 0000 0000 |
-|                                        x xxxx           |
-|---------------------------------------------------------|
-|           bits  0000 1100 0000 0000 1110 0001 1001 0000 |
- ---------------------------------------------------------
-| math                                                    |
- ---------------------------------------------------------
similarity index 78%
rename from rosapps/devutils/cputointel/From/IA32/IA32.h
rename to rosapps/devutils/cputointel/PPC/PPC.h
index eb0f06b..3c5ed38 100644 (file)
@@ -1,15 +1,16 @@
 
-#include "../../misc.h"
+#include "../misc.h"
 
-CPU_INT IA32Brain(  CPU_BYTE *cpu_buffer,
+CPU_INT PPCBrain(    CPU_BYTE *cpu_buffer,
                      CPU_UNINT cpu_pos,
                      CPU_UNINT cpu_size,
                      CPU_UNINT BaseAddress,
                      CPU_UNINT cpuarch,
                      FILE *outfp);
 
+
 /* here we put the prototype for the opcode api that brain need we show a example for it */
-CPU_INT IA32_Add(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch);
+CPU_INT PPC_Addx(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch);
 
 
 /* Export comment thing see m68k for example 
diff --git a/rosapps/devutils/cputointel/PPC/PPCBrain.c b/rosapps/devutils/cputointel/PPC/PPCBrain.c
new file mode 100644 (file)
index 0000000..c040186
--- /dev/null
@@ -0,0 +1,77 @@
+
+#include <stdio.h>
+#include <stdlib.h> 
+#include "PPCBrain.h"
+#include "PPC.h"
+#include "../misc.h"
+
+/* retun 
+ * 0 = Ok 
+ * 1 = unimplemt 
+ * 2 = Unkonwn Opcode 
+ * 3 = can not open read file
+ * 4 = can not open write file
+ * 5 = can not seek to end of read file
+ * 6 = can not get the file size of the read file
+ * 7 = read file size is Zero
+ * 8 = can not alloc memory
+ * 9 = can not read file
+ */
+
+CPU_INT PPCBrain(    CPU_BYTE *cpu_buffer,
+                     CPU_UNINT cpu_pos,
+                     CPU_UNINT cpu_size,
+                     CPU_UNINT BaseAddress,
+                     CPU_UNINT cpuarch,
+                     FILE *outfp)
+{
+    CPU_UNINT cpu_oldpos;
+    CPU_INT cpuint;
+    CPU_INT retcode = 0;
+    CPU_INT retsize;
+
+
+    /* now we start the process */
+    while (cpu_pos<cpu_size)
+    {
+        cpu_oldpos = cpu_pos;
+
+        cpuint = cpu_buffer[cpu_pos];
+    
+        /* Add */
+        if ((cpuint - (cpuint & GetMaskByte32(cpuPPCInit_Addx))) == ConvertBitToByte32(cpuPPCInit_Addx))
+        {
+            retsize = PPC_Addx( outfp, cpu_buffer, cpu_pos, cpu_size,
+                                 BaseAddress, cpuarch);
+            if (retsize<0)
+                 retcode = 1;
+            else
+                 cpu_pos += retsize;
+        }
+    
+        /* Found all Opcode and breakout and return no error found */
+        if (cpu_pos >=cpu_size)
+        {
+            break;
+        }
+
+        /* Check if we have found a cpu opcode */
+        if (cpu_oldpos == cpu_pos)
+        {            
+            if (retcode == 0)
+            {              
+                /* no unimplement error where found so we return a msg for unknown opcode */
+                printf("Unkonwn Opcode found at 0x%8x opcode 0x%2x\n",cpu_oldpos+BaseAddress,(unsigned int)cpu_buffer[cpu_oldpos]);                
+                retcode = 2;
+            }
+        }
+
+        /* Erorro Found ? */
+        if (retcode!=0)
+        {
+            /* Erorro Found break and return the error code */
+            break;
+        }
+    }
+    return retcode;    
+}
@@ -1,6 +1,5 @@
 
-
-#include "../../misc.h"
+#include "../misc.h"
 
 
 /* example how setup a opcode, this opcode is 16bit long (taken from M68K) 
@@ -9,5 +8,5 @@
  * the opcode. but a opcode have also normal bit that is always been set to 
  * same. thuse bit are always 0 or 1
  */
-CPU_BYTE cpuIA32Init_Add[16] = {1,1,0,1,2,2,2,2,2,2,2,2,2,2,2,2};
+CPU_BYTE cpuPPCInit_Addx[32] = {2,0,1,0,1,0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0};
 
@@ -1,7 +1,8 @@
 
 #include <stdio.h>
 #include <stdlib.h> 
-#include "../../misc.h"
+#include "PPC.h"
+#include "misc.h"
 
 
 /* cpuDummyInit_Add
  *                             pentinum-mmx so on, use this flag to specify which type 
  *                             of cpu you whant or do not use it if it does not exists
  *                             other or any sub model.
- *
- *                mode       : if we should run disambler of this binary or
- *                             translate it, Disambler will not calc the
- *                             the row name right so we simple give each
-                               row a name. In translations mode we run a 
- *                             analys so we getting better optimzing and 
- *                             only row name there we need.
- *                             value for mode are :
- *                                                  0 = disambler mode
- *                                                  1 = translate mode intel
  *
  * Return value :
  *               value -1            : unimplement 
@@ -33,7 +23,7 @@
  *               value +1 and higher : who many byte we should add to cpu_pos
  */
  
-CPU_INT ARM_( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos,
+CPU_INT PPC_Addx( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos,
                    CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch)
 
 {
diff --git a/rosapps/devutils/cputointel/ReadMe.txt b/rosapps/devutils/cputointel/ReadMe.txt
deleted file mode 100644 (file)
index 50ff74b..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-CpuToIntel is a experment tools and is strict under havy devloping\r
-\r
-\r
-The Idea\r
-The idea is to converting binary files or win pe files \r
-from one cpu to another cpu, But it does not exists\r
-plan to port over diffent hardware architect like\r
-how diffent hw comucate, example x86 DMA controller\r
-to PPC like that stuff. It is only to convert the \r
-binary or pe files to another cpu. it mean a user \r
-mode apps will always be ported, but if it self \r
-modify code it will not work. But it exists idea how \r
-to deal with self modify code. \r
-\r
-\r
-The idea to handling self modify code\r
-The idea is to add a small emulator or adding \r
-anaylysing  process to dectect self modify code \r
-and extract it. This is very hard part todo, some say\r
-imposible, some other say almost imposble. and I say\r
-it is posible todo but extream hard todo. for it is\r
-very diffcul to dectect self modify code with a\r
-analysing process.\r
-\r
-\r
-Why the name are CpuToIntel\r
-When I start write on it it was only ment to convert \r
-from ARM, PPC, m68k to X86 but then I come think of\r
-ReactOS PPC port that is going on. for or later we\r
-will need something that doing convert from x86 to\r
-PPC apps. It exists two way todo it. One is to use \r
-dymatic translation a jit, like UAE or QEMU doing \r
-converting. But it will lose of allot of speed if\r
-it is a game or a havy apps to much. So the idea\r
-is to convert the whole file in one sweep. will give\r
- one other problem it will be a slow process todo it,\r
-and hard dectect self modify program. so not all program\r
-can be really convert with this process. \r
-\r
-\r
-Who will it work \r
-we take it step for step and I will describe the \r
-binary translations how it works. The PE file\r
-work simluare way. \r
-\r
-step 1 : it will disambler the program frist \r
-\r
-step 2 : translate everthing to a middle asm dialect,\r
-         it is own asm dialect it is not suite for a real\r
-\r
-step 3 : (not implement) send it to ananalysing processs \r
-         to get any name or mark out which row is a new functions\r
-\r
-step 3.5 (not implement) split the code into functions here\r
-\r
-step 4 : Now it start the convert process. \r
-\r
-step 4.5 (not implement) maybe a optimzer. \r
-  \r
-step 5 : now it is finish. \r
-\r
-\r
-The arch that are plan \r
-PPC  to IA32, PPC (work in progress)\r
-m68k to IA32, PPC (stubed)\r
-ARM  to IA32, PPC (stubed)\r
-IA32 to IA32, PPC (work in progress)\r
-\r
-\r
-The Winodws NT PPC and x85 diffrent \r
-R1  The stack pointer equal with x86 esp\r
-R3  The return reg equal with x86 eax\r
-R4  The return reg equal with x86 edx\r
-R31 The base pointer equal with x86 ebp\r
-     \r
\ No newline at end of file
diff --git a/rosapps/devutils/cputointel/any_op.h b/rosapps/devutils/cputointel/any_op.h
deleted file mode 100644 (file)
index 0178aa7..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-
-#ifndef __ANY_OP_H__
-#define __ANY_OP_H__
-
-#define OP_ANY_mov  0x00000000
-#define OP_ANY_ret  0x00000001
-
-/* We are using same abi as PPC 
- * eax = register 3
- * edx = register 4
- * esp = register 1
- * ebp = register 31
-
- * ecx = 8
- * ebx = 9
- * esi = 10
- * edi = 11
- * mmx/sse/fpu 0 = 12
- * mmx/sse/fpu 1 = 14
- * mmx/sse/fpu 2 = 16
- * mmx/sse/fpu 3 = 18
- * mmx/sse/fpu 4 = 20
- * mmx/sse/fpu 5 = 22
- * mmx/sse/fpu 6 = 24
- * mmx/sse/fpu 7 = 28
- */
-
-typedef struct _BrainAnalys
-{
-    CPU_UNINT op;  /*  one tranlator for any cpu type set our own opcode */
-    CPU_INT  type; /*  1 = source are memmory, 2 source are register */
-                   /*  4 = dest are memmory,   8 dest are register */
-                   /*  16 = source are imm                          */
-                   /*  32 =  soucre -xx(r1) or [eax-xx] */
-                   /*  64 =  dest -xx(r1) or [eax-xx] */
-                   /*  128 =  update form the src be update with dest */
-
-    CPU_INT src_size; /* who many bits are src not vaild for reg*/
-    CPU_INT dst_size; /* who many bits are dst not vaild for reg*/
-
-    CPU_UNINT64 src;
-    CPU_UNINT64 dst;
-
-    CPU_INT src_extra; /* if type == 32 are set */
-    CPU_INT dst_extra; /* if type == 32 are set */
-
-    CPU_UNINT memAdr; /* where are we in the current memory pos + baseaddress */
-
-    CPU_INT row; /* 0 = no row, 
-                  * 1 = row is bcc (conditions), 
-                  * 2 = row is jsr (Call)
-                  */
-
-    /* try translate the Adress to a name */
-    CPU_BYTE* ptr_next; /* hook next one */
-    CPU_BYTE* ptr_prev; /* hook previus one */
-} MYBrainAnalys, *PMYBrainAnalys;
-
-extern PMYBrainAnalys pMyBrainAnalys;     /* current working address */
-extern PMYBrainAnalys pStartMyBrainAnalys; /* start address */
-
-CPU_INT ConvertToIA32Process( FILE *outfp, 
-                               PMYBrainAnalys pMystart, 
-                               PMYBrainAnalys pMyend, CPU_INT regbits,
-                               CPU_INT HowManyRegInUse,
-                               CPU_INT *RegTableCount);
-
-CPU_INT ConvertToPPCProcess( FILE *outfp, 
-                               PMYBrainAnalys pMystart, 
-                               PMYBrainAnalys pMyend, CPU_INT regbits,
-                               CPU_INT HowManyRegInUse,
-                               CPU_INT *RegTableCount);
-
-#endif
index ce10cea..0a7b145 100644 (file)
@@ -9,26 +9,16 @@
        <file>CpuToIntel.c</file>
        <file>misc.c</file>
 
-       <file>From/ARM/ARMBrain.c</file>
-       <file>From/ARM/ARMopcode.c</file>
+       <file>ARM/ARMBrain.c</file>
+       <file>ARM/ARMopcode.c</file>
 
-       <file>From/IA32/IA32Brain.c</file>
-       <file>From/IA32/IA32opcode.c</file>
+       <file>m68k/M68kBrain.c</file>
+       <file>m68k/M68kopcode.c</file>
 
-       <file>From/m68k/M68kBrain.c</file>
-       <file>From/m68k/M68kopcode.c</file>
-
-       <file>From/PPC/PPCBrain.c</file>
-       <file>From/PPC/PPCopcode.c</file>
-
-       <file>From/dummycpu/DummyBrain.c</file>
-       <file>From/dummycpu/Dummyopcode.c</file>
-
-       <file>ImageLoader.c</file>
-       <file>AnyalsingProcess.c</file> 
-       <file>ConvertingProcess.c</file>
-       <file>ConvertToIA32Process.c</file>
-       <file>ConvertToPPCProcess.c</file>
+       <file>PPC/PPCBrain.c</file>
+       <file>PPC/PPCopcode.c</file>
 
+       <file>dummycpu/DummyBrain.c</file>
+       <file>dummycpu/Dummyopcode.c</file>
 
 </module>
\ No newline at end of file
@@ -1,5 +1,5 @@
 
-#include "../../misc.h"
+#include "../misc.h"
 
 CPU_INT DummyBrain(  CPU_BYTE *cpu_buffer,
                      CPU_UNINT cpu_pos,
@@ -3,32 +3,19 @@
 #include <stdlib.h> 
 #include "DummyBrain.h"
 #include "Dummy.h"
-#include "../../misc.h"
+#include "../misc.h"
 
-
-
-/* 
- * DummyBrain is example how you create you own cpu brain to translate from 
- * cpu to intel assembler, I have not add DummyBrain to the loader it is not
- * need it in our example. When you write you own brain, it must be setup in
- * misc.c function LoadPFileImage and PEFileStart, PEFileStart maybe does not
- * need the brain you have writen so you do not need setup it there then.
- *
- * input param: 
- *         cpu_buffer   : the memory buffer with loaded program we whant translate
- *         cpu_pos      : the positions in the cpu_buffer 
- *         cpu_size     : the alloced memory size of the cpu_buffer
- *         BaseAddress  : the virtual memory address we setup to use.
- *         cpuarch      : the sub arch for the brain, example if it exists more one
- *                        cpu with same desgin but few other opcode or extend opcode
- *         outfp        : the output file pointer
- *
- * return value
- *         0            : Ok 
- *         1            : unimplemt 
- *         2            : Unkonwn Opcode
- *         3            : unimplement cpu
- *         4            : unknown machine
+/* retun 
+ * 0 = Ok 
+ * 1 = unimplemt 
+ * 2 = Unkonwn Opcode 
+ * 3 = can not open read file
+ * 4 = can not open write file
+ * 5 = can not seek to end of read file
+ * 6 = can not get the file size of the read file
+ * 7 = read file size is Zero
+ * 8 = can not alloc memory
+ * 9 = can not read file
  */
 
 CPU_INT DummyBrain(  CPU_BYTE *cpu_buffer,
@@ -43,18 +30,15 @@ CPU_INT DummyBrain(  CPU_BYTE *cpu_buffer,
     CPU_INT retcode = 0;
     CPU_INT retsize;
 
-    /* now we start the process */
+
+
+
+    /* now we start the process */    
     while (cpu_pos<cpu_size)
     {
         cpu_oldpos = cpu_pos;
 
-        /* use the GetData32Be or GetData32Le
-           to read from the memory the
-           Le is for small endian and the
-           Be is for big endian
-           the 32 is how many bits we should read 
-         */
-        cpuint = GetData32Be(&cpu_buffer[cpu_pos]);
+        cpuint = cpu_buffer[cpu_pos];
     
         /* Add */
         if ((cpuint - (cpuint & GetMaskByte(cpuDummyInit_Add))) == ConvertBitToByte(cpuDummyInit_Add))
@@ -91,5 +75,5 @@ CPU_INT DummyBrain(  CPU_BYTE *cpu_buffer,
             break;
         }
     }
-    return retcode;
+    return retcode;    
 }
@@ -1,5 +1,5 @@
 
-#include "../../misc.h"
+#include "../misc.h"
 
 
 /* example how setup a opcode, this opcode is 16bit long (taken from M68K) 
@@ -2,7 +2,7 @@
 #include <stdio.h>
 #include <stdlib.h> 
 #include "Dummy.h"
-#include "../../misc.h"
+#include "misc.h"
 
 
 /* cpuDummyInit_Add
@@ -16,6 +16,7 @@
  *                             pentinum-mmx so on, use this flag to specify which type 
  *                             of cpu you whant or do not use it if it does not exists
  *                             other or any sub model.
+ *
  * Return value :
  *               value -1            : unimplement 
  *               value  0            : wrong opcode or not vaild opcode
@@ -3,30 +3,19 @@
 #include <stdlib.h> 
 #include "M68kBrain.h"
 #include "m68k.h"
-#include "../../misc.h"
+#include "../misc.h"
 
-/* 
- * DummyBrain is example how you create you own cpu brain to translate from 
- * cpu to intel assembler, I have not add DummyBrain to the loader it is not
- * need it in our example. When you write you own brain, it must be setup in
- * misc.c function LoadPFileImage and PEFileStart, PEFileStart maybe does not
- * need the brain you have writen so you do not need setup it there then.
- *
- * input param: 
- *         cpu_buffer   : the memory buffer with loaded program we whant translate
- *         cpu_pos      : the positions in the cpu_buffer 
- *         cpu_size     : the alloced memory size of the cpu_buffer
- *         BaseAddress  : the virtual memory address we setup to use.
- *         cpuarch      : the sub arch for the brain, example if it exists more one
- *                        cpu with same desgin but few other opcode or extend opcode
- *         outfp        : the output file pointer
- *
- * return value
- *         0            : Ok 
- *         1            : unimplemt 
- *         2            : Unkonwn Opcode
- *         3            : unimplement cpu
- *         4            : unknown machine
+/* retun 
+ * 0 = Ok 
+ * 1 = unimplemt 
+ * 2 = Unkonwn Opcode 
+ * 3 = can not open read file
+ * 4 = can not open write file
+ * 5 = can not seek to end of read file
+ * 6 = can not get the file size of the read file
+ * 7 = read file size is Zero
+ * 8 = can not alloc memory
+ * 9 = can not read file
  */
 
 CPU_INT M68KBrain(   CPU_BYTE *cpu_buffer,
@@ -1,5 +1,5 @@
 
-#include "../../misc.h"
+#include "../misc.h"
 
 CPU_BYTE cpuM68kInit_Abcd[16]      = {1,1,1,1,2,2,2,1,0,0,0,0,2,2,2,2}; 
 CPU_BYTE cpuM68kInit_Add[16]       = {1,1,0,1,2,2,2,2,2,2,2,2,2,2,2,2};
similarity index 99%
rename from rosapps/devutils/cputointel/From/m68k/m68k.h
rename to rosapps/devutils/cputointel/m68k/m68k.h
index 124e7a4..155e38d 100644 (file)
@@ -1,5 +1,5 @@
 
-#include "../../misc.h"
+#include "../misc.h"
 CPU_INT M68KBrain(   CPU_BYTE *cpu_buffer,
                      CPU_UNINT cpu_pos,
                      CPU_UNINT cpu_size,
index 5062bd1..be536a6 100644 (file)
@@ -7,10 +7,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include "misc.h"
-#include "any_op.h"
-#include "From/ARM/ARM.h"
-#include "From/m68k/m68k.h"
-#include "From/PPC/PPC.h"
+#include "ARM/ARM.h"
+#include "m68k/m68k.h"
+#include "PPC/PPC.h"
 
 
 /* retun 
  * type 2 : exe/dll/sys
  */
 
+CPU_INT LoadPFileImage( char *infileName, char *outputfileName, 
+                     CPU_UNINT BaseAddress, char *cpuid,
+                     CPU_UNINT type)
+{
+    FILE *infp;
+    FILE *outfp;
+    CPU_BYTE *cpu_buffer;   
+    CPU_UNINT cpu_pos = 0;
+    CPU_UNINT cpu_size=0;
+
+
+    /* Open file for read */
+    if (!(infp = fopen(infileName,"RB")))
+    {
+        printf("Can not open file %s\n",infileName);
+        return 3;
+    }
+
+    /* Open file for write */
+    if (!(outfp = fopen(outputfileName,"WB")))
+    {
+        printf("Can not open file %s\n",outputfileName);
+        return 4;
+    }
+
+    /* Load the binary file to a memory buffer */
+    fseek(infp,0,SEEK_END);
+    if (!ferror(infp))
+    {
+        printf("error can not seek in the read file");
+        fclose(infp);
+        fclose(outfp);
+        return 5;
+    }
+    
+    /* get the memory size buffer */
+    cpu_size = ftell(infp);
+    if (!ferror(infp))
+    {
+        printf("error can not get file size of the read file");
+        fclose(infp);
+        fclose(outfp);
+        return 6;
+    }
+
+    if (cpu_size==0)
+    {
+        printf("error file size is Zero lenght of the read file");
+        fclose(infp);
+        fclose(outfp);
+        return 7;
+    }
+
+    /* alloc memory now */
+    if (!(cpu_buffer = (unsigned char *) malloc(cpu_size)))
+    {
+        printf("error can not alloc %uld size for memory buffer",cpu_size);
+        fclose(infp);
+        fclose(outfp);
+        return 8;
+    }
+
+    /* read from the file now in one sweep */
+    fread(cpu_buffer,1,cpu_size,infp);
+    if (!ferror(infp))
+    {
+        printf("error can not read file ");
+        fclose(infp);
+        fclose(outfp);
+        return 9;
+    }
+    fclose(infp);
+
+    if (type==0) 
+    {
+       if ( PEFileStart(cpu_buffer, 0, BaseAddress, cpu_size) !=0)
+       {
+            type=1;
+       }
+    }
+
+    if (type== 1)
+    {
+        if (stricmp(cpuid,"m68000"))
+                return M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68000,outfp);
+        else if (stricmp(cpuid,"m68010"))
+                return M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68010,outfp);
+        else if (stricmp(cpuid,"m68020"))
+                return M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68020,outfp);
+        else if (stricmp(cpuid,"m68030"))
+                return M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68030,outfp);
+        else if (stricmp(cpuid,"m68040"))
+                return M68KBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,68040,outfp);
+        else if (stricmp(cpuid,"ppc"))
+                return PPCBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,0,outfp);
+        else if (stricmp(cpuid,"arm4"))
+                return ARMBrain(cpu_buffer,cpu_pos,cpu_size,BaseAddress,4,outfp);
+    }
+
+    if (type==2) 
+    {
+       return PEFileStart(cpu_buffer, 0, BaseAddress, cpu_size);
+
+    }
+
+    return 0;
+}
+
+CPU_INT PEFileStart( CPU_BYTE *memory, CPU_UNINT pos,
+                     CPU_UNINT base,  CPU_UNINT size)
+{
+    PIMAGE_DOS_HEADER DosHeader;
+    PIMAGE_NT_HEADERS NtHeader;
+
+    DosHeader = (PIMAGE_DOS_HEADER)memory;
+    if ( (DosHeader->e_magic != IMAGE_DOS_SIGNATURE) ||
+         (size < 0x3c+2) )
+    {
+        printf("No MZ file \n");
+        return -1;
+    }
+
+    NtHeader = (PIMAGE_NT_HEADERS) memory+ DosHeader->e_lfanew;
+    if (NtHeader->Signature != IMAGE_NT_SIGNATURE)
+    {
+        printf("No PE header found \n");
+    }
+
+    if (!(NtHeader->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE))
+    {
+        printf("No execute image found \n");
+        return -1;
+    }
+
+    switch(NtHeader->OptionalHeader.Subsystem)
+    {
+        case IMAGE_SUBSYSTEM_EFI_APPLICATION:
+             printf("This exe file is desgin run in EFI bios as applactions\n");
+             break;
+        case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
+             printf("This exe file is desgin run in EFI bios as service driver\n");
+             break;
+        case IMAGE_SUBSYSTEM_EFI_ROM:
+             printf("This exe file is EFI ROM\n");
+             break;
+        case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
+             printf("This exe file is desgin run in EFI bios as driver\n");
+             break;
+        case IMAGE_SUBSYSTEM_NATIVE:
+             printf("This exe file does not need any subsystem\n");
+             break;
+        case IMAGE_SUBSYSTEM_NATIVE_WINDOWS:
+             printf("This exe file is desgin run on Windows 9x as driver \n");
+             break;
+        case IMAGE_SUBSYSTEM_OS2_CUI:
+             printf("This exe file is desgin run on OS2 as CUI\n");
+             break;
+        case IMAGE_SUBSYSTEM_POSIX_CUI:
+             printf("This exe file is desgin run on POSIX as CUI\n");
+             break;
+        case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
+             printf("This exe file is desgin run on Windows CE as GUI\n");
+             break;
+        case IMAGE_SUBSYSTEM_WINDOWS_CUI:
+             printf("This exe file is desgin run on Windows as CUI\n");
+             break;
+        case IMAGE_SUBSYSTEM_WINDOWS_GUI:
+             printf("This exe file is desgin run on Windows as GUI\n");
+             break;
+        case IMAGE_SUBSYSTEM_XBOX:
+             printf("This exe file is desgin run on X-Box\n");
+             break;
+        default:
+            printf("Unknown OS : SubID : %d\n",NtHeader->OptionalHeader.Subsystem);
+            break;
+    }
+
+    //*base =  NtHeader->OptionalHeader.AddressOfEntryPoint;
+
+
+    /* return */
+    switch (NtHeader->FileHeader.Machine)
+   {
+        case IMAGE_FILE_MACHINE_ALPHA:
+             printf("CPU ALPHA Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_ALPHA64:
+             printf("CPU ALPHA64/AXP64 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_AM33:
+             printf("CPU AM33 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_AMD64:
+             printf("CPU AMD64 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_ARM:
+             printf("CPU ARM Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_CEE:
+             printf("CPU CEE Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_CEF:
+             printf("CPU CEF Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_EBC:
+             printf("CPU EBC Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_I386:
+             printf("CPU I386 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_IA64:
+             printf("CPU IA64 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_M32R:
+             printf("CPU M32R Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_MIPS16:
+             printf("CPU MIPS16 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_MIPSFPU:
+             printf("CPU MIPSFPU Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_MIPSFPU16:
+             printf("CPU MIPSFPU16 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_POWERPC:
+             printf("CPU POWERPC Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_POWERPCFP:
+             printf("CPU POWERPCFP Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_R10000:
+             printf("CPU R10000 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_R3000:
+             printf("CPU R3000 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_R4000:
+             printf("CPU R4000 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_SH3:
+             printf("CPU SH3 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_SH3DSP:
+             printf("CPU SH3DSP Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_SH3E:
+             printf("CPU SH3E Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_SH4:
+             printf("CPU SH4 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_SH5:
+             printf("CPU SH5 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_THUMB:
+             printf("CPU THUMB Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_TRICORE:
+             printf("CPU TRICORE Detected no CPUBrain implement for it\n");
+             return -1;
+
+        case IMAGE_FILE_MACHINE_WCEMIPSV2:
+             printf("CPU WCEMIPSV2 Detected no CPUBrain implement for it\n");
+             return -1;
+
+        default:
+            printf("Unknown Machine : %d",NtHeader->FileHeader.Machine);
+            return -1;
+   }
+
+}
 
 
 /* Conveting bit array to a int byte */
 CPU_UNINT ConvertBitToByte(CPU_BYTE *bit)
 {
     CPU_UNINT Byte = 0;
-    CPU_INT t;
+    CPU_UNINT t;
     CPU_UNINT size = 15;
 
-    for(t=size;t>=0;t--)
+    for(t=size;t>0;t--)
     {
         if (bit[size-t] != 2) 
             Byte = Byte + (bit[size-t]<<t);
@@ -51,10 +347,10 @@ CPU_UNINT ConvertBitToByte(CPU_BYTE *bit)
 CPU_UNINT GetMaskByte(CPU_BYTE *bit)
 {
     CPU_UNINT MaskByte = 0;
-    CPU_INT t;
+    CPU_UNINT t;
     CPU_UNINT size = 15;
 
-    for(t=size;t>=0;t--)
+    for(t=size;t>0;t--)
     {
         if (bit[size-t] == 2) 
         {            
@@ -68,10 +364,10 @@ CPU_UNINT GetMaskByte(CPU_BYTE *bit)
 CPU_UNINT ConvertBitToByte32(CPU_BYTE *bit)
 {
     CPU_UNINT Byte = 0;
-    CPU_INT t;
+    CPU_UNINT t;
     CPU_UNINT size = 31;
 
-    for(t=size;t>=0;t--)
+    for(t=size;t>0;t--)
     {
         if (bit[size-t] != 2) 
             Byte = Byte + (bit[size-t]<<t);
@@ -83,10 +379,10 @@ CPU_UNINT ConvertBitToByte32(CPU_BYTE *bit)
 CPU_UNINT GetMaskByte32(CPU_BYTE *bit)
 {
     CPU_UNINT MaskByte = 0;
-    CPU_INT t;
+    CPU_UNINT t;
     CPU_UNINT size = 31;
 
-    for(t=size;t>=0;t--)
+    for(t=size;t>0;t--)
     {
         if (bit[size-t] == 2) 
         {            
@@ -97,103 +393,3 @@ CPU_UNINT GetMaskByte32(CPU_BYTE *bit)
 }
 
 
-
-CPU_UNINT GetData32Le(CPU_BYTE *cpu_buffer)
-{
-    CPU_UNINT cpuint;
-    CPU_UNINT split1;
-    CPU_UNINT split2;
-    CPU_UNINT split3;
-    CPU_UNINT split4;
-
-    cpuint = *((CPU_UNINT*) &cpu_buffer[0]);
-
-    split1 = cpu_buffer[0];
-    split2 = cpu_buffer[1];
-    split3 = cpu_buffer[2];
-    split4 = cpu_buffer[3];
-
-
-    cpuint = split4+(split3 <<8 )+(split2 <<16 )+(split1 <<24 );
-
-    return cpuint;
-}
-
-CPU_UNINT GetData32Be(CPU_BYTE *cpu_buffer)
-{
-    CPU_UNINT cpuint;
-
-    cpuint = *((CPU_UNINT*) &cpu_buffer[0]);
-
-    return cpuint;
-}
-
-
-CPU_INT AllocAny()
-{
-
-    if (pMyBrainAnalys== NULL)
-    {
-        pMyBrainAnalys = (PMYBrainAnalys) malloc(sizeof(MYBrainAnalys));
-        if (pMyBrainAnalys==NULL)
-        {
-            return -1;
-        }
-        ZeroMemory(pMyBrainAnalys,sizeof(MYBrainAnalys));
-        pStartMyBrainAnalys = pMyBrainAnalys;
-    }
-    else
-    {
-        PMYBrainAnalys tmp;
-        tmp = (PMYBrainAnalys) malloc(sizeof(MYBrainAnalys));
-        if (tmp==NULL)
-        {
-            return -1;
-        }
-        ZeroMemory(tmp,sizeof(MYBrainAnalys));
-
-        pMyBrainAnalys->ptr_next = (CPU_BYTE*)tmp;
-        tmp->ptr_prev= (CPU_BYTE*)pMyBrainAnalys;
-        
-        pMyBrainAnalys = tmp;
-    }
-return 0;
-}
-
-CPU_INT FreeAny()
-{
-  PMYBrainAnalys tmp = NULL;
-
-  if (pMyBrainAnalys == NULL)
-  {
-      return -1;
-  }
-
-  tmp = (PMYBrainAnalys)pMyBrainAnalys->ptr_prev;
-
-  while (pMyBrainAnalys != NULL)
-  {
-    if (pMyBrainAnalys == NULL)
-    {
-        break;
-    }
-
-    free(pMyBrainAnalys);
-
-    if (pMyBrainAnalys != NULL)
-    {
-        printf("fail to free memory");
-        return -1;
-    }
-
-    pMyBrainAnalys = tmp;
-  }
-
-  return 0;
-}
-
-
-
-
-
-
index 48999b2..49a2750 100644 (file)
@@ -1,21 +1,15 @@
 
+#define CPU_UNINT unsigned int
+#define CPU_INT int
 
-/* 64bits unsigned */
-#define CPU_UNINT64 unsigned long long
+#define CPU_BYTE unsigned char
 
-/* 32bits */
-#define CPU_UNINT   unsigned int
-#define CPU_INT     int
-
-/* 16 bits signed */
-#define CPU_SHORT short
+/* Prototypes for misc stuff */
 
-/* 8bits unsigned */
-#define CPU_BYTE    unsigned char
 
-/* Prototypes for misc stuff */
-CPU_INT LoadPFileImage(char *infileName, char *outputfileName, CPU_UNINT BaseAddress, char *cpuid, CPU_UNINT type, CPU_INT mode);
-CPU_INT PEFileStart( CPU_BYTE *memory, CPU_UNINT pos, CPU_UNINT base, CPU_UNINT size, FILE *outfp, CPU_INT mode);
+/* Convert Bit index to int */
+CPU_INT LoadPFileImage(char *infileName, char *outputfileName, CPU_UNINT BaseAddress, char *cpuid, CPU_UNINT type);
+CPU_INT PEFileStart( CPU_BYTE *memory, CPU_UNINT pos, CPU_UNINT base,  CPU_UNINT size);
 
 CPU_UNINT ConvertBitToByte(CPU_BYTE *bit);
 CPU_UNINT GetMaskByte(CPU_BYTE *bit);
@@ -23,13 +17,3 @@ CPU_UNINT GetMaskByte(CPU_BYTE *bit);
 CPU_UNINT ConvertBitToByte32(CPU_BYTE *bit);
 CPU_UNINT GetMaskByte32(CPU_BYTE *bit);
 
-CPU_UNINT GetData32Le(CPU_BYTE *cpu_buffer);
-CPU_UNINT GetData32Be(CPU_BYTE *cpu_buffer);
-
-CPU_INT AllocAny();
-CPU_INT FreeAny();
-CPU_INT AnyalsingProcess();
-
-CPU_INT ConvertProcess(FILE *outfp, CPU_INT FromCpuid, CPU_INT ToCpuid);
-
-
index 87f5b2d..a2f003c 100644 (file)
        <xi:include href="notevil/notevil.rbuild" />
 </directory>
 
-<!--
 <directory name="packmgr">
        <xi:include href="packmgr/directory.rbuild" />
 </directory>
--->
 
 <directory name="sysutils">
        <xi:include href="sysutils/sysutils.rbuild" />
index 59bff1e..ddbcf79 100644 (file)
@@ -1,8 +1,8 @@
-<module name="Imagelistviewer" type="win32gui" installbase="bin" installname="Imagelistviewer.exe">\r
+<module name="imagelistviewer" type="win32gui" installbase="bin" installname="imagelistviewer.exe">\r
        <define name="_WIN32_IE">0x0501</define>\r
        <define name="_WIN32_WINNT">0x0501</define>\r
        <define name="__USE_W32API" />\r
-       <include base="Imagelistviewer">.</include>\r
+       <include base="imagelistviewer">.</include>\r
        <library>kernel32</library>\r
        <library>user32</library>\r
        <library>setupapi</library>\r
index 67b85e2..d672754 100644 (file)
 <directory name="icontest">
        <xi:include href="icontest/icontest.rbuild" />
 </directory>
-<directory name="Imagelistviewer">
-       <xi:include href="Imagelistviewer/imagelistviewer.rbuild" />
+<directory name="imagelistviewer">
+       <xi:include href="imagelistviewer/imagelistviewer.rbuild" />
 </directory>
 
 <!-- fixme: iptest -->