Sync to trunk (r44933)
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 5 Jan 2010 00:11:08 +0000 (00:11 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 5 Jan 2010 00:11:08 +0000 (00:11 +0000)
svn path=/branches/ros-amd64-bringup/; revision=44938

191 files changed:
reactos/base/applications/cacls/cacls.c
reactos/base/applications/charmap/lang/ja-JP.rc
reactos/base/applications/magnify/lang/ja-JP.rc [new file with mode: 0644]
reactos/base/applications/magnify/rsrc.rc
reactos/base/applications/mscutils/devmgmt/lang/ja-JP.rc
reactos/base/applications/mscutils/servman/dependencies_tv2.c
reactos/base/applications/mscutils/servman/lang/ja-JP.rc
reactos/base/applications/mscutils/servman/precomp.h
reactos/base/applications/mscutils/servman/propsheet_depends.c
reactos/base/applications/mscutils/servman/stop.c
reactos/base/applications/paint/globalvar.h
reactos/base/applications/paint/lang/ja-JP.rc
reactos/base/applications/paint/main.c
reactos/base/applications/paint/winproc.c
reactos/base/applications/rapps/lang/de-DE.rc
reactos/base/applications/rapps/lang/ja-JP.rc
reactos/base/applications/shutdown/lang/ja-JP.rc [new file with mode: 0644]
reactos/base/applications/shutdown/rsrc.rc
reactos/base/applications/sndrec32/lang/ja-JP.rc [new file with mode: 0644]
reactos/base/applications/sndrec32/rsrc.rc
reactos/base/applications/taskmgr/lang/en-US.rc
reactos/base/applications/taskmgr/lang/fr-FR.rc
reactos/base/applications/taskmgr/lang/ja-JP.rc
reactos/base/applications/taskmgr/lang/ko-KR.rc
reactos/base/applications/taskmgr/lang/nl-NL.rc
reactos/base/applications/taskmgr/lang/ro-RO.rc
reactos/base/applications/taskmgr/lang/sk-SK.rc
reactos/base/applications/taskmgr/lang/uk-UA.rc
reactos/base/applications/taskmgr/lang/zh-CN.rc
reactos/base/applications/taskmgr/taskmgr.c
reactos/base/services/umpnpmgr/umpnpmgr.c
reactos/base/setup/usetup/lang/ja-JP.h
reactos/base/shell/explorer/utility/utility.cpp
reactos/base/shell/explorer/utility/utility.h
reactos/base/shell/explorer/utility/xmlstorage.h
reactos/base/system/runonce/lang/ja-JP.rc [new file with mode: 0644]
reactos/base/system/runonce/rsrc.rc
reactos/base/system/services/rpcserver.c
reactos/baseaddress.rbuild
reactos/boot/bootdata/hivesys_i386.inf
reactos/boot/bootdata/txtsetup.sif
reactos/boot/freeldr/freeldr/windows/i386/wlmemory.c
reactos/dll/cpl/sysdm/lang/ja-JP.rc
reactos/dll/ntdll/def/ntdll.pspec
reactos/dll/win32/advapi32/advapi32.spec
reactos/dll/win32/advapi32/sec/cred.c
reactos/dll/win32/advapi32/service/eventlog.c
reactos/dll/win32/cabinet/fdi.c
reactos/dll/win32/crypt32/cert.c
reactos/dll/win32/crypt32/chain.c
reactos/dll/win32/crypt32/crl.c
reactos/dll/win32/crypt32/ctl.c
reactos/dll/win32/crypt32/store.c
reactos/dll/win32/devmgr/advprop.c
reactos/dll/win32/devmgr/lang/bg-BG.rc
reactos/dll/win32/devmgr/lang/cs-CZ.rc
reactos/dll/win32/devmgr/lang/de-DE.rc
reactos/dll/win32/devmgr/lang/el-GR.rc
reactos/dll/win32/devmgr/lang/en-US.rc
reactos/dll/win32/devmgr/lang/es-ES.rc
reactos/dll/win32/devmgr/lang/fr-FR.rc
reactos/dll/win32/devmgr/lang/hu-HU.rc
reactos/dll/win32/devmgr/lang/id-ID.rc
reactos/dll/win32/devmgr/lang/it-IT.rc
reactos/dll/win32/devmgr/lang/no-NO.rc
reactos/dll/win32/devmgr/lang/pl-PL.rc
reactos/dll/win32/devmgr/lang/pt-BR.rc
reactos/dll/win32/devmgr/lang/ro-RO.rc
reactos/dll/win32/devmgr/lang/ru-RU.rc
reactos/dll/win32/devmgr/lang/sk-SK.rc
reactos/dll/win32/devmgr/lang/uk-UA.rc
reactos/dll/win32/devmgr/resource.h
reactos/dll/win32/gdi32/misc/misc.c
reactos/dll/win32/gdi32/objects/region.c
reactos/dll/win32/gdiplus/gdiplus_private.h
reactos/dll/win32/gdiplus/graphics.c
reactos/dll/win32/gdiplus/image.c
reactos/dll/win32/gdiplus/region.c
reactos/dll/win32/kernel32/misc/env.c
reactos/dll/win32/kernel32/thread/i386/fiber.S
reactos/dll/win32/kernel32/thread/thread.c
reactos/dll/win32/lsasrv/authport.c [new file with mode: 0644]
reactos/dll/win32/lsasrv/lsasrv.c
reactos/dll/win32/lsasrv/lsasrv.h
reactos/dll/win32/lsasrv/lsasrv.rbuild
reactos/dll/win32/msafd/misc/sndrcv.c
reactos/dll/win32/secur32/lsa.c [deleted file]
reactos/dll/win32/secur32/secur32.rbuild
reactos/dll/win32/setupapi/cfgmgr.c
reactos/dll/win32/setupapi/misc.c
reactos/dll/win32/setupapi/setupapi_private.h
reactos/dll/win32/setupapi/stubs.c
reactos/dll/win32/syssetup/lang/ja-JP.rc
reactos/dll/win32/user32/controls/combo.c
reactos/dll/win32/user32/windows/bitmap.c
reactos/dll/win32/user32/windows/icon.c
reactos/dll/win32/wdmaud.drv/legacy.c
reactos/dll/win32/wdmaud.drv/mmixer.c
reactos/dll/win32/wdmaud.drv/wdmaud.c
reactos/drivers/base/directory.rbuild
reactos/drivers/base/nmidebug/nmidebug.c [new file with mode: 0644]
reactos/drivers/base/nmidebug/nmidebug.rbuild [new file with mode: 0644]
reactos/drivers/base/nmidebug/nmidebug.rc [new file with mode: 0644]
reactos/drivers/filesystems/mup/create.c
reactos/drivers/filesystems/mup/mup.c
reactos/drivers/ksfilter/ks/connectivity.c
reactos/hal/halx86/generic/bios.c
reactos/hal/halx86/generic/i386/v86.s
reactos/hal/halx86/generic/misc.c
reactos/hal/halx86/include/hal.h
reactos/hal/halx86/include/halp.h
reactos/include/crt/crtdefs.h
reactos/include/crt/string.h
reactos/include/ddk/cfg.h
reactos/include/ddk/cfgmgr32.h
reactos/include/ddk/winddk.h
reactos/include/ndk/halfuncs.h
reactos/include/ndk/i386/asm.h
reactos/include/ndk/i386/ketypes.h
reactos/include/psdk/gdiplusenums.h
reactos/include/psdk/gdiplusflat.h
reactos/include/psdk/gdiplusimaging.h
reactos/include/psdk/winbase.h
reactos/include/reactos/idl/pnp.idl
reactos/include/reactos/subsys/lsass/lsass.h
reactos/include/reactos/version.h
reactos/lib/drivers/sound/mmixer/controls.c
reactos/lib/drivers/sound/mmixer/mixer.c
reactos/lib/drivers/sound/mmixer/mmixer.h
reactos/lib/drivers/sound/mmixer/priv.h
reactos/lib/drivers/sound/mmixer/sup.c
reactos/lib/lib.rbuild
reactos/lib/lsalib/lsa.c [new file with mode: 0644]
reactos/lib/lsalib/lsalib.rbuild [new file with mode: 0644]
reactos/lib/rtl/rtl.rbuild
reactos/lib/sdk/crt/time/ctime.c
reactos/media/inf/machine.inf
reactos/ntoskrnl/config/cmparse.c
reactos/ntoskrnl/ex/sysinfo.c
reactos/ntoskrnl/ex/time.c
reactos/ntoskrnl/include/internal/i386/asmmacro.S
reactos/ntoskrnl/include/internal/i386/callconv.s [new file with mode: 0644]
reactos/ntoskrnl/include/internal/i386/ke.h
reactos/ntoskrnl/include/internal/ke.h
reactos/ntoskrnl/include/internal/ke_x.h
reactos/ntoskrnl/io/pnpmgr/plugplay.c
reactos/ntoskrnl/io/pnpmgr/pnpmgr.c
reactos/ntoskrnl/kdbg/kdb_cli.c
reactos/ntoskrnl/ke/bug.c
reactos/ntoskrnl/ke/i386/cpu.c
reactos/ntoskrnl/ke/i386/irqobj.c
reactos/ntoskrnl/ke/i386/trap.s
reactos/ntoskrnl/mm/ARM3/expool.c
reactos/ntoskrnl/mm/ARM3/i386/init.c
reactos/ntoskrnl/mm/ARM3/miarm.h
reactos/ntoskrnl/mm/ARM3/pagfault.c
reactos/ntoskrnl/mm/ARM3/pool.c
reactos/ntoskrnl/mm/ARM3/procsup.c
reactos/ntoskrnl/mm/ARM3/virtual.c
reactos/ntoskrnl/mm/dbgpool.c [deleted file]
reactos/ntoskrnl/mm/mminit.c
reactos/ntoskrnl/mm/pool.c [deleted file]
reactos/ntoskrnl/mm/ppool.c
reactos/ntoskrnl/mm/rpoolmgr.h [deleted file]
reactos/ntoskrnl/ntoskrnl-generic.rbuild
reactos/subsystems/ntvdm/lang/zh-CN.rc [new file with mode: 0644]
reactos/subsystems/ntvdm/lang/zh-TW.rc [new file with mode: 0644]
reactos/subsystems/ntvdm/rsrc.rc
reactos/subsystems/win32/csrss/win32csr/lang/ja-JP.rc [new file with mode: 0644]
reactos/subsystems/win32/csrss/win32csr/lang/zh-CN.rc [new file with mode: 0644]
reactos/subsystems/win32/csrss/win32csr/lang/zh-TW.rc [new file with mode: 0644]
reactos/subsystems/win32/csrss/win32csr/rsrc.rc
reactos/subsystems/win32/win32k/eng/engwindow.c
reactos/subsystems/win32/win32k/eng/stretchblt.c
reactos/subsystems/win32/win32k/include/brush.h
reactos/subsystems/win32/win32k/include/dc.h
reactos/subsystems/win32/win32k/include/intgdi.h
reactos/subsystems/win32/win32k/include/region.h
reactos/subsystems/win32/win32k/main/dllmain.c
reactos/subsystems/win32/win32k/ntuser/cursoricon.c
reactos/subsystems/win32/win32k/ntuser/painting.c
reactos/subsystems/win32/win32k/ntuser/window.c
reactos/subsystems/win32/win32k/ntuser/winpos.c
reactos/subsystems/win32/win32k/objects/bitblt.c
reactos/subsystems/win32/win32k/objects/brush.c
reactos/subsystems/win32/win32k/objects/cliprgn.c
reactos/subsystems/win32/win32k/objects/dcattr.c
reactos/subsystems/win32/win32k/objects/dclife.c
reactos/subsystems/win32/win32k/objects/dcstate.c
reactos/subsystems/win32/win32k/objects/gdiobj.c
reactos/subsystems/win32/win32k/objects/region.c

index 023232d..0ad9789 100644 (file)
@@ -180,14 +180,14 @@ BOOL
 PrintFileDacl(IN LPTSTR FilePath,
               IN LPTSTR FileName)
 {
-    SIZE_T Indent;
+    SIZE_T Length;
     PSECURITY_DESCRIPTOR SecurityDescriptor;
     DWORD SDSize = 0;
     TCHAR FullFileName[MAX_PATH + 1];
     BOOL Error = FALSE, Ret = FALSE;
 
-    Indent = _tcslen(FilePath) + _tcslen(FileName);
-    if (Indent++ > MAX_PATH - 1)
+    Length = _tcslen(FilePath) + _tcslen(FileName);
+    if (Length > MAX_PATH)
     {
         /* file name too long */
         SetLastError(ERROR_FILE_NOT_FOUND);
index f59ee5e..17c649a 100644 (file)
@@ -1,7 +1,7 @@
 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
 
 IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233
-CAPTION "\83L\83\83\83\89\83N\83^\81\83}\83b\83v"
+CAPTION "\95\8e\9a\83R\81[\83h\95\\"
 FONT 9,"MS UI Gothic",0,0
 STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX
 BEGIN
@@ -18,11 +18,11 @@ BEGIN
 END
 
 IDD_ABOUTBOX DIALOGEX 22,16,210,182
-CAPTION "\83L\83\83\83\89\83N\83^\81\83}\83b\83v\82É\82Â\82¢\82Ä"
+CAPTION "\95\8e\9a\83R\81[\83h\95\\\82É\82Â\82¢\82Ä"
 FONT 9,"MS UI Gothic",0,0
 STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
 BEGIN
-  LTEXT         "\83L\83\83\83\89\83N\83^\81\83}\83b\83v v0.1\nCopyright (C) 2007 Ged Murphy (gedmurphy@reactos.org)", IDC_STATIC, 48, 7, 150, 36
+  LTEXT         "\95\8e\9a\83R\81[\83h\95\\ v0.1\nCopyright (C) 2007 Ged Murphy (gedmurphy@reactos.org)", IDC_STATIC, 48, 7, 150, 36
   PUSHBUTTON    "\95Â\82\82é", IDOK, 75, 162, 44, 15
   ICON          IDI_ICON, IDC_STATIC, 10, 10, 7, 30
   EDITTEXT      IDC_LICENSE_EDIT, 8, 44, 194, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE
diff --git a/reactos/base/applications/magnify/lang/ja-JP.rc b/reactos/base/applications/magnify/lang/ja-JP.rc
new file mode 100644 (file)
index 0000000..daba7bf
--- /dev/null
@@ -0,0 +1,64 @@
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+
+IDC_MAGNIFIER MENU
+BEGIN
+    POPUP "\83t\83@\83C\83\8b(&F)"
+    BEGIN
+        MENUITEM "\8fI\97¹(&X)",                    IDM_EXIT
+        MENUITEM "\83I\83v\83V\83\87\83\93(&O)",              IDM_OPTIONS
+        MENUITEM SEPARATOR
+        MENUITEM "\83o\81[\83W\83\87\83\93\8fî\95ñ(&A) ...",      IDM_ABOUT
+    END
+END
+
+IDC_MAGNIFIER ACCELERATORS
+BEGIN
+    "?",            IDM_ABOUT,              ASCII,  ALT
+    "/",            IDM_ABOUT,              ASCII,  ALT
+END
+
+IDD_ABOUTBOX DIALOGEX 22, 17, 220, 75
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU
+CAPTION "\8ag\91å\8b¾\82É\82Â\82¢\82Ä"
+FONT 9, "MS UI Gothic", 0, 0, 0x0
+BEGIN
+    ICON            IDI_ICON,IDC_MYICON,14,9,20,20
+    LTEXT           "\8ag\91å\8b¾ \83o\81[\83W\83\87\83\93 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX
+    LTEXT           "Copyright (C) 2007 Marc Piulachs (marc.piulachs@codexchange.net)",IDC_STATIC,48,24,125,22
+    PUSHBUTTON      "OK",IDOK,162,48,50,14
+END
+
+IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "\8ag\91å\8b¾\82Ì\90Ý\92è"
+FONT 9, "MS UI Gothic", 400, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "\8fI\97¹",IDOK,96,161,50,14
+    PUSHBUTTON      "\83w\83\8b\83v",IDC_BUTTON_HELP,38,161,50,14
+    LTEXT           "\8ag\91å\97¦:",IDC_STATIC,6,8,68,8
+    COMBOBOX        IDC_ZOOM,72,6,63,66,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "\8ag\91å\82Ì\91Î\8fÛ",IDC_STATIC,7,25,139,59
+    GROUPBOX        "\95\\\8e¦",IDC_STATIC,7,87,139,57
+    CONTROL         "\83}\83E\83\83J\81[\83\\\83\8b\82Ì\93®\82«\82ð\92Ç\82¤",IDC_FOLLOWMOUSECHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,42,114,10
+    CONTROL         "\83L\81[\83{\81[\83h\82Ì\83t\83H\81[\83J\83X\82ð\92Ç\82¤",IDC_FOLLOWKEYBOARDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,114,10
+    CONTROL         "\95Ò\8fW\92\86\82Ì\83e\83L\83X\83g\82ð\92Ç\82¤",IDC_FOLLOWTEXTEDITINGCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,66,114,10
+    CONTROL         "\90F\82ð\94½\93]\82·\82é",IDC_INVERTCOLORSCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,102,114,10
+    CONTROL         "\8dÅ\8f¬\89»\82µ\82Ä\8aJ\8en\82·\82é",IDC_STARTMINIMIZEDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,114,114,10
+    CONTROL         "\8ag\91å\8b¾\82ð\95\\\8e¦\82·\82é",IDC_SHOWMAGNIFIERCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,126,114,10
+END
+
+IDD_WARNINGDIALOG DIALOGEX 0, 0, 250, 97
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION
+CAPTION "ReactOS \8ag\91å\8b¾"
+FONT 9, "MS UI Gothic", 400, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,193,76,50,14
+    ICON            IDI_ICON,IDC_STATIC,7,17,20,20
+    LTEXT           "\8ag\91å\8b¾\82Í\8cy\82¢\8e\8b\8ao\8fá\8aQ\82ª\82 \82é\95û\82É\8dÅ\92á\8cÀ\82Ì\8b@\94\\\82ð\92ñ\8b\9f\82·\82é\82æ\82¤\82É\90Ý\8cv\82³\82ê\82Ä\82¢\82Ü\82·\81B\82Ù\82Æ\82ñ\82Ç\82Ì\8e\8b\8ao\8fá\8aQ\8eÒ\82Ì\95û\82Ì\8fê\8d\87\81A\93ú\8fí\97\98\97p\82·\82é\82É\82Í\82æ\82è\8d\82\8b@\94\\\82È\8ag\91å\83\86\81[\83e\83B\83\8a\83e\83B\82ª\95K\97v\82Æ\82È\82è\82Ü\82·\81B",IDC_STATIC,36,7,207,33
+    CONTROL         "\8d¡\8cã\81A\82±\82Ì\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82È\82¢",IDC_SHOWWARNINGCHECK, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,43,80,137,10
+END
+
+STRINGTABLE
+BEGIN
+    IDS_APP_TITLE           "\8ag\91å\8b¾"
+END
index ee4aef5..848be8c 100644 (file)
@@ -7,6 +7,7 @@
 #include "lang/de-DE.rc"
 #include "lang/fr-FR.rc"
 #include "lang/it-IT.rc"
+#include "lang/ja-JP.rc"
 #include "lang/no-NO.rc"
 #include "lang/pl-PL.rc"
 #include "lang/ro-RO.rc"
index cd4fd23..2a0afdf 100644 (file)
@@ -51,7 +51,7 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-  IDS_LICENSE "\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Í\83t\83\8a\81[\83\\\83t\83g\83E\83F\83A\82Å\82·\81B\82 \82È\82½\82Í\82±\82ê\82ð\81A\83t\83\8a\81[\83\\\83t\83g\83E\83F\83A\8dà\92c\82É\82æ\82Á\82Ä\94­\8ds\82³\82ê\82½ GNU\88ê\94Ê\8cö\8fO\97\98\97p\8b\96\91ø\8c_\96ñ\8f\91(\83o\81[\83W\83\87\83\932\82©\81A\8aó\96]\82É\82æ\82Á\82Ä\82Í\82»\82ê\88È\8d~\82Ì\83o\81[\83W\83\87\83\93\82Ì\82¤\82¿\82Ç\82ê\82©)\82Ì\92è\82ß\82é\8fð\8c\8f\82Ì\89º\82Å\8dÄ\94Ð\95z\82Ü\82½\82Í\89ü\95Ï\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\r\n\r\n\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Í\97L\97p\82Å\82 \82é\82±\82Æ\82ð\8aè\82Á\82Ä\94z\95z\82³\82ê\82Ü\82·\82ª\81A*\91S\82­\82Ì\96³\95Û\8fØ* \82Å\82·\81B*\8f¤\8bÆ\89Â\94\\\90«\82Ì\95Û\8fØ*\82â*\93Á\92è\82Ì\96Ú\93I\82Ö\82Ì\93K\8d\87\90«*\82Í\81A\8c¾\8aO\82É\8e¦\82³\82ê\82½\82à\82Ì\82à\8aÜ\82ß\91S\82­\91\8dÝ\82µ\82Ü\82¹\82ñ\81B\8fÚ\82µ\82­\82ÍGNU\88ê\94Ê\8cö\8fO\97\98\97p\8b\96\91ø\8c_\96ñ\8f\91\82ð\82²\97\97\82­\82¾\82³\82¢\81B\r\n\r\n\82 \82È\82½\82Í\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Æ\8b¤\82É\81AGNU\88ê\94Ê\8cö\8fO\97\98\97p\8b\96\91ø\8c_\96ñ\8f\91\82Ì\95¡\90»\82ð\88ê\95\94\8eó\82¯\8eæ\82Á\82½\82Í\82¸\82Å\82·\81B\82à\82µ\8eó\82¯\8eæ\82Á\82Ä\82¢\82È\82¯\82ê\82Î\81A\83t\83\8a\81[\83\\\83t\83g\83E\83F\83A\8dà\92c\82Ü\82Å\90¿\8b\81\82µ\82Ä\82­\82¾\82³\82¢(\88\90æ\82Í the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA)\81B"
+  IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA."
 END
 
 STRINGTABLE DISCARDABLE
index 3bbf490..2cd1bca 100644 (file)
@@ -10,8 +10,8 @@
 #include "precomp.h"
 
 
-static BOOL
-HasDependantServices(LPWSTR lpServiceName)
+BOOL
+TV2_HasDependantServices(LPWSTR lpServiceName)
 {
     HANDLE hSCManager;
     HANDLE hService;
@@ -136,7 +136,7 @@ TV2_AddDependantsToTree(PSERVICEPROPSHEET pDlgInfo,
                 for (i = 0; i < count; i++)
                 {
                     /* Does this item need a +/- box? */
-                    bHasChildren = HasDependantServices(lpServiceStatus[i].lpServiceName);
+                    bHasChildren = TV2_HasDependantServices(lpServiceStatus[i].lpServiceName);
 
                     /* Add it */
                     AddItemToTreeView(pDlgInfo->hDependsTreeView2,
index f5e8b1d..097f82d 100644 (file)
@@ -206,7 +206,7 @@ BEGIN
   IDS_NUM_SERVICES      "\83T\81[\83r\83X\82Ì\90\94: %d"
   IDS_STOP_DEPENDS      "%s \82ð\92â\8e~\82·\82é\8fê\8d\87\81A\82±\82ê\82ç\82Ì\83T\81[\83r\83X\82à\92â\8e~\82µ\82Ü\82·"
   IDS_NO_DEPENDS        "<\88Ë\91\8aÖ\8cW\82È\82µ>"
-  IDS_LICENSE           "\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Í\83t\83\8a\81[\83\\\83t\83g\83E\83F\83A\82Å\82·\81B\82 \82È\82½\82Í\82±\82ê\82ð\81A\83t\83\8a\81[\83\\\83t\83g\83E\83F\83A\8dà\92c\82É\82æ\82Á\82Ä\94­\8ds\82³\82ê\82½ GNU\88ê\94Ê\8cö\8fO\97\98\97p\8b\96\91ø\8c_\96ñ\8f\91(\83o\81[\83W\83\87\83\932\82©\81A\8aó\96]\82É\82æ\82Á\82Ä\82Í\82»\82ê\88È\8d~\82Ì\83o\81[\83W\83\87\83\93\82Ì\82¤\82¿\82Ç\82ê\82©)\82Ì\92è\82ß\82é\8fð\8c\8f\82Ì\89º\82Å\8dÄ\94Ð\95z\82Ü\82½\82Í\89ü\95Ï\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\r\n\r\n\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Í\97L\97p\82Å\82 \82é\82±\82Æ\82ð\8aè\82Á\82Ä\94z\95z\82³\82ê\82Ü\82·\82ª\81A*\91S\82­\82Ì\96³\95Û\8fØ* \82Å\82·\81B*\8f¤\8bÆ\89Â\94\\\90«\82Ì\95Û\8fØ*\82â*\93Á\92è\82Ì\96Ú\93I\82Ö\82Ì\93K\8d\87\90«*\82Í\81A\8c¾\8aO\82É\8e¦\82³\82ê\82½\82à\82Ì\82à\8aÜ\82ß\91S\82­\91\8dÝ\82µ\82Ü\82¹\82ñ\81B\8fÚ\82µ\82­\82ÍGNU\88ê\94Ê\8cö\8fO\97\98\97p\8b\96\91ø\8c_\96ñ\8f\91\82ð\82²\97\97\82­\82¾\82³\82¢\81B\r\n\r\n\82 \82È\82½\82Í\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Æ\8b¤\82É\81AGNU\88ê\94Ê\8cö\8fO\97\98\97p\8b\96\91ø\8c_\96ñ\8f\91\82Ì\95¡\90»\82ð\88ê\95\94\8eó\82¯\8eæ\82Á\82½\82Í\82¸\82Å\82·\81B\82à\82µ\8eó\82¯\8eæ\82Á\82Ä\82¢\82È\82¯\82ê\82Î\81A\83t\83\8a\81[\83\\\83t\83g\83E\83F\83A\8dà\92c\82Ü\82Å\90¿\8b\81\82µ\82Ä\82­\82¾\82³\82¢(\88\90æ\82Í the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA)\81B"
+  IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA."
 END
 
 STRINGTABLE DISCARDABLE
index b278327..b50e566 100644 (file)
 #define LVSTARTUP 3
 #define LVLOGONAS 4
 
+#define IMAGE_UNKNOWN 0
+#define IMAGE_SERVICE 1
+#define IMAGE_DRIVER 2
+
 typedef struct _MAIN_WND_INFO
 {
     HWND  hMainWnd;
@@ -130,6 +134,7 @@ VOID TV1_AddDependantsToTree(PSERVICEPROPSHEET pDlgInfo, HTREEITEM hParent, LPTS
 /* tv2_dependencies */
 BOOL TV2_Initialize(PSERVICEPROPSHEET pDlgInfo, LPTSTR lpServiceName);
 VOID TV2_AddDependantsToTree(PSERVICEPROPSHEET pDlgInfo, HTREEITEM hParent, LPTSTR lpServiceName);
+BOOL TV2_HasDependantServices(LPWSTR lpServiceName);
 
 LONG APIENTRY OpenPropSheet(PMAIN_WND_INFO Info);
 
index 7081435..2a7fe8f 100644 (file)
@@ -34,19 +34,19 @@ AddItemToTreeView(HWND hTreeView,
     {
         case SERVICE_WIN32_OWN_PROCESS:
         case SERVICE_WIN32_SHARE_PROCESS:
-            tvi.iImage = 1;
-            tvi.iSelectedImage = 1;
+            tvi.iImage = IMAGE_SERVICE;
+            tvi.iSelectedImage = IMAGE_SERVICE;
             break;
 
         case SERVICE_KERNEL_DRIVER:
         case SERVICE_FILE_SYSTEM_DRIVER:
-            tvi.iImage = 2;
-            tvi.iSelectedImage = 2;
+            tvi.iImage = IMAGE_DRIVER;
+            tvi.iSelectedImage = IMAGE_DRIVER;
             break;
 
         default:
-            tvi.iImage = 0;
-            tvi.iSelectedImage = 0;
+            tvi.iImage = IMAGE_UNKNOWN;
+            tvi.iSelectedImage = IMAGE_UNKNOWN;
             break;
     }
 
index 5a5fef6..412ccae 100644 (file)
 
 
 static BOOL
-StopService(PSTOP_INFO pStopInfo,
-            SC_HANDLE hService)
+StopService(PMAIN_WND_INFO pInfo,
+            LPWSTR lpServiceName)
 {
-    SERVICE_STATUS_PROCESS ServiceStatus;
-    DWORD dwBytesNeeded;
-    DWORD dwStartTime;
-    DWORD dwTimeout;
-    HWND hProgDlg;
+    //SERVICE_STATUS_PROCESS ServiceStatus;
+    //DWORD dwBytesNeeded;
+    //DWORD dwStartTime;
+   // DWORD dwTimeout;
+    //HWND hProgDlg;
     BOOL bRet = FALSE;
-
+/*
     dwStartTime = GetTickCount();
     dwTimeout = 30000; // 30 secs
 
@@ -47,7 +47,7 @@ StopService(PSTOP_INFO pStopInfo,
                 {
                     if (GetTickCount() - dwStartTime > dwTimeout)
                     {
-                        /* We exceeded our max wait time, give up */
+                        We exceeded our max wait time, give up
                         break;
                     }
                 }
@@ -63,13 +63,13 @@ StopService(PSTOP_INFO pStopInfo,
         Sleep(500);
         DestroyWindow(hProgDlg);
     }
-
+*/
     return bRet;
 }
 
 static BOOL
-StopDependentServices(PSTOP_INFO pStopInfo,
-                      SC_HANDLE hService)
+StopDependantServices(PMAIN_WND_INFO pInfo,
+                      LPWSTR lpServiceName)
 {
     //LPENUM_SERVICE_STATUS lpDependencies;
     //SC_HANDLE hDepService;
@@ -118,53 +118,33 @@ StopDependentServices(PSTOP_INFO pStopInfo,
 BOOL
 DoStop(PMAIN_WND_INFO pInfo)
 {
-    STOP_INFO stopInfo;
-    //SC_HANDLE hSCManager;
-    SC_HANDLE hService = NULL;
     BOOL bRet = FALSE;
 
     if (pInfo)
     {
-        //stopInfo.pInfo = pInfo;
-
-        if (TRUE /*HasDependentServices(pInfo->pCurrentService->lpServiceName)*/)
+        /* Does this service have anything which depends on it? */
+        if (TV2_HasDependantServices(pInfo->pCurrentService->lpServiceName))
         {
-            INT ret = DialogBoxParam(hInstance,
-                                     MAKEINTRESOURCE(IDD_DLG_DEPEND_STOP),
-                                     pInfo->hMainWnd,
-                                     StopDependsDialogProc,
-                                     (LPARAM)&stopInfo);
-            if (ret == IDOK)
+            /* It does, list them and ask the user if they want to stop them as well */
+            if (DialogBoxParam(hInstance,
+                               MAKEINTRESOURCE(IDD_DLG_DEPEND_STOP),
+                               pInfo->hMainWnd,
+                               StopDependsDialogProc,
+                               (LPARAM)&pInfo) == IDOK)
             {
-                if (StopDependentServices(&stopInfo, hService))
+                /* Stop all the dependany services */
+                if (StopDependantServices(pInfo, pInfo->pCurrentService->lpServiceName))
                 {
-                    bRet = StopService(&stopInfo, hService);
+                    /* Finally stop the requested service */
+                    bRet = StopService(pInfo, pInfo->pCurrentService->lpServiceName);
                 }
             }
         }
         else
         {
-            bRet = StopService(&stopInfo, hService);
+            /* No dependants, just stop the service */
+            bRet = StopService(pInfo, pInfo->pCurrentService->lpServiceName);
         }
-/*
-        hSCManager = OpenSCManager(NULL,
-                                   NULL,
-                                   SC_MANAGER_ALL_ACCESS);
-        if (hSCManager)
-        {
-            hService = OpenService(hSCManager,
-                                   pInfo->pCurrentService->lpServiceName,
-                                   SERVICE_STOP | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS);
-            if (hService)
-            {
-                stopInfo.hSCManager = hSCManager;
-                stopInfo.hMainService = hService;
-
-                CloseServiceHandle(hService);
-            }
-
-            CloseServiceHandle(hSCManager);
-        }*/
     }
 
     return bRet;
index 964f28b..821e814 100644 (file)
@@ -53,6 +53,7 @@ extern HWND hStatusBar;
 extern HWND hScrollbox;
 extern HWND hMainWnd;
 extern HWND hPalWin;
+extern HWND hToolBoxContainer;
 extern HWND hToolSettings;
 extern HWND hTrackbarZoom;
 extern CHOOSECOLOR choosecolor;
index ece4d5d..c7eebe4 100644 (file)
@@ -201,6 +201,6 @@ BEGIN
     IDS_TOOLTIP16, "\8ap\8aÛ\8el\8ap\8c`"
     IDS_OPENFILTER, "\83r\83b\83g\83}\83b\83\83t\83@\83C\83\8b (*.bmp;*.dib)\1*.bmp;*.dib\1\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)\1*.*\1"
     IDS_SAVEFILTER, "24 \83r\83b\83\83r\83b\83g\83}\83b\83v (*.bmp;*.dib)\1*.bmp;*.dib\1"
-    IDS_FILESIZE, "%d bytes"
-    IDS_PRINTRES, "%d x %d pixels per meter"
+    IDS_FILESIZE, "%d \83o\83C\83g"
+    IDS_PRINTRES, "%d x %d \83s\83N\83Z\83\8b/\83\81\81[\83g\83\8b"
 END
index 790c498..c83554a 100644 (file)
@@ -76,6 +76,7 @@ HWND hStatusBar;
 HWND hScrollbox;
 HWND hMainWnd;
 HWND hPalWin;
+HWND hToolBoxContainer;
 HWND hToolSettings;
 HWND hTrackbarZoom;
 CHOOSECOLOR choosecolor;
@@ -285,6 +286,9 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument
     CreateWindowEx(0, _T("STATIC"), _T(""), WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, 0, 0, 5000, 2, hwnd, NULL,
                    hThisInstance, NULL);
 
+    hToolBoxContainer =
+        CreateWindowEx(0, _T("WindowsApp"), _T(""), WS_CHILD | WS_VISIBLE, 2, 2, 52, 350, hwnd, NULL,
+                       hThisInstance, NULL);
     /* creating the 16 bitmap radio buttons and setting the bitmap */
 
 
@@ -295,7 +299,7 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument
     hToolbar =
         CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
                        WS_CHILD | WS_VISIBLE | CCS_NOPARENTALIGN | CCS_VERT | CCS_NORESIZE | TBSTYLE_TOOLTIPS,
-                       3, 3, 50, 205, hwnd, NULL, hThisInstance, NULL);
+                       1, 1, 50, 205, hToolBoxContainer, NULL, hThisInstance, NULL);
     hImageList = ImageList_Create(16, 16, ILC_COLOR24 | ILC_MASK, 16, 0);
     SendMessage(hToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList);
     tempBm = LoadImage(hThisInstance, MAKEINTRESOURCE(IDB_TOOLBARICONS), IMAGE_BITMAP, 256, 16, 0);
@@ -327,8 +331,8 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument
 
     /* creating the tool settings child window */
     hToolSettings =
-        CreateWindowEx(0, _T("ToolSettings"), _T(""), WS_CHILD | WS_VISIBLE, 7, 210, 42, 140, hwnd, NULL,
-                       hThisInstance, NULL);
+        CreateWindowEx(0, _T("ToolSettings"), _T(""), WS_CHILD | WS_VISIBLE, 5, 208, 42, 140,
+                       hToolBoxContainer, NULL, hThisInstance, NULL);
     hTrackbarZoom =
         CreateWindowEx(0, TRACKBAR_CLASS, _T(""), WS_CHILD | TBS_VERT | TBS_AUTOTICKS, 1, 1, 40, 64,
                        hToolSettings, NULL, hThisInstance, NULL);
index c10e7a7..9d269d3 100644 (file)
@@ -112,6 +112,38 @@ drawZoomFrame(int mouseX, int mouseY)
     ReleaseDC(hImageArea, hdc);
 }
 
+void
+alignChildrenToMainWindow()
+{
+    int x, y, w, h;
+    RECT clientRect;
+    GetClientRect(hMainWnd, &clientRect);
+
+    if (IsWindowVisible(hToolBoxContainer))
+    {
+        x = 56;
+        w = clientRect.right - 56;
+    }
+    else
+    {
+        x = 0;
+        w = clientRect.right;
+    }
+    if (IsWindowVisible(hPalWin))
+    {
+        y = 49;
+        h = clientRect.bottom - 49;
+    }
+    else
+    {
+        y = 3;
+        h = clientRect.bottom - 3;
+    }
+
+    MoveWindow(hScrollbox, x, y, w, IsWindowVisible(hStatusBar) ? h - 23 : h, TRUE);
+    MoveWindow(hPalWin, x, 9, 255, 32, TRUE);
+}
+
 BOOL drawing;
 
 LRESULT CALLBACK
@@ -179,14 +211,10 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                     }
                     break;
                 case 1:
-                    if (undoSteps > 0)
-                        EnableMenuItem(GetMenu(hMainWnd), IDM_EDITUNDO, MF_ENABLED | MF_BYCOMMAND);
-                    else
-                        EnableMenuItem(GetMenu(hMainWnd), IDM_EDITUNDO, MF_GRAYED | MF_BYCOMMAND);
-                    if (redoSteps > 0)
-                        EnableMenuItem(GetMenu(hMainWnd), IDM_EDITREDO, MF_ENABLED | MF_BYCOMMAND);
-                    else
-                        EnableMenuItem(GetMenu(hMainWnd), IDM_EDITREDO, MF_GRAYED | MF_BYCOMMAND);
+                    EnableMenuItem(GetMenu(hMainWnd), IDM_EDITUNDO,
+                                   (undoSteps > 0) ? (MF_ENABLED | MF_BYCOMMAND) : (MF_GRAYED | MF_BYCOMMAND));
+                    EnableMenuItem(GetMenu(hMainWnd), IDM_EDITREDO,
+                                   (redoSteps > 0) ? (MF_ENABLED | MF_BYCOMMAND) : (MF_GRAYED | MF_BYCOMMAND));
                     if (IsWindowVisible(hSelection))
                     {
                         EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCUT, MF_ENABLED | MF_BYCOMMAND);
@@ -219,10 +247,15 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                                   (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
                     break;
             }
-            if (IsWindowVisible(hStatusBar))
-                CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSTATUSBAR, MF_CHECKED | MF_BYCOMMAND);
-            else
-                CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSTATUSBAR, MF_UNCHECKED | MF_BYCOMMAND);
+            CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWTOOLBOX,
+                          IsWindowVisible(hToolBoxContainer) ?
+                              (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
+            CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWCOLORPALETTE,
+                          IsWindowVisible(hPalWin) ?
+                              (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
+            CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSTATUSBAR,
+                          IsWindowVisible(hStatusBar) ?
+                              (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
 
             CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSHOWGRID,
                           showGrid ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
@@ -252,8 +285,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                 int test[] = { LOWORD(lParam) - 260, LOWORD(lParam) - 140, LOWORD(lParam) - 20 };
                 SendMessage(hStatusBar, WM_SIZE, wParam, lParam);
                 SendMessage(hStatusBar, SB_SETPARTS, 3, (LPARAM)&test);
-                MoveWindow(hScrollbox, 56, 49, LOWORD(lParam) - 56, HIWORD(lParam) - 72, TRUE);
-                //InvalidateRect(hwnd, NULL, TRUE);
+                alignChildrenToMainWindow();
             }
             if (hwnd == hImageArea)
             {
@@ -813,8 +845,17 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                     updateCanvasAndScrollbars();
                     break;
 
+                case IDM_VIEWTOOLBOX:
+                    ShowWindow(hToolBoxContainer, IsWindowVisible(hToolBoxContainer) ? SW_HIDE : SW_SHOW);
+                    alignChildrenToMainWindow();
+                    break;
+                case IDM_VIEWCOLORPALETTE:
+                    ShowWindow(hPalWin, IsWindowVisible(hPalWin) ? SW_HIDE : SW_SHOW);
+                    alignChildrenToMainWindow();
+                    break;
                 case IDM_VIEWSTATUSBAR:
                     ShowWindow(hStatusBar, IsWindowVisible(hStatusBar) ? SW_HIDE : SW_SHOW);
+                    alignChildrenToMainWindow();
                     break;
 
                 case IDM_VIEWSHOWGRID:
index 8a1db9c..1ead4ab 100644 (file)
@@ -14,7 +14,7 @@ BEGIN
                MENUITEM "&Deinstallieren",ID_UNINSTALL
                MENUITEM "&Ändern",   ID_MODIFY
                MENUITEM SEPARATOR
-               MENUITEM "&Remove from Registry", ID_REGREMOVE
+               MENUITEM "Aus &Registry entfernen", ID_REGREMOVE
                MENUITEM SEPARATOR
                MENUITEM "&Aktualisieren",  ID_REFRESH
        END
@@ -50,23 +50,23 @@ END
 
 IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE  0, 0, 250, 144
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Settings"
+CAPTION "Einstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       GROUPBOX "General", -1, 4, 2, 240, 61
-       AUTOCHECKBOX "&Save window position", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12
-       AUTOCHECKBOX "&Update the list of accessible programs at start", IDC_UPDATE_AVLIST, 15, 29, 219, 12
-       AUTOCHECKBOX "&Log of installation and removal of programs", IDC_LOG_ENABLED, 15, 46, 219, 12
+       GROUPBOX "Allgemein", -1, 4, 2, 240, 61
+       AUTOCHECKBOX "Fensterposition &speichern", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12
+       AUTOCHECKBOX "Beim Start Liste der verfügbaren Programme &aktualisieren", IDC_UPDATE_AVLIST, 15, 29, 219, 12
+       AUTOCHECKBOX "Hinzufügen und Entfernen von Programmen mit&loggen", IDC_LOG_ENABLED, 15, 46, 219, 12
 
-       GROUPBOX "Downloading", -1, 4, 65, 240, 51
-       LTEXT "Folder for downloadings:", -1, 16, 75, 100, 9
+       GROUPBOX "Download", -1, 4, 65, 240, 51
+       LTEXT "Ordner für Downloads:", -1, 16, 75, 100, 9
        EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP
-       PUSHBUTTON "&Choose", IDC_CHOOSE, 187, 85, 50, 14
-       AUTOCHECKBOX "&Delete installers of programs after installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12
+       PUSHBUTTON "&Wählen", IDC_CHOOSE, 187, 85, 50, 14
+       AUTOCHECKBOX "&Installer nach Programminstallation löschen", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12
 
-       PUSHBUTTON "Default", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14
+       PUSHBUTTON "Vorgabe", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14
        PUSHBUTTON "OK", IDOK, 116, 124, 60, 14
-       PUSHBUTTON "Cancel", IDCANCEL, 181, 124, 60, 14
+       PUSHBUTTON "Abbrechen", IDCANCEL, 181, 124, 60, 14
 END
 
 IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE  0, 0, 216, 97
index 1f27145..ff8cf34 100644 (file)
@@ -98,7 +98,7 @@ STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
 CAPTION "\83o\81[\83W\83\87\83\93\8fî\95ñ"
 FONT 9, "MS UI Gothic"
 BEGIN
-       LTEXT "ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83\81[\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
+       LTEXT "ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
        PUSHBUTTON "\95Â\82\82é", IDOK, 133, 46, 50, 14
        ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
 END
@@ -171,13 +171,13 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-       IDS_APPTITLE            "ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83\81["
+       IDS_APPTITLE            "ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83"
        IDS_SEARCH_TEXT         "\8c\9f\8dõ..."
        IDS_INSTALL             "\83C\83\93\83X\83g\81[\83\8b"
        IDS_UNINSTALL           "\83A\83\93\83C\83\93\83X\83g\81[\83\8b"
        IDS_MODIFY              "\95Ï\8dX"
        IDS_APPS_COUNT          "\83A\83v\83\8a\83P\81[\83V\83\87\83\93\90\94: %d"
-       IDS_WELCOME_TITLE       "ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83\81[\82Ö\82æ\82¤\82±\82»!\n\n"
+       IDS_WELCOME_TITLE       "ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83\82Ö\82æ\82¤\82±\82»!\n\n"
        IDS_WELCOME_TEXT        "\8d\91¤\82©\82ç\83J\83e\83S\83\8a\82ð\91I\91ð\82µ\81A\83C\83\93\83X\83g\81[\83\8b\96\94\82Í\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82·\82é\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\91I\82ñ\82Å\82­\82¾\82³\82¢\81B\nReactOS \83E\83F\83\83T\83C\83g: "
        IDS_WELCOME_URL         "http://www.reactos.org"
        IDS_INSTALLED           "\83C\83\93\83X\83g\81[\83\8b\8dÏ\82Ý"
@@ -186,7 +186,7 @@ BEGIN
        IDS_APPLICATIONS        "\83A\83v\83\8a\83P\81[\83V\83\87\83\93"
        IDS_CHOOSE_FOLDER_TEXT  "\83v\83\8d\83O\83\89\83\80\82Ì\83_\83E\83\93\83\8d\81[\83h\82É\8eg\97p\82·\82é\83t\83H\83\8b\83_\82ð\91I\91ð\82µ\82Ä\82­\82¾\82³\82¢:"
        IDS_CHOOSE_FOLDER_ERROR "\8ew\92è\82³\82ê\82½\83t\83H\83\8b\83_\82Í\91\8dÝ\82µ\82Ü\82¹\82ñ!"
-       IDS_USER_NOT_ADMIN      """ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83\81["" \82ð\8bN\93®\82·\82é\82É\82Í\8aÇ\97\9d\8eÒ\8c \8cÀ\82Å\82 \82é\95K\97v\82ª\82 \82è\82Ü\82·!"
+       IDS_USER_NOT_ADMIN      """ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83"" \82ð\8bN\93®\82·\82é\82É\82Í\8aÇ\97\9d\8eÒ\8c \8cÀ\82Å\82 \82é\95K\97v\82ª\82 \82è\82Ü\82·!"
        IDS_APP_REG_REMOVE "\83\8c\83W\83X\83g\83\8a\82©\82ç\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82½\83v\83\8d\83O\83\89\83\80\82É\8aÖ\82·\82é\83f\81[\83^\82ð\8dí\8f\9c\82µ\82Ä\82à\82æ\82ë\82µ\82¢\82Å\82·\82©?"
        IDS_INFORMATION "\8fî\95ñ"
        IDS_UNABLE_TO_REMOVE "\83\8c\83W\83X\83g\83\8a\82©\82ç\82±\82Ì\83v\83\8d\83O\83\89\83\80\82É\8aÖ\82·\82é\83f\81[\83^\82ð\8dí\8f\9c\82Å\82«\82Ü\82¹\82ñ!"
diff --git a/reactos/base/applications/shutdown/lang/ja-JP.rc b/reactos/base/applications/shutdown/lang/ja-JP.rc
new file mode 100644 (file)
index 0000000..f06e59a
--- /dev/null
@@ -0,0 +1,14 @@
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+BEGIN
+
+IDS_USAGE, "\8eg\97p\96@: shutdown [-?] [-l | -s | -r] [-f]\n\n\
+  \88ø\90\94\82È\82µ\82à\82µ\82­\82Í -?\t\82±\82Ì\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82Ü\82·\n\
+  -l\t\t\t\83\8d\83O\83I\83t\n\
+  -s\t\t\t\83R\83\93\83s\83\85\81[\83^\82ð\83V\83\83\83b\83g\83_\83E\83\93\82µ\82Ü\82·\n\
+  -r\t\t\t\83R\83\93\83s\83\85\81[\83^\82ð\83V\83\83\83b\83g\83_\83E\83\93\82µ\82Ä\8dÄ\8bN\93®\82µ\82Ü\82·\n\
+  -f\t\t\t\8eÀ\8ds\92\86\82Ì\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\8cx\8d\90\82È\82µ\82É\95Â\82\82Ü\82·\n\
+    \t\t\t\91¼\82Ì\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82µ\82È\82¢\8fê\8d\87\81A\83\8d\83O\83I\83tn\n\
+    \t\t\t\82µ\82Ü\82·"
+END
index 18fe216..eda9b52 100644 (file)
@@ -7,6 +7,7 @@
 #include "lang/en-US.rc"
 #include "lang/fr-FR.rc"
 #include "lang/it-IT.rc"
+#include "lang/ja-JP.rc"
 #include "lang/ko-KR.rc"
 #include "lang/lt-LT.rc"
 #include "lang/nl-NL.rc"
@@ -15,3 +16,4 @@
 #include "lang/ru-RU.rc"
 #include "lang/sk-SK.rc"
 #include "lang/uk-UA.rc"
+
diff --git a/reactos/base/applications/sndrec32/lang/ja-JP.rc b/reactos/base/applications/sndrec32/lang/ja-JP.rc
new file mode 100644 (file)
index 0000000..e7efa6b
--- /dev/null
@@ -0,0 +1,54 @@
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+
+IDC_REACTOS_SNDREC32 ACCELERATORS
+BEGIN
+    "?",            IDM_ABOUT,              ASCII,  ALT
+    "/",            IDM_ABOUT,              ASCII,  ALT
+END
+
+IDD_ABOUTBOX DIALOGEX 0, 0, 196, 75
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "reactOS_sndrec32 \82É\8aÖ\82·\82é\8fî\95ñ"
+FONT 9, "MS UI Gothic", 0, 0, 0x1
+BEGIN
+    ICON            128,IDC_REACTOS_SNDREC32,19,14,21,20
+    LTEXT           "reactOS_sndrec32, \83o\81[\83W\83\87\83\93 1.0",IDC_STATIC,56,16,114,8,SS_NOPREFIX
+    LTEXT           "Copyright (C) 2009",IDC_STATIC,55,25,114,8
+    DEFPUSHBUTTON   "OK",IDOK,139,54,50,14,WS_GROUP
+END
+
+IDR_MENU1 MENU
+BEGIN
+    POPUP "\83t\83@\83C\83\8b"
+    BEGIN
+        MENUITEM "\90V\8bK\8dì\90¬",                    ID_NEW
+        MENUITEM "\8aJ\82­...",                     ID_FILE_OPEN
+        MENUITEM "\8fã\8f\91\82«\95Û\91¶",                  ID_FILE_SAVE, GRAYED
+        MENUITEM "\96¼\91O\82ð\82Â\82¯\82Ä\95Û\91¶...",         ID_FILE_SAVEAS, GRAYED
+        MENUITEM SEPARATOR
+        MENUITEM "\8fI\97¹",                        ID_EXIT
+    END
+    MENUITEM "todo1",                       0
+    MENUITEM "todo2",                       0
+    POPUP "?"
+    BEGIN
+        MENUITEM "\83o\81[\83W\83\87\83\93\8fî\95ñ...",                    ID__ABOUT
+    END
+END
+
+STRINGTABLE 
+BEGIN
+    IDS_APP_TITLE           "\83T\83E\83\93\83\83\8c\83R\81[\83_"
+    IDC_REACTOS_SNDREC32    "REACTOS_SNDREC32"
+END
+
+STRINGTABLE 
+BEGIN
+    IDS_STRPOS              "\88Ê\92u: %.2f \95b"
+    IDS_STRDUR              "\92·\82³: %.2f \95b"
+    IDS_STRBUF              "\83o\83b\83t\83@: %.2f kb"
+    IDS_STRFMT              "%.1f kHz %u \83r\83b\83g"
+    IDS_STRMONO             "\83\82\83m\83\89\83\8b"
+    IDS_STRSTEREO           "\83X\83e\83\8c\83I"
+    IDS_STRCHAN             "%s"
+END
index 7bde4fa..82b24cc 100644 (file)
@@ -20,5 +20,6 @@ IDB_BITMAP2_STOP_DIS    BITMAP                  "resources/but_stop_dis.bmp"
 #include "lang/en-US.rc"
 #include "lang/es-ES.rc"
 #include "lang/it-IT.rc"
+#include "lang/ja-JP.rc"
 #include "lang/sk-SK.rc"
 
index 75e6727..dcaa194 100644 (file)
@@ -165,7 +165,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE  0, 0, 264, 246
 STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
     WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
     WS_THICKFRAME
-CAPTION "ReactOS Task Manager"
+CAPTION "Task Manager"
 MENU IDR_TASKMANAGER
 FONT 8, "MS Shell Dlg"
 BEGIN
index 41a95c6..6f06075 100644 (file)
@@ -165,7 +165,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE  0, 0, 264, 246
 STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
     WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
     WS_THICKFRAME
-CAPTION "Gestionnaire des tâches ReactOS"
+CAPTION "Gestionnaire des tâches"
 MENU IDR_TASKMANAGER
 FONT 8, "MS Shell Dlg"
 BEGIN
index 3cb440a..001e8a6 100644 (file)
@@ -165,7 +165,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE  0, 0, 264, 246
 STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
     WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
     WS_THICKFRAME
-CAPTION "ReactOS \83^\83X\83\83}\83l\81[\83W\83\83"
+CAPTION "\83^\83X\83\83}\83l\81[\83W\83\83"
 MENU IDR_TASKMANAGER
 FONT 9, "MS UI Gothic"
 BEGIN
index 674aac5..e446bc6 100644 (file)
@@ -168,7 +168,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE  0, 0, 264, 246
 STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
     WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
     WS_THICKFRAME
-CAPTION "ReactOS ÀÛ¾÷ °ü¸®ÀÚ"
+CAPTION "ÀÛ¾÷ °ü¸®ÀÚ"
 MENU IDR_TASKMANAGER
 FONT 8, "MS Shell Dlg"
 BEGIN
@@ -523,7 +523,7 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-    IDS_APP_TITLE           "ÀÛ¾÷ °ü¸®ÀÚ"
+    IDS_APP_TITLE           "ÀÛ¾÷ °ü¸®ÀÚ" 
     IDC_TASKMGR             "ÀÛ¾÷ °ü¸®ÀÚ"
     IDS_IDLE_PROCESS        "System Idle Process"
 END
index d7b769d..3ce8e52 100644 (file)
@@ -165,7 +165,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE  0, 0, 264, 246
 STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
     WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
     WS_THICKFRAME
-CAPTION "Reactos Taakbeheer"
+CAPTION "Taakbeheer"
 MENU IDR_TASKMANAGER
 FONT 8, "MS Shell Dlg"
 BEGIN
@@ -523,7 +523,7 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-    IDS_APP_TITLE           "Reactos Taakbeheer"
+    IDS_APP_TITLE           "Taakbeheer"
     IDC_TASKMGR             "Taakbeheer"
     IDS_IDLE_PROCESS        "Niet-actieve systeemprocessen"
 END
index 788e987..9509c87 100644 (file)
@@ -165,7 +165,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE  0, 0, 264, 246
 STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
     WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
     WS_THICKFRAME
-CAPTION "Gestionarul de activități ReactOS"
+CAPTION "Gestionarul de activități"
 MENU IDR_TASKMANAGER
 FONT 8, "MS Shell Dlg"
 BEGIN
index 3d3b4fc..da93d37 100644 (file)
@@ -164,7 +164,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE  0, 0, 264, 246
 STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
     WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
     WS_THICKFRAME
-CAPTION "Správca úloh systému ReactOS"
+CAPTION "Správca úloh systému"
 MENU IDR_TASKMANAGER
 FONT 8, "MS Shell Dlg"
 BEGIN
index 41737ad..f983976 100644 (file)
@@ -165,7 +165,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE  0, 0, 264, 246
 STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
     WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
     WS_THICKFRAME
-CAPTION "Äèñïåò÷åð çàâäàíü ReactOS"
+CAPTION "Äèñïåò÷åð çàâäàíü"
 MENU IDR_TASKMANAGER
 FONT 8, "MS Shell Dlg"
 BEGIN
index bb62579..7423300 100644 (file)
@@ -173,7 +173,7 @@ IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE  0, 0, 264, 246
 STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
     WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU |
     WS_THICKFRAME
-CAPTION "ReactOS ÈÎÎñ¹ÜÀíÆ÷"
+CAPTION "ÈÎÎñ¹ÜÀíÆ÷"
 MENU IDR_TASKMANAGER
 FONT 8, "MS Shell Dlg"
 BEGIN
index e0ff5c2..3f8bcbd 100644 (file)
@@ -55,8 +55,27 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
 
     /* check wether we're already running or not */
     hMutex = CreateMutexW(NULL, TRUE, L"taskmgrros");
-    if ((!hMutex) || (GetLastError() == ERROR_ALREADY_EXISTS))
+    if (hMutex && GetLastError() == ERROR_ALREADY_EXISTS)
+    {
+        /* Restore existing taskmanager and bring window to front */
+        /* Relies on the fact that the application title string and window title are the same */
+        HWND hTaskMgr;
+        TCHAR szTaskmgr[128];
+
+        LoadString(hInst, IDS_APP_TITLE, szTaskmgr, sizeof(szTaskmgr)/sizeof(TCHAR));
+        hTaskMgr = FindWindow(NULL, szTaskmgr);
+
+        if (hTaskMgr != NULL)
+        {
+            SendMessage(hTaskMgr, WM_SYSCOMMAND, SC_RESTORE, 0);
+            SetForegroundWindow(hTaskMgr);
+        }
+        return 0;
+    }
+    else if (!hMutex)
+    {
         return 1;
+    }
 
     /* Initialize global variables */
     hInst = hInstance;
index 8fd96c4..e224ee7 100644 (file)
@@ -667,11 +667,11 @@ DWORD PNP_GetDeviceRegProp(
             case CM_DRP_BUSNUMBER:
                 PlugPlayData.Property = DevicePropertyBusNumber;
                 break;
+#endif
 
             case CM_DRP_ENUMERATOR_NAME:
-                PlugPlayData.Property = DevicePropertyEnumeratorName;
+                PlugPlayData.Property = 15; //DevicePropertyEnumeratorName;
                 break;
-#endif
 
             default:
                 return CR_INVALID_PROPERTY;
@@ -1086,9 +1086,6 @@ DWORD PNP_CreateDevInst(
 
 
 /* Function 29 */
-#define PNP_DEVINST_SETUP       0x3
-#define PNP_DEVINST_ENABLE      0x4
-#define PNP_DEVINST_REENUMERATE 0x7
 DWORD PNP_DeviceInstanceAction(
     handle_t hBinding,
     DWORD ulMajorAction,
index 7ef1520..c444450 100644 (file)
@@ -83,31 +83,31 @@ static MUI_ENTRY jaJPWelcomePageEntries[] =
     {
         8,
         15,
-        "\x07  ReactOS¦ ²Ý½Ä°Ù ½ÙÆÊ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ReactOS ¦ ²Ý½Ä°Ù ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         17,
-        "\x07  ReactOS¦ ¼­³Ì¸ Ó¼¸Ê º³¼Ý ½ÙÆÊ R·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ReactOS ¦ ¼­³Ì¸ Ó¼¸Ê º³¼Ý ½ÙÆÊ R ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         19,
-        "\x07  ReactOSɠײ¾Ý½¼Þ®³¹Ý ¦Ë®³¼Þ ½ÙÆÊ L·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ReactOS É ×²¾Ý½¼Þ®³¹Ý¦ Ë®³¼Þ ½ÙÆÊ L ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         21,
-        "\x07  ReactOS¦ ²Ý½Ä°Ù¾½ÞÆ Á­³¼½Ù ÊÞ±²Ê F3·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ReactOS ¦ ²Ý½Ä°Ù ¾½ÞÆ Á­³¼½Ù ÊÞ±²Ê F3 ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         6,
         23,
-        "ReactOSÉ ¼®³»²Å ¼Þ®³Î³Æ ¶Ý¼ÃÊ ¶·¦ ºÞ×ݸÀÞ»²:",
+        "ReactOS É ¼®³»²Å ¼Þ®³Î³Æ ¶Ý¼ÃÊ ²¶¦ ºÞ×Ý ¸ÀÞ»²:",
         TEXT_STYLE_NORMAL
     },
     {
@@ -141,13 +141,13 @@ static MUI_ENTRY jaJPIntroPageEntries[] =
     {
         6,
         8,
-        "ReactOS ¾¯Ä±¯ÌßÊ ¼®· ¶²Ê ÀÞݶ²Æ ±ØϽ¡ ¿ÉÀÒ¤ ÏÀÞ",
+        "ReactOS ¾¯Ä±¯ÌßÊ ¼®·¶²ÊÂÀÞݶ²Æ ±ØϽ¡ ¿ÉÀÒ¤ ÏÀÞ",
         TEXT_STYLE_NORMAL
     },
     {
         6,
         9,
-        "¼Þ­³ÌÞÝÆ ØÖ³ÃÞ·Ù ¾¯Ä±¯Ìß±Ìßع°¼®Ý É ½ÍÞÃɷɳʠ»Îß°Ä »ÚϾݡ",
+        "¼Þ­³ÌÞÝÆ ØÖ³ÃÞ·Ù ¾¯Ä±¯Ìß ±Ìßع°¼®ÝÉ ½ÍÞÃÉ ·É³Ê »Îß°Ä »ÚϾݡ",
         TEXT_STYLE_NORMAL
     },
     {
@@ -159,13 +159,13 @@ static MUI_ENTRY jaJPIntroPageEntries[] =
     {
         8,
         13,
-        "- ¾¯Ä±¯ÌßÊ 1ÂÉ ÃÞ¨½¸Æ Â· 1²¼Þ®³É ÌßײÏØ Ê߰輮ݦ ±Â¶³ºÄÊ Ã޷Ͼݡ",
+        "- ¾¯Ä±¯ÌßÊ 1ÂÉ ÃÞ¨½¸Æ Â· 1²¼Þ®³É ÌßײÏØ Ê߰輮ݦ ±Â¶³ºÄ¶Þ Ã޷Ͼݡ",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         14,
-        "- ¶¸Á®³ Ê߰輮ݠ¶Þ ºÉÃÞ¨½¸¼Þ®³Æ ¿Ý»Þ²½Ù ÊÞ±²¤ ¾¯Ä±¯ÌßÊ",
+        "- ¶¸Á®³ Ê߰輮ݶޠºÉ ÃÞ¨½¸¼Þ®³Æ ¿Ý»Þ²½Ù ÊÞ±²¤ ¾¯Ä±¯ÌßÊ",
         TEXT_STYLE_NORMAL
     },
     {
@@ -201,13 +201,13 @@ static MUI_ENTRY jaJPIntroPageEntries[] =
     {
         8,
         23,
-        "\x07  ReactOS¦ ²Ý½Ä°Ù ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ReactOS ¦ ²Ý½Ä°Ù ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         25,
-        "\x07  ReactOS¦ ²Ý½Ä°Ù¾½ÞÆ Á­³¼ ½Ù ÊÞ±²Ê F3·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ReactOS ¦ ²Ý½Ä°Ù¾½ÞÆ Á­³¼ ½Ù ÊÞ±²Ê F3 ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -241,31 +241,31 @@ static MUI_ENTRY jaJPLicensePageEntries[] =
     {
         8,
         8,
-        "ºÉ ReactOS ¼½ÃÑÊ ¸Ð±Ü¾ ¶É³Å ×²¾Ý½(X11Ô¤BSD µÖËÞ",
+        "ºÉ ReactOS ¼½ÃÑÊ ¸Ð±Ü¾ ¶É³Å ×²¾Ý½(X11 Ô¤BSD µÖËÞ",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         9,
-        "GNU LGPLײ¾Ý½ ÅÄÞ) É º°ÄÞ¦ Ì¸Ñ Êß°ÂÄ ÄÓÆ GNU GPLÉ",
+        "GNU LGPL ×²¾Ý½ ÅÄÞ)É º°ÄÞ¦ Ì¸Ñ Êß°ÂÄ ÄÓÆ GNU GPL É",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         10,
-        "¼Þ®³¹Ý É ÓÄƠײ¾Ý½ »ÚòϽ¡",
+        "¼Þ®³¹ÝÉ ÓÄƠײ¾Ý½ »ÚòϽ¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         11,
-        "ReactOS ¼½ÃÑÉ ²ÁÌÞÉ ½ÍÞÃÉ ¿Ìijª±Ê ReactOS ¼½ÃÑÉ ²ÁÌÞÃÞ",
+        "ReactOS ¼½ÃÑÉ ²ÁÌÞÉ ¿Ìijª±É ½ÍÞÃÊ ReactOS ¼½ÃÑÉ ²ÁÌÞÃÞ",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         12,
-        "±ÙÕ´Æ GNU GPLÀÞ¹ÃÞŸ¤ ¿É ¿Ìijª±É µØ¼ÞÅÙײ¾Ý½É ÓÄÆÓ",
+        "±ÙÕ´Æ GNU GPL ÀÞ¹ÃÞŸ¤ ¿É ¿Ìijª±É µØ¼ÞÅ٠ײ¾Ý½É ÓÄÆÓ",
         TEXT_STYLE_NORMAL
     },
     {
@@ -277,25 +277,25 @@ static MUI_ENTRY jaJPLicensePageEntries[] =
     {
         8,
         15,
-        "ºÉ ¿Ìijª±Ê 'Ñμ®³' Ãޠó·®³ »Ú¤ Á²·Î³Ô º¸»²Î³¶Þ Ã·µ³»ÚÙ",
+        "ºÉ ¿Ìijª±Ê 'Ñμ®³'Ãޠó·®³ »Ú¤ Á²·Î³Ô º¸»²Î³¶Þ Ã·µ³»ÚÙ",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         16,
-        "ÊÞ±²¦ É¿Þ²Ã¤ ØÖ³ ¾²¹Þݦ ³¹Ï½¡ ReactOSɠײ¾Ý½ ·®³ÖÊ",
+        "ÊÞ±²¦ É¿Þ²Ã¤ ØÖ³ ¾²¹Þݦ ³¹Ï½¡ ReactOS É ×²¾Ý½ ·®³ÖÊ",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         17,
-        "ÀÞ²»Ý¼¬ÍÉ ÊÝÊÞ²¦ Ì¾¸Þ ÀÞ¹ ÃÞ½¡",
+        "ÀÞ²»Ý¼¬ÍÉ ÊÝÊÞ²¦ Ì¾¸Þ ÀÞ¹ÃÞ½¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         18,
-        "GNU General Public License¦ ReactOSÄ ÄÓÆ ³¹Ä×Ŷ¯À",
+        "GNU General Public License ¦ ReactOS Ä ÄÓÆ ³¹Ä×Ŷ¯À",
         TEXT_STYLE_NORMAL
     },
     {
@@ -319,7 +319,7 @@ static MUI_ENTRY jaJPLicensePageEntries[] =
     {
         8,
         24,
-        "ºÚÊ ÌØ°¿Ìijª± ÃÞ½¡ ¼®³»²Ê ¿°½É ºËß°¼Þ®³¹Ý¦ ºÞ×Ý ¸ÀÞ»²¡",
+        "ºÚÊ ÌØ° ¿Ìijª±ÃÞ½¡ ¼®³»²Ê ¿°½É ºËß°¼Þ®³¹Ý¦ ºÞ×Ý ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -331,7 +331,7 @@ static MUI_ENTRY jaJPLicensePageEntries[] =
     {
         8,
         26,
-        "Ƶ²ÃÓ ÄÞ³Ö³ ÃÞ½¡",
+        "Ƶ²ÃÓ ÄÞ³Ö³ÃÞ½¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -394,19 +394,19 @@ static MUI_ENTRY jaJPDevicePageEntries[] =
     },
     {
         25,
-        16, "ºÚ×É ÃÞÊÞ²½ ¾¯Ã²¦ ¼Þ­ÀÞ¸ ½Ù",
+        16, "ºÚ×É ÃÞÊÞ²½É ¾¯Ã²¦ ¼Þ­ÀÞ¸ ½Ù",
         TEXT_STYLE_NORMAL
     },
     {
         6,
         19,
-        "UP Ó¼¸Ê DOWN·°¦ µ¼Ã ´ÝÄØ°¦ ¾ÝÀ¸ ½Ù ºÄÆÖØ",
+        "UP Ó¼¸Ê DOWN ·°¦ µ¼Ã ´ÝÄØ°¦ ¾ÝÀ¸ ½Ù ºÄÆÖØ",
         TEXT_STYLE_NORMAL
     },
     {
         6,
         20,
-        "Ê°ÄÞ³ª±É ¾¯Ã²¦ Íݺ³ Ã޷Ͻ¡ ¾ÝÀ¸ ¼Àפ ENTER·°¦ µ¼Ã Ã·¾ÂÅ ¾¯Ã²¦",
+        "Ê°ÄÞ³ª±É ¾¯Ã²¦ Íݺ³ Ã޷Ͻ¡ ¾ÝÀ¸ ¼Àפ ENTER ·°¦ µ¼Ã Ã·¾ÂÅ ¾¯Ã²¦",
         TEXT_STYLE_NORMAL
     },
     {
@@ -418,13 +418,13 @@ static MUI_ENTRY jaJPDevicePageEntries[] =
     {
         6,
         23,
-        "ºÚ×É ¾¯Ã²¶Þ ½ÍÞàÀÀÞ¼² ÊÞ±²Ê¤ \"ºÚ×É ÃÞÊÞ²½ ¾¯Ã²¦ ¼Þ­ÀÞ¸ ½Ù\" ¦ ¾ÝÀ¸ ¼Ã¤",
+        "ºÚ×É ¾¯Ã²¶Þ ½ÍÞàÀÀÞ¼² ÊÞ±²Ê¤ \"ºÚ×É ÃÞÊÞ²½É ¾¯Ã²¦ ¼Þ­ÀÞ¸ ½Ù\" ¦ ¾ÝÀ¸ ¼Ã¤",
         TEXT_STYLE_NORMAL
     },
     {
         6,
         24,
-        "ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -470,25 +470,25 @@ static MUI_ENTRY jaJPRepairPageEntries[] =
     {
         8,
         15,
-        "\x07  OS¦ º³¼Ý ½Ù ÆÊ U·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  OS ¦ º³¼Ý ½ÙÆÊ U ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         17,
-        "\x07  ¶²Ì¸ ºÝ¿°Ù¦ Ë׸ÆÊ R·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ¶²Ì¸ ºÝ¿°Ù¦ Ë׸ÆÊ R ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         19,
-        "\x07  Ò²ÝÍß°¼ÞÆ ÓÄÞÙ ÆÊ ESC·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  Ò²ÝÍß°¼ÞÆ ÓÄÞÙÆÊ ESC ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         21,
-        "\x07  ºÝËß­°À¦ »²·ÄÞ³ ½ÙÆÊ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ºÝËß­°À¦ »²·ÄÞ³ ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -521,19 +521,19 @@ static MUI_ENTRY jaJPComputerPageEntries[] =
     {
         8,
         10,
-        "\x07  UP Ó¼¸Ê DOWN·°¦ µ¼Ã Ã·½Ù ºÝËß­°ÀÉ ¼­Ù²¦ ¾ÝÀ¸ ¼Ã ¸ÀÞ»²¡",
+        "\x07  UP Ó¼¸Ê DOWN ·°¦ µ¼Ã Ã·½Ù ºÝËß­°ÀÉ ¼­Ù²¦ ¾ÝÀ¸ ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         11,
-        "   Â·ÞÆ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "   Â·ÞÆ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         13,
-        "\x07  ºÝËß­°ÀÉ ¼­Ù²¦ Íݺ³¾½ÞÆ Ï´É Íß°¼ÞÆ ÓÄÞÙ ÊÞ±²Ê ESC·°¦",
+        "\x07  ºÝËß­°ÀÉ ¼­Ù²¦ Íݺ³¾½ÞÆ Ï´É Íß°¼ÞÆ ÓÄÞÙ ÊÞ±²Ê ESC ·°¦",
         TEXT_STYLE_NORMAL
     },
     {
@@ -567,7 +567,7 @@ static MUI_ENTRY jaJPFlushPageEntries[] =
     {
         10,
         6,
-        "¼½ÃÑÊ ¶¸¼ÞÂÆ ½ÍÞÃÉ ½ÍÞÃÉ ÃÞ°À¶Þ ÃÞ¨½¸¼Þ®³Æ Î¿ÞÝ »Ú٠ֳƠ¼Ã²Ï½",
+        "¼½ÃÑÊ ¶¸¼ÞÂÆ ½ÍÞÃÉ ÃÞ°À¶Þ ÃÞ¨½¸¼Þ®³Æ Î¿ÞÝ »Ú٠ֳƠ¼Ã²Ï½",
         TEXT_STYLE_NORMAL
     },
     {
@@ -607,31 +607,31 @@ static MUI_ENTRY jaJPQuitPageEntries[] =
     {
         10,
         6,
-        "ReactOSʠϯÀ¸ ²Ý½Ä°Ù »ÚϾÝ",
+        "ReactOS Ê ¶Ý¾ÞÝÆ ²Ý½Ä°Ù »ÚϾÝÃÞ¼À",
         TEXT_STYLE_NORMAL
     },
     {
         10,
         8,
-        "ÄÞײÌÞ A: ¶× ÌÛ¯Ëß° ÃÞ¨½¸¤ CD ÄÞײÌÞ ¶×",
+        "ÄÞײÌÞ A: ¶× ÌÛ¯Ëß° ÃÞ¨½¸¤ CD ÄÞײÌÞ¶×",
         TEXT_STYLE_NORMAL
     },
     {
         10,
         9,
-        "½ÍÞÃÉ CD-ROM¦ ÄØÀ޼à¸ÀÞ»²¡",
+        "½ÍÞÃÉ CD-ROM ¦ ÄØÀ޼à¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         10,
         11,
-        "ºÝËß­°À¦ »²·ÄÞ³ ½ÙÆÊ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "ºÝËß­°À¦ »²·ÄÞ³ ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         0,
         0,
-        "µÏÁ¸ÀÞ»² ...",
+        "µÏÁ ¸ÀÞ»² ...",
         TEXT_TYPE_STATUS | TEXT_PADDING_BIG,
     },
     {
@@ -658,19 +658,19 @@ static MUI_ENTRY jaJPDisplayPageEntries[] =
     },
     {   8,
         10,
-         "\x07  UP Ó¼¸Ê DOWN·°¦ µ¼Ã Ã·½Ù ÃÞ¨½Ìßڲɠ¼­Ù²¦ ¾ÝÀ¸ ¼Ã ¸ÀÞ»²¡",
+         "\x07  UP Ó¼¸Ê DOWN ·°¦ µ¼Ã Ã·½Ù ÃÞ¨½Ìßڲɠ¼­Ù²¦ ¾ÝÀ¸ ¼Ã ¸ÀÞ»²¡",
          TEXT_STYLE_NORMAL
     },
     {
         8,
         11,
-        "   Â·ÞÆ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "   Â·ÞÆ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         13,
-        "\x07  ÃÞ¨½Ìßڲɠ¼­Ù²¦ Íݺ³¾½ÞÆ Ï´É Íß°¼ÞÆ ÓÄÞÙÆÊ ESC·°¦",
+        "\x07  ÃÞ¨½Ìßڲɠ¼­Ù²¦ Íݺ³¾½ÞÆ Ï´É Íß°¼ÞÆ ÓÄÞÙÆÊ ESC ·°¦",
         TEXT_STYLE_NORMAL
     },
     {
@@ -704,25 +704,25 @@ static MUI_ENTRY jaJPSuccessPageEntries[] =
     {
         10,
         6,
-        "ReactOSÉ ·ÎÝÌÞÌÞÝÉ ²Ý½Ä°ÙÊ ¾²º³ ¼Ï¼À¡",
+        "ReactOS É ·ÎÝÌÞÌÞÝÉ ²Ý½Ä°ÙÊ ¾²º³ ¼Ï¼À¡",
         TEXT_STYLE_NORMAL
     },
     {
         10,
         8,
-        "ÄÞײÌÞ A: ¶× ÌÛ¯Ëß° ÃÞ¨½¸¤ CD ÄÞײÌÞ ¶×",
+        "ÄÞײÌÞ A: ¶× ÌÛ¯Ëß° ÃÞ¨½¸¤ CD ÄÞײÌÞ¶×",
         TEXT_STYLE_NORMAL
     },
     {
         10,
         9,
-        "½ÍÞÃÉ CD-ROM¦ ÄØÀ޼à¸ÀÞ»²¡",
+        "½ÍÞÃÉ CD-ROM ¦ ÄØÀ޼à¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         10,
         11,
-        "ºÝËß­°À¦ »²·ÄÞ³ ½Ù ÆÊ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "ºÝËß­°À¦ »²·ÄÞ³ ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -750,7 +750,7 @@ static MUI_ENTRY jaJPBootPageEntries[] =
     {
         6,
         8,
-        "¾¯Ä±¯ÌßÊ ÌÞ°ÄÛ°ÀÞ¦ ºÝËß­°ÀÉ Ê°ÄÞÃÞ¨½¸ ¼Þ®³ Æ ²Ý½Ä°Ù",
+        "¾¯Ä±¯ÌßÊ ÌÞ°ÄÛ°ÀÞ¦ ºÝËß­°ÀÉ Ê°ÄÞÃÞ¨½¸¼Þ®³Æ ²Ý½Ä°Ù",
         TEXT_STYLE_NORMAL
     },
     {
@@ -762,13 +762,13 @@ static MUI_ENTRY jaJPBootPageEntries[] =
     {
         6,
         13,
-        "ÄÞײÌÞ A: Æ Ì«°Ï¯Ä»ÚÀ ÌÛ¯Ëß° ÃÞ¨½¸¦ ²Úä",
+        "ÄÞײÌÞ A: Æ Ì«°Ï¯Ä »ÚÀ ÌÛ¯Ëß° ÃÞ¨½¸¦ ²Úä",
         TEXT_STYLE_NORMAL
     },
     {
         6,
         14,
-        "ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL,
     },
     {
@@ -803,37 +803,37 @@ static MUI_ENTRY jaJPSelectPartitionEntries[] =
     {
         6,
         9,
-        "ÃÞ²½¸ ½Íß°½É ²Á×Ý ÃÞ½¡",
+        "ÃÞ¨½¸ ½Íß°½É ²Á×ÝÃÞ½¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         11,
-        "\x07  UP Ó¼¸Ê DOWN·°¦ µ¼Ã Ø½Ä´ÝÄØ°¦ ¾ÝÀ¸ ¼Ã ¸ÀÞ»²¡",
+        "\x07  UP Ó¼¸Ê DOWN ·°¦ µ¼Ã Ø½Ä ´ÝÄØ°¦ ¾ÝÀ¸ ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         13,
-        "\x07  ¾ÝÀ¸»ÚÀ Ê߰è¼®ÝÆ ReactOS¦ ²Ý½Ä°Ù½Ù ÆÊ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ¾ÝÀ¸»ÚÀ Ê߰è¼®ÝÆ ReactOS ¦ ²Ý½Ä°Ù ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         15,
-        "\x07  ±À×¼² Ê߰輮ݠ¦ »¸¾²½Ù ÆÊ C·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ±À×¼² Ê߰輮ݠ¦ »¸¾² ½ÙÆÊ C ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         17,
-        "\x07  ·¿ÝÉ Ê߰輮ݦ »¸¼Þ®½Ù ÆÊ D·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ·¿ÝÉ Ê߰輮ݦ »¸¼Þ® ½ÙÆÊ D ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         0,
         0,
-        "µÏÁ¸ÀÞ»²...",
+        "µÏÁ ¸ÀÞ»²...",
         TEXT_TYPE_STATUS | TEXT_PADDING_BIG
     },
     {
@@ -861,7 +861,7 @@ static MUI_ENTRY jaJPFormatPartitionEntries[] =
     {
         6,
         10,
-        "¾¯Ä±¯ÌßÊ Ê߰輮ݦ Ì«°Ï¯Ä ¼Ï½¡ ¿Þ¯º³ ½ÙÆÊ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "¾¯Ä±¯ÌßÊ Ê߰輮ݦ Ì«°Ï¯Ä ¼Ï½¡ ¿Þ¯º³ ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -889,7 +889,7 @@ static MUI_ENTRY jaJPInstallDirectoryEntries[] =
     {
         6,
         8,
-        "¾¯Ä±¯ÌßÊ ReactOSɠ̧²Ù¦ ¾ÝÀ¸ »ÚÀ Ê߰輮ݠ¼Þ®³Æ ²Ý½Ä°Ù¼Ï½¡ ReactOS¦",
+        "¾¯Ä±¯ÌßÊ ReactOS É Ì§²Ù¦ ¾ÝÀ¸ »ÚÀ Ê߰輮ݼޮ³Æ ²Ý½Ä°Ù ¼Ï½¡ ReactOS ¦",
         TEXT_STYLE_NORMAL
     },
     {
@@ -901,13 +901,13 @@ static MUI_ENTRY jaJPInstallDirectoryEntries[] =
     {
         6,
         14,
-        "½²¼®³ ÃÞ¨Ú¸Äئ Íݺ³½ÙÆÊ\81ABACKSPACE·°ÃÞ »¸¼Þ®¼À ±ÄƤ",
+        "½²¼®³ ÃÞ¨Ú¸Äئ Íݺ³½ÙÆʤ BACKSPACE ·°ÃÞ Ó¼Þ¦ »¸¼Þ® ¼À ±ÄƤ",
         TEXT_STYLE_NORMAL
     },
     {
         6,
         15,
-        "ReactOS¦ ²Ý½Ä°Ù ½Ù ÃÞ¨Ú¸Äئ Æ­³Ø®¸",
+        "ReactOS ¦ ²Ý½Ä°Ù ½Ù ÃÞ¨Ú¸Äئ Æ­³Ø®¸",
         TEXT_STYLE_NORMAL
     },
     {
@@ -947,7 +947,7 @@ static MUI_ENTRY jaJPFileCopyEntries[] =
     {
         0,
         13,
-        "ºËß°½Ù ±²ÀÞ ¼ÊÞ׸ µÏÁ ¸ÀÞ»²¡",
+        "ºËß° ½Ù ±²ÀÞ ¼ÊÞ׸ µÏÁ ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER
     },
     {
@@ -981,13 +981,13 @@ static MUI_ENTRY jaJPBootLoaderEntries[] =
     {
         6,
         8,
-        "¾¯Ä±¯ÌßÊ ÌÞ°ÄÛ°ÀÞ¦ ²Ý½Ä°Ù ¼Ï½",
+        "¾¯Ä±¯ÌßÊ ÌÞ°Ä Û°ÀÞ¦ ²Ý½Ä°Ù ¼Ï½",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         12,
-        "ÌÞ°ÄÛ°ÀÞ¦ Ê°ÄÞÃÞ¨½¸ (MBR) Æ ²Ý½Ä°Ù ½Ù¡",
+        "ÌÞ°ÄÛ°ÀÞ¦ Ê°ÄÞÃÞ¨½¸ (Ìްľ¸À)Æ ²Ý½Ä°Ù ½Ù¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -1027,19 +1027,19 @@ static MUI_ENTRY jaJPKeyboardSettingsEntries[] =
     {
         6,
         8,
-        "²Ý½Ä°Ù »ÚÙ ·°ÎÞ°ÄÞÉ ¼­Ù²¦ Íݺ³½Ù ºÄ¶Þ ¾ÝÀ¸ »ÚϼÀ¡",
+        "²Ý½Ä°Ù »ÚÙ ·°ÎÞ°ÄÞÉ ¼­Ù²¦ Íݺ³ ½Ù ºÄ¶Þ ¾ÝÀ¸ »ÚϼÀ¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         10,
-        "\x07  UP Ó¼¸Ê DOWN·°¦ µ¼Ã Ã·½Ù ·°ÎÞ°ÄÞÉ ¼­Ù²¦ ¾ÝÀ¸¼Ã ¸ÀÞ»²¡",
+        "\x07  UP Ó¼¸Ê DOWN ·°¦ µ¼Ã Ã·½Ù ·°ÎÞ°ÄÞÉ ¼­Ù²¦ ¾ÝÀ¸ ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         11,
-        "   Â·ÞÆ ENTER·°¦ µ¼Ã¸ÀÞ»²¡",
+        "   Â·ÞÆ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -1079,25 +1079,25 @@ static MUI_ENTRY jaJPLayoutSettingsEntries[] =
     {
         6,
         8,
-        "²Ý½Ä°Ù»ÚÙ ·Äòɠڲ±³Ä¦ ¾ÝÀ¸¼Ã ¸ÀÞ»²¡",
+        "·Ã²É Ú²±³Äļà²Ý½Ä°Ù »ÚÙ Ú²±³Ä¦ ¾ÝÀ¸ ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         10,
-        "\x07  UP Ó¼¸Ê DOWN·°¦ µ¼Ã Ã·½Ù ·°ÎÞ°ÄÞ Ú²±³Ä¦ ¾ÝÀ¸¼Ã¤",
+        "\x07  UP Ó¼¸Ê DOWN ·°¦ µ¼Ã Ã·½Ù ·°ÎÞ°ÄÞ Ú²±³Ä¦ ¾ÝÀ¸ ¼Ã¤",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         11,
-        "    Â·ÞÆ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "    Â·ÞÆ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         13,
-        "\x07  ·°ÎÞ°ÄÞ Ú²±³Ä¦ Íݺ³ ¾½ÞÆ Ï´É Íß°¼ÞÆ ÓÄÞÙÆÊ ESC·°¦",
+        "\x07  ·°ÎÞ°ÄÞ Ú²±³Ä¦ Íݺ³ ¾½ÞÆ Ï´É Íß°¼ÞÆ ÓÄÞÙÆÊ ESC ·°¦",
         TEXT_STYLE_NORMAL
     },
     {
@@ -1132,13 +1132,13 @@ static MUI_ENTRY jaJPPrepareCopyEntries[] =
     {
         6,
         8,
-        "¾¯Ä±¯ÌßÊ ReactOSȨ́²Ù¦ ºÝËß­°ÀÆ ºËß°½Ù ¼Þ­ÝËÞ¦ ¼Ã ²Ï½¡ ",
+        "¾¯Ä±¯ÌßÊ ReactOS Ȩ́²Ù¦ ºÝËß­°ÀÆ ºËß° ½Ù ¼Þ­ÝËÞ¦ ¼Ã ²Ï½¡ ",
         TEXT_STYLE_NORMAL
     },
     {
         0,
         0,
-        "ºËß°½Ù Ì§²Ù Ø½Ä¦ »¸¾² Á­³...",
+        "ºËß° ½Ù Ì§²ÙÉؽĦ »¸¾² Á­³...",
         TEXT_TYPE_STATUS | TEXT_PADDING_BIG
     },
     {
@@ -1167,19 +1167,19 @@ static MUI_ENTRY jaJPSelectFSEntries[] =
     {
         8,
         19,
-        "\x07  UP Ó¼¸Ê DOWN·°¦ µ¼Ã Ì§²Ù ¼½ÃѦ ¾ÝÀ¸¼Ã ¸ÀÞ»²¡",
+        "\x07  UP Ó¼¸Ê DOWN ·°¦ µ¼Ã Ì§²Ù ¼½ÃѦ ¾ÝÀ¸ ¼Ã ¸ÀÞ»²¡",
         0
     },
     {
         8,
         21,
-        "\x07  Ê߰輮ݦ Ì«°Ï¯Ä½ÙÆÊ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  Ê߰輮ݦ Ì«°Ï¯Ä ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
         0
     },
     {
         8,
         23,
-        "\x07  ÍÞÂÉ Ê߰輮ݦ ¾ÝÀ¸½Ù ÊÞ±²¤ ESC·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ÍÞÂÉ Ê߰輮ݦ ¾ÝÀ¸ ½Ù ÊÞ±²¤ ESC ·°¦ µ¼Ã ¸ÀÞ»²¡",
         0
     },
     {
@@ -1208,25 +1208,25 @@ static MUI_ENTRY jaJPDeletePartitionEntries[] =
     {
         6,
         8,
-        "ºÉ Ê߰輮ݦ »¸¼Þ®½Ù ºÄ¶Þ ¾ÝÀ¸ »ÚϼÀ",
+        "ºÉ Ê߰輮ݦ »¸¼Þ® ½Ù ºÄ¶Þ ¾ÝÀ¸ »ÚϼÀ",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         18,
-        "\x07  ºÉ Ê߰輮ݦ »¸¼Þ® ½ÙÆÊ D·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "\x07  ºÉ Ê߰輮ݦ »¸¼Þ® ½ÙÆÊ D ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
         11,
         19,
-        "¹²º¸(WARNING): ºÉ Ê߰輮ݠ¼Þ®³É ½ÍÞÃÉ ÃÞ°ÀÊ ³¼ÅÜÚ Ͻ!",
+        "¹²º¸(WARNING): ºÉ Ê߰輮ݼޮ³É ½ÍÞÃÉ ÃÞ°ÀÊ ³¼ÅÜÚϽ!",
         TEXT_STYLE_NORMAL
     },
     {
         8,
         21,
-        "\x07  ·¬Ý¾Ù½Ù ÆÊ ESC·° ¦ µ¼Ã¸ÀÞ»²¡",
+        "\x07  ·¬Ý¾Ù ½ÙÆÊ ESC ·°¦ µ¼Ã ¸ÀÞ»²¡",
         TEXT_STYLE_NORMAL
     },
     {
@@ -1276,12 +1276,12 @@ MUI_ERROR jaJPErrorEntries[] =
 {
     {
         //ERROR_NOT_INSTALLED
-        "ReactOSÊ ºÝËß­°ÀƠϯÀ¸ ²Ý½Ä°Ù\n"
-        "»ÚϾݡ ¾¯Ä±¯Ìߦ Á­³¼ ½Ù ÊÞ±²¤ ReactOS¦ ²Ý½Ä°Ù½Ù ÆÊ ¾¯Ä±¯Ìߦ\n"
+        "ReactOS Ê ºÝËß­°ÀÆ ¶Ý¾ÞÝÆ ²Ý½Ä°Ù\n"
+        "»ÚϾݡ ¾¯Ä±¯Ìߦ Á­³¼ ½Ù ÊÞ±²¤ ReactOS ¦ ²Ý½Ä°Ù ½ÙÆÊ ¾¯Ä±¯Ìߦ\n"
         "Ó³²ÁÄÞ ¼Þ¯º³ ½Ù ËÂÖ³¶Þ ±ØϽ¡\n"
         "\n"
-        "  \x07  ¾¯Ä±¯Ìߦ ¿Þ¯º³½ÆÊ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡\n"
-        "  \x07  ¾¯Ä±¯Ìߦ Á­³¼½ÙÆÊ F3·°¦ µ¼Ã ¸ÀÞ»²¡",
+        "  \x07  ¾¯Ä±¯Ìߦ ¿Þ¯º³ ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡\n"
+        "  \x07  ¾¯Ä±¯Ìߦ Á­³¼ ½ÙÆÊ F3 ·°¦ µ¼Ã ¸ÀÞ»²¡",
         "F3 = Á­³¼  ENTER = ¿Þ¯º³"
     },
     {
@@ -1291,7 +1291,7 @@ MUI_ERROR jaJPErrorEntries[] =
     },
     {
         //ERROR_NO_SOURCE_DRIVE
-        "¾¯Ä±¯ÌßÊ ¿°½ ÄÞײÌÞ ¦ ¹Ý¼­Â Ã޷ϾݠÃÞ¼À¡\n",
+        "¾¯Ä±¯ÌßÊ ¿°½ ÄÞײÌÞ¦ ¹Ý¼­Â Ã޷ϾݠÃÞ¼À¡\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
@@ -1321,38 +1321,38 @@ MUI_ERROR jaJPErrorEntries[] =
     },
     {
         //ERROR_LOAD_COMPUTER,
-        "¾¯Ä±¯ÌßÊ ºÝËß­°ÀÉ ¼­Ù² Ø½Ä É ÖкÐÆ ¼¯Êß² ¼Ï¼À¡\n",
+        "¾¯Ä±¯ÌßÊ ºÝËß­°ÀÉ ¼­Ù² Ø½ÄÉ ÖкÐÆ ¼¯Êß² ¼Ï¼À¡\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_LOAD_DISPLAY,
-        "¾¯Ä±¯ÌßÊ ÃÞ¨½Ìßڲɠ¾¯Ã² Ø½Ä É ÖкÐÆ ¼¯Êß² ¼Ï¼À¡\n",
+        "¾¯Ä±¯ÌßÊ ÃÞ¨½Ìßڲɠ¾¯Ã² Ø½ÄÉ ÖкÐÆ ¼¯Êß² ¼Ï¼À¡\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_LOAD_KEYBOARD,
-        "¾¯Ä±¯ÌßÊ ·°ÎÞ°ÄÞÉ ¼­Ù² Ø½Ä É ÖкÐÆ ¼¯Êß² ¼Ï¼À¡\n",
+        "¾¯Ä±¯ÌßÊ ·°ÎÞ°ÄÞÉ ¼­Ù² Ø½ÄÉ ÖкÐÆ ¼¯Êß² ¼Ï¼À¡\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_LOAD_KBLAYOUT,
-        "¾¯Ä±¯ÌßÊ ·°ÎÞ°ÄÞ Ú²±³Ä Ø½Ä É ÖкÐÆ ¼¯Êß² ¼Ï¼À¡\n",
+        "¾¯Ä±¯ÌßÊ ·°ÎÞ°ÄÞ Ú²±³Ä Ø½ÄÉ ÖкÐÆ ¼¯Êß² ¼Ï¼À¡\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_WARN_PARTITION,
           "¾¯Ä±¯ÌßÊ ½¸Å¸ÄÓ 1ÂÉ Ê°ÄÞÃÞ¨½¸¶Þ Ã·¾ÂÆ ±Â¶´Å² ºÞ¶Ý¾²É Å²\n"
-          "Ê߰輮ݠðÌÞÙ¦ Ì¸Ñ ºÄ¦ Ê¯¹Ý ¼Ï¼À!\n"
+          "Ê߰輮ݠðÌÞÙ¦ Ì¸Ñ ºÄ¦ ¹Ý¼­Â ¼Ï¼À!\n"
           "\n"
-          "Ê߰輮ݦ »¸¾² ÏÀÊ »¸¼Þ®¼Ã¤ ºÉ Ê߰輮ݠðÌÞÙ¦ Ê¶² Ã޷Ͻ\n"
+          "Ê߰輮ݦ »¸¾² ÏÀÊ »¸¼Þ® ¼Ã¤ ºÉ Ê߰輮ݠðÌÞÙ¦ Ê¶² Ã޷Ͻ\n"
           "\n"
-          "  \x07  ¾¯Ä±¯Ìߦ Á­³¼ ½ÙÆÊ F3·°¦ µ¼Ã ¸ÀÞ»²¡"
-          "  \x07  ¿Þ¯º³ ½ÙÆÊ ENTER·°¦ µ¼Ã ¸ÀÞ»²¡",
+          "  \x07  ¾¯Ä±¯Ìߦ Á­³¼ ½ÙÆÊ F3 ·°¦ µ¼Ã ¸ÀÞ»²¡\n"
+          "  \x07  ¿Þ¯º³ ½ÙÆÊ ENTER ·°¦ µ¼Ã ¸ÀÞ»²¡",
           "F3= Á­³¼  ENTER = ¿Þ¯º³"
     },
     {
         //ERROR_NEW_PARTITION,
-        "±À×¼² Ê߰輮ݠ¦ ½ÃÞÆ ¿Ý»Þ²½Ù\n"
+        "±À×¼² Ê߰輮ݦ ½ÃÞÆ ¿Ý»Þ²½Ù\n"
         "Ê߰è¼®ÝɠŲÌÞÆ »¸¾² ½ÙºÄÊ Ã޷ϾÝ!\n"
         "\n"
         "  * ¿Þ¯º³ ½ÙÆÊ Åƶ ·°¦ µ¼Ã ¸ÀÞ»²¡",
@@ -1382,27 +1382,27 @@ MUI_ERROR jaJPErrorEntries[] =
     },
     {
         //ERROR_UPDATE_DISPLAY_SETTINGS,
-        "¾¯Ä±¯ÌßÊ ÃÞ¨½Ìßڲɠڼ޽ÄØ ¾¯Ã² É º³¼ÝÆ ¼¯Êß² ¼Ï¼À¡",
+        "¾¯Ä±¯ÌßÊ ÃÞ¨½Ìßڲɠڼ޽ÄØ ¾¯Ã²É º³¼ÝÆ ¼¯Êß² ¼Ï¼À¡",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_IMPORT_HIVE,
-        "¾¯Ä±¯ÌßʠʲÌޠ̧²Ù É ²ÝÎß°ÄÆ ¼¯Êß² ¼Ï¼À¡",
+        "¾¯Ä±¯ÌßʠʲÌޠ̧²ÙÉ ²ÝÎß°ÄÆ ¼¯Êß² ¼Ï¼À¡",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_FIND_REGISTRY
-        "¾¯Ä±¯ÌßÊ Ú¼Þ½ÄØ ÃÞ°À Ì§²Ù É ¹Ý¼­ÂÆ ¼¯Êß² ¼Ï¼À¡",
+        "¾¯Ä±¯ÌßÊ Ú¼Þ½ÄØ ÃÞ°À Ì§²ÙÉ ¹Ý¼­ÂÆ ¼¯Êß² ¼Ï¼À¡",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_CREATE_HIVE,
-        "¾¯Ä±¯ÌßÊ Ú¼Þ½ÄؠʲÌÞ É »¸¾²Æ ¼¯Êß² ¼Ï¼À¡",
+        "¾¯Ä±¯ÌßÊ Ú¼Þ½ÄؠʲÌÞÉ »¸¾²Æ ¼¯Êß² ¼Ï¼À¡",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_INITIALIZE_REGISTRY,
-        "¾¯Ä±¯ÌßÊ Ú¼Þ½ÄØ É ¼®·¶Æ ¼¯Êß² ¼Ï¼À¡",
+        "¾¯Ä±¯ÌßÊ Ú¼Þ½ÄØÉ ¼®·¶Æ ¼¯Êß² ¼Ï¼À¡",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
@@ -1412,50 +1412,50 @@ MUI_ERROR jaJPErrorEntries[] =
     },
     {
         //ERROR_CABINET_MISSING,
-        "·¬ËÞȯĠ¶Þ Ð¶ØϾݡ\n",
+        "·¬ËÞȯĶޠжØϾݡ\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_CABINET_SCRIPT,
-        "·¬ËÞȯÄŲƠ¾¯Ä±¯Ìß ½¸ØÌßÄ ¶Þ Ð¶ØϾݡ\n",
+        "·¬ËÞȯÄŲƠ¾¯Ä±¯Ìß ½¸ØÌßĶޠжØϾݡ\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_COPY_QUEUE,
-        "¾¯Ä±¯ÌßÊ ºËß° Ì§²Ù ·­° É µ°ÌßÝÆ ¼¯Êß² ¼Ï¼À¡\n",
+        "¾¯Ä±¯ÌßÊ ºËß° Ì§²Ù ·­°É µ°ÌßÝÆ ¼¯Êß² ¼Ï¼À¡\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_CREATE_DIR,
-        "¾¯Ä±¯ÌßÊ ²Ý½Ä°Ù ÃÞ¨Ú¸ÄØ ¦ »¸¾² Ã޷ϾݠÃÞ¼À¡",
+        "¾¯Ä±¯ÌßÊ ²Ý½Ä°Ù ÃÞ¨Ú¸Äئ »¸¾² Ã޷ϾݠÃÞ¼À¡",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_TXTSETUP_SECTION,
-        "¾¯Ä±¯ÌßÊ TXTSETUP.SIF Å²É 'Directories' ¾¸¼®Ý É¹Ý»¸Æ\n"
+        "¾¯Ä±¯ÌßÊ TXTSETUP.SIF Å²É 'Directories' ¾¸¼®ÝÉ ¹Ý»¸Æ\n"
         "¼¯Êß² ¼Ï¼À¡\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_CABINET_SECTION,
-        "¾¯Ä±¯ÌßÊ ·¬ËÞȯĠŲɠ'Directories' ¾¸¼®Ý É¹Ý»¸Æ\n"
+        "¾¯Ä±¯ÌßÊ ·¬ËÞȯÄŲɠ'Directories' ¾¸¼®ÝÉ ¹Ý»¸Æ\n"
         "¼¯Êß² ¼Ï¼À¡\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_CREATE_INSTALL_DIR
-        "¾¯Ä±¯ÌßÊ ²Ý½Ä°Ù ÃÞ¨Ú¸ÄØ ¦ »¸¾² Ã޷ϾݠÃÞ¼À¡",
+        "¾¯Ä±¯ÌßÊ ²Ý½Ä°Ù ÃÞ¨Ú¸Äئ »¸¾² Ã޷ϾݠÃÞ¼À¡",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_FIND_SETUPDATA,
-        "¾¯Ä±¯ÌßÊ TXTSETUP.SIF Å²É 'SetupData' ¾¸¼®Ý É¹Ý»¸Æ\n"
+        "¾¯Ä±¯ÌßÊ TXTSETUP.SIF Å²É 'SetupData' ¾¸¼®ÝÉ ¹Ý»¸Æ\n"
         "¼¯Êß² ¼Ï¼À¡\n",
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
         //ERROR_WRITE_PTABLE,
-        "¾¯Ä±¯ÌßÊ Ê߰輮ݠðÌÞÙ É ¶·ºÐ Æ ¼¯Êß² ¼Ï¼À¡\n"
+        "¾¯Ä±¯ÌßÊ Ê߰輮ݠðÌÞÙÉ ¶·ºÐÆ ¼¯Êß² ¼Ï¼À¡\n"
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
@@ -1465,7 +1465,7 @@ MUI_ERROR jaJPErrorEntries[] =
     },
     {
         //ERROR_UPDATE_LOCALESETTINGS,
-        "¾¯Ä±¯ÌßÊ ¼½ÃÑ Û¹°Ù ¦ ¾¯Ã² Ã޷ϾݠÃÞ¼À¡\n"
+        "¾¯Ä±¯ÌßÊ ¼½ÃÑ Û¹°Ù¦ ¾¯Ã² Ã޷ϾݠÃÞ¼À¡\n"
         "ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"
     },
     {
@@ -1484,7 +1484,6 @@ MUI_ERROR jaJPErrorEntries[] =
     }
 };
 
-
 MUI_PAGE jaJPPages[] =
 {
     {
@@ -1596,13 +1595,13 @@ MUI_STRING jaJPStrings[] =
     {STRING_PARTITIONSIZE,
      "±À×¼² Ê߰è¼®ÝÉ »²½Þ:"},
     {STRING_CHOOSENEWPARTITION,
-     "±À×¼² Ê߰輮ݠ¦ Â·ÞÆ »¸¾²½Ù ºÄ¶Þ ¾ÝÀ¸ »ÚϼÀ:"},
+     "±À×¼² Ê߰輮ݦ Â·ÞÆ »¸¾²½Ù ºÄ¶Þ ¾ÝÀ¸ »ÚϼÀ:"},
     {STRING_HDDSIZE,
     "±À×¼² Ê߰è¼®ÝÉ »²½Þ¦ Ò¶ÞÊ޲ĠÀݲÃÞ Æ­³Ø®¸ ¼Ã¸ÀÞ»²¡"},
     {STRING_CREATEPARTITION,
      "   ENTER = Ê߰輮ݠ»¸¾²   ESC = ·¬Ý¾Ù   F3 = Á­³¼"},
     {STRING_PARTFORMAT,
-    "ºÉ Ê߰è¼®Ýʠ·ÞÆ Ì«°Ï¯Ä »ÚϽ¡"},
+    "ºÉ Ê߰è¼®Ýʠ·ÞɠüޭÝÃÞ Ì«°Ï¯Ä »ÚϽ¡"},
     {STRING_NONFORMATTEDPART,
     "ReactOS¦ ¼Ý· ÏÀÊ ÐÌ«°Ï¯ÄÉ Ê߰è¼®ÝÆ ²Ý½Ä°Ù½Ù ºÄ¶Þ ¾ÝÀ¸ »ÚϼÀ¡"},
     {STRING_INSTALLONPART,
@@ -1620,7 +1619,7 @@ MUI_STRING jaJPStrings[] =
     {STRING_SETUPCOPYINGFILES,
      "¾¯Ä±¯Ìßʠ̧²Ù¦ ºËß° ¼Ã ²Ï½..."},
     {STRING_REGHIVEUPDATE,
-    "   Ú¼Þ½ÄؠʲÌÞ É º³¼Ý Á­³..."},
+    "   Ú¼Þ½ÄؠʲÌÞÉ º³¼Ý Á­³..."},
     {STRING_IMPORTFILE,
     "   %S ¦ ²ÝÎß°Ä Á­³..."},
     {STRING_DISPLAYETTINGSUPDATE,
@@ -1628,7 +1627,7 @@ MUI_STRING jaJPStrings[] =
     {STRING_LOCALESETTINGSUPDATE,
     "   Á²· ¾¯Ã²É º³¼Ý Á­³..."},
     {STRING_KEYBOARDSETTINGSUPDATE,
-    "   ·°ÎÞ°ÄÞ Ú²±³ÄÉ ¾¯Ã² º³¼Ý Á­³..."},
+    "   ·°ÎÞ°ÄÞ Ú²±³ÄÉ ¾¯Ã²¦ º³¼Ý Á­³..."},
     {STRING_CODEPAGEINFOUPDATE,
     "   º°ÄÞ Íß°¼Þ É ¼Þ®³Î³¦ Ú¼Þ½ÄØƠ²¶ Á­³..."},
     {STRING_DONE,
@@ -1680,9 +1679,9 @@ MUI_STRING jaJPStrings[] =
     {STRING_MAXSIZE,
     "MB (»²ÀÞ². %lu MB)"},
     {STRING_UNFORMATTED,
-    "¼Ý· (Р̫°Ï¯Ä)"},
+    "¼Ý· (ÐÌ«°Ï¯Ä)"},
     {STRING_FORMATUNUSED,
-    "Р¼Ö³"},
+    "мֳ"},
     {STRING_FORMATUNKNOWN,
     "ÌÒ²"},
     {STRING_KB,
@@ -1692,7 +1691,7 @@ MUI_STRING jaJPStrings[] =
     {STRING_GB,
     "GB"},
     {STRING_ADDKBLAYOUTS,
-    "·°ÎÞ°ÄÞ Ú²±³Ä É Â²¶ Á­³"},
+    "·°ÎÞ°ÄÞ Ú²±³Äɠ²¶ Á­³"},
     {0, 0}
 };
 
index a663130..9fe745e 100644 (file)
@@ -158,7 +158,7 @@ String Context::getStackTrace() const
 
 BOOL time_to_filetime(const time_t* t, FILETIME* ftime)
 {
-#ifdef __STDC_WANT_SECURE_LIB__
+#if defined(__STDC_WANT_SECURE_LIB__) && defined(_MS_VER)
        SYSTEMTIME stime;
        struct tm tm_;
        struct tm* tm = &tm_;
index 34984cc..35bfff4 100644 (file)
@@ -183,7 +183,7 @@ BOOL exists_path(LPCTSTR path);
 
 
  // secure CRT functions
-#ifdef __STDC_WANT_SECURE_LIB__        // for VS 2005: _MSC_VER>=1400
+#if defined(__STDC_WANT_SECURE_LIB__) && defined(_MS_VER)      // for VS 2005: _MSC_VER>=1400
 
 #define _stprintf_s1 _stprintf_s
 #define _stprintf_s2 _stprintf_s
index a1964d9..3b5910b 100644 (file)
@@ -512,7 +512,7 @@ struct FileHolder
 {
        FileHolder(LPCTSTR path, LPCTSTR mode)
        {
-#ifdef __STDC_WANT_SECURE_LIB__        // secure CRT functions using VS 2005
+#if defined(__STDC_WANT_SECURE_LIB__) && defined(_MS_VER) // secure CRT functions using VS 2005
                if (_tfopen_s(&_pfile, path, mode) != 0)
                        _pfile = NULL;
 #else
diff --git a/reactos/base/system/runonce/lang/ja-JP.rc b/reactos/base/system/runonce/lang/ja-JP.rc
new file mode 100644 (file)
index 0000000..cc4d740
--- /dev/null
@@ -0,0 +1,11 @@
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+
+IDD_RUNONCE_DLG DIALOG DISCARDABLE 0, 0, 239, 170
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "ReactOS \83Z\83b\83g\83A\83b\83v"
+FONT 9, "MS UI Gothic"
+BEGIN
+       LTEXT "ReactOS \82Í\8e\9f\82Ì\8d\80\96Ú\82ð\90Ý\92è\82µ\82Ä\82¢\82Ü\82·:", -1, 38, 8, 196, 18
+       LISTBOX IDC_COMP_LIST, 36, 32, 197, 131, LBS_OWNERDRAWVARIABLE | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+       ICON IDI_ICON, -1, 5, 6, 21, 20
+END
index c5e0b69..ddeb502 100644 (file)
@@ -1,5 +1,6 @@
 #include "lang/en-US.rc"
 #include "lang/es-ES.rc"
+#include "lang/ja-JP.rc"
 #include "lang/ru-RU.rc"
 #include "lang/sk-SK.rc"
 
index e11507a..d9dcfa3 100644 (file)
@@ -1733,6 +1733,7 @@ DWORD RCreateServiceW(
     SC_HANDLE hServiceHandle = NULL;
     LPWSTR lpImagePath = NULL;
     HKEY hServiceKey = NULL;
+    LPWSTR lpObjectName;
 
     DPRINT("RCreateServiceW() called\n");
     DPRINT("lpServiceName = %S\n", lpServiceName);
@@ -1973,16 +1974,16 @@ DWORD RCreateServiceW(
             goto done;
     }
 
-    /* FIXME: Handle lpServiceStartName propertly! */
-    /* If a non driver and NULL for lpServiceStartName, write ObjectName as LocalSystem */
-    if ((dwServiceType & SERVICE_WIN32) && (!lpServiceStartName))
+    /* Write service start name */
+    if (dwServiceType & SERVICE_WIN32)
     {
+        lpObjectName = (lpServiceStartName != NULL) ? (LPWSTR)lpServiceStartName : L"LocalSystem";
         dwError = RegSetValueExW(hServiceKey,
                                  L"ObjectName",
                                  0,
                                  REG_SZ,
-                                 (LPBYTE)L"LocalSystem",
-                                 24);
+                                 (LPBYTE)lpObjectName,
+                                 (wcslen(lpObjectName) + 1) * sizeof(WCHAR));
         if (dwError != ERROR_SUCCESS)
             goto done;
     }
index 530378e..38f23cb 100644 (file)
 <?xml version="1.0"?>
 <!DOCTYPE group SYSTEM "tools/rbuild/project.dtd">
 <group xmlns:xi="http://www.w3.org/2001/XInclude">
-  <property name="BASEADDRESS_REGTESTS" value="0x07000000" />
-  <property name="BASEADDRESS_NOTIFYHOOK" value="0x08000000" />
-  <property name="BASEADDRESS_QMGRPRXY" value="0x1F710000" />
-  <property name="BASEADDRESS_CRYPTDLG" value="0x209C0000" />
-  <property name="BASEADDRESS_COMCAT" value="0x20A50000" />
-  <property name="BASEADDRESS_WINDOWSCODECS" value="0x26c40000" />
-  <property name="BASEADDRESS_DEVENUM" value="0x35680000" />
-  <property name="BASEADDRESS_RSABASE" value="0x35700000" />
-  <property name="BASEADDRESS_RSAENH" value="0x35780000" />
-  <property name="BASEADDRESS_URL" value="0x42ea0000" />
-  <property name="BASEADDRESS_WLANAPI" value="0x470F0000" />
-  <property name="BASEADDRESS_PIDGEN" value="0x473e0000" />
-  <property name="BASEADDRESS_DWMAPI" value="0x4A3F0000" />
-  <property name="BASEADDRESS_T2EMBED" value="0x4b310000" />
-  <property name="BASEADDRESS_LOADPERF" value="0x4B920000" />
-  <property name="BASEADDRESS_MPRAPI" value="0x4C400000" />
-  <property name="BASEADDRESS_MSFTEDIT" value="0x4b460000" />
-  <property name="BASEADDRESS_WUAPI" value="0x506a0000" />
-  <property name="BASEADDRESS_SRCLIENT" value="0x512C0000" />
-  <property name="BASEADDRESS_PSTOREC" value="0x513D0000" />
-  <property name="BASEADDRESS_LPK" value="0x516C0000" />
-  <property name="BASEADDRESS_MSGSM32ACM" value="0x56db0000" />
-  <property name="BASEADDRESS_MSG711ACM" value="0x584f0000" />
-  <property name="BASEADDRESS_IMAADP32ACM" value="0x585e0000" />
-  <property name="BASEADDRESS_TELEPHON" value="0x58750000" />
-  <property name="BASEADDRESS_PWRCFG" value="0x587e0000" />
-  <property name="BASEADDRESS_MMSYS" value="0x588a0000" />
-  <property name="BASEADDRESS_JOY" value="0x589b0000" />
-  <property name="BASEADDRESS_QMGR" value="0x59620000" />
-  <property name="BASEADDRESS_UXTHEME" value="0x5ad70000" />
-  <property name="BASEADDRESS_VDMDBG" value="0x5b0d0000" />
-  <property name="BASEADDRESS_UNTFS" value="0x5b340000" />
-  <property name="BASEADDRESS_OBJSEL" value="0x5b400000" />
-  <property name="BASEADDRESS_UFAT" value="0x5b570000" />
-  <property name="BASEADDRESS_TAPIUI" value="0x5b770000" />
-  <property name="BASEADDRESS_UEXT2" value="0x5b7a0000" />
-  <property name="BASEADDRESS_SLAYER" value="0x5c7e0000" />
-  <property name="BASEADDRESS_USRMGR" value="0x5c900000" />
-  <property name="BASEADDRESS_SHIMGVW" value="0x5cb00000" />
-  <property name="BASEADDRESS_COMMCTRL" value="0x5d090000" />
-  <property name="BASEADDRESS_DPLAYX" value="0x5e080000" />
-  <property name="BASEADDRESS_INPUT" value ="0x5e400000" />
-  <property name="BASEADDRESS_NTLANMAN" value="0x5f380000" />
-  <property name="BASEADDRESS_DINPUT" value="0x5f580000" />
-  <property name="BASEADDRESS_NETID" value="0x5f660000" />
-  <property name="BASEADDRESS_NTPRINT" value="0x5f6a0000" />
-  <property name="BASEADDRESS_MSSIP32" value="0x60430000" />
-  <property name="BASEADDRESS_MSISIP" value="0x60b10000" />
-  <property name="BASEADDRESS_INSENG" value="0x61000000" />
-  <property name="BASEADDRESS_QEDIT" value="0x611c0000" />
-  <property name="BASEADDRESS_MODEMUI" value="0x61650000" />
-  <property name="BASEADDRESS_MAPI32" value="0x62250000" />
-  <property name="BASEADDRESS_MCIWAVE" value="0x622a0000" />
-  <property name="BASEADDRESS_MCISEQ" value="0x622b0000" />
-  <property name="BASEADDRESS_MCIQTZ32" value="0x622c0000" />
-  <property name="BASEADDRESS_MCICDA" value="0x622e0000" />
-  <property name="BASEADDRESS_LOCALUI" value="0x62f70000" />
-  <property name="BASEADDRESS_HDWWIZ" value="0x64d40000" />
-  <property name="BASEADDRESS_TIMEDATE" value="0x64da0000" />
-  <property name="BASEADDRESS_SYSDM" value="0x64dd0000" />
-  <property name="BASEADDRESS_NCPL" value="0x64ea0000" />
-  <property name="BASEADDRESS_MAIN" value="0x64f40000" />
-  <property name="BASEADDRESS_INTL" value="0x64fb0000" />
-  <property name="BASEADDRESS_CONSOLE" value="0x6e4d0000" />
-  <property name="BASEADDRESS_DESK" value="0x65080000" />
-  <property name="BASEADDRESS_APPWIZ" value="0x65100000" />
-  <property name="BASEADDRESS_MLANG" value="0x65140000" />
-  <property name="BASEADDRESS_ACCESS" value="0x65180000" />
-  <property name="BASEADDRESS_ITSS" value="0x66370000" />
-  <property name="BASEADDRESS_ITIRCL" value="0x663a0000" />
-  <property name="BASEADDRESS_INETMIB1" value="0x666f0000" />
-  <property name="BASEADDRESS_INITPKI" value="0x66b00000" />
-  <property name="BASEADDRESS_WSHTCPIP" value="0x677b0000" />
-  <property name="BASEADDRESS_CRYPT32" value="0x67ab0000" />
-  <property name="BASEADDRESS_HTTPAPI" value="0x67ae0000" />
-  <property name="BASEADDRESS_HID" value="0x688f0000" />
-  <property name="BASEADDRESS_PSXDLL" value="0x68eb0000" />
-  <property name="BASEADDRESS_PSAPI" value="0x68f70000" />
-  <property name="BASEADDRESS_KSPROXY" value="0x68f90000" />
-  <property name="BASEADDRESS_GETUNAME" value="0x69110000" />
-  <property name="BASEADDRESS_OLEACC" value="0x69640000" />
-  <property name="BASEADDRESS_WINMM" value="0x697d0000" />
-  <property name="BASEADDRESS_MSIMG32" value="0x69cc0000" />
-  <property name="BASEADDRESS_BROWSEUI" value="0x69cd0000" />
-  <property name="BASEADDRESS_NETPLWIZ" value="0x6a240000" />
-  <property name="BASEADDRESS_SHELL32" value="0x6a360000" />
-  <property name="BASEADDRESS_UNICODE" value="0x6b200000" />
-  <property name="BASEADDRESS_ADVPACK" value="0x6b300000" />
-  <property name="BASEADDRESS_CONTROL" value="0x6b310000" />
-  <property name="BASEADDRESS_NCPA" value="0x6b320000" />
-  <property name="BASEADDRESS_DBGHELP" value="0x6b330000" />
-  <property name="BASEADDRESS_DINPUT8" value="0x6b340000" />
-  <property name="BASEADDRESS_DXDIAGN" value="0x6b350000" />
-  <property name="BASEADDRESS_DSOUND" value="0x6b360000" />
-  <property name="BASEADDRESS_GLU32" value="0x6b370000" />
-  <property name="BASEADDRESS_MESA32" value="0x6b380000" />
-  <property name="BASEADDRESS_OPENGL32" value="0x6b390000" />
-  <property name="BASEADDRESS_SECUR32" value="0x6b3a0000" />
-  <property name="BASEADDRESS_SMDLL" value="0x6b3b0000" />
-  <property name="BASEADDRESS_URLMON" value="0x6b3c0000" />
-  <property name="BASEADDRESS_SERIALUI" value="0x6b3D0000" />
-  <property name="BASEADDRESS_HLINK" value="0x6C6E0000" />
-  <property name="BASEADDRESS_DESKMON" value="0x6d400000" />
-  <property name="BASEADDRESS_DESKADP" value="0x6d410000" />
-  <property name="BASEADDRESS_WLDAP32" value="0x6e130000" />
-  <property name="BASEADDRESS_SXS" value="0x6e160000" />
-  <property name="BASEADDRESS_SCHANNEL" value="0x6e360000" />
-  <property name="BASEADDRESS_COMPSTUI" value="0x6ec10000" />
-  <property name="BASEADDRESS_HNETCFG" value="0x6edb0000" />
-  <property name="BASEADDRESS_CLB" value="0x6f2b0000" />
-  <property name="BASEADDRESS_JSCRIPT" value="0x6fe80000" />
-  <property name="BASEADDRESS_FONTEXT" value="0x6f7b0000" />
-  <property name="BASEADDRESS_CARDS" value="0x701a0000" />
-  <property name="BASEADDRESS_WININET" value="0x70200000" />
-  <property name="BASEADDRESS_WINHTTP" value="0x70c60000" />
-  <property name="BASEADDRESS_AMSTREAM" value="0x71030000" />
-  <property name="BASEADDRESS_ACLUI" value="0x71550000" />
-  <property name="BASEADDRESS_DHCPCSVC" value="0x71650000" />
-  <property name="BASEADDRESS_SHDOCVW" value="0x71700000" />
-  <property name="BASEADDRESS_ACTXPRXY" value="0x71800000" />
-  <property name="BASEADDRESS_MSWSOCK" value="0x71a30000" />
-  <property name="BASEADDRESS_WSOCK32" value="0x71ab0000" />
-  <property name="BASEADDRESS_ACLEDIT" value="0x71b70000" />
-  <property name="BASEADDRESS_NETAPI32" value="0x71c00000" />
-  <property name="BASEADDRESS_OLESVR32" value="0x71dd0000" />
-  <property name="BASEADDRESS_OLECLI32" value="0x71df0000" />
-  <property name="BASEADDRESS_OLETHK32" value="0x71e10000" />
-  <property name="BASEADDRESS_DPLAY" value="0x71e80000" />
-  <property name="BASEADDRESS_SECURITY" value="0x71f10000" />
-  <property name="BASEADDRESS_MSSIGN32" value="0x720c0000" />
-  <property name="BASEADDRESS_CRYPTUI" value="0x720D0000" />
-  <property name="BASEADDRESS_WINFAX" value="0x722C0000" />
-  <property name="BASEADDRESS_WINSCARD" value="0x723d0000" />
-  <property name="BASEADDRESS_DEVMGR" value="0x72a90000" />
-  <property name="BASEADDRESS_MSADP32ACM" value="0x72cb0000" />
-  <property name="BASEADDRESS_WDMAUD" value="0x72d20000" />
-  <property name="BASEADDRESS_WINSPOOL" value="0x72f50000" />
-  <property name="BASEADDRESS_SOFTPUB" value="0x73290000" />
-  <property name="BASEADDRESS_MSCAT32" value="0x732b0000" />
-  <property name="BASEADDRESS_MSTASK" value="0x73520000" />
-  <property name="BASEADDRESS_TRAFFIC" value="0x73550000" />
-  <property name="BASEADDRESS_MCIAVI32" value="0x73610000" />
-  <property name="BASEADDRESS_MSVIDC32" value="0x73650000" />
-  <property name="BASEADDRESS_MSRLE32" value="0x73660000" />
-  <property name="BASEADDRESS_MSDMO" value="0x73670000" />
-  <property name="BASEADDRESS_AVICAP32" value="0x739e0000" />
-  <property name="BASEADDRESS_AVIFIL32" value="0x73ac0000" />
-  <property name="BASEADDRESS_MSCMS" value="0x73af0000" />
-  <property name="BASEADDRESS_DCIMAN32" value="0x73b10000" />
-  <property name="BASEADDRESS_STI" value="0x73b60000" />
-  <property name="BASEADDRESS_ICCVID" value="0x73bc0000" />
-  <property name="BASEADDRESS_LZ32" value="0x73d80000" />
-  <property name="BASEADDRESS_COREDLL" value="0x73d80000" />
-  <property name="BASEADDRESS_KSUSER" value="0x73ea0000" />
-  <property name="BASEADDRESS_ICMP" value="0x741f0000" />
-  <property name="BASEADDRESS_SPOOLSS" value="0x742a0000" />
-  <property name="BASEADDRESS_MSIMTF" value="0x746b0000" />
-  <property name="BASEADDRESS_MSCTF" value="0x746e0000" />
-  <property name="BASEADDRESS_QUARTZ" value="0x747d0000" />
-  <property name="BASEADDRESS_USERENV" value="0x74850000" />
-  <property name="BASEADDRESS_WS2_32" value="0x74aa0000" />
-  <property name="BASEADDRESS_SYSSETUP" value="0x74a30000" />
-  <property name="BASEADDRESS_POWRPROF" value="0x74ad0000" />
-  <property name="BASEADDRESS_MSXML3" value="0x74ae0000" />
-  <property name="BASEADDRESS_PRINTUI" value="0x74b40000" />
-  <property name="BASEADDRESS_MMDRV" value="0x74c30000" />
-  <property name="BASEADDRESS_PDH" value="0x74c70000" />
-  <property name="BASEADDRESS_OLEDLG" value="0x74d00000" />
-  <property name="BASEADDRESS_SAMSRV" value="0x74f30000" />
-  <property name="BASEADDRESS_RESUTILS" value="0x75070000" />
-  <property name="BASEADDRESS_SAMLIB" value="0x750C0000" />
-  <property name="BASEADDRESS_CABINET" value="0x75120000" />
-  <property name="BASEADDRESS_NETCFGX" value="0x755F0000" />
-  <property name="BASEADDRESS_IPHLPAPI" value="0x75700000" />
-  <property name="BASEADDRESS_NDDEAPI" value="0x75940000" />
-  <property name="BASEADDRESS_MSGINA" value="0x75970000" />
-  <property name="BASEADDRESS_LOCALSPL" value="0x75b80000" />
-  <property name="BASEADDRESS_CRYPTNET" value="0x75e60000" />
-  <property name="BASEADDRESS_RPCRT4" value="0x76000000" />
-  <property name="BASEADDRESS_SHLWAPI" value="0x76120000" />
-  <property name="BASEADDRESS_INETCOMM" value="0x76150000" />
-  <property name="BASEADDRESS_COMCTL32" value="0x76160000" />
-  <property name="BASEADDRESS_COMDLG32" value="0x76210000" />
-  <property name="BASEADDRESS_WINSTA" value="0x762F0000" />
-  <property name="BASEADDRESS_IMM32" value="0x76320000" />
-  <property name="BASEADDRESS_RICHED32" value="0x76340000" />
-  <property name="BASEADDRESS_D3D8THK" value="0x76340000" />
-  <property name="BASEADDRESS_RICHED20" value="0x76360000" />
-  <property name="BASEADDRESS_TWAIN_32" value="0x76380000" />
-  <property name="BASEADDRESS_NETSHELL" value="0x76390000" />
-  <property name="BASEADDRESS_LSASRV" value="0x76540000" />
-  <property name="BASEADDRESS_MIDIMAP" value="0x76600000" />
-  <property name="BASEADDRESS_ODBC32" value="0x76660000" />
-  <property name="BASEADDRESS_MSHTML" value="0x76660000" />
-  <property name="BASEADDRESS_ODBCCP32" value="0x76380000" />
-  <property name="BASEADDRESS_WAVEMAP" value="0x76610000" />
-  <property name="BASEADDRESS_MPR" value="0x76620000" />
-  <property name="BASEADDRESS_SETUPAPI" value="0x76660000" />
-  <property name="BASEADDRESS_CRYPTDLL" value="0x76740000" />
-  <property name="BASEADDRESS_SHFOLDER" value="0x76760000" />
-  <property name="BASEADDRESS_NTDSAPI" value="0x76780000" />
-  <property name="BASEADDRESS_NTMARTA" value="0x768A0000" />
-  <property name="BASEADDRESS_RASDLG" value="0x768d0000" />
-  <property name="BASEADDRESS_GDIPLUS" value="0x76a00000" />
-  <property name="BASEADDRESS_ATL" value="0x76a80000" />
-  <property name="BASEADDRESS_SFC" value="0x76b50000" />
-  <property name="BASEADDRESS_CREDUI" value="0x76bf0000" />
-  <property name="BASEADDRESS_SFC_OS" value="0x76c10000" />
-  <property name="BASEADDRESS_WINTRUST" value="0x76c30000" />
-  <property name="BASEADDRESS_IMAGEHLP" value="0x76c90000" />
-  <property name="BASEADDRESS_CLUSAPI" value="0x76d10000" />
-  <property name="BASEADDRESS_WMI" value="0x76d20000" />
-  <property name="BASEADDRESS_DHCPCSVC" value="0x76d80000" />
-  <property name="BASEADDRESS_FMIFS" value="0x76df0000" />
-  <property name="BASEADDRESS_OLEAUT32" value="0x76e00000" />
-  <property name="BASEADDRESS_TAPI32" value="0x76e60000" />
-  <property name="BASEADDRESS_RASMAN" value="0x76e90000" />
-  <property name="BASEADDRESS_RASAPI32" value="0x76ee0000" />
-  <property name="BASEADDRESS_WTSAPI32" value="0x76f50000" />
-  <property name="BASEADDRESS_MSVFW32" value="0x76f60000" />
-  <property name="BASEADDRESS_MSACM32" value="0x77400000" />
-  <property name="BASEADDRESS_CRTDLL" value="0x77630000" />
-  <property name="BASEADDRESS_AUTHZ" value="0x77690000" />
-  <property name="BASEADDRESS_CFGMGR32" value="0x77700000" />
-  <property name="BASEADDRESS_SENSAPI" value="0x77700000" />
-  <property name="BASEADDRESS_PACKET" value="0x77780000" />
-  <property name="BASEADDRESS_MSAFD" value="0x77780000" />
-  <property name="BASEADDRESS_MSI" value="0x77790000" />
-  <property name="BASEADDRESS_SNMPAPI" value="0x777a0000" />
-  <property name="BASEADDRESS_USP10" value="0x777b0000" />
-  <property name="BASEADDRESS_IPRTPRIO" value="0x777c0000" />
-  <property name="BASEADDRESS_WS2HELP" value="0x777e0000" />
-  <property name="BASEADDRESS_WSHIRDA" value="0x777f0000" />
-  <property name="BASEADDRESS_VERSION" value="0x77a40000" />
-  <property name="BASEADDRESS_OLE32" value="0x77a50000" />
-  <property name="BASEADDRESS_OLEPRO32" value="0x77b10000" />
-  <property name="BASEADDRESS_ACTIVEDS" value="0x77cb0000" />
-  <property name="BASEADDRESS_ADVAPI32" value="0x77dc0000" />
-  <property name="BASEADDRESS_USER32" value="0x77e50000" />
-  <property name="BASEADDRESS_GDI32" value="0x77f70000" />
-  <property name="BASEADDRESS_DNSAPI" value="0x77fb0000" />
-  <property name="BASEADDRESS_MSVCRT" value="0x78000000" />
-  <property name="BASEADDRESS_MSVCRT20" value="0x78500000" />
-  <property name="BASEADDRESS_MSVCRT40" value="0x78700000" />
-  <property name="BASEADDRESS_MSCOREE" value="0x79000000" />
-  <property name="BASEADDRESS_FUSION" value="0x79040000" />
-  <property name="BASEADDRESS_KERNEL32" value="0x7c700000" />
-  <property name="BASEADDRESS_NTDLL" value="0x7c900000" />
-  <property name="BASEADDRESS_QUERY" value="0x7d9a0000" />
-  <property name="BASEADDRESS_HHCTRL" value="0x7e410000" />
-  <property name="BASEADDRESS_SXS" value="0x7e690000" />
-  <property name="BASEADDRESS_BEEPMIDI" value="0x7ef0000" />
-  <property name="BASEADDRESS_FREETYPE" value="0x7f000000" />
+       <property name="BASEADDRESS_REGTESTS"           value="0x07000000" />
+       <property name="BASEADDRESS_NOTIFYHOOK"         value="0x08000000" />
+       <property name="BASEADDRESS_QMGRPRXY"           value="0x1f710000" />
+       <property name="BASEADDRESS_CRYPTDLG"           value="0x209c0000" />
+       <property name="BASEADDRESS_COMCAT"             value="0x20a50000" />
+       <property name="BASEADDRESS_WINDOWSCODECS"      value="0x26c40000" />
+       <property name="BASEADDRESS_DEVENUM"            value="0x35670000" />
+       <property name="BASEADDRESS_RSABASE"            value="0x35700000" />
+       <property name="BASEADDRESS_RSAENH"             value="0x35780000" />
+       <property name="BASEADDRESS_URL"                value="0x42ea0000" />
+       <property name="BASEADDRESS_WLANAPI"            value="0x470f0000" />
+       <property name="BASEADDRESS_PIDGEN"             value="0x473e0000" />
+       <property name="BASEADDRESS_DWMAPI"             value="0x4a3f0000" />
+       <property name="BASEADDRESS_T2EMBED"            value="0x4b310000" />
+       <property name="BASEADDRESS_MSFTEDIT"           value="0x4b460000" />
+       <property name="BASEADDRESS_LOADPERF"           value="0x4b920000" />
+       <property name="BASEADDRESS_MPRAPI"             value="0x4c400000" />
+       <property name="BASEADDRESS_WUAPI"              value="0x506a0000" />
+       <property name="BASEADDRESS_SRCLIENT"           value="0x512c0000" />
+       <property name="BASEADDRESS_PSTOREC"            value="0x513d0000" />
+       <property name="BASEADDRESS_LPK"                value="0x516c0000" />
+       <property name="BASEADDRESS_MSGSM32ACM"         value="0x56db0000" />
+       <property name="BASEADDRESS_MSG711ACM"          value="0x584f0000" />
+       <property name="BASEADDRESS_IMAADP32ACM"        value="0x585e0000" />
+       <property name="BASEADDRESS_TELEPHON"           value="0x58750000" />
+       <property name="BASEADDRESS_PWRCFG"             value="0x587e0000" />
+       <property name="BASEADDRESS_MMSYS"              value="0x588a0000" />
+       <property name="BASEADDRESS_JOY"                value="0x589b0000" />
+       <property name="BASEADDRESS_QMGR"               value="0x59620000" />
+       <property name="BASEADDRESS_UXTHEME"            value="0x5ad70000" />
+       <property name="BASEADDRESS_VDMDBG"             value="0x5b0d0000" />
+       <property name="BASEADDRESS_UNTFS"              value="0x5b340000" />
+       <property name="BASEADDRESS_OBJSEL"             value="0x5b400000" />
+       <property name="BASEADDRESS_UFAT"               value="0x5b570000" />
+       <property name="BASEADDRESS_TAPIUI"             value="0x5b770000" />
+       <property name="BASEADDRESS_UEXT2"              value="0x5b7a0000" />
+       <property name="BASEADDRESS_SLAYER"             value="0x5c7e0000" />
+       <property name="BASEADDRESS_USRMGR"             value="0x5c900000" />
+       <property name="BASEADDRESS_SHIMGVW"            value="0x5cb00000" />
+       <property name="BASEADDRESS_COMMCTRL"           value="0x5d090000" />
+       <property name="BASEADDRESS_DPLAYX"             value="0x5e080000" />
+       <property name="BASEADDRESS_INPUT"              value="0x5e400000" />
+       <property name="BASEADDRESS_NTLANMAN"           value="0x5f380000" />
+       <property name="BASEADDRESS_DINPUT"             value="0x5f580000" />
+       <property name="BASEADDRESS_NETID"              value="0x5f660000" />
+       <property name="BASEADDRESS_NTPRINT"            value="0x5f6a0000" />
+       <property name="BASEADDRESS_MSSIP32"            value="0x60430000" />
+       <property name="BASEADDRESS_MSISIP"             value="0x60b10000" />
+       <property name="BASEADDRESS_INSENG"             value="0x61000000" />
+       <property name="BASEADDRESS_QEDIT"              value="0x611c0000" />
+       <property name="BASEADDRESS_MODEMUI"            value="0x61650000" />
+       <property name="BASEADDRESS_MAPI32"             value="0x62250000" />
+       <property name="BASEADDRESS_MCIWAVE"            value="0x622a0000" />
+       <property name="BASEADDRESS_MCISEQ"             value="0x622b0000" />
+       <property name="BASEADDRESS_MCIQTZ32"           value="0x622c0000" />
+       <property name="BASEADDRESS_MCICDA"             value="0x622e0000" />
+       <property name="BASEADDRESS_LOCALUI"            value="0x62f70000" />
+       <property name="BASEADDRESS_HDWWIZ"             value="0x64d40000" />
+       <property name="BASEADDRESS_TIMEDATE"           value="0x64da0000" />
+       <property name="BASEADDRESS_SYSDM"              value="0x64dd0000" />
+       <property name="BASEADDRESS_NCPL"               value="0x64ea0000" />
+       <property name="BASEADDRESS_MAIN"               value="0x64f40000" />
+       <property name="BASEADDRESS_INTL"               value="0x64fb0000" />
+       <property name="BASEADDRESS_DESK"               value="0x65080000" />
+       <property name="BASEADDRESS_APPWIZ"             value="0x65100000" />
+       <property name="BASEADDRESS_MLANG"              value="0x65140000" />
+       <property name="BASEADDRESS_ACCESS"             value="0x65180000" />
+       <property name="BASEADDRESS_ITSS"               value="0x66370000" />
+       <property name="BASEADDRESS_ITIRCL"             value="0x663a0000" />
+       <property name="BASEADDRESS_INETMIB1"           value="0x666f0000" />
+       <property name="BASEADDRESS_INITPKI"            value="0x66b00000" />
+       <property name="BASEADDRESS_WSHTCPIP"           value="0x677b0000" />
+       <property name="BASEADDRESS_CRYPT32"            value="0x67ab0000" />
+       <property name="BASEADDRESS_HTTPAPI"            value="0x67ae0000" />
+       <property name="BASEADDRESS_HID"                value="0x688f0000" />
+       <property name="BASEADDRESS_PSXDLL"             value="0x68eb0000" />
+       <property name="BASEADDRESS_PSAPI"              value="0x68f70000" />
+       <property name="BASEADDRESS_KSPROXY"            value="0x68f90000" />
+       <property name="BASEADDRESS_GETUNAME"           value="0x69110000" />
+       <property name="BASEADDRESS_OLEACC"             value="0x69640000" />
+       <property name="BASEADDRESS_WINMM"              value="0x697d0000" />
+       <property name="BASEADDRESS_MSIMG32"            value="0x69cc0000" />
+       <property name="BASEADDRESS_BROWSEUI"           value="0x69cd0000" />
+       <property name="BASEADDRESS_NETPLWIZ"           value="0x6a240000" />
+       <property name="BASEADDRESS_SHELL32"            value="0x6a360000" />
+       <property name="BASEADDRESS_UNICODE"            value="0x6b200000" />
+       <property name="BASEADDRESS_ADVPACK"            value="0x6b300000" />
+       <property name="BASEADDRESS_CONTROL"            value="0x6b310000" />
+       <property name="BASEADDRESS_NCPA"               value="0x6b320000" />
+       <property name="BASEADDRESS_DBGHELP"            value="0x6b330000" />
+       <property name="BASEADDRESS_DINPUT8"            value="0x6b340000" />
+       <property name="BASEADDRESS_DXDIAGN"            value="0x6b350000" />
+       <property name="BASEADDRESS_DSOUND"             value="0x6b360000" />
+       <property name="BASEADDRESS_GLU32"              value="0x6b370000" />
+       <property name="BASEADDRESS_MESA32"             value="0x6b380000" />
+       <property name="BASEADDRESS_OPENGL32"           value="0x6b390000" />
+       <property name="BASEADDRESS_SECUR32"            value="0x6b3a0000" />
+       <property name="BASEADDRESS_SMDLL"              value="0x6b3b0000" />
+       <property name="BASEADDRESS_URLMON"             value="0x6b3c0000" />
+       <property name="BASEADDRESS_SERIALUI"           value="0x6b3d0000" />
+       <property name="BASEADDRESS_HLINK"              value="0x6c6e0000" />
+       <property name="BASEADDRESS_DESKMON"            value="0x6d400000" />
+       <property name="BASEADDRESS_DESKADP"            value="0x6d410000" />
+       <property name="BASEADDRESS_WLDAP32"            value="0x6e130000" />
+       <property name="BASEADDRESS_SXS"                value="0x6e160000" />
+       <property name="BASEADDRESS_SCHANNEL"           value="0x6e360000" />
+       <property name="BASEADDRESS_CONSOLE"            value="0x6e4d0000" />
+       <property name="BASEADDRESS_COMPSTUI"           value="0x6ec10000" />
+       <property name="BASEADDRESS_HNETCFG"            value="0x6edb0000" />
+       <property name="BASEADDRESS_CLB"                value="0x6f2b0000" />
+       <property name="BASEADDRESS_FONTEXT"            value="0x6f7b0000" />
+       <property name="BASEADDRESS_JSCRIPT"            value="0x6fe80000" />
+       <property name="BASEADDRESS_CARDS"              value="0x701a0000" />
+       <property name="BASEADDRESS_WININET"            value="0x70200000" />
+       <property name="BASEADDRESS_WINHTTP"            value="0x70c60000" />
+       <property name="BASEADDRESS_AMSTREAM"           value="0x71030000" />
+       <property name="BASEADDRESS_ACLUI"              value="0x71550000" />
+       <property name="BASEADDRESS_DHCPCSVC"           value="0x71650000" />
+       <property name="BASEADDRESS_SHDOCVW"            value="0x71700000" />
+       <property name="BASEADDRESS_ACTXPRXY"           value="0x71800000" />
+       <property name="BASEADDRESS_MSWSOCK"            value="0x71a30000" />
+       <property name="BASEADDRESS_WSOCK32"            value="0x71ab0000" />
+       <property name="BASEADDRESS_ACLEDIT"            value="0x71b70000" />
+       <property name="BASEADDRESS_NETAPI32"           value="0x71c00000" />
+       <property name="BASEADDRESS_OLESVR32"           value="0x71dd0000" />
+       <property name="BASEADDRESS_OLECLI32"           value="0x71df0000" />
+       <property name="BASEADDRESS_OLETHK32"           value="0x71e10000" />
+       <property name="BASEADDRESS_DPLAY"              value="0x71e80000" />
+       <property name="BASEADDRESS_SECURITY"           value="0x71f10000" />
+       <property name="BASEADDRESS_MSSIGN32"           value="0x720c0000" />
+       <property name="BASEADDRESS_CRYPTUI"            value="0x720d0000" />
+       <property name="BASEADDRESS_WINFAX"             value="0x722c0000" />
+       <property name="BASEADDRESS_WINSCARD"           value="0x723d0000" />
+       <property name="BASEADDRESS_DEVMGR"             value="0x72a90000" />
+       <property name="BASEADDRESS_MSADP32ACM"         value="0x72cb0000" />
+       <property name="BASEADDRESS_WDMAUD"             value="0x72d20000" />
+       <property name="BASEADDRESS_WINSPOOL"           value="0x72f50000" />
+       <property name="BASEADDRESS_SOFTPUB"            value="0x73290000" />
+       <property name="BASEADDRESS_MSCAT32"            value="0x732b0000" />
+       <property name="BASEADDRESS_MSTASK"             value="0x73520000" />
+       <property name="BASEADDRESS_TRAFFIC"            value="0x73550000" />
+       <property name="BASEADDRESS_MCIAVI32"           value="0x73610000" />
+       <property name="BASEADDRESS_MSVIDC32"           value="0x73650000" />
+       <property name="BASEADDRESS_MSRLE32"            value="0x73660000" />
+       <property name="BASEADDRESS_MSDMO"              value="0x73670000" />
+       <property name="BASEADDRESS_AVICAP32"           value="0x739e0000" />
+       <property name="BASEADDRESS_AVIFIL32"           value="0x73ac0000" />
+       <property name="BASEADDRESS_MSCMS"              value="0x73af0000" />
+       <property name="BASEADDRESS_DCIMAN32"           value="0x73b10000" />
+       <property name="BASEADDRESS_STI"                value="0x73b60000" />
+       <property name="BASEADDRESS_ICCVID"             value="0x73bc0000" />
+       <property name="BASEADDRESS_COREDLL"            value="0x73d80000" />
+       <property name="BASEADDRESS_LZ32"               value="0x73d80000" />
+       <property name="BASEADDRESS_KSUSER"             value="0x73ea0000" />
+       <property name="BASEADDRESS_ICMP"               value="0x741f0000" />
+       <property name="BASEADDRESS_SPOOLSS"            value="0x742a0000" />
+       <property name="BASEADDRESS_MSIMTF"             value="0x746b0000" />
+       <property name="BASEADDRESS_MSCTF"              value="0x746e0000" />
+       <property name="BASEADDRESS_QUARTZ"             value="0x747d0000" />
+       <property name="BASEADDRESS_USERENV"            value="0x74850000" />
+       <property name="BASEADDRESS_SYSSETUP"           value="0x74a10000" />
+       <property name="BASEADDRESS_WS2_32"             value="0x74aa0000" />
+       <property name="BASEADDRESS_POWRPROF"           value="0x74ad0000" />
+       <property name="BASEADDRESS_MSXML3"             value="0x74ae0000" />
+       <property name="BASEADDRESS_PRINTUI"            value="0x74b40000" />
+       <property name="BASEADDRESS_MMDRV"              value="0x74c30000" />
+       <property name="BASEADDRESS_PDH"                value="0x74c70000" />
+       <property name="BASEADDRESS_OLEDLG"             value="0x74d00000" />
+       <property name="BASEADDRESS_SAMSRV"             value="0x74f30000" />
+       <property name="BASEADDRESS_RESUTILS"           value="0x75070000" />
+       <property name="BASEADDRESS_SAMLIB"             value="0x750c0000" />
+       <property name="BASEADDRESS_CABINET"            value="0x75120000" />
+       <property name="BASEADDRESS_NETCFGX"            value="0x755f0000" />
+       <property name="BASEADDRESS_IPHLPAPI"           value="0x75700000" />
+       <property name="BASEADDRESS_NDDEAPI"            value="0x75940000" />
+       <property name="BASEADDRESS_MSGINA"             value="0x75970000" />
+       <property name="BASEADDRESS_LOCALSPL"           value="0x75b80000" />
+       <property name="BASEADDRESS_CRYPTNET"           value="0x75e60000" />
+       <property name="BASEADDRESS_RPCRT4"             value="0x76000000" />
+       <property name="BASEADDRESS_SHLWAPI"            value="0x76100000" />
+       <property name="BASEADDRESS_INETCOMM"           value="0x76140000" />
+       <property name="BASEADDRESS_COMCTL32"           value="0x76160000" />
+       <property name="BASEADDRESS_COMDLG32"           value="0x76210000" />
+       <property name="BASEADDRESS_WINSTA"             value="0x762f0000" />
+       <property name="BASEADDRESS_IMM32"              value="0x76320000" />
+       <property name="BASEADDRESS_D3D8THK"            value="0x76340000" />
+       <property name="BASEADDRESS_RICHED32"           value="0x76340000" />
+       <property name="BASEADDRESS_RICHED20"           value="0x76360000" />
+       <property name="BASEADDRESS_ODBCCP32"           value="0x76380000" />
+       <property name="BASEADDRESS_TWAIN_32"           value="0x76380000" />
+       <property name="BASEADDRESS_NETSHELL"           value="0x76390000" />
+       <property name="BASEADDRESS_LSASRV"             value="0x76540000" />
+       <property name="BASEADDRESS_MIDIMAP"            value="0x76600000" />
+       <property name="BASEADDRESS_WAVEMAP"            value="0x76610000" />
+       <property name="BASEADDRESS_MPR"                value="0x76620000" />
+       <property name="BASEADDRESS_MSHTML"             value="0x76650000" />
+       <property name="BASEADDRESS_ODBC32"             value="0x76660000" />
+       <property name="BASEADDRESS_SETUPAPI"           value="0x76660000" />
+       <property name="BASEADDRESS_CRYPTDLL"           value="0x76740000" />
+       <property name="BASEADDRESS_SHFOLDER"           value="0x76760000" />
+       <property name="BASEADDRESS_NTDSAPI"            value="0x76780000" />
+       <property name="BASEADDRESS_NTMARTA"            value="0x768a0000" />
+       <property name="BASEADDRESS_RASDLG"             value="0x768d0000" />
+       <property name="BASEADDRESS_GDIPLUS"            value="0x76a00000" />
+       <property name="BASEADDRESS_ATL"                value="0x76a80000" />
+       <property name="BASEADDRESS_SFC"                value="0x76b50000" />
+       <property name="BASEADDRESS_CREDUI"             value="0x76bf0000" />
+       <property name="BASEADDRESS_SFC_OS"             value="0x76c10000" />
+       <property name="BASEADDRESS_WINTRUST"           value="0x76c30000" />
+       <property name="BASEADDRESS_IMAGEHLP"           value="0x76c90000" />
+       <property name="BASEADDRESS_CLUSAPI"            value="0x76d10000" />
+       <property name="BASEADDRESS_WMI"                value="0x76d20000" />
+       <property name="BASEADDRESS_DHCPCSVC"           value="0x76d80000" />
+       <property name="BASEADDRESS_FMIFS"              value="0x76df0000" />
+       <property name="BASEADDRESS_OLEAUT32"           value="0x76e00000" />
+       <property name="BASEADDRESS_TAPI32"             value="0x76e60000" />
+       <property name="BASEADDRESS_RASMAN"             value="0x76e90000" />
+       <property name="BASEADDRESS_RASAPI32"           value="0x76ee0000" />
+       <property name="BASEADDRESS_WTSAPI32"           value="0x76f50000" />
+       <property name="BASEADDRESS_MSVFW32"            value="0x76f60000" />
+       <property name="BASEADDRESS_MSACM32"            value="0x77400000" />
+       <property name="BASEADDRESS_CRTDLL"             value="0x77630000" />
+       <property name="BASEADDRESS_AUTHZ"              value="0x77690000" />
+       <property name="BASEADDRESS_CFGMGR32"           value="0x77700000" />
+       <property name="BASEADDRESS_SENSAPI"            value="0x77700000" />
+       <property name="BASEADDRESS_MSAFD"              value="0x77780000" />
+       <property name="BASEADDRESS_PACKET"             value="0x77780000" />
+       <property name="BASEADDRESS_MSI"                value="0x77790000" />
+       <property name="BASEADDRESS_SNMPAPI"            value="0x777a0000" />
+       <property name="BASEADDRESS_USP10"              value="0x777b0000" />
+       <property name="BASEADDRESS_IPRTPRIO"           value="0x777c0000" />
+       <property name="BASEADDRESS_WS2HELP"            value="0x777e0000" />
+       <property name="BASEADDRESS_WSHIRDA"            value="0x777f0000" />
+       <property name="BASEADDRESS_VERSION"            value="0x77a40000" />
+       <property name="BASEADDRESS_OLE32"              value="0x77a50000" />
+       <property name="BASEADDRESS_OLEPRO32"           value="0x77b10000" />
+       <property name="BASEADDRESS_ACTIVEDS"           value="0x77cb0000" />
+       <property name="BASEADDRESS_ADVAPI32"           value="0x77dc0000" />
+       <property name="BASEADDRESS_USER32"             value="0x77e50000" />
+       <property name="BASEADDRESS_GDI32"              value="0x77f70000" />
+       <property name="BASEADDRESS_DNSAPI"             value="0x77fb0000" />
+       <property name="BASEADDRESS_MSVCRT"             value="0x78000000" />
+       <property name="BASEADDRESS_MSVCRT20"           value="0x78500000" />
+       <property name="BASEADDRESS_MSVCRT40"           value="0x78700000" />
+       <property name="BASEADDRESS_MSCOREE"            value="0x79000000" />
+       <property name="BASEADDRESS_FUSION"             value="0x79040000" />
+       <property name="BASEADDRESS_KERNEL32"           value="0x7c700000" />
+       <property name="BASEADDRESS_NTDLL"              value="0x7c900000" />
+       <property name="BASEADDRESS_QUERY"              value="0x7d9a0000" />
+       <property name="BASEADDRESS_HHCTRL"             value="0x7e410000" />
+       <property name="BASEADDRESS_SXS"                value="0x7e690000" />
+       <property name="BASEADDRESS_BEEPMIDI"           value="0x7ef00000" />
+       <property name="BASEADDRESS_FREETYPE"           value="0x7f000000" />
 </group>
index 875dc74..6a932cc 100644 (file)
@@ -1149,6 +1149,13 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Null","ImagePath",0x00020000,"system32\d
 HKLM,"SYSTEM\CurrentControlSet\Services\Null","Start",0x00010001,0x00000001
 HKLM,"SYSTEM\CurrentControlSet\Services\Null","Type",0x00010001,0x00000001
 
+; NMI device driver
+HKLM,"SYSTEM\CurrentControlSet\Services\NMIDebug","ErrorControl",0x00010001,0x00000000
+HKLM,"SYSTEM\CurrentControlSet\Services\NMIDebug","Group",0x00000000,"Base"
+HKLM,"SYSTEM\CurrentControlSet\Services\NMIDebug","ImagePath",0x00020000,"system32\drivers\nmidebug.sys"
+HKLM,"SYSTEM\CurrentControlSet\Services\NMIDebug","Start",0x00010001,0x00000000
+HKLM,"SYSTEM\CurrentControlSet\Services\NMIDebug","Type",0x00010001,0x00000001
+
 ; Packet driver
 HKLM,"SYSTEM\CurrentControlSet\Services\Packet","ErrorControl",0x00010001,0x00000001
 HKLM,"SYSTEM\CurrentControlSet\Services\Packet","Group",0x00000000,"PNP_TDI"
index 7977e44..05c9edc 100644 (file)
@@ -50,7 +50,7 @@ Cabinet=reactos.cab
 [SetupData]
 DefaultPath = \ReactOS
 OsLoadOptions = "/NOGUIBOOT /NODEBUG"
-DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM1"
+DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM2"
 ;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=SCREEN"
 ;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=BOCHS"
 
index 7800f3d..3310e7d 100644 (file)
@@ -208,6 +208,10 @@ MempUnmapPage(ULONG Page)
     PHARDWARE_PTE KernelPT;
     ULONG Entry = (Page >> 10) + (KSEG0_BASE >> 22);
 
+    /* Don't unmap hyperspace or HAL entries */
+    if (Entry == HYPER_SPACE_ENTRY || Entry == 1023)
+        return;
+
     if (PDE[Entry].Valid)
     {
         KernelPT = (PHARDWARE_PTE)(PDE[Entry].PageFrameNumber << MM_PAGE_SHIFT);
index d837f51..2ce3b7c 100644 (file)
@@ -43,16 +43,6 @@ BEGIN
     PUSHBUTTON  "\83n\81[\83h\83E\83F\83\83v\83\8d\83t\83@\83C\83\8b(&W)...", IDC_HARDWARE_PROFILE, 154, 190, 90, 15
 END
 
-IDD_SYSSETTINGS DIALOGEX 0, 0, 221, 106
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
-CAPTION "System Settings"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    GROUPBOX        "Version Info",IDC_STATIC,6,3,210,73
-    CONTROL         "Report as Workstation",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10
-    LTEXT           "ReactOS is built as a server OS and reports as such. Check this box to change this for applications only.",IDC_STATIC,15,15,183,41
-    PUSHBUTTON      "OK",IDOK,166,83,50,14
-END
 
 IDD_PROPPAGEADVANCED DIALOGEX 0, 0, 256, 218
 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
@@ -72,10 +62,22 @@ BEGIN
     LTEXT       "\8bN\93®\82Æ\89ñ\95\9c\83I\83v\83V\83\87\83\93\82Å\82Í\83R\83\93\83s\83\85\81[\83^\82Ì\8bN\93®\95û\96@\82Æ\81A\83R\83\93\83s\83\85\81[\83^\82ª\92â\8e~\82·\82é\83G\83\89\81[\82ª \94­\90\82µ\82½\8fê\8d\87\81A\82Ç\82¤\8f\88\97\9d\82·\82é\82©\82ð\90Ý\92è\82µ\82Ü\82·\81B", IDC_STATIC, 16, 144, 228, 19
     PUSHBUTTON  "\90Ý\92è", IDC_STAREC, 194, 162, 50, 15
 
-    PUSHBUTTON  "\8aÂ\8b«\95Ï\90\94", IDC_ENVVAR, 84, 192, 80, 15
+    PUSHBUTTON  "\83V\83X\83e\83\80\82Ì\90Ý\92è", IDC_SYSSETTINGS, 2, 192, 80, 15
+    PUSHBUTTON  "\8aÂ\8b«\95Ï\90\94", IDC_ENVVAR, 85, 192, 80, 15
     PUSHBUTTON  "\83G\83\89\81[\95ñ\8d\90", IDC_ERRORREPORT, 170, 192, 80, 15
 END
 
+IDD_SYSSETTINGS DIALOGEX 0, 0, 221, 106
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
+CAPTION "\83V\83X\83e\83\80\82Ì\90Ý\92è"
+FONT 9, "MS UI Gothic", 0, 0, 0x1
+BEGIN
+    GROUPBOX        "\83o\81[\83W\83\87\83\93\8fî\95ñ",IDC_STATIC,6,3,210,73
+    CONTROL         "\83\8f\81[\83N\83X\83e\81[\83V\83\87\83\93\82Æ\82µ\82Ä\82Ó\82é\82Ü\82¤",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10
+    LTEXT           "ReactOS \82Í\83T\81[\83o OS \82Æ\82µ\82Ä\83r\83\8b\83h\82³\82ê\82Ä\82¢\82é\82½\82ß\81A\83T\81[\83o\82Æ\82µ\82Ä\82Ó\82é\82Ü\82¢\82Ü\82·\81B\82±\82ê\82ð\95Ï\8dX\82·\82é\82É\82Í\82±\82Ì\83{\83b\83N\83X\82É\83`\83F\83b\83N\82µ\82Ä\82­\82¾\82³\82¢\81B\82½\82¾\82µ\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82É\91Î\82µ\82Ä\82Ì\82Ý\97L\8cø\82Å\82·\81B",IDC_STATIC,15,15,183,41
+    PUSHBUTTON      "OK",IDOK,166,83,50,14
+END
+
 
 IDD_HARDWAREPROFILES DIALOGEX 6, 18, 254, 234
 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
@@ -88,7 +90,8 @@ BEGIN
     LISTBOX     IDC_HRDPROFLSTBOX, 8, 52, 215, 54, LBS_NOTIFY
     PUSHBUTTON  "", IDC_HRDPROFUP, 232, 59, 15, 14, BS_ICON
     PUSHBUTTON  "", IDC_HRDPROFDWN, 232, 79, 15, 14, BS_ICON
-    PUSHBUTTON  "\83v\83\8d\83p\83e\83B(&P)", IDC_HRDPROFPROP, 8, 106, 50, 14    PUSHBUTTON  "\83R\83s\81[(&C)", IDC_HRDPROFCOPY, 63, 106, 50, 14
+    PUSHBUTTON  "\83v\83\8d\83p\83e\83B(&P)", IDC_HRDPROFPROP, 8, 106, 50, 14
+    PUSHBUTTON  "\83R\83s\81[(&C)", IDC_HRDPROFCOPY, 63, 106, 50, 14
     PUSHBUTTON  "\96¼\91O\82Ì\95Ï\8dX(&R)", IDC_HRDPROFRENAME, 118, 106, 50, 14
     PUSHBUTTON  "\8dí\8f\9c(&D)", IDC_HRDPROFDEL, 173, 106, 50, 14
 
@@ -280,5 +283,5 @@ BEGIN
     IDS_USERPROFILE_SIZE "\83T\83C\83Y"
     IDS_USERPROFILE_TYPE "\8eí\97Þ"
     IDS_USERPROFILE_STATUS "\8fó\91Ô"
-    IDS_USERPROFILE_MODIFIED "\8fC\90³\8dÏ"
+    IDS_USERPROFILE_MODIFIED "\95Ï\8dX\93ú"
 END
index 81ec6ed..0af7647 100644 (file)
 @ stdcall RtlAcquirePebLock()
 @ stdcall RtlAcquireResourceExclusive(ptr long)
 @ stdcall RtlAcquireResourceShared(ptr long)
+@ stdcall RtlAcquireSRWLockExclusive(ptr)
+@ stdcall RtlAcquireSRWLockShared(ptr)
 @ stdcall RtlActivateActivationContext(long ptr ptr)
 //@ stdcall RtlActivateActivationContextEx
 @ stdcall RtlActivateActivationContextUnsafeFast(ptr ptr)
 @ stdcall RtlInitializeResource(ptr)
 @ stdcall RtlInitializeSListHead(ptr)
 @ stdcall RtlInitializeSid(ptr ptr long)
+@ stdcall RtlInitializeSRWLock(ptr)
 //@ stdcall RtlInitializeStackTraceDataBase // 5.1 SP2 and SP3, and 5.2 only
 @ stdcall RtlInsertElementGenericTable(ptr ptr long ptr)
 @ stdcall RtlInsertElementGenericTableAvl(ptr ptr long ptr)
 //@ stdcall RtlReleaseMemoryStream
 @ stdcall RtlReleasePebLock()
 @ stdcall RtlReleaseResource(ptr)
+@ stdcall RtlReleaseSRWLockExclusive(ptr)
+@ stdcall RtlReleaseSRWLockShared(ptr)
 @ stdcall RtlRemoteCall(ptr ptr ptr long ptr long long)
 //@ stdcall RtlRemoveVectoredContinueHandler
 @ stdcall RtlRemoveVectoredExceptionHandler(ptr)
 @ stdcall RtlSetUserFlagsHeap(ptr long ptr long)
 @ stdcall RtlSetUserValueHeap(ptr long ptr ptr)
 @ stdcall RtlSizeHeap(long long ptr)
+@ stdcall RtlSleepConditionVariableCS(ptr ptr ptr)
+@ stdcall RtlSleepConditionVariableSRW(ptr ptr ptr long)
 @ stdcall RtlSplay(ptr)
 //@ stdcall RtlStartRXact
 //@ stdcall RtlStatMemoryStream
index 624cf66..c397a5a 100644 (file)
 @ stdcall GetCurrentHwProfileW(ptr)
 @ stdcall GetEffectiveRightsFromAclA(ptr ptr ptr)
 @ stdcall GetEffectiveRightsFromAclW(ptr ptr ptr)
-@ stub GetEventLogInformation
+@ stdcall GetEventLogInformation(long long ptr long ptr)
 @ stdcall GetExplicitEntriesFromAclA(ptr ptr ptr) advapi32.GetExplicitEntriesFromAclW
 @ stdcall GetExplicitEntriesFromAclW(ptr ptr ptr)
 @ stdcall GetFileSecurityA(str long ptr long ptr)
index c40871c..e8e0283 100644 (file)
@@ -911,6 +911,13 @@ static DWORD mac_delete_credential(LPCWSTR TargetName)
 }
 #endif
 
+/******************************************************************************
+ * convert_PCREDENTIALW_to_PCREDENTIALA [internal]
+ *
+ * convert a Credential struct from UNICODE to ANSI and return the needed size in Bytes
+ *
+ */
+
 static INT convert_PCREDENTIALW_to_PCREDENTIALA(const CREDENTIALW *CredentialW, PCREDENTIALA CredentialA, INT len)
 {
     char *buffer;
@@ -996,6 +1003,12 @@ static INT convert_PCREDENTIALW_to_PCREDENTIALA(const CREDENTIALW *CredentialW,
     return needed;
 }
 
+/******************************************************************************
+ * convert_PCREDENTIALA_to_PCREDENTIALW [internal]
+ *
+ * convert a Credential struct from ANSI to UNICODE and return the needed size in Bytes
+ *
+ */
 static INT convert_PCREDENTIALA_to_PCREDENTIALW(const CREDENTIALA *CredentialA, PCREDENTIALW CredentialW, INT len)
 {
     char *buffer;
@@ -1555,6 +1568,172 @@ BOOL WINAPI CredReadW(LPCWSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALW
     return TRUE;
 }
 
+/******************************************************************************
+ * CredReadDomainCredentialsA [ADVAPI32.@]
+ */
+BOOL WINAPI CredReadDomainCredentialsA(PCREDENTIAL_TARGET_INFORMATIONA TargetInformation,
+                                       DWORD Flags, DWORD *Size, PCREDENTIALA **Credentials)
+{
+    PCREDENTIAL_TARGET_INFORMATIONW TargetInformationW;
+    INT len, i;
+    WCHAR *buffer, *end;
+    BOOL ret;
+    PCREDENTIALW* CredentialsW;
+
+    TRACE("(%p, 0x%x, %p, %p)\n", TargetInformation, Flags, Size, Credentials);
+
+    /* follow Windows behavior - do not test for NULL, initialize early */
+    *Size = 0;
+    *Credentials = NULL;
+
+    if (!TargetInformation)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    len = sizeof(*TargetInformationW);
+    if (TargetInformation->TargetName)
+        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->TargetName, -1, NULL, 0) * sizeof(WCHAR);
+    if (TargetInformation->NetbiosServerName)
+        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosServerName, -1, NULL, 0) * sizeof(WCHAR);
+    if (TargetInformation->DnsServerName)
+        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsServerName, -1, NULL, 0) * sizeof(WCHAR);
+    if (TargetInformation->NetbiosDomainName)
+        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosDomainName, -1, NULL, 0) * sizeof(WCHAR);
+    if (TargetInformation->DnsDomainName)
+        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsDomainName, -1, NULL, 0) * sizeof(WCHAR);
+    if (TargetInformation->DnsTreeName)
+        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsTreeName, -1, NULL, 0) * sizeof(WCHAR);
+    if (TargetInformation->PackageName)
+        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->PackageName, -1, NULL, 0) * sizeof(WCHAR);
+
+    TargetInformationW = HeapAlloc(GetProcessHeap(), 0, len);
+    if (!TargetInformationW)
+    {
+        SetLastError(ERROR_OUTOFMEMORY);
+        return FALSE;
+    }
+    buffer = (WCHAR*)(TargetInformationW + 1);
+    end = (WCHAR *)((char *)TargetInformationW + len);
+
+    if (TargetInformation->TargetName)
+    {
+        TargetInformationW->TargetName = buffer;
+        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->TargetName, -1,
+                                      TargetInformationW->TargetName, end - buffer);
+    } else
+        TargetInformationW->TargetName = NULL;
+
+    if (TargetInformation->NetbiosServerName)
+    {
+        TargetInformationW->NetbiosServerName = buffer;
+        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosServerName, -1,
+                                      TargetInformationW->NetbiosServerName, end - buffer);
+    } else
+        TargetInformationW->NetbiosServerName = NULL;
+
+    if (TargetInformation->DnsServerName)
+    {
+        TargetInformationW->DnsServerName = buffer;
+        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsServerName, -1,
+                                      TargetInformationW->DnsServerName, end - buffer);
+    } else
+        TargetInformationW->DnsServerName = NULL;
+
+    if (TargetInformation->NetbiosDomainName)
+    {
+        TargetInformationW->NetbiosDomainName = buffer;
+        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosDomainName, -1,
+                                      TargetInformationW->NetbiosDomainName, end - buffer);
+    } else
+        TargetInformationW->NetbiosDomainName = NULL;
+
+    if (TargetInformation->DnsDomainName)
+    {
+        TargetInformationW->DnsDomainName = buffer;
+        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsDomainName, -1,
+                                      TargetInformationW->DnsDomainName, end - buffer);
+    } else
+        TargetInformationW->DnsDomainName = NULL;
+
+    if (TargetInformation->DnsTreeName)
+    {
+        TargetInformationW->DnsTreeName = buffer;
+        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsTreeName, -1,
+                                      TargetInformationW->DnsTreeName, end - buffer);
+    } else
+        TargetInformationW->DnsTreeName = NULL;
+
+    if (TargetInformation->PackageName)
+    {
+        TargetInformationW->PackageName = buffer;
+        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->PackageName, -1,
+                                      TargetInformationW->PackageName, end - buffer);
+    } else
+        TargetInformationW->PackageName = NULL;
+
+    TargetInformationW->Flags = TargetInformation->Flags;
+    TargetInformationW->CredTypeCount = TargetInformation->CredTypeCount;
+    TargetInformationW->CredTypes = TargetInformation->CredTypes;
+
+    ret = CredReadDomainCredentialsW(TargetInformationW, Flags, Size, &CredentialsW);
+
+    HeapFree(GetProcessHeap(), 0, TargetInformationW);
+
+    if (ret)
+    {
+        char *buf;
+        INT needed;
+
+        len = *Size * sizeof(PCREDENTIALA);
+        for (i = 0; i < *Size; i++)
+            len += convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], NULL, 0);
+
+        *Credentials = HeapAlloc(GetProcessHeap(), 0, len);
+        if (!*Credentials)
+        {
+            CredFree(CredentialsW);
+            SetLastError(ERROR_OUTOFMEMORY);
+            return FALSE;
+        }
+
+        buf = (char *)&(*Credentials)[*Size];
+        len -= *Size * sizeof(PCREDENTIALA);
+        for (i = 0; i < *Size; i++)
+        {
+            (*Credentials)[i] = (PCREDENTIALA)buf;
+            needed = convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], (*Credentials)[i], len);
+            buf += needed;
+            len -= needed;
+        }
+
+        CredFree(CredentialsW);
+    }
+    return ret;
+}
+
+/******************************************************************************
+ * CredReadDomainCredentialsW [ADVAPI32.@]
+ */
+BOOL WINAPI CredReadDomainCredentialsW(PCREDENTIAL_TARGET_INFORMATIONW TargetInformation, DWORD Flags,
+                                       DWORD *Size, PCREDENTIALW **Credentials)
+{
+    FIXME("(%p, 0x%x, %p, %p) stub\n", TargetInformation, Flags, Size, Credentials);
+
+    /* follow Windows behavior - do not test for NULL, initialize early */
+    *Size = 0;
+    *Credentials = NULL;
+    if (!TargetInformation)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    SetLastError(ERROR_NOT_FOUND);
+    return FALSE;
+}
+
 /******************************************************************************
  * CredWriteA [ADVAPI32.@]
  */
@@ -1714,172 +1893,6 @@ BOOL WINAPI CredGetSessionTypes(DWORD persistCount, LPDWORD persists)
     return TRUE;
 }
 
-/******************************************************************************
- * CredReadDomainCredentialsW [ADVAPI32.@]
- */
-BOOL WINAPI CredReadDomainCredentialsW(PCREDENTIAL_TARGET_INFORMATIONW TargetInformation, DWORD Flags,
-                                       DWORD *Size, PCREDENTIALW **Credentials)
-{
-    FIXME("(%p, 0x%x, %p, %p) stub\n", TargetInformation, Flags, Size, Credentials);
-
-    /* follow Windows behavior - do not test for NULL, initialize early */
-    *Size = 0;
-    *Credentials = NULL;
-    if (!TargetInformation)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-
-    SetLastError(ERROR_NOT_FOUND);
-    return FALSE;
-}
-
-/******************************************************************************
- * CredReadDomainCredentialsA [ADVAPI32.@]
- */
-BOOL WINAPI CredReadDomainCredentialsA(PCREDENTIAL_TARGET_INFORMATIONA TargetInformation,
-                                       DWORD Flags, DWORD *Size, PCREDENTIALA **Credentials)
-{
-    PCREDENTIAL_TARGET_INFORMATIONW TargetInformationW;
-    INT len, i;
-    WCHAR *buffer, *end;
-    BOOL ret;
-    PCREDENTIALW* CredentialsW;
-
-    TRACE("(%p, 0x%x, %p, %p)\n", TargetInformation, Flags, Size, Credentials);
-
-    /* follow Windows behavior - do not test for NULL, initialize early */
-    *Size = 0;
-    *Credentials = NULL;
-
-    if (!TargetInformation)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-
-    len = sizeof(*TargetInformationW);
-    if (TargetInformation->TargetName)
-        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->TargetName, -1, NULL, 0) * sizeof(WCHAR);
-    if (TargetInformation->NetbiosServerName)
-        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosServerName, -1, NULL, 0) * sizeof(WCHAR);
-    if (TargetInformation->DnsServerName)
-        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsServerName, -1, NULL, 0) * sizeof(WCHAR);
-    if (TargetInformation->NetbiosDomainName)
-        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosDomainName, -1, NULL, 0) * sizeof(WCHAR);
-    if (TargetInformation->DnsDomainName)
-        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsDomainName, -1, NULL, 0) * sizeof(WCHAR);
-    if (TargetInformation->DnsTreeName)
-        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsTreeName, -1, NULL, 0) * sizeof(WCHAR);
-    if (TargetInformation->PackageName)
-        len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->PackageName, -1, NULL, 0) * sizeof(WCHAR);
-
-    TargetInformationW = HeapAlloc(GetProcessHeap(), 0, len);
-    if (!TargetInformationW)
-    {
-        SetLastError(ERROR_OUTOFMEMORY);
-        return FALSE;
-    }
-    buffer = (WCHAR*)(TargetInformationW + 1);
-    end = (WCHAR *)((char *)TargetInformationW + len);
-
-    if (TargetInformation->TargetName)
-    {
-        TargetInformationW->TargetName = buffer;
-        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->TargetName, -1,
-                                      TargetInformationW->TargetName, end - buffer);
-    } else
-        TargetInformationW->TargetName = NULL;
-
-    if (TargetInformation->NetbiosServerName)
-    {
-        TargetInformationW->NetbiosServerName = buffer;
-        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosServerName, -1,
-                                      TargetInformationW->NetbiosServerName, end - buffer);
-    } else
-        TargetInformationW->NetbiosServerName = NULL;
-
-    if (TargetInformation->DnsServerName)
-    {
-        TargetInformationW->DnsServerName = buffer;
-        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsServerName, -1,
-                                      TargetInformationW->DnsServerName, end - buffer);
-    } else
-        TargetInformationW->DnsServerName = NULL;
-
-    if (TargetInformation->NetbiosDomainName)
-    {
-        TargetInformationW->NetbiosDomainName = buffer;
-        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosDomainName, -1,
-                                      TargetInformationW->NetbiosDomainName, end - buffer);
-    } else
-        TargetInformationW->NetbiosDomainName = NULL;
-
-    if (TargetInformation->DnsDomainName)
-    {
-        TargetInformationW->DnsDomainName = buffer;
-        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsDomainName, -1,
-                                      TargetInformationW->DnsDomainName, end - buffer);
-    } else
-        TargetInformationW->DnsDomainName = NULL;
-
-    if (TargetInformation->DnsTreeName)
-    {
-        TargetInformationW->DnsTreeName = buffer;
-        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsTreeName, -1,
-                                      TargetInformationW->DnsTreeName, end - buffer);
-    } else
-        TargetInformationW->DnsTreeName = NULL;
-
-    if (TargetInformation->PackageName)
-    {
-        TargetInformationW->PackageName = buffer;
-        buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->PackageName, -1,
-                                      TargetInformationW->PackageName, end - buffer);
-    } else
-        TargetInformationW->PackageName = NULL;
-
-    TargetInformationW->Flags = TargetInformation->Flags;
-    TargetInformationW->CredTypeCount = TargetInformation->CredTypeCount;
-    TargetInformationW->CredTypes = TargetInformation->CredTypes;
-
-    ret = CredReadDomainCredentialsW(TargetInformationW, Flags, Size, &CredentialsW);
-
-    HeapFree(GetProcessHeap(), 0, TargetInformationW);
-
-    if (ret)
-    {
-        char *buf;
-        INT needed;
-
-        len = *Size * sizeof(PCREDENTIALA);
-        for (i = 0; i < *Size; i++)
-            len += convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], NULL, 0);
-
-        *Credentials = HeapAlloc(GetProcessHeap(), 0, len);
-        if (!*Credentials)
-        {
-            CredFree(CredentialsW);
-            SetLastError(ERROR_OUTOFMEMORY);
-            return FALSE;
-        }
-
-        buf = (char *)&(*Credentials)[*Size];
-        len -= *Size * sizeof(PCREDENTIALA);
-        for (i = 0; i < *Size; i++)
-        {
-            (*Credentials)[i] = (PCREDENTIALA)buf;
-            needed = convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], (*Credentials)[i], len);
-            buf += needed;
-            len -= needed;
-        }
-
-        CredFree(CredentialsW);
-    }
-    return ret;
-}
-
 BOOL
 WINAPI
 CredWriteDomainCredentialsW(PCREDENTIAL_TARGET_INFORMATIONW TargetInfo,
index 75a5ff9..7a4acb5 100644 (file)
@@ -360,6 +360,29 @@ DeregisterEventSource(IN HANDLE hEventLog)
 }
 
 
+/******************************************************************************
+ * GetEventLogInformation [ADVAPI32.@]
+ *
+ * PARAMS
+ *   hEventLog      [I] Handle to event log
+ *   dwInfoLevel    [I] Level of event log information to return
+ *   lpBuffer       [O] Buffer that receives the event log information
+ *   cbBufSize      [I] Size of the lpBuffer buffer
+ *   pcbBytesNeeded [O] Required buffer size
+ */
+BOOL WINAPI
+GetEventLogInformation(IN HANDLE hEventLog,
+                       IN DWORD dwInfoLevel,
+                       OUT LPVOID lpBuffer,
+                       IN DWORD cbBufSize,
+                       OUT LPDWORD pcbBytesNeeded)
+{
+    UNIMPLEMENTED;
+    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return FALSE;
+}
+
+
 /******************************************************************************
  * GetNumberOfEventLogRecords [ADVAPI32.@]
  *
@@ -376,6 +399,12 @@ GetNumberOfEventLogRecords(IN HANDLE hEventLog,
 
     TRACE("%p, %p\n", hEventLog, NumberOfRecords);
 
+    if(!NumberOfRecords)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    
     RpcTryExcept
     {
         Status = ElfrNumberOfRecords(hEventLog,
@@ -415,6 +444,12 @@ GetOldestEventLogRecord(IN HANDLE hEventLog,
 
     TRACE("%p, %p\n", hEventLog, OldestRecord);
 
+    if(!OldestRecord)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    
     RpcTryExcept
     {
         Status = ElfrOldestRecord(hEventLog,
index 61dafdb..de64f02 100644 (file)
@@ -2519,6 +2519,7 @@ BOOL __cdecl FDICopy(
   /* slight overestimation here to save CPU cycles in the developer's brain */
   if ((pathlen + filenamelen + 3) > MAX_PATH) {
     ERR("MAX_PATH exceeded.\n");
+    PFDI_FREE(hfdi, decomp_state);
     PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CABINET_NOT_FOUND;
     PFDI_INT(hfdi)->perf->erfType = ERROR_FILE_NOT_FOUND;
     PFDI_INT(hfdi)->perf->fError = TRUE;
@@ -2540,6 +2541,7 @@ BOOL __cdecl FDICopy(
   /* get a handle to the cabfile */
   cabhf = PFDI_OPEN(hfdi, fullpath, _O_RDONLY|_O_BINARY, _S_IREAD | _S_IWRITE);
   if (cabhf == -1) {
+    PFDI_FREE(hfdi, decomp_state);
     PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CABINET_NOT_FOUND;
     PFDI_INT(hfdi)->perf->fError = TRUE;
     SetLastError(ERROR_FILE_NOT_FOUND);
@@ -2548,6 +2550,7 @@ BOOL __cdecl FDICopy(
 
   if (cabhf == 0) {
     ERR("PFDI_OPEN returned zero for %s.\n", fullpath);
+    PFDI_FREE(hfdi, decomp_state);
     PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CABINET_NOT_FOUND;
     PFDI_INT(hfdi)->perf->erfType = ERROR_FILE_NOT_FOUND;
     PFDI_INT(hfdi)->perf->fError = TRUE;
@@ -2558,6 +2561,7 @@ BOOL __cdecl FDICopy(
   /* check if it's really a cabfile. Note that this doesn't implement the bug */
   if (!FDI_read_entries(hfdi, cabhf, &fdici, &(CAB(mii)))) {
     ERR("FDIIsCabinet failed.\n");
+    PFDI_FREE(hfdi, decomp_state);
     PFDI_CLOSE(hfdi, cabhf);
     return FALSE;
   }
index a247570..c25e612 100644 (file)
@@ -2854,7 +2854,7 @@ static void CertContext_SetKeyProvInfo(PCCERT_CONTEXT context,
                     {
                         info.pwszContainerName = CryptMemAlloc(len *
                          sizeof(WCHAR));
-                        len = MultiByteToWideChar(CP_ACP, 0, szContainer, -1,
+                        MultiByteToWideChar(CP_ACP, 0, szContainer, -1,
                          info.pwszContainerName, len);
                     }
                 }
@@ -2878,7 +2878,7 @@ static void CertContext_SetKeyProvInfo(PCCERT_CONTEXT context,
                     {
                         info.pwszProvName = CryptMemAlloc(len *
                          sizeof(WCHAR));
-                        len = MultiByteToWideChar(CP_ACP, 0, szProvider, -1,
+                        MultiByteToWideChar(CP_ACP, 0, szProvider, -1,
                          info.pwszProvName, len);
                     }
                 }
@@ -2898,7 +2898,7 @@ static void CertContext_SetKeyProvInfo(PCCERT_CONTEXT context,
         pInfo = &info;
     }
 
-    ret = CertSetCertificateContextProperty(context, CERT_KEY_PROV_INFO_PROP_ID,
+    CertSetCertificateContextProperty(context, CERT_KEY_PROV_INFO_PROP_ID,
      0, pInfo);
 
     if (pInfo == &info)
index 5cc46b7..28a2206 100644 (file)
@@ -230,10 +230,118 @@ typedef struct _CertificateChain
     LONG ref;
 } CertificateChain, *PCertificateChain;
 
-static inline BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
+static BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
 {
-    return CertCompareCertificateName(cert->dwCertEncodingType,
-     &cert->pCertInfo->Subject, &cert->pCertInfo->Issuer);
+    PCERT_EXTENSION ext;
+    DWORD size;
+    BOOL ret;
+
+    if ((ext = CertFindExtension(szOID_AUTHORITY_KEY_IDENTIFIER2,
+     cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
+    {
+        CERT_AUTHORITY_KEY_ID2_INFO *info;
+
+        ret = CryptDecodeObjectEx(cert->dwCertEncodingType,
+         X509_AUTHORITY_KEY_ID2, ext->Value.pbData, ext->Value.cbData,
+         CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_NOCOPY_FLAG, NULL,
+         &info, &size);
+        if (ret)
+        {
+            if (info->AuthorityCertIssuer.cAltEntry &&
+             info->AuthorityCertSerialNumber.cbData)
+            {
+                PCERT_ALT_NAME_ENTRY directoryName = NULL;
+                DWORD i;
+
+                for (i = 0; !directoryName &&
+                 i < info->AuthorityCertIssuer.cAltEntry; i++)
+                    if (info->AuthorityCertIssuer.rgAltEntry[i].dwAltNameChoice
+                     == CERT_ALT_NAME_DIRECTORY_NAME)
+                        directoryName =
+                         &info->AuthorityCertIssuer.rgAltEntry[i];
+                if (directoryName)
+                {
+                    ret = CertCompareCertificateName(cert->dwCertEncodingType,
+                     &directoryName->u.DirectoryName, &cert->pCertInfo->Issuer)
+                     && CertCompareIntegerBlob(&info->AuthorityCertSerialNumber,
+                     &cert->pCertInfo->SerialNumber);
+                }
+                else
+                {
+                    FIXME("no supported name type in authority key id2\n");
+                    ret = FALSE;
+                }
+            }
+            else if (info->KeyId.cbData)
+            {
+                ret = CertGetCertificateContextProperty(cert,
+                 CERT_KEY_IDENTIFIER_PROP_ID, NULL, &size);
+                if (ret && size == info->KeyId.cbData)
+                {
+                    LPBYTE buf = CryptMemAlloc(size);
+
+                    if (buf)
+                    {
+                        CertGetCertificateContextProperty(cert,
+                         CERT_KEY_IDENTIFIER_PROP_ID, buf, &size);
+                        ret = !memcmp(buf, info->KeyId.pbData, size);
+                        CryptMemFree(buf);
+                    }
+                }
+                else
+                    ret = FALSE;
+            }
+            LocalFree(info);
+        }
+    }
+    else if ((ext = CertFindExtension(szOID_AUTHORITY_KEY_IDENTIFIER,
+     cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
+    {
+        CERT_AUTHORITY_KEY_ID_INFO *info;
+
+        ret = CryptDecodeObjectEx(cert->dwCertEncodingType,
+         X509_AUTHORITY_KEY_ID, ext->Value.pbData, ext->Value.cbData,
+         CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_NOCOPY_FLAG, NULL,
+         &info, &size);
+        if (ret)
+        {
+            if (info->CertIssuer.cbData && info->CertSerialNumber.cbData)
+            {
+                ret = CertCompareCertificateName(cert->dwCertEncodingType,
+                 &info->CertIssuer, &cert->pCertInfo->Issuer) &&
+                 CertCompareIntegerBlob(&info->CertSerialNumber,
+                 &cert->pCertInfo->SerialNumber);
+            }
+            else if (info->KeyId.cbData)
+            {
+                ret = CertGetCertificateContextProperty(cert,
+                 CERT_KEY_IDENTIFIER_PROP_ID, NULL, &size);
+                if (ret && size == info->KeyId.cbData)
+                {
+                    LPBYTE buf = CryptMemAlloc(size);
+
+                    if (buf)
+                    {
+                        CertGetCertificateContextProperty(cert,
+                         CERT_KEY_IDENTIFIER_PROP_ID, buf, &size);
+                        ret = !memcmp(buf, info->KeyId.pbData, size);
+                        CryptMemFree(buf);
+                    }
+                    else
+                        ret = FALSE;
+                }
+                else
+                    ret = FALSE;
+            }
+            else
+                ret = FALSE;
+            LocalFree(info);
+        }
+    }
+    else
+        ret = CertCompareCertificateName(cert->dwCertEncodingType,
+         &cert->pCertInfo->Subject, &cert->pCertInfo->Issuer);
+    return ret;
 }
 
 static void CRYPT_FreeChainElement(PCERT_CHAIN_ELEMENT element)
@@ -619,7 +727,7 @@ static BOOL rfc822_name_matches(LPCWSTR constraint, LPCWSTR name,
         *trustErrorStatus |= CERT_TRUST_INVALID_NAME_CONSTRAINTS;
     else if (!name)
         ; /* no match */
-    else if ((at = strchrW(constraint, '@')))
+    else if (strchrW(constraint, '@'))
         match = !lstrcmpiW(constraint, name);
     else
     {
@@ -2541,10 +2649,11 @@ static void CRYPT_CheckUsages(PCERT_CHAIN_CONTEXT chain,
              *  key usage extension be present and that a particular purpose
              *  be indicated in order for the certificate to be acceptable to
              *  that application."
-             * For now I'm being more conservative and disallowing it.
+             * Not all web sites include the extended key usage extension, so
+             * accept chains without it.
              */
-            WARN_(chain)("requested usage from a certificate with no usages\n");
-            validForUsage = FALSE;
+            TRACE_(chain)("requested usage from certificate with no usages\n");
+            validForUsage = TRUE;
         }
         if (!validForUsage)
         {
@@ -2641,6 +2750,8 @@ BOOL WINAPI CertGetCertificateChain(HCERTCHAINENGINE hChainEngine,
         if (!pChain->TrustStatus.dwErrorStatus)
             CRYPT_VerifyChainRevocation(pChain, pTime, pChainPara, dwFlags);
         CRYPT_CheckUsages(pChain, pChainPara);
+        TRACE_(chain)("error status: %08x\n",
+         pChain->TrustStatus.dwErrorStatus);
         if (ppChainContext)
             *ppChainContext = pChain;
         else
index a24e6ad..72180c5 100644 (file)
@@ -167,14 +167,21 @@ static BOOL compare_crl_issued_by(PCCRL_CONTEXT pCrlContext, DWORD dwType,
                     }
                     else if (info->KeyId.cbData)
                     {
-                        if ((ext = CertFindExtension(
-                         szOID_SUBJECT_KEY_IDENTIFIER,
-                         issuer->pCertInfo->cExtension,
-                         issuer->pCertInfo->rgExtension)))
+                        DWORD size;
+
+                        ret = CertGetCertificateContextProperty(issuer,
+                         CERT_KEY_IDENTIFIER_PROP_ID, NULL, &size);
+                        if (ret && size == info->KeyId.cbData)
                         {
-                            if (info->KeyId.cbData == ext->Value.cbData)
-                                ret = !memcmp(info->KeyId.pbData,
-                                 ext->Value.pbData, info->KeyId.cbData);
+                            LPBYTE buf = CryptMemAlloc(size);
+
+                            if (buf)
+                            {
+                                CertGetCertificateContextProperty(issuer,
+                                 CERT_KEY_IDENTIFIER_PROP_ID, buf, &size);
+                                ret = !memcmp(buf, info->KeyId.pbData, size);
+                                CryptMemFree(buf);
+                            }
                             else
                                 ret = FALSE;
                         }
index 44b517a..40895fa 100644 (file)
@@ -113,7 +113,13 @@ BOOL WINAPI CertAddCTLContextToStore(HCERTSTORE hCertStore,
         break;
     case CERT_STORE_ADD_USE_EXISTING:
         if (existing)
+        {
             CtlContext_CopyProperties(existing, pCtlContext);
+            if (ppStoreContext)
+                *ppStoreContext = CertDuplicateCTLContext(existing);
+        }
+        else
+            toAdd = CertDuplicateCTLContext(pCtlContext);
         break;
     default:
         FIXME("Unimplemented add disposition %d\n", dwAddDisposition);
index 3a786b0..153d3aa 100644 (file)
@@ -899,7 +899,8 @@ BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
         if (existing)
         {
             CertContext_CopyProperties(existing, pCertContext);
-            *ppStoreContext = CertDuplicateCertificateContext(existing);
+            if (ppStoreContext)
+                *ppStoreContext = CertDuplicateCertificateContext(existing);
         }
         else
             toAdd = CertDuplicateCertificateContext(pCertContext);
@@ -1090,7 +1091,13 @@ BOOL WINAPI CertAddCRLContextToStore(HCERTSTORE hCertStore,
         break;
     case CERT_STORE_ADD_USE_EXISTING:
         if (existing)
+        {
             CrlContext_CopyProperties(existing, pCrlContext);
+            if (ppStoreContext)
+                *ppStoreContext = CertDuplicateCRLContext(existing);
+        }
+        else
+            toAdd = CertDuplicateCRLContext(pCrlContext);
         break;
     default:
         FIXME("Unimplemented add disposition %d\n", dwAddDisposition);
index 450a22a..fe8773b 100644 (file)
@@ -439,6 +439,554 @@ AdvProcDriverDlgProc(IN HWND hwndDlg,
 }
 
 
+static VOID
+SetListViewText(HWND hwnd,
+                INT iItem,
+                LPWSTR lpText)
+{
+    LVITEM li;
+
+    li.mask = LVIF_TEXT | LVIF_STATE;
+    li.iItem = iItem;
+    li.iSubItem = 0;
+    li.state = 0; //(li.iItem == 0 ? LVIS_SELECTED : 0);
+    li.stateMask = LVIS_SELECTED;
+    li.pszText = lpText;
+    (void)ListView_InsertItem(hwnd,
+                              &li);
+}
+
+
+static VOID
+UpdateDetailsDlg(IN HWND hwndDlg,
+                 IN PDEVADVPROP_INFO dap)
+{
+    HWND hwndComboBox;
+    HWND hwndListView;
+    LV_COLUMN lvc;
+    RECT rcClient;
+
+    UINT i;
+    UINT Properties[] =
+    {
+        IDS_PROP_DEVICEID,
+        IDS_PROP_HARDWAREIDS,
+        IDS_PROP_COMPATIBLEIDS,
+        IDS_PROP_MATCHINGDEVICEID,
+        IDS_PROP_SERVICE,
+        IDS_PROP_ENUMERATOR,
+        IDS_PROP_CAPABILITIES,
+        IDS_PROP_DEVNODEFLAGS,
+        IDS_PROP_CONFIGFLAGS,
+        IDS_PROP_CSCONFIGFLAGS,
+        IDS_PROP_EJECTIONRELATIONS,
+        IDS_PROP_REMOVALRELATIONS,
+        IDS_PROP_BUSRELATIONS,
+        IDS_PROP_DEVUPPERFILTERS,
+        IDS_PROP_DEVLOWERFILTERS,
+        IDS_PROP_CLASSUPPERFILTERS,
+        IDS_PROP_CLASSLOWERFILTERS,
+        IDS_PROP_CLASSINSTALLER,
+        IDS_PROP_CLASSCOINSTALLER,
+        IDS_PROP_DEVICECOINSTALLER,
+        IDS_PROP_FIRMWAREREVISION,
+        IDS_PROP_CURRENTPOWERSTATE,
+        IDS_PROP_POWERCAPABILITIES,
+        IDS_PROP_POWERSTATEMAPPINGS
+    };
+
+
+    /* set the device image */
+    SendDlgItemMessage(hwndDlg,
+                       IDC_DEVICON,
+                       STM_SETICON,
+                       (WPARAM)dap->hDevIcon,
+                       0);
+
+    /* set the device name edit control text */
+    SetDlgItemText(hwndDlg,
+                   IDC_DEVNAME,
+                   dap->szDevName);
+
+
+    hwndComboBox = GetDlgItem(hwndDlg,
+                              IDC_DETAILSPROPNAME);
+
+    hwndListView = GetDlgItem(hwndDlg,
+                              IDC_DETAILSPROPVALUE);
+
+    for (i = 0; i != sizeof(Properties) / sizeof(Properties[0]); i++)
+    {
+        /* fill in the device usage combo box */
+        if (LoadString(hDllInstance,
+                       Properties[i],
+                       dap->szTemp,
+                       sizeof(dap->szTemp) / sizeof(dap->szTemp[0])))
+        {
+            SendMessage(hwndComboBox,
+                        CB_ADDSTRING,
+                        0,
+                        (LPARAM)dap->szTemp);
+        }
+    }
+
+
+    GetClientRect(hwndListView,
+                  &rcClient);
+
+    /* add a column to the list view control */
+    lvc.mask = LVCF_FMT | LVCF_WIDTH;
+    lvc.fmt = LVCFMT_LEFT;
+    lvc.cx = rcClient.right;
+    (void)ListView_InsertColumn(hwndListView,
+                                0,
+                                &lvc);
+
+    SendMessage(hwndComboBox,
+                CB_SETCURSEL,
+                0,
+                0);
+
+    SetListViewText(hwndListView, 0, dap->szDeviceID);
+
+    SetFocus(hwndComboBox);
+}
+
+
+static VOID
+DisplayDevicePropertyText(IN PDEVADVPROP_INFO dap,
+                          IN HWND hwndListView,
+                          IN DWORD dwProperty)
+{
+    HDEVINFO DeviceInfoSet;
+    PSP_DEVINFO_DATA DeviceInfoData;
+    DWORD dwType;
+    DWORD dwSize;
+    LPBYTE lpBuffer;
+    LPWSTR lpStr;
+    INT len;
+    INT index;
+
+    if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE)
+    {
+        DeviceInfoSet = dap->CurrentDeviceInfoSet;
+        DeviceInfoData = &dap->CurrentDeviceInfoData;
+    }
+    else
+    {
+        DeviceInfoSet = dap->DeviceInfoSet;
+        DeviceInfoData = &dap->DeviceInfoData;
+    }
+
+    dwSize = 0;
+    SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+                                     DeviceInfoData,
+                                     dwProperty,
+                                     &dwType,
+                                     NULL,
+                                     0,
+                                     &dwSize);
+    if (dwSize == 0)
+    {
+        if (GetLastError() != ERROR_FILE_NOT_FOUND)
+        {
+            swprintf(dap->szTemp, L"Error: Getting the size failed! (Error: %ld)", GetLastError());
+            SetListViewText(hwndListView, 0, dap->szTemp);
+        }
+        return;
+    }
+
+    lpBuffer = HeapAlloc(GetProcessHeap(),
+                         HEAP_ZERO_MEMORY,
+                         dwSize);
+    if (lpBuffer == NULL)
+    {
+        SetListViewText(hwndListView, 0, L"Error: Allocating the buffer failed!");
+        return;
+    }
+
+    if (SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+                                         DeviceInfoData,
+                                         dwProperty,
+                                         &dwType,
+                                         lpBuffer,
+                                         dwSize,
+                                         &dwSize))
+    {
+        if (dwType == REG_SZ)
+        {
+            SetListViewText(hwndListView, 0, (LPWSTR)lpBuffer);
+        }
+        else if (dwType == REG_MULTI_SZ)
+        {
+            lpStr = (LPWSTR)lpBuffer;
+            index = 0;
+            while (*lpStr != 0)
+            {
+                len = wcslen(lpStr) + 1;
+
+                SetListViewText(hwndListView, index, lpStr);
+
+                lpStr += len;
+                index++;
+            }
+        }
+        else if (dwType == REG_DWORD)
+        {
+            switch (dwProperty)
+            {
+                case SPDRP_CAPABILITIES:
+                    index = 0;
+                    if (*lpBuffer & CM_DEVCAP_LOCKSUPPORTED)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_LOCKSUPPORTED");
+                    if (*lpBuffer & CM_DEVCAP_EJECTSUPPORTED)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_EJECTSUPPORTED");
+                    if (*lpBuffer & CM_DEVCAP_REMOVABLE)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_REMOVABLE");
+                    if (*lpBuffer & CM_DEVCAP_DOCKDEVICE)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_DOCKDEVICE");
+                    if (*lpBuffer & CM_DEVCAP_UNIQUEID)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_UNIQUEID");
+                    if (*lpBuffer & CM_DEVCAP_SILENTINSTALL)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_SILENTINSTALL");
+                    if (*lpBuffer & CM_DEVCAP_RAWDEVICEOK)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_RAWDEVICEOK");
+                    if (*lpBuffer & CM_DEVCAP_SURPRISEREMOVALOK)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_SURPRISEREMOVALOK");
+                    if (*lpBuffer & CM_DEVCAP_HARDWAREDISABLED)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_HARDWAREDISABLED");
+                    if (*lpBuffer & CM_DEVCAP_NONDYNAMIC)
+                        SetListViewText(hwndListView, index++, L"CM_DEVCAP_NONDYNAMIC");
+                    break;
+
+                case SPDRP_CONFIGFLAGS:
+                    index = 0;
+                    if (*lpBuffer & CONFIGFLAG_DISABLED)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_DISABLED");
+                    if (*lpBuffer & CONFIGFLAG_REMOVED)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_REMOVED");
+                    if (*lpBuffer & CONFIGFLAG_MANUAL_INSTALL)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_MANUAL_INSTALL");
+                    if (*lpBuffer & CONFIGFLAG_IGNORE_BOOT_LC)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_IGNORE_BOOT_LC");
+                    if (*lpBuffer & CONFIGFLAG_NET_BOOT)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_NET_BOOT");
+                    if (*lpBuffer & CONFIGFLAG_REINSTALL)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_REINSTALL");
+                    if (*lpBuffer & CONFIGFLAG_FAILEDINSTALL)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_FAILEDINSTALL");
+                    if (*lpBuffer & CONFIGFLAG_CANTSTOPACHILD)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_CANTSTOPACHILD");
+                    if (*lpBuffer & CONFIGFLAG_OKREMOVEROM)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_OKREMOVEROM");
+                    if (*lpBuffer & CONFIGFLAG_NOREMOVEEXIT)
+                        SetListViewText(hwndListView, index++, L"CONFIGFLAG_NOREMOVEEXIT");
+                    break;
+
+                default:
+                    swprintf(dap->szTemp, L"0x%08x", *lpBuffer);
+                    SetListViewText(hwndListView, 0, dap->szTemp);
+                    break;
+            }
+        }
+        else
+        {
+            SetListViewText(hwndListView, 0, L"Error: Unsupported value type!");
+
+        }
+    }
+    else
+    {
+        SetListViewText(hwndListView, 0, L"Error: Retrieving the value failed!");
+    }
+
+    HeapFree(GetProcessHeap(),
+             0,
+             lpBuffer);
+}
+
+static VOID
+DisplayDevNodeFlags(IN PDEVADVPROP_INFO dap,
+                    IN HWND hwndListView)
+{
+    DWORD dwStatus = 0;
+    DWORD dwProblem = 0;
+    INT index;
+
+    CM_Get_DevNode_Status_Ex(&dwStatus,
+                             &dwProblem,
+                             dap->DeviceInfoData.DevInst,
+                             0,
+                             dap->hMachine);
+
+    index = 0;
+    if (dwStatus & DN_ROOT_ENUMERATED)
+        SetListViewText(hwndListView, index++, L"DN_ROOT_ENUMERATED");
+    if (dwStatus & DN_DRIVER_LOADED)
+        SetListViewText(hwndListView, index++, L"DN_DRIVER_LOADED");
+    if (dwStatus & DN_ENUM_LOADED)
+        SetListViewText(hwndListView, index++, L"DN_ENUM_LOADED");
+    if (dwStatus & DN_STARTED)
+        SetListViewText(hwndListView, index++, L"DN_STARTED");
+    if (dwStatus & DN_MANUAL)
+        SetListViewText(hwndListView, index++, L"DN_MANUAL");
+    if (dwStatus & DN_NEED_TO_ENUM)
+        SetListViewText(hwndListView, index++, L"DN_NEED_TO_ENUM");
+    if (dwStatus & DN_DRIVER_BLOCKED)
+        SetListViewText(hwndListView, index++, L"DN_DRIVER_BLOCKED");
+    if (dwStatus & DN_HARDWARE_ENUM)
+        SetListViewText(hwndListView, index++, L"DN_HARDWARE_ENUM");
+    if (dwStatus & DN_NEED_RESTART)
+        SetListViewText(hwndListView, index++, L"DN_NEED_RESTART");
+    if (dwStatus & DN_CHILD_WITH_INVALID_ID)
+        SetListViewText(hwndListView, index++, L"DN_CHILD_WITH_INVALID_ID");
+    if (dwStatus & DN_HAS_PROBLEM)
+        SetListViewText(hwndListView, index++, L"DN_HAS_PROBLEM");
+    if (dwStatus & DN_FILTERED)
+        SetListViewText(hwndListView, index++, L"DN_FILTERED");
+    if (dwStatus & DN_LEGACY_DRIVER)
+        SetListViewText(hwndListView, index++, L"DN_LEGACY_DRIVER");
+    if (dwStatus & DN_DISABLEABLE)
+        SetListViewText(hwndListView, index++, L"DN_DISABLEABLE");
+    if (dwStatus & DN_REMOVABLE)
+        SetListViewText(hwndListView, index++, L"DN_REMOVABLE");
+    if (dwStatus & DN_PRIVATE_PROBLEM)
+        SetListViewText(hwndListView, index++, L"DN_PRIVATE_PROBLEM");
+    if (dwStatus & DN_MF_PARENT)
+        SetListViewText(hwndListView, index++, L"DN_MF_PARENT");
+    if (dwStatus & DN_MF_CHILD)
+        SetListViewText(hwndListView, index++, L"DN_MF_CHILD");
+    if (dwStatus & DN_WILL_BE_REMOVED)
+        SetListViewText(hwndListView, index++, L"DN_WILL_BE_REMOVED");
+
+    if (dwStatus & DN_NOT_FIRST_TIMEE)
+        SetListViewText(hwndListView, index++, L"DN_NOT_FIRST_TIMEE");
+    if (dwStatus & DN_STOP_FREE_RES)
+        SetListViewText(hwndListView, index++, L"DN_STOP_FREE_RES");
+    if (dwStatus & DN_REBAL_CANDIDATE)
+        SetListViewText(hwndListView, index++, L"DN_REBAL_CANDIDATE");
+    if (dwStatus & DN_BAD_PARTIAL)
+        SetListViewText(hwndListView, index++, L"DN_BAD_PARTIAL");
+    if (dwStatus & DN_NT_ENUMERATOR)
+        SetListViewText(hwndListView, index++, L"DN_NT_ENUMERATOR");
+    if (dwStatus & DN_NT_DRIVER)
+        SetListViewText(hwndListView, index++, L"DN_NT_DRIVER");
+
+    if (dwStatus & DN_NEEDS_LOCKING)
+        SetListViewText(hwndListView, index++, L"DN_NEEDS_LOCKING");
+    if (dwStatus & DN_ARM_WAKEUP)
+        SetListViewText(hwndListView, index++, L"DN_ARM_WAKEUP");
+    if (dwStatus & DN_APM_ENUMERATOR)
+        SetListViewText(hwndListView, index++, L"DN_APM_ENUMERATOR");
+    if (dwStatus & DN_APM_DRIVER)
+        SetListViewText(hwndListView, index++, L"DN_APM_DRIVER");
+    if (dwStatus & DN_SILENT_INSTALL)
+        SetListViewText(hwndListView, index++, L"DN_SILENT_INSTALL");
+    if (dwStatus & DN_NO_SHOW_IN_DM)
+        SetListViewText(hwndListView, index++, L"DN_NO_SHOW_IN_DM");
+    if (dwStatus & DN_BOOT_LOG_PROB)
+        SetListViewText(hwndListView, index++, L"DN_BOOT_LOG_PROB");
+
+//    swprintf(dap->szTemp, L"0x%08x", dwStatus);
+//    SetListViewText(hwndListView, 0, dap->szTemp);
+}
+
+static VOID
+DisplayDevNodeEnumerator(IN PDEVADVPROP_INFO dap,
+                         IN HWND hwndListView)
+{
+    HDEVINFO DeviceInfoSet;
+    PSP_DEVINFO_DATA DeviceInfoData;
+
+    DWORD dwType = 0;
+    WCHAR szBuffer[256];
+    DWORD dwSize = 256 * sizeof(WCHAR);
+
+    if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE)
+    {
+        DeviceInfoSet = dap->CurrentDeviceInfoSet;
+        DeviceInfoData = &dap->CurrentDeviceInfoData;
+    }
+    else
+    {
+        DeviceInfoSet = dap->DeviceInfoSet;
+        DeviceInfoData = &dap->DeviceInfoData;
+    }
+
+    CM_Get_DevNode_Registry_Property_ExW(DeviceInfoData->DevInst,
+                                         CM_DRP_ENUMERATOR_NAME,
+                                         &dwType,
+                                         &szBuffer,
+                                         &dwSize,
+                                         0,
+                                         dap->hMachine);
+
+    SetListViewText(hwndListView, 0, szBuffer);
+}
+
+
+
+static VOID
+DisplayDeviceProperties(IN PDEVADVPROP_INFO dap,
+                        IN HWND hwndComboBox,
+                        IN HWND hwndListView)
+{
+    INT Index;
+
+    Index = (INT)SendMessage(hwndComboBox,
+                             CB_GETCURSEL,
+                             0,
+                             0);
+    if (Index == CB_ERR)
+        return;
+
+    (void)ListView_DeleteAllItems(hwndListView);
+
+    switch (Index)
+    {
+        case 0:
+            SetListViewText(hwndListView, 0, dap->szDeviceID);
+            break;
+
+
+        case 1: /* Hardware ID */
+            DisplayDevicePropertyText(dap,
+                                      hwndListView,
+                                      SPDRP_HARDWAREID);
+            break;
+
+        case 2: /* Compatible IDs */
+            DisplayDevicePropertyText(dap,
+                                      hwndListView,
+                                      SPDRP_COMPATIBLEIDS);
+            break;
+
+#if 0
+        case 3: /* Matching ID */
+            break;
+#endif
+
+        case 4: /* Service */
+            DisplayDevicePropertyText(dap,
+                                      hwndListView,
+                                      SPDRP_SERVICE);
+            break;
+
+        case 5: /* Enumerator */
+            DisplayDevNodeEnumerator(dap,
+                                     hwndListView);
+//            DisplayDevicePropertyText(dap,
+//                                      hwndListView,
+//                                      SPDRP_ENUMERATOR_NAME);
+            break;
+
+        case 6: /* Capabilities */
+            DisplayDevicePropertyText(dap,
+                                      hwndListView,
+                                      SPDRP_CAPABILITIES);
+            break;
+
+        case 7: /* Devnode Flags */
+            DisplayDevNodeFlags(dap,
+                                hwndListView);
+            break;
+
+        case 8: /* Config Flags */
+            DisplayDevicePropertyText(dap,
+                                      hwndListView,
+                                      SPDRP_CONFIGFLAGS);
+            break;
+
+#if 0
+        case 9: /* CSConfig Flags */
+            break;
+#endif
+
+        case 13: /* Upper Filters */
+            DisplayDevicePropertyText(dap,
+                                      hwndListView,
+                                      SPDRP_UPPERFILTERS);
+            break;
+
+        case 14: /* Lower Filters */
+            DisplayDevicePropertyText(dap,
+                                      hwndListView,
+                                      SPDRP_LOWERFILTERS);
+            break;
+
+        default:
+            SetListViewText(hwndListView, 0, L"<Not implemented yet>");
+            break;
+    }
+}
+
+
+static INT_PTR
+CALLBACK
+AdvProcDetailsDlgProc(IN HWND hwndDlg,
+                      IN UINT uMsg,
+                      IN WPARAM wParam,
+                      IN LPARAM lParam)
+{
+    PDEVADVPROP_INFO dap;
+    INT_PTR Ret = FALSE;
+
+    dap = (PDEVADVPROP_INFO)GetWindowLongPtr(hwndDlg,
+                                             DWL_USER);
+
+    if (dap != NULL || uMsg == WM_INITDIALOG)
+    {
+        switch (uMsg)
+        {
+            case WM_COMMAND:
+            {
+                switch (LOWORD(wParam))
+                {
+                    case IDC_DETAILSPROPNAME:
+                        if (HIWORD(wParam) == CBN_SELCHANGE)
+                        {
+                            DisplayDeviceProperties(dap,
+                                                    GetDlgItem(hwndDlg, IDC_DETAILSPROPNAME),
+                                                    GetDlgItem(hwndDlg, IDC_DETAILSPROPVALUE));
+                        }
+                        break;
+                }
+                break;
+            }
+
+            case WM_NOTIFY:
+            {
+                NMHDR *hdr = (NMHDR*)lParam;
+                switch (hdr->code)
+                {
+                    case PSN_APPLY:
+                        break;
+                }
+                break;
+            }
+
+            case WM_INITDIALOG:
+            {
+                dap = (PDEVADVPROP_INFO)((LPPROPSHEETPAGE)lParam)->lParam;
+                if (dap != NULL)
+                {
+                    SetWindowLongPtr(hwndDlg,
+                                     DWL_USER,
+                                     (DWORD_PTR)dap);
+
+                    UpdateDetailsDlg(hwndDlg,
+                                     dap);
+                }
+                Ret = TRUE;
+                break;
+            }
+        }
+    }
+
+    return Ret;
+}
+
+
 static VOID
 InitDevUsageActions(IN HWND hwndDlg,
                     IN HWND hComboBox,
@@ -1021,6 +1569,9 @@ GetParentNode:
     if (dap->HasDriverPage)
         dap->nDevPropSheets++;
 
+    /* include the details page */
+    dap->nDevPropSheets++;
+
     /* add the device property sheets */
     if (dap->nDevPropSheets != 0)
     {
@@ -1092,6 +1643,36 @@ GetParentNode:
                     }
                 }
             }
+
+            if (1)
+            {
+                PROPSHEETPAGE pspDetails = {0};
+                pspDetails.dwSize = sizeof(PROPSHEETPAGE);
+                pspDetails.dwFlags = PSP_DEFAULT;
+                pspDetails.hInstance = hDllInstance;
+                pspDetails.pszTemplate = (LPCWSTR)MAKEINTRESOURCE(IDD_DEVICEDETAILS);
+                pspDetails.pfnDlgProc = AdvProcDetailsDlgProc;
+                pspDetails.lParam = (LPARAM)dap;
+                dap->DevPropSheets[iPage] = dap->pCreatePropertySheetPageW(&pspDetails);
+                if (dap->DevPropSheets[iPage] != NULL)
+                {
+                    if (PropSheet_AddPage(hPropSheetDlg,
+                                          dap->DevPropSheets[iPage]))
+                    {
+                        iPage++;
+                        RecalcPages = TRUE;
+                    }
+                    else
+                    {
+                        dap->pDestroyPropertySheetPage(dap->DevPropSheets[iPage]);
+                        dap->DevPropSheets[iPage] = NULL;
+                    }
+                }
+            }
+
+            /* FIXME: Add the resources page */
+
+            /* FIXME: Add the power page */
         }
         else
             dap->nDevPropSheets = 0;
index 50e60c7..7ade5f1 100644 (file)
@@ -91,6 +91,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ÐåàêòÎÑ íå óñïÿ äà ñìåíè íàñòðîéêèòå íà óñòðîéñòâîòî."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -169,3 +197,33 @@ BEGIN
     PUSHBUTTON "Äîáðå", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index ec04777..2c29b44 100644 (file)
@@ -94,6 +94,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS nedokázal zmìnit nastavení tohoto zaøízení."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -171,3 +199,34 @@ BEGIN
     LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
+
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index 556139d..72fa774 100644 (file)
@@ -26,7 +26,7 @@ BEGIN
     IDS_UPDATEDRV "Treiber &aktualisieren..."
     IDS_REBOOT "Computer neusta&rten..."
     IDS_NOTAVAILABLE "Nicht verfügbar"
-    IDS_NOTDIGITALLYSIGNED "Nicht digital signierte"
+    IDS_NOTDIGITALLYSIGNED "Nicht digital signiert"
     IDS_NODRIVERS "Es werden keine Treiber für dieses Gerät benötigt oder es wurden keine Treiber geladen."
 END
 
@@ -43,12 +43,12 @@ BEGIN
     IDS_DEV_BOOT_CONFIG_CONFLICT "Ein anderes Gerät benutzt bereits die Ressourcen, die dieses Gerät benötigt."
     IDS_DEV_FAILED_FILTER "Die Treiber für dieses Gerät müssen neuinstalliert werden."
     IDS_DEV_DEVLOADER_NOT_FOUND "Dieses Gerät arbeitet nicht korrekt, weil ReactOS die Datei $1 nicht laden kann, die die Treiber für dieses Gerät lädt."
-    IDS_DEV_DEVLOADER_NOT_FOUND2 "Dieses Gerät arbeitet nicht korrekt, weil die Datei $1, die die Treiber für dieses Gerät lädt, kaputt ist."
-    IDS_DEV_DEVLOADER_NOT_FOUND3 "Gerätefehler: Versuchen Sie, den Treiber für dieses Gerät auszutauschen. Wenn das nicht hilft, schauen Sie in die Gerätedokumentation."
-    IDS_DEV_INVALID_DATA "Dieses Gerät arbeitet nicht korrekt, weil das BIOS ihres Computer die Ressourcen für dieses Gerät falsch angibt."
+    IDS_DEV_DEVLOADER_NOT_FOUND2 "Dieses Gerät arbeitet nicht korrekt, weil die Datei $1, die die Treiber für dieses Gerät lädt, defekt ist."
+    IDS_DEV_DEVLOADER_NOT_FOUND3 "Gerätefehler: Versuchen Sie, den Treiber für dieses Gerät auszutauschen. Wenn das nicht hilft, sehen Sie in die Gerätedokumentation."
+    IDS_DEV_INVALID_DATA "Dieses Gerät arbeitet nicht korrekt, weil das BIOS ihres Computers die Ressourcen für dieses Gerät falsch angibt."
     IDS_DEV_INVALID_DATA2 "Dieses Gerät arbeitet nicht korrekt, weil das BIOS dieses Gerätes die Ressourcen für dieses Gerät falsch angibt. "
     IDS_DEV_FAILED_START "Dieses Gerät ist entweder nicht vorhanden, funktioniert nicht korrekt, oder es sind nicht alle Treiber installiert."
-    IDS_DEV_LIAR "ReactOS hörte während des Versuchs dieses Gerät zu starten auf zu reagieren und wird deshalb nie wieder versuchen, dieses Gerät zu starten.."
+    IDS_DEV_LIAR "ReactOS hörte während des Versuchs dieses Gerät zu starten auf zu reagieren und wird deshalb nicht wieder versuchen, dieses Gerät zu starten.."
     IDS_DEV_NORMAL_CONFLICT "Dieses Gerät kann keine freien $1 Ressourcen zur Benutzung finden."
     IDS_DEV_NOT_VERIFIED "Dieses Gerät ist entweder nicht vorhanden, funktioniert nicht korrekt, oder es sind nicht alle Treiber installiert."
     IDS_DEV_NEED_RESTART "Dieses Gerät wird erst korrekt funktionieren, wenn Sie den Computer neugestartet haben."
@@ -61,14 +61,14 @@ BEGIN
     IDS_DEV_DISABLED "Dieses Gerät ist nicht gestartet."
     IDS_DEV_DISABLED2 "Dieses Gerät ist deaktiviert."
     IDS_DEV_DEVLOADER_NOT_READY "Der Lader für dieses Gerät kann die benötigten Treiber nicht laden."
-    IDS_DEV_DEVLOADER_NOT_READY2 "Dieses Grafikkarte funktioniert einwandfrei."
+    IDS_DEV_DEVLOADER_NOT_READY2 "Diese Grafikkarte funktioniert einwandfrei."
     IDS_DEV_DEVLOADER_NOT_READY3 "Die Lader für dieses Gerät können die benötigten Treiber nicht laden."
     IDS_DEV_DEVICE_NOT_THERE "Dieses Gerät ist entweder nicht vorhanden, funktioniert nicht korrekt, oder es sind nicht alle Treiber installiert."
     IDS_DEV_MOVED "ReactOS ist dabei dieses Gerät zu aktivieren."
     IDS_DEV_TOO_EARLY "ReactOS ist dabei dieses Gerät zu aktivieren."
     IDS_DEV_NO_VALID_LOG_CONF "ReactOS kann die Ressourcen für dieses Gerät nicht feststellen."
     IDS_DEV_FAILED_INSTALL "Die Treiber für dieses Gerät sind nicht installiert."
-    IDS_DEV_HARDWARE_DISABLED "Dieses Gerät ist deaktiviert, weil das BIOS für dieses Gerät ihm keine Ressourcen zugeteilt hat."
+    IDS_DEV_HARDWARE_DISABLED "Dieses Gerät ist deaktiviert, weil das BIOS für dieses Gerät keine Ressourcen zugeteilt hat."
     IDS_DEV_CANT_SHARE_IRQ "Dieses Gerät benutzt einen Interrupt (IRQ), der bereits von einem anderen Gerät benutzt wird und nicht geteilt werden kann. Sie müssen die kollidierenden Einstellungen ändern, oder den real-mode Treiber entfernen, der den Konflikt verursacht."
     IDS_DEV_FAILED_ADD "Dieses Gerät arbeitet nicht korrekt, weil $1 nicht korrekt funktioniert."
     IDS_DEV_DISABLED_SERVICE "ReactOS kann die Treiber für dieses Gerät nicht installieren, weil auf das (Netz-)Laufwerk, auf dem die Installationsdateien abgelegt sind, nicht zugegriffen werden kann."
@@ -86,12 +86,40 @@ BEGIN
     IDS_DEV_HALTED "Eine Anwendung oder ein Dienst hat dieses Gerät heruntergefahren."
     IDS_DEV_PHANTOM "Dieses Gerät ist momentan nicht mit dem Computer verbunden."
     IDS_DEV_SYSTEM_SHUTDOWN "ReactOS kann auf dieses Gerät nicht zugreifen, weil das Betriebssystem heruntergefahren wird."
-    IDS_DEV_HELD_FOR_EJECT "ReactOS kann dieses Gerät nicht benutzen, weil es für ""Sicheres Entfernen"" vorbereitet wurde, aber es wurde bisher nicht vom Computer entfernt."
+    IDS_DEV_HELD_FOR_EJECT "ReactOS kann dieses Gerät nicht benutzen, weil es für ""Sicheres Entfernen"" vorbereitet, aber bisher nicht vom Computer entfernt wurde."
     IDS_DEV_DRIVER_BLOCKED "Die Ausführung der Software für dieses Gerät wurde blockiert, weil bekannt ist, dass sie Probleme mit ReactOS hat. Kontaktieren Sie den Hersteller für einen neuen Treiber."
     IDS_DEV_REGISTRY_TOO_LARGE "Die neuen Hardwaregeräte können nicht gestartet werden, da die Systemstruktur zu groß ist (die Struktur überschreitet die Registrierungsgrößenbeschränkung)."
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS konnte die Einstellungen für dieses Gerät nicht verändern."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Geräteinstanz-ID"
+    IDS_PROP_HARDWAREIDS "Hardware-IDs"
+    IDS_PROP_COMPATIBLEIDS "Kompatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Passende Geräte-ID"
+    IDS_PROP_SERVICE "Dienst"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Eigenschaften"
+    IDS_PROP_DEVNODEFLAGS "DevNode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Auswurfsrichtlinien"
+    IDS_PROP_REMOVALRELATIONS "Entfernungsrichtlinen"
+    IDS_PROP_BUSRELATIONS "Bus Richtlinien"
+    IDS_PROP_DEVUPPERFILTERS "Obere Gerätefilter"
+    IDS_PROP_DEVLOWERFILTERS "Untere Gerätefilter"
+    IDS_PROP_CLASSUPPERFILTERS "Obere Klassenfilter"
+    IDS_PROP_CLASSLOWERFILTERS "Untere Klassenfilter"
+    IDS_PROP_CLASSINSTALLER "Klassen Installationsprogramm"
+    IDS_PROP_CLASSCOINSTALLER "Klassen Co-Installationsprogramm"
+    IDS_PROP_DEVICECOINSTALLER "Geräte Co-Installationsprogramm"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Aktueller Energiezustand"
+    IDS_PROP_POWERCAPABILITIES "Energie-Eigenschaften"
+    IDS_PROP_POWERSTATEMAPPINGS "Energiezustandszuordnungen"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -170,5 +198,36 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resourcen"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Energie"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
 
 
index 2f35544..9ccb338 100644 (file)
@@ -91,6 +91,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS wasn\'t able to change the settings of this device."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -169,3 +197,33 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index 176bb08..64b44f2 100644 (file)
@@ -91,6 +91,35 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS wasn\'t able to change the settings of this device."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -169,3 +198,33 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index 351d5ea..2b728c1 100644 (file)
@@ -92,6 +92,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS no fue capaz de cambiar las propiedades de este dispositivo."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -170,6 +198,35 @@ BEGIN
     PUSHBUTTON "Aceptar", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
 
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
 
 
index 6a05d37..1d1e580 100644 (file)
@@ -90,6 +90,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS n'a pas pu changer les réglages de ce périphérique."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -168,3 +196,33 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index a542f7e..23180c6 100644 (file)
@@ -90,6 +90,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "A ReactOS nem tudta megváltoztatni az eszköz beállításait."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -146,3 +174,33 @@ BEGIN
      LTEXT "To view details about the driver files.", -1, 91, 110, 154, 17, SS_NOPREFIX
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index 30ce6de..3f4dc52 100644 (file)
@@ -91,6 +91,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS tidak bisa mengubah setelan device ini."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -169,3 +197,33 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index 0267864..f024abf 100644 (file)
@@ -91,6 +91,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS non può modificare le impostazioni di questo dispositivo."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -169,3 +197,33 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index 77efbcc..a7a5a7b 100644 (file)
@@ -91,6 +91,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS var ikke tilgjengelig for å endre innstillinger for denne enheten."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -169,3 +197,33 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index dd005eb..59bd6ae 100644 (file)
@@ -4,7 +4,7 @@
 * xxrogers@users.sourceforge.net
 * https://sourceforge.net/projects/reactospl
 *
-* updates by Caemyr - Olaf Siejka (Jan, 2008)
+* updates by Caemyr - Olaf Siejka (Jan 2008, Jan 2010)
 */
 
 LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
@@ -98,6 +98,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS nie by³ w stanie zmieniæ parametrów instalacyjnych tego urz¹dzenia."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "\8ccie¿ka urz¹dzenia"
+    IDS_PROP_HARDWAREIDS "Identyfikator urz¹dzenia"
+    IDS_PROP_COMPATIBLEIDS "Zgodne identyfikatory"
+    IDS_PROP_MATCHINGDEVICEID "U¿yty identyfikator"
+    IDS_PROP_SERVICE "Us³uga"
+    IDS_PROP_ENUMERATOR "Modu³ lokalizuj¹cy"
+    IDS_PROP_CAPABILITIES "Mo¿liwo\9cci"
+    IDS_PROP_DEVNODEFLAGS "Konfiguracja wêz³a Devnode"
+    IDS_PROP_CONFIGFLAGS "Stan wêz³a Config"
+    IDS_PROP_CSCONFIGFLAGS "Stan wêz³a CSCONFIG"
+    IDS_PROP_EJECTIONRELATIONS "Relacje wysuwania"
+    IDS_PROP_REMOVALRELATIONS "Relacje usuwania"
+    IDS_PROP_BUSRELATIONS "Relacje magistrali"
+    IDS_PROP_DEVUPPERFILTERS "Wy¿sze filtry urz¹dzenia"
+    IDS_PROP_DEVLOWERFILTERS "Ni¿sze filtry urz¹dzenia"
+    IDS_PROP_CLASSUPPERFILTERS "Wy¿sze filtry klasy"
+    IDS_PROP_CLASSLOWERFILTERS "Ni¿sze filtry klasy"
+    IDS_PROP_CLASSINSTALLER "Instalator klasy"
+    IDS_PROP_CLASSCOINSTALLER "Dodatkowy instalator klasy"
+    IDS_PROP_DEVICECOINSTALLER "Dodatkowy instalator urz¹dzenia"
+    IDS_PROP_FIRMWAREREVISION "Wersja Firmware"
+    IDS_PROP_CURRENTPOWERSTATE "Bie¿¹cy stan zasilania"
+    IDS_PROP_POWERCAPABILITIES "Zdolno\9cci trybu zasilania"
+    IDS_PROP_POWERSTATEMAPPINGS "Mapowania stanu zasilania"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -154,5 +182,35 @@ BEGIN
      LTEXT "Wy\9cwietla informacje szczegó³owe.", -1, 91, 110, 154, 17, SS_NOPREFIX
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Szczegó³y"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Zasoby"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Zasilanie"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
 
 
index c949e6d..5b0c477 100644 (file)
@@ -35,8 +35,8 @@ BEGIN
     IDS_DEV_NO_PROBLEM "Este dispositivo está funcionando corretamente."
     IDS_DEV_NOT_CONFIGURED "Este dispositivo não está corretamente configurado."
     IDS_DEV_DEVLOADER_FAILED "O ReactOS não pôde carregar o driver para este dispositivo porque o computador está relatando dois tipos de barramento $1."
-       IDS_DEV_DEVLOADER_FAILED2 "O(s) carregadore(es) do dispositivo $1 não pôde/puderam carregar o driver do dispositivo para este dispositivo."
-       IDS_DEV_OUT_OF_MEMORY "O driver para este dispositivo pode estar danificado, ou seu sistema com pouca memória ou insuficiência de outros recursos."
+    IDS_DEV_DEVLOADER_FAILED2 "O(s) carregadore(es) do dispositivo $1 não pôde/puderam carregar o driver do dispositivo para este dispositivo."
+    IDS_DEV_OUT_OF_MEMORY "O driver para este dispositivo pode estar danificado, ou seu sistema com pouca memória ou insuficiência de outros recursos."
     IDS_DEV_ENTRY_IS_WRONG_TYPE "Este dispositivo não está funcionando corretamente porque um de seus drivers pode estar danificado, ou seu registro pode estar danificado."
     IDS_DEV_LACKED_ARBITRATOR "O driver para este dispositivo requisitou um recurso que o ReactOS não sabe como manusear."
     IDS_DEV_BOOT_CONFIG_CONFLICT "Outro dispositivo está usando os recursos que este dispositivo necessita."
@@ -91,6 +91,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS não pôde alterar as configurações para este dispositivo."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -168,3 +196,34 @@ BEGIN
     LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
+
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index d5bfb36..4e18c3a 100644 (file)
@@ -8,89 +8,117 @@ STRINGTABLE
 BEGIN
     IDS_NAME "Nume"
     IDS_TYPE "Tip"
-    IDS_MANUFACTURER "Producător: %1"
-    IDS_LOCATION "Locație: %1"
+    IDS_MANUFACTURER "Producator: %1"
+    IDS_LOCATION "Loca?ie: %1"
     IDS_STATUS "Stare dispozitiv: %1"
     IDS_UNKNOWN "Necunoscut"
-    IDS_LOCATIONSTR "Locație %1!u! (%2)"
+    IDS_LOCATIONSTR "Loca?ie %1!u! (%2)"
     IDS_DEVCODE " (Cod %1!u!)"
     IDS_DEVCODE2 " (Cod %2!u!)"
     IDS_ENABLEDEVICE "Folosire dispozitiv (activare)"
     IDS_DISABLEDEVICE "Nu folosi dispozitivul (dezactivare)"
     IDS_UNKNOWNDEVICE "Dispozitiv necunoscut"
-    IDS_NODRIVERLOADED "Nu există drivere instalate pentru acest dispozitiv."
+    IDS_NODRIVERLOADED "Nu exista drivere instalate pentru acest dispozitiv."
     IDS_DEVONPARENT "pe %1"
     IDS_TROUBLESHOOTDEV "&Depanare..."
     IDS_ENABLEDEV "A&ctivare"
     IDS_REINSTALLDRV "Re&instalare driver"
-    IDS_PROPERTIES "P&roprietăți"
+    IDS_PROPERTIES "P&roprieta?i"
     IDS_UPDATEDRV "A&ctualizare driver..."
     IDS_REBOOT "Repornire &computer..."
     IDS_NOTAVAILABLE "Indisponibil"
     IDS_NOTDIGITALLYSIGNED "Nesemnat digital"
-    IDS_NODRIVERS "Nu sunt necesare fișiere driver pentru acest dispozitiv sau nu a fost încărcat niciunul."
+    IDS_NODRIVERS "Nu sunt necesare fi?iere driver pentru acest dispozitiv sau nu a fost încarcat niciunul."
 END
 
 /* error messages, source: http://www.z123.org/techsupport/medm.htm */
 STRINGTABLE
 BEGIN
-    IDS_DEV_NO_PROBLEM "Acest dispozitiv funcționează bine."
+    IDS_DEV_NO_PROBLEM "Acest dispozitiv func?ioneaza bine."
     IDS_DEV_NOT_CONFIGURED "Acest dispozitiv nu e configurat corect."
-    IDS_DEV_DEVLOADER_FAILED "ReactOS  nu a putut încărca driverul deoarece computerul indică două tipuri de magistrale $1."
-    IDS_DEV_DEVLOADER_FAILED2 "Încărcătorul sau încărcătoarele pentru dispozitivul $1 nu au putut încărca driverul."
-    IDS_DEV_OUT_OF_MEMORY "Este posibil ca driverul să fie stricat sau sistemul dumneavoastră rulează pe puțină memorie."
-    IDS_DEV_ENTRY_IS_WRONG_TYPE "Acest dispozitiv nu funcționează bine deoarece cel puțin unul din driverele lui este stricat sau este avariat sistemul de registri."
-    IDS_DEV_LACKED_ARBITRATOR "Driverul acestui dispozitiv solicită un tip de resurse cu care ReactOS nu știe să lucreze."
-    IDS_DEV_BOOT_CONFIG_CONFLICT "Alt dispozitiv folosește deja resursele acestui dispozitiv."
+    IDS_DEV_DEVLOADER_FAILED "ReactOS  nu a putut încarca driverul deoarece computerul indica doua tipuri de magistrale $1."
+    IDS_DEV_DEVLOADER_FAILED2 "Încarcatorul sau încarcatoarele pentru dispozitivul $1 nu au putut încarca driverul."
+    IDS_DEV_OUT_OF_MEMORY "Este posibil ca driverul sa fie stricat sau sistemul dumneavoastra ruleaza pe pu?ina memorie."
+    IDS_DEV_ENTRY_IS_WRONG_TYPE "Acest dispozitiv nu func?ioneaza bine deoarece cel pu?in unul din driverele lui este stricat sau este avariat sistemul de registri."
+    IDS_DEV_LACKED_ARBITRATOR "Driverul acestui dispozitiv solicita un tip de resurse cu care ReactOS nu ?tie sa lucreze."
+    IDS_DEV_BOOT_CONFIG_CONFLICT "Alt dispozitiv folose?te deja resursele acestui dispozitiv."
     IDS_DEV_FAILED_FILTER "Driverele pentru acest dispozitiv trebuiesc reinstalate."
-    IDS_DEV_DEVLOADER_NOT_FOUND "Acest dispozitiv nu funcționează bine deoarece ReactOS nu poate deschide fișierul $1 care încarcă driverul."
-    IDS_DEV_DEVLOADER_NOT_FOUND2 "Acest dispozitiv nu funcționează bine deoare fișierul $1 care încarcă driverul este stricat."
-    IDS_DEV_DEVLOADER_NOT_FOUND3 "Defecțiune dispozitiv: Încercați să schimbați driverul. Dacă asta nu rezolvă problema, vedeți documentația driverului."
-    IDS_DEV_INVALID_DATA "Acest dispozitiv nu funcționează bine deoarece sistemul BIOS al computerului raportează resursele dispozitivului greșit."
-    IDS_DEV_INVALID_DATA2 "Acest dispozitiv nu funcționează bine deoarece sistemul BIOS al dispozitivului raportează resursele dispozitivului greșit. "
-    IDS_DEV_FAILED_START "Acest dispozitiv fie nu e prezent, fie nu funcționează bine, fie nu are toate driverele instalate."
-    IDS_DEV_LIAR "ReactOS s-a blocat când a încercat să pornească dispozitivul și astfel nu va mai încerca să îl pornească din nou."
-    IDS_DEV_NORMAL_CONFLICT "Acest dispozitiv nu are la dispoziție $1 resurse pentru folosiință."
-    IDS_DEV_NOT_VERIFIED "Acest dispozitiv fie nu e prezent, fie nu funcționează bine, fie nu are toate driverele instalate."
-    IDS_DEV_NEED_RESTART "Acest dispozitiv nu poate funcționa ."
+    IDS_DEV_DEVLOADER_NOT_FOUND "Acest dispozitiv nu func?ioneaza bine deoarece ReactOS nu poate deschide fi?ierul $1 care încarca driverul."
+    IDS_DEV_DEVLOADER_NOT_FOUND2 "Acest dispozitiv nu func?ioneaza bine deoare fi?ierul $1 care încarca driverul este stricat."
+    IDS_DEV_DEVLOADER_NOT_FOUND3 "Defec?iune dispozitiv: Încerca?i sa schimba?i driverul. Daca asta nu rezolva problema, vede?i documenta?ia driverului."
+    IDS_DEV_INVALID_DATA "Acest dispozitiv nu func?ioneaza bine deoarece sistemul BIOS al computerului raporteaza resursele dispozitivului gre?it."
+    IDS_DEV_INVALID_DATA2 "Acest dispozitiv nu func?ioneaza bine deoarece sistemul BIOS al dispozitivului raporteaza resursele dispozitivului gre?it. "
+    IDS_DEV_FAILED_START "Acest dispozitiv fie nu e prezent, fie nu func?ioneaza bine, fie nu are toate driverele instalate."
+    IDS_DEV_LIAR "ReactOS s-a blocat când a încercat sa porneasca dispozitivul ?i astfel nu va mai încerca sa îl porneasca din nou."
+    IDS_DEV_NORMAL_CONFLICT "Acest dispozitiv nu are la dispozi?ie $1 resurse pentru folosiin?a."
+    IDS_DEV_NOT_VERIFIED "Acest dispozitiv fie nu e prezent, fie nu func?ioneaza bine, fie nu are toate driverele instalate."
+    IDS_DEV_NEED_RESTART "Acest dispozitiv nu poate func?iona ."
     IDS_DEV_REENUMERATION "Acest dispoztiv produce un conflict de resurse."
-    IDS_DEV_PARTIAL_LOG_CONF "ReactOS nu a putut identifica toate resursele pe care acest dispozitiv le folosește."
-    IDS_DEV_UNKNOWN_RESOURCE "Fișierul de informații $1 spune acestui sub-dispozitiv să folosească o resursă pe care dispozitivul-părinte nu o are sau nu o recunoaște."
+    IDS_DEV_PARTIAL_LOG_CONF "ReactOS nu a putut identifica toate resursele pe care acest dispozitiv le folose?te."
+    IDS_DEV_UNKNOWN_RESOURCE "Fi?ierul de informa?ii $1 spune acestui sub-dispozitiv sa foloseasca o resursa pe care dispozitivul-parinte nu o are sau nu o recunoa?te."
     IDS_DEV_REINSTALL "Driverele pentru acest dispozitiv trebuiesc reinstalate."
-    IDS_DEV_REGISTRY "Se pare că registrii sunt avariați."
-    IDS_DEV_WILL_BE_REMOVED "ReactOS elimină în acest moment dispozitivul."
-    IDS_DEV_DISABLED "Acest dispozitiv nu e pornit încă."
+    IDS_DEV_REGISTRY "Se pare ca registrii sunt avaria?i."
+    IDS_DEV_WILL_BE_REMOVED "ReactOS elimina în acest moment dispozitivul."
+    IDS_DEV_DISABLED "Acest dispozitiv nu e pornit înca."
     IDS_DEV_DISABLED2 "Acest dispozitiv este dezactivat."
-    IDS_DEV_DEVLOADER_NOT_READY "Încărcătoarele pentru acest dispozitiv nu pot încărca driverele necesare."
-    IDS_DEV_DEVLOADER_NOT_READY2 "Acest adaptor pentru monitor funcționează bine."
-    IDS_DEV_DEVLOADER_NOT_READY3 "Încărcătoarele pentru acest dispozitiv nu pot încărca driverele necesare."
-    IDS_DEV_DEVICE_NOT_THERE "Acest dispozitiv fie nu e prezent, fie nu funcționează bine, fie nu are toate driverele instalate."
-    IDS_DEV_MOVED "ReactOS instalează în acest moment acest dispozitiv."
-    IDS_DEV_TOO_EARLY "ReactOS instalează în acest moment acest dispozitiv."
+    IDS_DEV_DEVLOADER_NOT_READY "Încarcatoarele pentru acest dispozitiv nu pot încarca driverele necesare."
+    IDS_DEV_DEVLOADER_NOT_READY2 "Acest adaptor pentru monitor func?ioneaza bine."
+    IDS_DEV_DEVLOADER_NOT_READY3 "Încarcatoarele pentru acest dispozitiv nu pot încarca driverele necesare."
+    IDS_DEV_DEVICE_NOT_THERE "Acest dispozitiv fie nu e prezent, fie nu func?ioneaza bine, fie nu are toate driverele instalate."
+    IDS_DEV_MOVED "ReactOS instaleaza în acest moment acest dispozitiv."
+    IDS_DEV_TOO_EARLY "ReactOS instaleaza în acest moment acest dispozitiv."
     IDS_DEV_NO_VALID_LOG_CONF "ReactOS nu poate specifica resoursele pentru acest dispozitiv."
     IDS_DEV_FAILED_INSTALL "Driverele pentru acest dispozitiv nu sunt instalate."
-    IDS_DEV_HARDWARE_DISABLED "Acest dispozitiv este dezactivat deoarece sistemul BIOS al acestuia nu îi rezervă nicio resursă."
-    IDS_DEV_CANT_SHARE_IRQ "Acest dispozitiv folosește o resursă Interrupt Request - Cerere de Întrerupere (IRQ) care este folosită deja de alt dispozitiv și nu poate fi folosită în comun.\nTrebuie să schimbați setările care intră în conflict sau să eliminați driverul în mod real care produce conflictul."
-    IDS_DEV_FAILED_ADD "Acest dispozitiv nu funcționează bine deoarcere $1 nu funcționează corect."
-    IDS_DEV_DISABLED_SERVICE "ReactOS nu poate instala driverele pentru acest dispozitiv deoarece nu poate accesa locația unde sunt stocate fișierele de instalare."
-    IDS_DEV_TRANSLATION_FAILED "Acest dispozitiv nu răspunde la comenzile driverului."
-    IDS_DEV_NO_SOFTCONFIG "ReactOS nu poate determina setările acestui dispozitiv. Consultați documentația care a venit cu acesta și folosiți fila Resurse pentru a seta configurația."
-    IDS_DEV_BIOS_TABLE "Computerul dumneavoastră nu conține componentele (fizice sau virtuale) necesare pentru a configura și a lucra cu acest dispozitiv. \nPentru a folosi acest dispozitiv, contactați producătorul computerului pentru o actualizare a sistemului BIOS și a firmware-ului."
-    IDS_DEV_IRQ_TRANSLATION_FAILED "Acest dispozitiv a solicitat o întrerupere PCI pe când el este configurat pentru întreruperi ISA (sau viceversa). \nVă rugăm folosiți programul de configurare sistem pentru a configura întreruperile."
-    IDS_DEV_FAILED_DRIVER_ENTRY "ReactOS nu poate inițializa driverul pentru acest dispozitiv."
-    IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD "ReactOS nu poate încărca driverul pentru acest dispozitiv deoarece acesta este deja încărcat în memorie."
-    IDS_DEV_DRIVER_FAILED_LOAD "ReactOS nu poate încărca driverul pentru acest dispozitiv. Este posibil ca acesta să fie stricat sau să lipsească."
+    IDS_DEV_HARDWARE_DISABLED "Acest dispozitiv este dezactivat deoarece sistemul BIOS al acestuia nu îi rezerva nicio resursa."
+    IDS_DEV_CANT_SHARE_IRQ "Acest dispozitiv folose?te o resursa Interrupt Request - Cerere de Întrerupere (IRQ) care este folosita deja de alt dispozitiv ?i nu poate fi folosita în comun.\nTrebuie sa schimba?i setarile care intra în conflict sau sa elimina?i driverul în mod real care produce conflictul."
+    IDS_DEV_FAILED_ADD "Acest dispozitiv nu func?ioneaza bine deoarcere $1 nu func?ioneaza corect."
+    IDS_DEV_DISABLED_SERVICE "ReactOS nu poate instala driverele pentru acest dispozitiv deoarece nu poate accesa loca?ia unde sunt stocate fi?ierele de instalare."
+    IDS_DEV_TRANSLATION_FAILED "Acest dispozitiv nu raspunde la comenzile driverului."
+    IDS_DEV_NO_SOFTCONFIG "ReactOS nu poate determina setarile acestui dispozitiv. Consulta?i documenta?ia care a venit cu acesta ?i folosi?i fila Resurse pentru a seta configura?ia."
+    IDS_DEV_BIOS_TABLE "Computerul dumneavoastra nu con?ine componentele (fizice sau virtuale) necesare pentru a configura ?i a lucra cu acest dispozitiv. \nPentru a folosi acest dispozitiv, contacta?i producatorul computerului pentru o actualizare a sistemului BIOS ?i a firmware-ului."
+    IDS_DEV_IRQ_TRANSLATION_FAILED "Acest dispozitiv a solicitat o întrerupere PCI pe când el este configurat pentru întreruperi ISA (sau viceversa). \nVa rugam folosi?i programul de configurare sistem pentru a configura întreruperile."
+    IDS_DEV_FAILED_DRIVER_ENTRY "ReactOS nu poate ini?ializa driverul pentru acest dispozitiv."
+    IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD "ReactOS nu poate încarca driverul pentru acest dispozitiv deoarece acesta este deja încarcat în memorie."
+    IDS_DEV_DRIVER_FAILED_LOAD "ReactOS nu poate încarca driverul pentru acest dispozitiv. Este posibil ca acesta sa fie stricat sau sa lipseasca."
     IDS_DEV_DRIVER_SERVICE_KEY_INVALID "ReactOS nu poate accesa dispozitivul deoarece cheile din registri pentru acest dispozitiv deoarece acestea lipsesc sau nu sunt corect înregistrate."
-    IDS_DEV_LEGACY_SERVICE_NO_DEVICES "ReactOS a încărcat cu succes driverul pentru acest dispozitiv dar nu găsește dispozitivul."
-    IDS_DEV_DUPLICATE_DEVICE "ReactOS nu poate încărca driverul deoarece există un dispozitiv dublură care deja funcționează."
+    IDS_DEV_LEGACY_SERVICE_NO_DEVICES "ReactOS a încarcat cu succes driverul pentru acest dispozitiv dar nu gase?te dispozitivul."
+    IDS_DEV_DUPLICATE_DEVICE "ReactOS nu poate încarca driverul deoarece exista un dispozitiv dublura care deja func?ioneaza."
     IDS_DEV_FAILED_POST_START "ReactOS a oprit dispozitivul deoarece acesta a indicat probleme."
-    IDS_DEV_HALTED "O aplicație sau un serviciu a oprit acest dispozitiv."
+    IDS_DEV_HALTED "O aplica?ie sau un serviciu a oprit acest dispozitiv."
     IDS_DEV_PHANTOM "Acest dispozitiv nu este conectat la computer."
     IDS_DEV_SYSTEM_SHUTDOWN "ReactOS nu poate accesa dispozitivul deoarece sistemul de operare este în curs de închidere."
-    IDS_DEV_HELD_FOR_EJECT "ReactOS nu poate folosi acest dispozitiv deoarece acesta a fost pregătit pentru eliminarea în siguranță dar încă nu a fost deconectat."
-    IDS_DEV_DRIVER_BLOCKED "Software-ul acestui dispozitiv a fost oprit deoarece se cunoaște că acesta întâmpină probleme pe ReactOS. Contactați vânzătorul driverului pentru unul nou."
+    IDS_DEV_HELD_FOR_EJECT "ReactOS nu poate folosi acest dispozitiv deoarece acesta a fost pregatit pentru eliminarea în siguran?a dar înca nu a fost deconectat."
+    IDS_DEV_DRIVER_BLOCKED "Software-ul acestui dispozitiv a fost oprit deoarece se cunoa?te ca acesta întâmpina probleme pe ReactOS. Contacta?i vânzatorul driverului pentru unul nou."
     IDS_DEV_REGISTRY_TOO_LARGE "ReactOS nu poate porni acest dispozitiv deoarece hive-ul de sistem este prea mare."
-    IDS_DEV_SETPROPERTIES_FAILED "ReactOS nu a putut schimba setările acestui dispozitiv."
+    IDS_DEV_SETPROPERTIES_FAILED "ReactOS nu a putut schimba setarile acestui dispozitiv."
+END
+
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
 END
 
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
@@ -101,13 +129,13 @@ BEGIN
     CONTROL         "",IDC_LV_DEVICES,"SysListView32",LVS_REPORT |
                     LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
                     LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,16,196,50
-    GROUPBOX        "Proprietăți dispozitiv",IDC_PROPERTIESGROUP,7,76,196,105
+    GROUPBOX        "Proprieta?i dispozitiv",IDC_PROPERTIESGROUP,7,76,196,105
     LTEXT           "",IDC_MANUFACTURER,14,88,183,10,SS_ENDELLIPSIS
     LTEXT           "",IDC_LOCATION,14,100,183,10,SS_ENDELLIPSIS
     LTEXT           "",IDC_STATUS,14,112,183,30
     PUSHBUTTON      "&Depanare...",IDC_TROUBLESHOOT,85,140,54,14,
                     BS_PUSHBUTTON | WS_CHILD | WS_DISABLED | WS_TABSTOP
-    PUSHBUTTON      "P&roprietăți",IDC_PROPERTIES,146,140,50,14
+    PUSHBUTTON      "P&roprieta?i",IDC_PROPERTIES,146,140,50,14
 END
 
 IDD_DEVICEGENERAL DIALOGEX DISCARDABLE  0, 0, 252, 218
@@ -119,9 +147,9 @@ BEGIN
      LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
      LTEXT "Tip dispozitiv:", -1, 37, 39, 60, 8, SS_NOPREFIX
      EDITTEXT IDC_DEVTYPE, 100, 39, 146, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
-     LTEXT "Producător:", -1, 37, 53, 60, 8, SS_NOPREFIX
+     LTEXT "Producator:", -1, 37, 53, 60, 8, SS_NOPREFIX
      EDITTEXT IDC_DEVMANUFACTURER, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
-     LTEXT "Locație:", -1, 37, 67, 60, 8, SS_NOPREFIX
+     LTEXT "Loca?ie:", -1, 37, 67, 60, 8, SS_NOPREFIX
      EDITTEXT IDC_DEVLOCATION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
      GROUPBOX "Stare dispozitiv", IDC_DEVSTATUSGROUP, 7, 83, 238, 100
      EDITTEXT IDC_DEVSTATUS, 14, 96, 224, 61, NOT WS_TABSTOP | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
@@ -139,30 +167,30 @@ BEGIN
      LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
      LTEXT "Furnizor driver:", -1, 37, 39, 60, 8, SS_NOPREFIX
      EDITTEXT IDC_DRVPROVIDER, 100, 39, 146, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
-     LTEXT "Dată driver:", -1, 37, 53, 60, 8, SS_NOPREFIX
+     LTEXT "Data driver:", -1, 37, 53, 60, 8, SS_NOPREFIX
      EDITTEXT IDC_DRVDATE, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
      LTEXT "Versiune driver:", -1, 37, 67, 60, 8, SS_NOPREFIX
      EDITTEXT IDC_DRVVERSION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
      LTEXT "Semnatar digital:", -1, 37, 81, 60, 8, SS_NOPREFIX
      EDITTEXT IDC_DIGITALSIGNER, 100, 81, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
      PUSHBUTTON "&Detalii...", IDC_DRIVERDETAILS, 7, 106, 70, 15
-     LTEXT "Pentru a vedea detalii despre fișierele driver.", -1, 91, 110, 154, 17, SS_NOPREFIX
+     LTEXT "Pentru a vedea detalii despre fi?ierele driver.", -1, 91, 110, 154, 17, SS_NOPREFIX
 END
 
 IDD_DRIVERDETAILS DIALOGEX DISCARDABLE  0, 0, 224, 250
 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
-CAPTION "Detalii fișiere driver"
+CAPTION "Detalii fi?iere driver"
 FONT 8, "MS Shell Dlg"
 BEGIN
     ICON "", IDC_DEVICON, 7, 7, 20, 20
     LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
-    LTEXT "&Fișiere driver:", -1, 7, 36, 204, 8
+    LTEXT "&Fi?iere driver:", -1, 7, 36, 204, 8
     CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER |
             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
     LTEXT "Furnizor:", -1, 14, 134, 50, 8
     LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
-    LTEXT "Versiune fișier:", -1, 14, 150, 50, 8
+    LTEXT "Versiune fi?ier:", -1, 14, 150, 50, 8
     LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
     LTEXT "Drept de autor:", -1, 14, 166, 50, 8
     LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
@@ -171,4 +199,35 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
 #pragma code_page(default)
index 1b1861c..9a41793 100644 (file)
@@ -38,7 +38,7 @@ BEGIN
     IDS_DEV_ENTRY_IS_WRONG_TYPE "This device is not working properly because one of its drivers may be bad, or your registry may be bad."
     IDS_DEV_LACKED_ARBITRATOR "The driver for this device requested a resource that ReactOS does not know how to handle."
     IDS_DEV_BOOT_CONFIG_CONFLICT "Another device is using the resources this device needs."
-    IDS_DEV_FAILED_FILTER "The drivers for this device need to be reinstalled."
+    IDS_DEV_FAILED_FILTER "Äðàéâåðû äëÿ ýòîãî óñòðîéñòâà äîëæíû áûòü ïåðåóñòàíîâëåíû."
     IDS_DEV_DEVLOADER_NOT_FOUND "This device is not working properly because ReactOS cannot load the file $1 that loads the drivers for the device."
     IDS_DEV_DEVLOADER_NOT_FOUND2 "This device is not working properly because the file $1 that loads the drivers for this device is bad."
     IDS_DEV_DEVLOADER_NOT_FOUND3 "Device failure: Try changing the driver for this device. If that doesn\'t work, see your hardware documentation."
@@ -50,20 +50,20 @@ BEGIN
     IDS_DEV_NOT_VERIFIED "Äàííîå óñòðîéñòâî ÿâëÿåòñÿ íåèçâåñòíûì, ðàáîòàåò íåêîððåêòíî èëè íå èìååò óñòàíîâëåííûõ äðàéâåðîâ."
     IDS_DEV_NEED_RESTART "Äàííîå óñòðîéñòâî íå ñìîæåò êîððåêòíî ðàáîòàòü äî âûïîëíåíèÿ ïåðåçàãðóçêè."
     IDS_DEV_REENUMERATION "Äàííîå óñòðîéñòâî âûçâàëî êîíôëèêò ðåñóðñîâ."
-    IDS_DEV_PARTIAL_LOG_CONF "ReactOS could not identify all the resources this device uses."
+    IDS_DEV_PARTIAL_LOG_CONF "ReactOS íå ìîæåò èäåíòèôèöèðîâàòü ðåñóðñû, èñïîëüçóåìûå óñòðîéñòâîì."
     IDS_DEV_UNKNOWN_RESOURCE "The driver information file $1 is telling this child device to use a resource that the parent device does not have or recognize."
     IDS_DEV_REINSTALL "Äðàéâåðû ýòîãî óñòðîéñòâà äîëæíû áûòü ïåðåóñòàíîâëåíû."
     IDS_DEV_REGISTRY "Âàø ñèñòåìíûé ðååñòð ïîâðåæäåí."
     IDS_DEV_WILL_BE_REMOVED "ReactOS óäàëèò ýòî óñòðîéñòâî."
     IDS_DEV_DISABLED "Ýòî óñòðîéñòâî íå çàïóùåíî."
     IDS_DEV_DISABLED2 "Ýòî óñòðîéñòâî îòêëþ÷åíî."
-    IDS_DEV_DEVLOADER_NOT_READY "The loaders for this device cannot load the required drivers."
+    IDS_DEV_DEVLOADER_NOT_READY "Çàãðóç÷èê ýòîãî óñòðîéñòâà íå ìîæåò çàãðóçèòü íåîáõîäèìûå äðàéâåðû."
     IDS_DEV_DEVLOADER_NOT_READY2 "Ýòîò àäàïòåð ýêðàíà ôóíêöèîíèðóåò êîððåêòíî."
-    IDS_DEV_DEVLOADER_NOT_READY3 "The loaders for this device cannot load the required drivers."
-    IDS_DEV_DEVICE_NOT_THERE "This device is either not present, not working properly, or does not have all the drivers installed."
-    IDS_DEV_MOVED "ReactOS is in the process of setting up this device."
-    IDS_DEV_TOO_EARLY "ReactOS is in the process of setting up this device."
-    IDS_DEV_NO_VALID_LOG_CONF "ReactOS can\'t specify the resources for this device."
+    IDS_DEV_DEVLOADER_NOT_READY3 "Çàãðóç÷èê ýòîãî óñòðîéñòâà íå ìîæåò çàãðóçèòü íåîáõîäèìûå äðàéâåðû."
+    IDS_DEV_DEVICE_NOT_THERE "Óñòðîéñòâî îòñóòñòâóåò, ðàáîòàåò íåïðàâèëüíî èëè äëÿ íåãî óñòàíîâëåíû íå âñå äðàéâåðû."
+    IDS_DEV_MOVED "ReactOS íàñòðàèâàåò ýòî óñòðîéñòâî."
+    IDS_DEV_TOO_EARLY "ReactOS íàñòðàèâàåò ýòî óñòðîéñòâî."
+    IDS_DEV_NO_VALID_LOG_CONF "ReactOS íå ìîæåò óêàçàòü ðåñóðñû äëÿ ýòîãî óñòðîéñòâà."
     IDS_DEV_FAILED_INSTALL "Äðàéâåðû äëÿ ýòîãî óñòðîéñòâà íå óñòàíîâëåíû."
     IDS_DEV_HARDWARE_DISABLED "This device is disabled because the BIOS for the device did not give it any resources."
     IDS_DEV_CANT_SHARE_IRQ "This device is using an Interrupt Request (IRQ) resource that is in use by another device and cannot be shared.\nYou must change the conflicting setting or remove the real-mode driver causing the conflict."
@@ -73,7 +73,7 @@ BEGIN
     IDS_DEV_NO_SOFTCONFIG "ReactOS cannot determine the settings for this device. Consult the documentation that came with this device and use the Resource tab to set the configuration."
     IDS_DEV_BIOS_TABLE "Your computer\'s system firmware does not include enough information to properly configure and use this device. \nTo use this device, contact your computer manufacturer to obtain a firmware or BIOS update."
     IDS_DEV_IRQ_TRANSLATION_FAILED "This device is requesting a PCI interrupt but is configured for an ISA interrupt (or vice versa). \nPlease use the computer\'s system setup program to reconfigure the interrupt for this device."
-    IDS_DEV_FAILED_DRIVER_ENTRY "ReactOS cannot initialize the device driver for this hardware."
+    IDS_DEV_FAILED_DRIVER_ENTRY "ReactOS íå ìîæåò èíèöèàëèçèðîâàòü äðàéâåð óñòðîéñòâà äëÿ äàííîãî îáîðóäîâàíèÿ."
     IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD "ReactOS cannot load the device driver for this hardware because a previous instance of the device driver is still in memory."
     IDS_DEV_DRIVER_FAILED_LOAD "ReactOS cannot load the device driver for this hardware. The driver may be corrupted or missing."
     IDS_DEV_DRIVER_SERVICE_KEY_INVALID "ReactOS cannot access this hardware because its service key information in the registry is missing or recorded incorrectly."
@@ -81,7 +81,7 @@ BEGIN
     IDS_DEV_DUPLICATE_DEVICE "ReactOS cannot load the device driver for this hardware because there is a duplicate device already running in the system."
     IDS_DEV_FAILED_POST_START "ReactOS îñòàíîâèë äàííîå óñòðîéñòâî, òàê êàê â åãî ðàáîòå îáíàðóæèëèñü ïðîáëåìû."
     IDS_DEV_HALTED "Ïðèëîæåíèå èëè ñëóæáà îòêëþ÷èëè äàííîå óñòðîéñòâî."
-    IDS_DEV_PHANTOM "Currently, this hardware device is not connected to the computer."
+    IDS_DEV_PHANTOM " íàñòîÿùåå âðåìÿ äàííîå óñòðîéñòâî íå ïîäêëþ÷åíî ê êîìïüþòåðó."
     IDS_DEV_SYSTEM_SHUTDOWN "ReactOS cannot gain access to this hardware device because the operating system is in the process of shutting down."
     IDS_DEV_HELD_FOR_EJECT "ReactOS cannot use this hardware device because it has been prepared for safe removal, but it has not been removed from the computer"
     IDS_DEV_DRIVER_BLOCKED "The software for this device has been blocked from starting because it is known to have problems with ReactOS. Contact the hardware vendor for a new driver."
@@ -89,6 +89,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS wasn\'t able to change the settings of this device."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Êîä ýêçåìïëÿðà óñòðîéñòâà"
+    IDS_PROP_HARDWAREIDS "Êîäû (ID) îáîðóäîâàíèÿ"
+    IDS_PROP_COMPATIBLEIDS "Ñîâìåñòèìûå êîäû (ID)"
+    IDS_PROP_MATCHINGDEVICEID "Ñîîòâåòñòâóþùèé êîä (ID) óñòðîéñòâà"
+    IDS_PROP_SERVICE "Ñëóæáà"
+    IDS_PROP_ENUMERATOR "Ïåðå÷èñëèòåëü"
+    IDS_PROP_CAPABILITIES "Õàðàêòåðèñòèêè"
+    IDS_PROP_DEVNODEFLAGS "Ôëàãè Devnode"
+    IDS_PROP_CONFIGFLAGS "Ôëàãè Config"
+    IDS_PROP_CSCONFIGFLAGS "Ôëàãè CSConfig"
+    IDS_PROP_EJECTIONRELATIONS "Çàâèñèìîñòè èçâëå÷åíèÿ"
+    IDS_PROP_REMOVALRELATIONS "Çàâèñèìîñòè óäàëåíèÿ"
+    IDS_PROP_BUSRELATIONS "Çàâèñèìîñòè øèíû"
+    IDS_PROP_DEVUPPERFILTERS "Âåðõíèå ôèëüòðû óñòðîéñòâà"
+    IDS_PROP_DEVLOWERFILTERS "Íèæíèå ôèëüòðû óñòðîéñòâà"
+    IDS_PROP_CLASSUPPERFILTERS "Âåðõíèå ôèëüòðû êëàññà"
+    IDS_PROP_CLASSLOWERFILTERS "Íèæíèå ôèëüòðû êëàññà"
+    IDS_PROP_CLASSINSTALLER "Óñòàíîâùèê êëàññîâ"
+    IDS_PROP_CLASSCOINSTALLER "Ñîóñòàíîâùèêè êëàññîâ"
+    IDS_PROP_DEVICECOINSTALLER "Ñîóñòàíîâùèêè óñòðîéñòâ"
+    IDS_PROP_FIRMWAREREVISION "Ìèêðîïðîãðàììà"
+    IDS_PROP_CURRENTPOWERSTATE "Òåêóøåå ñîñòîÿíèå ýëåêòðîïèòàíèÿ"
+    IDS_PROP_POWERCAPABILITIES "Âîçìîæíîñòè ýëåêòðîïèòàíèÿ"
+    IDS_PROP_POWERSTATEMAPPINGS "Ñîïîñòàâëåíèÿ ýíåðãîñáåðåæåíèÿ"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -167,4 +195,34 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Ñâåäåíèÿ"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
+
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Ðåñóðñû"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Ïèòàíèå"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
 
index 4d3da98..7be94ac 100644 (file)
@@ -94,6 +94,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS wasn\'t able to change the settings of this device."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -172,4 +200,33 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
 
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index 42f69e1..050e520 100644 (file)
@@ -97,6 +97,34 @@ BEGIN
     IDS_DEV_SETPROPERTIES_FAILED "ReactOS wasn\'t able to change the settings of this device."
 END
 
+STRINGTABLE
+BEGIN
+    IDS_PROP_DEVICEID "Device Instance ID"
+    IDS_PROP_HARDWAREIDS "Hardware IDs"
+    IDS_PROP_COMPATIBLEIDS "Compatible IDs"
+    IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
+    IDS_PROP_SERVICE "Service"
+    IDS_PROP_ENUMERATOR "Enumerator"
+    IDS_PROP_CAPABILITIES "Capabilities"
+    IDS_PROP_DEVNODEFLAGS "Devnode Flags"
+    IDS_PROP_CONFIGFLAGS "Config Flags"
+    IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
+    IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
+    IDS_PROP_REMOVALRELATIONS "Removal Relations"
+    IDS_PROP_BUSRELATIONS "Bus Relations"
+    IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
+    IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
+    IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
+    IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
+    IDS_PROP_CLASSINSTALLER "Class Installers"
+    IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
+    IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
+    IDS_PROP_FIRMWAREREVISION "Firmware Revision"
+    IDS_PROP_CURRENTPOWERSTATE "Current Power State"
+    IDS_PROP_POWERCAPABILITIES "Power Capabilities"
+    IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+END
+
 IDD_HARDWARE DIALOGEX DISCARDABLE  0, 0, 300, 400
 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION | DS_SHELLFONT
 FONT 8, "MS Shell Dlg"
@@ -175,4 +203,33 @@ BEGIN
     PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
 END
 
+IDD_DEVICEDETAILS DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+    COMBOBOX IDC_DETAILSPROPNAME, 7, 36, 238, 165, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL  "",IDC_DETAILSPROPVALUE,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER |
+             LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS |
+             LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 58, 238, 155
+END
 
+IDD_DEVICERESOURCES DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Resources"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
+
+IDD_DEVICEPOWER DIALOGEX DISCARDABLE  0, 0, 252, 218
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Power"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    ICON "", IDC_DEVICON, 7, 7, 20, 20
+    LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+END
index 1c31bcd..4c038b2 100644 (file)
@@ -8,6 +8,8 @@
 #define IDD_DEVICEDRIVER       102
 #define IDD_DEVICERESOURCES    103
 #define IDD_DRIVERDETAILS      104
+#define IDD_DEVICEDETAILS      105
+#define IDD_DEVICEPOWER                106
 
 #define IDC_DEVICON            0x57B
 #define IDC_DEVNAME            0x57C
@@ -36,6 +38,8 @@
 #define IDC_FILEPROVIDER       0x593
 #define IDC_FILEVERSION                0x594
 #define IDC_FILECOPYRIGHT      0x595
+#define IDC_DETAILSPROPNAME    0x596
+#define IDC_DETAILSPROPVALUE   0x597
 
 #define IDS_NAME               0x100
 #define IDS_TYPE               0x101
 #define IDS_DEV_REGISTRY_TOO_LARGE             0x237
 #define IDS_DEV_SETPROPERTIES_FAILED           0x238
 
+#define IDS_PROP_DEVICEID                      0x300
+#define IDS_PROP_HARDWAREIDS                   0x301
+#define IDS_PROP_COMPATIBLEIDS                 0x302
+#define IDS_PROP_MATCHINGDEVICEID              0x303
+#define IDS_PROP_SERVICE                       0x304
+#define IDS_PROP_ENUMERATOR                    0x305
+#define IDS_PROP_CAPABILITIES                  0x306
+#define IDS_PROP_DEVNODEFLAGS                  0x307
+#define IDS_PROP_CONFIGFLAGS                   0x308
+#define IDS_PROP_CSCONFIGFLAGS                 0x309
+#define IDS_PROP_EJECTIONRELATIONS             0x30A
+#define IDS_PROP_REMOVALRELATIONS              0x30B
+#define IDS_PROP_BUSRELATIONS                  0x30C
+#define IDS_PROP_DEVUPPERFILTERS               0x30D
+#define IDS_PROP_DEVLOWERFILTERS               0x30E
+#define IDS_PROP_CLASSUPPERFILTERS             0x30F
+#define IDS_PROP_CLASSLOWERFILTERS             0x310
+#define IDS_PROP_CLASSINSTALLER                        0x311
+#define IDS_PROP_CLASSCOINSTALLER              0x312
+#define IDS_PROP_DEVICECOINSTALLER             0x313
+#define IDS_PROP_FIRMWAREREVISION              0x314
+#define IDS_PROP_CURRENTPOWERSTATE             0x315
+#define IDS_PROP_POWERCAPABILITIES             0x316
+#define IDS_PROP_POWERSTATEMAPPINGS            0x317
+
 #endif /* __DEVMGR_RESOURCE_H */
 
 /* EOF */
index b1f8aea..b8a0906 100644 (file)
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-/* $Id$
- *
+/*
  * PROJECT:         ReactOS gdi32.dll
- * FILE:            lib/gdi32/misc/misc.c
+ * FILE:            dll/win32/gdi32/misc/misc.c
  * PURPOSE:         Miscellaneous functions
  * PROGRAMMER:      Thomas Weidenmueller <w3seek@reactos.com>
  * UPDATE HISTORY:
@@ -284,10 +283,46 @@ GdiAddGlsBounds(HDC hdc,LPRECT prc)
     return NtGdiSetBoundsRect(hdc, prc, 0x8000 |  DCB_ACCUMULATE ) ? TRUE : FALSE;
 }
 
+extern PGDIHANDLECACHE GdiHandleCache;
+
 HGDIOBJ
 FASTCALL
 hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr)
 {
-   return NULL;
+   int Number;
+   HANDLE Lock;
+   HGDIOBJ Handle = NULL;
+
+   Lock = InterlockedCompareExchangePointer( (PVOID*)&GdiHandleCache->ulLock,
+                                              NtCurrentTeb(),
+                                              NULL );
+   
+   if (Lock) return Handle;
+
+   Number = GdiHandleCache->ulNumHandles[Type];
+
+   if ( Number && Number <= CACHE_REGION_ENTRIES )
+   {
+      if ( Type == hctRegionHandle)
+      {
+         PRGN_ATTR pRgn_Attr;
+         HGDIOBJ *hPtr;
+         hPtr = GdiHandleCache->Handle + CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES;
+         Handle = hPtr[Number - 1];
+
+         if (GdiGetHandleUserData( Handle, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr))
+         {
+            if (pRgn_Attr->AttrFlags & ATTR_CACHED)
+            {
+               DPRINT("Get Handle! Count %d\n", GdiHandleCache->ulNumHandles[Type]);
+               pRgn_Attr->AttrFlags &= ~ATTR_CACHED;
+               hPtr[Number - 1] = NULL;
+               GdiHandleCache->ulNumHandles[Type]--;
+            }
+         }
+      }
+   }
+   (void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock);
+   return Handle;
 }
 
index 3fb2559..c0bd80c 100644 (file)
@@ -1,22 +1,37 @@
 #include "precomp.h"
 
+#define NDEBUG
+#include <debug.h>
+
 #define INRECT(r, x, y) \
       ( ( ((r).right >  x)) && \
       ( ((r).left <= x)) && \
       ( ((r).bottom >  y)) && \
       ( ((r).top <= y)) )
 
-static
+#define OVERLAPPING_RGN 0
+#define INVERTED_RGN 1
+#define SAME_RGN 2
+#define DIFF_RGN 3
+/*
+ From tests, there are four results based on normalized coordinates.
+ If the rects are overlapping and normalized, it's OVERLAPPING_RGN.
+ If the rects are overlapping in anyway or same in dimension and one is inverted,
+ it's INVERTED_RGN.
+ If the rects are same in dimension or NULL, it's SAME_RGN.
+ If the rects are overlapping and not normalized or displace in different areas,
+ it's DIFF_RGN.
+ */
 INT
 FASTCALL
-ComplexityFromRects( PRECT prc1, PRECT prc2)
+ComplexityFromRects( PRECTL prc1, PRECTL prc2)
 {
   if ( prc2->left >= prc1->left )
   {
      if ( ( prc1->right >= prc2->right) &&
           ( prc1->top <= prc2->top ) &&
-          ( prc1->bottom <= prc2->bottom ) )      
-        return SIMPLEREGION;
+          ( prc1->bottom >= prc2->bottom ) )      
+        return SAME_RGN;
 
      if ( prc2->left > prc1->left )
      {
@@ -24,7 +39,7 @@ ComplexityFromRects( PRECT prc1, PRECT prc2)
              ( prc1->right <= prc2->left ) ||
              ( prc1->top >= prc2->bottom ) ||
              ( prc1->bottom <= prc2->top ) )
-           return COMPLEXREGION;
+           return DIFF_RGN;
      }
   }
 
@@ -36,14 +51,13 @@ ComplexityFromRects( PRECT prc1, PRECT prc2)
           ( prc1->right <= prc2->left ) ||
           ( prc1->top >= prc2->bottom ) ||
           ( prc1->bottom <= prc2->top ) )
-        return COMPLEXREGION;
+        return DIFF_RGN;
   }
   else
   {
-    return NULLREGION;
+     return INVERTED_RGN;
   }
-
-  return ERROR;
+  return OVERLAPPING_RGN;
 }
 
 static
@@ -181,7 +195,7 @@ MirrorRgnDC(HDC hdc, HRGN hRgn, HRGN *phRgn)
 /* FUNCTIONS *****************************************************************/
 
 /*
- * @unimplemented
+ * @implemented
  */
 INT
 WINAPI
@@ -190,8 +204,192 @@ CombineRgn(HRGN  hDest,
            HRGN  hSrc2,
            INT  CombineMode)
 {
-    /* FIXME some part should be done in user mode */
-    return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+#if 0
+  PRGN_ATTR pRgn_Attr_Dest = NULL;
+  PRGN_ATTR pRgn_Attr_Src1 = NULL;
+  PRGN_ATTR pRgn_Attr_Src2 = NULL;
+  INT Complexity;
+  BOOL Ret;
+
+  Ret = GdiGetHandleUserData((HGDIOBJ) hDest, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr_Dest);
+  Ret = GdiGetHandleUserData((HGDIOBJ) hSrc1, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr_Src1);
+
+  if ( !Ret ||
+       !pRgn_Attr_Dest ||
+       !pRgn_Attr_Src1 ||
+        pRgn_Attr_Src1->Flags > SIMPLEREGION )
+#endif
+     return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+#if 0
+  /* Handle COPY and use only src1. */
+  if ( CombineMode == RGN_COPY )
+  {
+     switch (pRgn_Attr_Src1->Flags)
+     {
+        case NULLREGION:
+             Ret = SetRectRgn( hDest, 0, 0, 0, 0);
+             if (Ret)
+                return NULLREGION;
+             goto ERROR_Exit;
+
+        case SIMPLEREGION:
+             Ret = SetRectRgn( hDest,
+                               pRgn_Attr_Src1->Rect.left,
+                               pRgn_Attr_Src1->Rect.top,
+                               pRgn_Attr_Src1->Rect.right,
+                               pRgn_Attr_Src1->Rect.bottom );
+             if (Ret)
+                return SIMPLEREGION;
+             goto ERROR_Exit;
+
+        case COMPLEXREGION:
+        default:
+            return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+     }
+  }
+
+  Ret = GdiGetHandleUserData((HGDIOBJ) hSrc2, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr_Src2);
+  if ( !Ret ||
+       !pRgn_Attr_Src2 ||
+        pRgn_Attr_Src2->Flags > SIMPLEREGION )
+     return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+
+  /* All but AND. */
+  if ( CombineMode != RGN_AND)
+  {
+     if ( CombineMode <= RGN_AND)
+     {
+        /*
+           There might be some type of junk in the call, so go K.
+           If this becomes a problem, need to setup parameter check at the top.
+         */
+        DPRINT1("Might be junk! CombineMode %d\n",CombineMode);
+        return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+     }
+
+     if ( CombineMode > RGN_XOR) /* Handle DIFF. */
+     {
+        if ( CombineMode != RGN_DIFF)
+        {  /* Filter check! Well, must be junk?, so go K. */
+           DPRINT1("RGN_COPY was handled! CombineMode %d\n",CombineMode);
+           return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+        }
+
+        if ( pRgn_Attr_Src1->Flags != NULLREGION &&
+             pRgn_Attr_Src2->Flags != NULLREGION )
+        {
+           Complexity = ComplexityFromRects( &pRgn_Attr_Src1->Rect, &pRgn_Attr_Src2->Rect);
+           /* If same or overlapping and norm just go K. */
+           if (Complexity == SAME_RGN || Complexity == OVERLAPPING_RGN)
+              return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+        }
+        /* Just NULL rgn. */
+        if (SetRectRgn( hDest, 0, 0, 0, 0))
+           return NULLREGION;
+        goto ERROR_Exit;
+     }
+     else /* Handle OR or XOR. */
+     {
+        if ( pRgn_Attr_Src1->Flags == NULLREGION )
+        {
+           if ( pRgn_Attr_Src2->Flags != NULLREGION )
+           { /* Src1 null and not NULL, set from src2. */
+              Ret = SetRectRgn( hDest,
+                                pRgn_Attr_Src2->Rect.left,
+                                pRgn_Attr_Src2->Rect.top,
+                                pRgn_Attr_Src2->Rect.right,
+                                pRgn_Attr_Src2->Rect.bottom );
+              if (Ret)
+                 return SIMPLEREGION;
+              goto ERROR_Exit;
+           }
+           /* Both are NULL. */
+           if (SetRectRgn( hDest, 0, 0, 0, 0))
+              return NULLREGION;
+           goto ERROR_Exit;          
+        }
+        /* Src1 is not NULL. */
+        if ( pRgn_Attr_Src2->Flags != NULLREGION )
+        {
+           if ( CombineMode != RGN_OR ) /* Filter XOR, so go K. */
+              return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+
+           Complexity = ComplexityFromRects( &pRgn_Attr_Src1->Rect, &pRgn_Attr_Src2->Rect);
+           /* If inverted use Src2. */
+           if ( Complexity == INVERTED_RGN)
+           {
+              Ret = SetRectRgn( hDest,
+                                pRgn_Attr_Src2->Rect.left,
+                                pRgn_Attr_Src2->Rect.top,
+                                pRgn_Attr_Src2->Rect.right,
+                                pRgn_Attr_Src2->Rect.bottom );
+              if (Ret)
+                 return SIMPLEREGION;
+              goto ERROR_Exit;
+           }
+           /* Not NULL or overlapping or differentiated, go to K. */
+           if ( Complexity != SAME_RGN)
+              return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+           /* If same, just fall through. */
+        }
+     }
+     Ret = SetRectRgn( hDest,
+                       pRgn_Attr_Src1->Rect.left,
+                       pRgn_Attr_Src1->Rect.top,
+                       pRgn_Attr_Src1->Rect.right,
+                       pRgn_Attr_Src1->Rect.bottom );
+     if (Ret)
+        return SIMPLEREGION;
+     goto ERROR_Exit;
+  }
+
+  /* Handle AND.  */
+  if ( pRgn_Attr_Src1->Flags != NULLREGION &&
+       pRgn_Attr_Src2->Flags != NULLREGION )
+  {
+     Complexity = ComplexityFromRects( &pRgn_Attr_Src1->Rect, &pRgn_Attr_Src2->Rect);
+
+     if ( Complexity == DIFF_RGN ) /* Differentiated in anyway just NULL rgn. */
+     {
+        if (SetRectRgn( hDest, 0, 0, 0, 0))
+           return NULLREGION;
+        goto ERROR_Exit;
+     }
+
+     if ( Complexity != INVERTED_RGN) /* Not inverted and overlapping. */
+     {
+        if ( Complexity != SAME_RGN) /* Must be norm and overlapping. */
+           return NtGdiCombineRgn(hDest, hSrc1, hSrc2, CombineMode);
+        /* Merge from src2.  */
+        Ret = SetRectRgn( hDest,
+                          pRgn_Attr_Src2->Rect.left,
+                          pRgn_Attr_Src2->Rect.top,
+                          pRgn_Attr_Src2->Rect.right,
+                          pRgn_Attr_Src2->Rect.bottom );
+        if (Ret)
+           return SIMPLEREGION;
+        goto ERROR_Exit;
+     }
+     /* Inverted so merge from src1. */
+     Ret = SetRectRgn( hDest,
+                       pRgn_Attr_Src1->Rect.left,
+                       pRgn_Attr_Src1->Rect.top,
+                       pRgn_Attr_Src1->Rect.right,
+                       pRgn_Attr_Src1->Rect.bottom );
+     if (Ret)
+        return SIMPLEREGION;
+     goto ERROR_Exit;
+  }
+
+  /* It's all NULL! */
+  if (SetRectRgn( hDest, 0, 0, 0, 0))
+     return NULLREGION;
+
+ERROR_Exit:
+  /* Even on error the flag is set dirty and force server side to redraw. */
+  pRgn_Attr_Dest->AttrFlags |= ATTR_RGN_DIRTY;
+  return ERROR;
+#endif
 }
 
 /*
@@ -199,9 +397,13 @@ CombineRgn(HRGN  hDest,
  */
 HRGN
 WINAPI
-CreatePolygonRgn( const POINT * lppt, int cPoints, int fnPolyFillMode)
+CreateEllipticRgnIndirect(
+   const RECT *prc
+)
 {
-    return (HRGN) NtGdiPolyPolyDraw( ULongToHandle(fnPolyFillMode), (PPOINT) lppt, (PULONG) &cPoints, 1, GdiPolyPolyRgn);
+    /* Notes if prc is NULL it will crash on All Windows NT I checked 2000/XP/VISTA */
+    return NtGdiCreateEllipticRgn(prc->left, prc->top, prc->right, prc->bottom);
+
 }
 
 /*
@@ -209,12 +411,9 @@ CreatePolygonRgn( const POINT * lppt, int cPoints, int fnPolyFillMode)
  */
 HRGN
 WINAPI
-CreatePolyPolygonRgn( const POINT* lppt,
-                      const INT* lpPolyCounts,
-                      int nCount,
-                      int fnPolyFillMode)
+CreatePolygonRgn( const POINT * lppt, int cPoints, int fnPolyFillMode)
 {
-    return (HRGN) NtGdiPolyPolyDraw( ULongToHandle(fnPolyFillMode), (PPOINT) lppt, (PULONG) lpPolyCounts, (ULONG) nCount, GdiPolyPolyRgn );
+    return (HRGN) NtGdiPolyPolyDraw(ULongToHandle(fnPolyFillMode), (PPOINT) lppt, (PULONG) &cPoints, 1, GdiPolyPolyRgn);
 }
 
 /*
@@ -222,13 +421,12 @@ CreatePolyPolygonRgn( const POINT* lppt,
  */
 HRGN
 WINAPI
-CreateEllipticRgnIndirect(
-   const RECT *prc
-)
+CreatePolyPolygonRgn( const POINT* lppt,
+                      const INT* lpPolyCounts,
+                      int nCount,
+                      int fnPolyFillMode)
 {
-    /* Notes if prc is NULL it will crash on All Windows NT I checked 2000/XP/VISTA */
-    return NtGdiCreateEllipticRgn(prc->left, prc->top, prc->right, prc->bottom);
-
+    return (HRGN) NtGdiPolyPolyDraw(  (HDC) fnPolyFillMode, (PPOINT) lppt, (PULONG) lpPolyCounts, (ULONG) nCount, GdiPolyPolyRgn );
 }
 
 /*
@@ -240,34 +438,32 @@ CreateRectRgn(int x1, int y1, int x2, int y2)
 {
   PRGN_ATTR pRgn_Attr;
   HRGN hrgn;
-  int x, y;
+  int tmp;
 
  /* Normalize points */
-  x = x1;
+  tmp = x1;
   if ( x1 > x2 )
   {
     x1 = x2;
-    x2 = x;
+    x2 = tmp;
   }
 
-  y = y1;
+  tmp = y1;
   if ( y1 > y2 )
   {
     y1 = y2;
-    y2 = y;
+    y2 = tmp;
   }
-
-  if ( (UINT)x1 < 0x80000000 ||
-       (UINT)y1 < 0x80000000 ||
-       (UINT)x2 > 0x7FFFFFFF ||
-       (UINT)y2 > 0x7FFFFFFF )
+  /* Check outside 24 bit limit for universal set. Chp 9 Areas, pg 560.*/
+  if ( x1 < -(1<<27)  ||
+       y1 < -(1<<27)  ||
+       x2 > (1<<27)-1 ||
+       y2 > (1<<27)-1 )
   {
      SetLastError(ERROR_INVALID_PARAMETER);
      return NULL;
   }
-//// Remove when Brush/Pen/Rgn Attr is ready!
-  return NtGdiCreateRectRgn(x1,y1,x2,y2);
-////
+
   hrgn = hGetPEBHandle(hctRegionHandle, 0);
 
   if (!hrgn)
@@ -278,6 +474,7 @@ CreateRectRgn(int x1, int y1, int x2, int y2)
 
   if (!GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr))
   {
+     DPRINT1("No Attr for Region handle!!!\n");
      DeleteRegion(hrgn);
      return NULL;
   }
@@ -437,11 +634,13 @@ WINAPI
 GetRgnBox(HRGN hrgn,
           LPRECT prcOut)
 {
+#if 0
   PRGN_ATTR Rgn_Attr;
 
   if (!GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &Rgn_Attr))
+#endif
      return NtGdiGetRgnBox(hrgn, prcOut);
-
+#if 0
   if (Rgn_Attr->Flags == NULLREGION)
   {
      prcOut->left   = 0;
@@ -457,6 +656,7 @@ GetRgnBox(HRGN hrgn,
      RtlCopyMemory( prcOut, &Rgn_Attr->Rect, sizeof(RECT));
   }
   return Rgn_Attr->Flags;
+#endif
 }
 
 /*
@@ -547,12 +747,14 @@ OffsetRgn( HRGN hrgn,
           int nXOffset,
           int nYOffset)
 {
+#if 0
   PRGN_ATTR pRgn_Attr;
   int nLeftRect, nTopRect, nRightRect, nBottomRect;
 
   if (!GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr))
+#endif
      return NtGdiOffsetRgn(hrgn,nXOffset,nYOffset);
-
+#if 0
   if ( pRgn_Attr->Flags == NULLREGION)
      return pRgn_Attr->Flags;
 
@@ -573,29 +775,24 @@ OffsetRgn( HRGN hrgn,
         nRightRect  = nXOffset + nRightRect;
         nBottomRect = nYOffset + nBottomRect;
 
-        /* Mask and bit test. */
-        if ( ( nLeftRect   & 0xF8000000 &&
-              (nLeftRect   & 0xF8000000) != 0x80000000 ) ||
-             ( nTopRect    & 0xF8000000 &&
-              (nTopRect    & 0xF8000000) != 0x80000000 ) ||
-             ( nRightRect  & 0xF8000000 &&
-              (nRightRect  & 0xF8000000) != 0x80000000 ) ||
-             ( nBottomRect & 0xF8000000 &&
-              (nBottomRect & 0xF8000000) != 0x80000000 ) )
+        /* Check 28 bit limit. Chp 9 Areas, pg 560. */
+        if ( nLeftRect   < -(1<<27)  ||
+             nTopRect    < -(1<<27)  ||
+             nRightRect  > (1<<27)-1 ||
+             nBottomRect > (1<<27)-1  )
         {
            return ERROR;
         }
-        else
-        {
-           pRgn_Attr->Rect.top    = nTopRect;
-           pRgn_Attr->Rect.left   = nLeftRect;
-           pRgn_Attr->Rect.right  = nRightRect;
-           pRgn_Attr->Rect.bottom = nBottomRect;
-           pRgn_Attr->AttrFlags |= ATTR_RGN_DIRTY;
-        }
+
+        pRgn_Attr->Rect.top    = nTopRect;
+        pRgn_Attr->Rect.left   = nLeftRect;
+        pRgn_Attr->Rect.right  = nRightRect;
+        pRgn_Attr->Rect.bottom = nBottomRect;
+        pRgn_Attr->AttrFlags |= ATTR_RGN_DIRTY;
      }
   }
   return pRgn_Attr->Flags;
+#endif
 }
 
 /*
@@ -607,11 +804,13 @@ PtInRegion(IN HRGN hrgn,
            int x,
            int y)
 {
+#if 0
   PRGN_ATTR pRgn_Attr;
 
   if (!GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr))
+#endif
      return NtGdiPtInRegion(hrgn,x,y);
-
+#if 0
   if ( pRgn_Attr->Flags == NULLREGION)
      return FALSE;
 
@@ -619,6 +818,7 @@ PtInRegion(IN HRGN hrgn,
      return NtGdiPtInRegion(hrgn,x,y);
 
   return INRECT( pRgn_Attr->Rect, x, y);
+#endif
 }
 
 /*
@@ -629,12 +829,14 @@ WINAPI
 RectInRegion(HRGN hrgn,
              LPCRECT prcl)
 {
+#if 0
   PRGN_ATTR pRgn_Attr;
-  RECT rc;
+  RECTL rc;
 
   if (!GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr))
+#endif
      return NtGdiRectInRegion(hrgn, (LPRECT) prcl);
-
+#if 0
   if ( pRgn_Attr->Flags == NULLREGION)
      return FALSE;
 
@@ -643,31 +845,32 @@ RectInRegion(HRGN hrgn,
 
  /* swap the coordinates to make right >= left and bottom >= top */
  /* (region building rectangles are normalized the same way) */
-   if ( prcl->top > prcl->bottom)
-   {
-      rc.top = prcl->bottom;
-      rc.bottom = prcl->top;
-   }
-   else
-   {
-     rc.top = prcl->top;
-     rc.bottom = prcl->bottom;
-   }
-   if ( prcl->right < prcl->left)
-   {
-      rc.right = prcl->left;
-      rc.left = prcl->right;
-   }
-   else
-   {
-      rc.right = prcl->right;
-      rc.left = prcl->left;
-   }
+  if ( prcl->top > prcl->bottom)
+  {
+     rc.top = prcl->bottom;
+     rc.bottom = prcl->top;
+  }
+  else
+  {
+    rc.top = prcl->top;
+    rc.bottom = prcl->bottom;
+  }
+  if ( prcl->right < prcl->left)
+  {
+     rc.right = prcl->left;
+     rc.left = prcl->right;
+  }
+  else
+  {
+     rc.right = prcl->right;
+     rc.left = prcl->left;
+  }
 
-   if ( ComplexityFromRects( (PRECT)&pRgn_Attr->Rect, &rc) != COMPLEXREGION )
-      return TRUE;
+  if ( ComplexityFromRects( &pRgn_Attr->Rect, &rc) != DIFF_RGN )
+     return TRUE;
 
-   return FALSE;
+  return FALSE;
+#endif
 }
 
 /*
@@ -693,11 +896,13 @@ SetRectRgn(HRGN hrgn,
            int nRightRect,
            int nBottomRect)
 {
+#if 0
   PRGN_ATTR Rgn_Attr;
 
   if (!GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &Rgn_Attr))
+#endif
      return NtGdiSetRectRgn(hrgn, nLeftRect, nTopRect, nRightRect, nBottomRect);
-
+#if 0
   if ((nLeftRect == nRightRect) || (nTopRect == nBottomRect))
   {
      Rgn_Attr->AttrFlags |= ATTR_RGN_DIRTY;
@@ -726,6 +931,7 @@ SetRectRgn(HRGN hrgn,
   Rgn_Attr->AttrFlags |= ATTR_RGN_DIRTY ;
   Rgn_Attr->Flags = SIMPLEREGION;
   return TRUE;
+#endif
 }
 
 /*
@@ -752,4 +958,3 @@ SetMetaRgn( HDC hDC )
  return ERROR;
 }
 
-
index dfff66c..0ceeb6e 100644 (file)
@@ -213,6 +213,10 @@ struct GpImage{
     ImageType type;
     GUID format;
     UINT flags;
+    UINT palette_flags;
+    UINT palette_count;
+    UINT palette_size;
+    ARGB *palette_entries;
 };
 
 struct GpMetafile{
index df107e4..b1092b7 100644 (file)
@@ -1256,6 +1256,10 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete,
 
     (*metafile)->image.type = ImageTypeMetafile;
     memcpy(&(*metafile)->image.format, &ImageFormatWMF, sizeof(GUID));
+    (*metafile)->image.palette_flags = 0;
+    (*metafile)->image.palette_count = 0;
+    (*metafile)->image.palette_size = 0;
+    (*metafile)->image.palette_entries = NULL;
     (*metafile)->bounds.X = ((REAL) placeable->BoundingBox.Left) / ((REAL) placeable->Inch);
     (*metafile)->bounds.Y = ((REAL) placeable->BoundingBox.Right) / ((REAL) placeable->Inch);
     (*metafile)->bounds.Width = ((REAL) (placeable->BoundingBox.Right
@@ -4157,6 +4161,7 @@ GpStatus WINGDIPAPI GdipGetClip(GpGraphics *graphics, GpRegion *region)
     /* free everything except root node and header */
     delete_element(&region->node);
     memcpy(region, clip, sizeof(GpRegion));
+    GdipFree(clip);
 
     return Ok;
 }
index 5b70918..3dbe4da 100644 (file)
@@ -607,17 +607,73 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
 GpStatus WINGDIPAPI GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
     PixelFormat format, GpBitmap* srcBitmap, GpBitmap** dstBitmap)
 {
-    FIXME("(%f,%f,%f,%f,%i,%p,%p): stub\n", x, y, width, height, format, srcBitmap, dstBitmap);
+    BitmapData lockeddata_src, lockeddata_dst;
+    int i;
+    UINT row_size;
+    Rect area;
+    GpStatus stat;
 
-    return NotImplemented;
+    TRACE("(%f,%f,%f,%f,%i,%p,%p)\n", x, y, width, height, format, srcBitmap, dstBitmap);
+
+    if (!srcBitmap || !dstBitmap || srcBitmap->image.type != ImageTypeBitmap ||
+        x < 0 || y < 0 ||
+        x + width > srcBitmap->width || y + height > srcBitmap->height)
+    {
+        TRACE("<-- InvalidParameter\n");
+        return InvalidParameter;
+    }
+
+    if (format == PixelFormatDontCare)
+        format = srcBitmap->format;
+
+    area.X = roundr(x);
+    area.Y = roundr(y);
+    area.Width = roundr(width);
+    area.Height = roundr(height);
+
+    stat = GdipBitmapLockBits(srcBitmap, &area, ImageLockModeRead, format,
+        &lockeddata_src);
+    if (stat != Ok) return stat;
+
+    stat = GdipCreateBitmapFromScan0(lockeddata_src.Width, lockeddata_src.Height,
+        0, lockeddata_src.PixelFormat, NULL, dstBitmap);
+    if (stat == Ok)
+    {
+        stat = GdipBitmapLockBits(*dstBitmap, NULL, ImageLockModeWrite,
+            lockeddata_src.PixelFormat, &lockeddata_dst);
+
+        if (stat == Ok)
+        {
+            /* copy the image data */
+            row_size = (lockeddata_src.Width * PIXELFORMATBPP(lockeddata_src.PixelFormat) +7)/8;
+            for (i=0; i<lockeddata_src.Height; i++)
+                memcpy((BYTE*)lockeddata_dst.Scan0+lockeddata_dst.Stride*i,
+                       (BYTE*)lockeddata_src.Scan0+lockeddata_src.Stride*i,
+                       row_size);
+
+            GdipBitmapUnlockBits(*dstBitmap, &lockeddata_dst);
+        }
+
+        if (stat != Ok)
+            GdipDisposeImage((GpImage*)*dstBitmap);
+    }
+
+    GdipBitmapUnlockBits(srcBitmap, &lockeddata_src);
+
+    if (stat != Ok)
+    {
+        *dstBitmap = NULL;
+    }
+
+    return stat;
 }
 
 GpStatus WINGDIPAPI GdipCloneBitmapAreaI(INT x, INT y, INT width, INT height,
     PixelFormat format, GpBitmap* srcBitmap, GpBitmap** dstBitmap)
 {
-    FIXME("(%i,%i,%i,%i,%i,%p,%p): stub\n", x, y, width, height, format, srcBitmap, dstBitmap);
+    TRACE("(%i,%i,%i,%i,%i,%p,%p)\n", x, y, width, height, format, srcBitmap, dstBitmap);
 
-    return NotImplemented;
+    return GdipCloneBitmapArea(x, y, width, height, format, srcBitmap, dstBitmap);
 }
 
 GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage)
@@ -690,12 +746,14 @@ GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage)
                 GdipBitmapUnlockBits((GpBitmap*)*cloneImage, &lockeddata_dst);
             }
 
-            GdipBitmapUnlockBits(bitmap, &lockeddata_src);
+            if (stat != Ok)
+                GdipDisposeImage(*cloneImage);
         }
 
+        GdipBitmapUnlockBits(bitmap, &lockeddata_src);
+
         if (stat != Ok)
         {
-            GdipDisposeImage(*cloneImage);
             *cloneImage = NULL;
         }
         else memcpy(&(*cloneImage)->format, &image->format, sizeof(GUID));
@@ -1076,6 +1134,44 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap** bitmap)
     return Ok;
 }
 
+static void generate_halftone_palette(ARGB *entries, UINT count)
+{
+    static const BYTE halftone_values[6]={0x00,0x33,0x66,0x99,0xcc,0xff};
+    UINT i;
+
+    for (i=0; i<8 && i<count; i++)
+    {
+        entries[i] = 0xff000000;
+        if (i&1) entries[i] |= 0x800000;
+        if (i&2) entries[i] |= 0x8000;
+        if (i&4) entries[i] |= 0x80;
+    }
+
+    if (8 < count)
+        entries[i] = 0xffc0c0c0;
+
+    for (i=9; i<16 && i<count; i++)
+    {
+        entries[i] = 0xff000000;
+        if (i&1) entries[i] |= 0xff0000;
+        if (i&2) entries[i] |= 0xff00;
+        if (i&4) entries[i] |= 0xff;
+    }
+
+    for (i=16; i<40 && i<count; i++)
+    {
+        entries[i] = 0;
+    }
+
+    for (i=40; i<256 && i<count; i++)
+    {
+        entries[i] = 0xff000000;
+        entries[i] |= halftone_values[(i-40)%6];
+        entries[i] |= halftone_values[((i-40)/6)%6] << 8;
+        entries[i] |= halftone_values[((i-40)/36)%6] << 16;
+    }
+}
+
 GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
     PixelFormat format, BYTE* scan0, GpBitmap** bitmap)
 {
@@ -1143,6 +1239,10 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
     (*bitmap)->image.type = ImageTypeBitmap;
     memcpy(&(*bitmap)->image.format, &ImageFormatMemoryBMP, sizeof(GUID));
     (*bitmap)->image.flags = ImageFlagsNone;
+    (*bitmap)->image.palette_flags = 0;
+    (*bitmap)->image.palette_count = 0;
+    (*bitmap)->image.palette_size = 0;
+    (*bitmap)->image.palette_entries = NULL;
     (*bitmap)->width = width;
     (*bitmap)->height = height;
     (*bitmap)->format = format;
@@ -1152,6 +1252,36 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
     (*bitmap)->bits = bits;
     (*bitmap)->stride = dib_stride;
 
+    if (format == PixelFormat1bppIndexed ||
+        format == PixelFormat4bppIndexed ||
+        format == PixelFormat8bppIndexed)
+    {
+        (*bitmap)->image.palette_size = (*bitmap)->image.palette_count = 1 << PIXELFORMATBPP(format);
+        (*bitmap)->image.palette_entries = GdipAlloc(sizeof(ARGB) * ((*bitmap)->image.palette_size));
+
+        if (!(*bitmap)->image.palette_entries)
+        {
+            GdipDisposeImage(&(*bitmap)->image);
+            *bitmap = NULL;
+            return OutOfMemory;
+        }
+
+        if (format == PixelFormat1bppIndexed)
+        {
+            (*bitmap)->image.palette_flags = PaletteFlagsGrayScale;
+            (*bitmap)->image.palette_entries[0] = 0xff000000;
+            (*bitmap)->image.palette_entries[1] = 0xffffffff;
+        }
+        else
+        {
+            if (format == PixelFormat8bppIndexed)
+                (*bitmap)->image.palette_flags = PaletteFlagsHalftone;
+
+            generate_halftone_palette((*bitmap)->image.palette_entries,
+                (*bitmap)->image.palette_count);
+        }
+    }
+
     return Ok;
 }
 
@@ -1260,6 +1390,7 @@ GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
         GdipFree(((GpBitmap*)image)->bitmapbits);
         DeleteDC(((GpBitmap*)image)->hdc);
     }
+    GdipFree(image->palette_entries);
     GdipFree(image);
 
     return Ok;
@@ -1402,12 +1533,19 @@ GpStatus WINGDIPAPI GdipGetImageHorizontalResolution(GpImage *image, REAL *res)
 
 GpStatus WINGDIPAPI GdipGetImagePaletteSize(GpImage *image, INT *size)
 {
-    FIXME("%p %p\n", image, size);
+    TRACE("%p %p\n", image, size);
 
     if(!image || !size)
         return InvalidParameter;
 
-    return NotImplemented;
+    if (image->palette_count == 0)
+        *size = sizeof(ColorPalette);
+    else
+        *size = sizeof(UINT)*2 + sizeof(ARGB)*image->palette_count;
+
+    TRACE("<-- %u\n", *size);
+
+    return Ok;
 }
 
 /* FIXME: test this function for non-bitmap types */
@@ -1833,6 +1971,10 @@ static GpStatus decode_image_olepicture_metafile(IStream* stream, REFCLSID clsid
     (*image)->type = ImageTypeMetafile;
     (*image)->picture = pic;
     (*image)->flags   = ImageFlagsNone;
+    (*image)->palette_flags = 0;
+    (*image)->palette_count = 0;
+    (*image)->palette_size = 0;
+    (*image)->palette_entries = NULL;
 
     return Ok;
 }
@@ -2168,15 +2310,22 @@ GpStatus WINGDIPAPI GdipSaveImageToStream(GpImage *image, IStream* stream,
  */
 GpStatus WINGDIPAPI GdipGetImagePalette(GpImage *image, ColorPalette *palette, INT size)
 {
-    static int calls = 0;
+    TRACE("(%p,%p,%i)\n", image, palette, size);
 
-    if(!image)
+    if (!image || !palette)
         return InvalidParameter;
 
-    if(!(calls++))
-        FIXME("not implemented\n");
+    if (size < (sizeof(UINT)*2+sizeof(ARGB)*image->palette_count))
+    {
+        TRACE("<-- InsufficientBuffer\n");
+        return InsufficientBuffer;
+    }
 
-    return NotImplemented;
+    palette->Flags = image->palette_flags;
+    palette->Count = image->palette_count;
+    memcpy(palette->Entries, image->palette_entries, sizeof(ARGB)*image->palette_count);
+
+    return Ok;
 }
 
 /*****************************************************************************
@@ -2185,15 +2334,28 @@ GpStatus WINGDIPAPI GdipGetImagePalette(GpImage *image, ColorPalette *palette, I
 GpStatus WINGDIPAPI GdipSetImagePalette(GpImage *image,
     GDIPCONST ColorPalette *palette)
 {
-    static int calls;
+    TRACE("(%p,%p)\n", image, palette);
 
-    if(!image || !palette)
+    if(!image || !palette || palette->Count > 256)
         return InvalidParameter;
 
-    if(!(calls++))
-        FIXME("not implemented\n");
+    if (palette->Count > image->palette_size)
+    {
+        ARGB *new_palette;
 
-    return NotImplemented;
+        new_palette = GdipAlloc(sizeof(ARGB) * palette->Count);
+        if (!new_palette) return OutOfMemory;
+
+        GdipFree(image->palette_entries);
+        image->palette_entries = new_palette;
+        image->palette_size = palette->Count;
+    }
+
+    image->palette_flags = palette->Flags;
+    image->palette_count = palette->Count;
+    memcpy(image->palette_entries, palette->Entries, sizeof(ARGB)*palette->Count);
+
+    return Ok;
 }
 
 /*************************************************************************
@@ -2497,7 +2659,8 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
     BITMAP bm;
     GpStatus retval;
     PixelFormat format;
-    BYTE* bits;
+    BitmapData lockeddata;
+    INT y;
 
     TRACE("%p %p %p\n", hbm, hpal, bitmap);
 
@@ -2538,16 +2701,75 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
             return InvalidParameter;
     }
 
-    if (bm.bmBits)
-        bits = (BYTE*)bm.bmBits + (bm.bmHeight - 1) * bm.bmWidthBytes;
-    else
+    retval = GdipCreateBitmapFromScan0(bm.bmWidth, bm.bmHeight, 0,
+        format, NULL, bitmap);
+
+    if (retval == Ok)
     {
-        FIXME("can only get image data from DIB sections\n");
-        bits = NULL;
-    }
+        retval = GdipBitmapLockBits(*bitmap, NULL, ImageLockModeWrite,
+            format, &lockeddata);
+        if (retval == Ok)
+        {
+            if (bm.bmBits)
+            {
+                for (y=0; y<bm.bmHeight; y++)
+                {
+                    memcpy((BYTE*)lockeddata.Scan0+lockeddata.Stride*y,
+                           (BYTE*)bm.bmBits+bm.bmWidthBytes*(bm.bmHeight-1-y),
+                           bm.bmWidthBytes);
+                }
+            }
+            else
+            {
+                HDC hdc;
+                HBITMAP oldhbm;
+                BITMAPINFO *pbmi;
+                INT src_height, dst_stride;
+                BYTE *dst_bits;
+
+                hdc = CreateCompatibleDC(NULL);
+                oldhbm = SelectObject(hdc, hbm);
 
-    retval = GdipCreateBitmapFromScan0(bm.bmWidth, bm.bmHeight, -bm.bmWidthBytes,
-        format, bits, bitmap);
+                pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
+
+                if (pbmi)
+                {
+                    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+                    pbmi->bmiHeader.biBitCount = 0;
+
+                    GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
+
+                    src_height = abs(pbmi->bmiHeader.biHeight);
+
+                    if (pbmi->bmiHeader.biHeight > 0)
+                    {
+                        dst_bits = (BYTE*)lockeddata.Scan0+lockeddata.Stride*(src_height-1);
+                        dst_stride = -lockeddata.Stride;
+                    }
+                    else
+                    {
+                        dst_bits = lockeddata.Scan0;
+                        dst_stride = lockeddata.Stride;
+                    }
+
+                    for (y=0; y<src_height; y++)
+                    {
+                        GetDIBits(hdc, hbm, y, 1, dst_bits+dst_stride*y,
+                            pbmi, DIB_RGB_COLORS);
+                    }
+
+                    GdipFree(pbmi);
+                }
+                else
+                    retval = OutOfMemory;
+
+                SelectObject(hdc, oldhbm);
+                DeleteDC(hdc);
+            }
+
+            GdipBitmapUnlockBits(*bitmap, &lockeddata);
+        }
+    }
 
     return retval;
 }
index 197b68a..eab9b8f 100644 (file)
@@ -249,6 +249,7 @@ GpStatus WINGDIPAPI GdipCombineRegionPath(GpRegion *region, GpPath *path, Combin
     if(mode == CombineModeReplace){
         delete_element(&region->node);
         memcpy(region, path_region, sizeof(GpRegion));
+        GdipFree(path_region);
         return Ok;
     }
 
@@ -295,6 +296,7 @@ GpStatus WINGDIPAPI GdipCombineRegionRect(GpRegion *region,
     if(mode == CombineModeReplace){
         delete_element(&region->node);
         memcpy(region, rect_region, sizeof(GpRegion));
+        GdipFree(rect_region);
         return Ok;
     }
 
index 2e38f80..b132abf 100644 (file)
@@ -382,7 +382,6 @@ FreeEnvironmentStringsW (
        LPWSTR  EnvironmentStrings
        )
 {
- (void)EnvironmentStrings;
  return TRUE;
 }
 
index decfcaa..cf8bbe0 100644 (file)
@@ -9,9 +9,6 @@
 
 #include <ndk/asm.h>
 
-#define CONTEXT_FULL                    0x10007
-#define CONTEXT_FLOATING_POINT          0xF
-
 .globl _SwitchToFiber@4
 .intel_syntax noprefix
 
@@ -29,7 +26,7 @@ _SwitchToFiber@4:
     mov [eax+FIBER_CONTEXT_EBP], ebp
     
     /* Check if we're to save FPU State */
-    cmp dword ptr [eax+FIBER_CONTEXT_FLAGS], CONTEXT_FULL + CONTEXT_FLOATING_POINT
+    cmp dword ptr [eax+FIBER_CONTEXT_FLAGS], CONTEXT_FULL | CONTEXT_FLOATING_POINT
     jnz NoFpuStateSave
     
     /* Save the FPU State (Status and Control)*/
@@ -79,7 +76,7 @@ NoFpuStateSave:
     mov [edx+TEB_ACTIVATION_CONTEXT_STACK_POINTER], esi
     
     /* Restore FPU State */
-    cmp dword ptr [eax+FIBER_CONTEXT_FLAGS], CONTEXT_FULL + CONTEXT_FLOATING_POINT
+    cmp dword ptr [eax+FIBER_CONTEXT_FLAGS], CONTEXT_FULL | CONTEXT_FLOATING_POINT
     jnz NoFpuStateRestore
     
     /* Check if the Status Word Changed */
index 395a3a8..9a6e282 100644 (file)
@@ -242,7 +242,7 @@ WINAPI
 ExitThread(DWORD uExitCode)
 {
     NTSTATUS Status;
-    BOOLEAN LastThread;
+    ULONG LastThread;
 
     /*
      * Terminate process if this is the last thread
@@ -251,7 +251,7 @@ ExitThread(DWORD uExitCode)
     Status = NtQueryInformationThread(NtCurrentThread(),
                                       ThreadAmILastThread,
                                       &LastThread,
-                                      sizeof(BOOLEAN),
+                                      sizeof(LastThread),
                                       NULL);
     if (NT_SUCCESS(Status) && LastThread)
     {
@@ -266,8 +266,9 @@ ExitThread(DWORD uExitCode)
     NtCurrentTeb()->FreeStackOnTermination = TRUE;
     NtTerminateThread(NULL, uExitCode);
 
-    /* We will never reach this place. This silences the compiler */
-    ExitThread(uExitCode);
+    /* We should never reach this place */
+    DPRINT1("It should not happen\n");
+    while (TRUE) ;
 }
 
 /*
diff --git a/reactos/dll/win32/lsasrv/authport.c b/reactos/dll/win32/lsasrv/authport.c
new file mode 100644 (file)
index 0000000..dd5a69d
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * PROJECT:     Local Security Authority Server DLL
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        dll/win32/lsasrv/authport.c
+ * PURPOSE:     LsaAuthenticationPort server routines
+ * COPYRIGHT:   Copyright 2009 Eric Kohl
+ */
+
+/* INCLUDES ****************************************************************/
+
+#define WIN32_NO_STATUS
+#include <windows.h>
+#define NTOS_MODE_USER
+#include <ndk/ntndk.h>
+
+#include "lsass.h"
+#include "lsasrv.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(lsasrv);
+
+
+static HANDLE PortThreadHandle = NULL;
+static HANDLE AuthPortHandle = NULL;
+
+
+/* FUNCTIONS ***************************************************************/
+
+NTSTATUS WINAPI
+AuthPortThreadRoutine(PVOID Param)
+{
+    LSASS_REQUEST Request;
+    PPORT_MESSAGE Reply = NULL;
+    NTSTATUS Status;
+
+    NTSTATUS Status2;
+
+    HANDLE ConnectionHandle = NULL;
+    PVOID Context = NULL;
+    BOOLEAN Accept;
+
+    TRACE("AuthPortThreadRoutine() called\n");
+
+    Status = STATUS_SUCCESS;
+
+    for (;;)
+    {
+        Status = NtReplyWaitReceivePort(AuthPortHandle,
+                                        0,
+                                        Reply,
+                                        &Request.Header);
+        if (!NT_SUCCESS(Status))
+        {
+            TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status);
+            break;
+        }
+
+        TRACE("Received message\n");
+
+        if (Request.Header.u2.s2.Type == LPC_CONNECTION_REQUEST)
+        {
+            TRACE("Port connection request\n");
+
+            Accept = TRUE;
+            Status2 = NtAcceptConnectPort(&ConnectionHandle,
+                                         &Context,
+                                         &Request.Header,
+                                         Accept,
+                                         NULL,
+                                         NULL);
+
+
+            Status2 = NtCompleteConnectPort(ConnectionHandle);
+
+        }
+        else if (Request.Header.u2.s2.Type == LPC_PORT_CLOSED ||
+                 Request.Header.u2.s2.Type == LPC_CLIENT_DIED)
+        {
+            TRACE("Port closed or client died request\n");
+
+//            return STATUS_UNSUCCESSFUL;
+        }
+        else if (Request.Header.u2.s2.Type == LPC_REQUEST)
+        {
+            TRACE("Received request (Type: %lu)\n", Request.Type);
+
+        }
+        else if (Request.Header.u2.s2.Type == LPC_DATAGRAM)
+        {
+            TRACE("Received datagram\n");
+
+        }
+    }
+
+    return Status;
+}
+
+
+NTSTATUS
+StartAuthenticationPort(VOID)
+{
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    UNICODE_STRING PortName;
+    DWORD ThreadId;
+    NTSTATUS Status;
+
+    RtlInitUnicodeString(&PortName,
+                         L"\\LsaAuthenticationPort");
+
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &PortName,
+                               0,
+                               NULL,
+                               NULL);
+
+    Status = NtCreatePort(&AuthPortHandle,
+                          &ObjectAttributes,
+                          0,
+                          0x100,
+                          0x2000);
+    if (!NT_SUCCESS(Status))
+    {
+        TRACE("NtCreatePort() failed (Status %lx)\n", Status);
+        return Status;
+    }
+
+    PortThreadHandle = CreateThread(NULL,
+                                    0x1000,
+                                    (LPTHREAD_START_ROUTINE)AuthPortThreadRoutine,
+                                    NULL,
+                                    0,
+                                    &ThreadId);
+
+
+    return STATUS_SUCCESS;
+}
+
+/* EOF */
index 088da34..2b79108 100644 (file)
@@ -1,3 +1,13 @@
+/*
+ * PROJECT:     Local Security Authority Server DLL
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        dll/win32/lsasrv/lsasrv.c
+ * PURPOSE:     Main file
+ * COPYRIGHT:   Copyright 2006-2009 Eric Kohl
+ */
+
+/* INCLUDES ****************************************************************/
+
 #define WIN32_NO_STATUS
 #include <windows.h>
 #define NTOS_MODE_USER
 WINE_DEFAULT_DEBUG_CHANNEL(lsasrv);
 
 
+/* FUNCTIONS ***************************************************************/
+
 NTSTATUS WINAPI
 LsapInitLsa(VOID)
 {
     HANDLE hEvent;
     DWORD dwError;
 
-    TRACE("LsapInitLsa()\n");
+    TRACE("LsapInitLsa() called\n");
 
     /* Start the RPC server */
     LsarStartRpcServer();
 
+    TRACE("Creating notification event!\n");
     /* Notify the service manager */
     hEvent = CreateEventW(NULL,
                           TRUE,
@@ -43,10 +56,13 @@ LsapInitLsa(VOID)
         }
     }
 
+    TRACE("Set notification event!\n");
     SetEvent(hEvent);
 
     /* NOTE: Do not close the event handle!!!! */
 
+    StartAuthenticationPort();
+
     return STATUS_SUCCESS;
 }
 
index 0e90bd0..1599508 100644 (file)
@@ -2,11 +2,13 @@
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         Local Security Authority (LSA) Server
  * FILE:            reactos/dll/win32/lsasrv/lsasrv.h
- * PURPOSE:         
+ * PURPOSE:         Common header file
  *
  * PROGRAMMERS:     Eric Kohl
  */
 
+/* authport.c */
+NTSTATUS StartAuthenticationPort(VOID);
+
 /* lsarpc.c */
 VOID LsarStartRpcServer(VOID);
-
index f35f190..840599c 100644 (file)
@@ -2,11 +2,13 @@
        <importlibrary definition="lsasrv.spec" />
        <include base="lsasrv">.</include>
        <include base="lsa_server">.</include>
+       <include base="ReactOS">include/reactos/subsys/lsass</include>
        <library>lsa_server</library>
        <library>wine</library>
        <library>rpcrt4</library>
        <library>ntdll</library>
        <library>pseh</library>
+       <file>authport.c</file>
        <file>lsarpc.c</file>
        <file>lsasrv.c</file>
        <file>lsasrv.rc</file>
index e4260dd..212b4fc 100644 (file)
@@ -516,22 +516,14 @@ WSPSendTo(SOCKET Handle,
     PVOID                   APCFunction;
     HANDLE                  Event = NULL;
     PTRANSPORT_ADDRESS      RemoteAddress;
-    UCHAR                   TdiBuffer[0x16];
-    PSOCKADDR               BindAddress;
+    PSOCKADDR               BindAddress = NULL;
     INT                     BindAddressLength;
     HANDLE                  SockEvent;
     PSOCKET_INFORMATION     Socket;
 
-
-    /* Get the Socket Structure associate to this Socket*/
+    /* Get the Socket Structure associate to this Socket */
     Socket = GetSocketStructure(Handle);
 
-    Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
-        NULL, 1, FALSE );
-
-    if( !NT_SUCCESS(Status) )
-        return -1;
-
     /* Bind us First */
     if (Socket->SharedData.State == SocketOpen)
     {
@@ -540,19 +532,42 @@ WSPSendTo(SOCKET Handle,
         BindAddress = HeapAlloc(GlobalHeap, 0, BindAddressLength);
         if (!BindAddress)
         {
-            MsafdReturnWithErrno( STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL );
+            MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL);
             return INVALID_SOCKET;
         }
-        Socket->HelperData->WSHGetWildcardSockaddr (Socket->HelperContext,
-                                                    BindAddress,
-                                                    &BindAddressLength);
 
+        Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext,
+                                                   BindAddress,
+                                                   &BindAddressLength);
         /* Bind it */
         WSPBind(Handle, BindAddress, BindAddressLength, NULL);
     }
 
+    RemoteAddress = HeapAlloc(GlobalHeap, 0, 0x6 + SocketAddressLength);
+    if (!RemoteAddress)
+    {
+        if (BindAddress != NULL)
+        {
+            HeapFree(GlobalHeap, 0, BindAddress);
+        }
+        return MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL);
+    }
+
+    Status = NtCreateEvent(&SockEvent,
+                           GENERIC_READ | GENERIC_WRITE,
+                           NULL, 1, FALSE);
+
+    if (!NT_SUCCESS(Status))
+    {
+        HeapFree(GlobalHeap, 0, RemoteAddress);
+        if (BindAddress != NULL)
+        {
+            HeapFree(GlobalHeap, 0, BindAddress);
+        }
+        return SOCKET_ERROR;
+    }
+
     /* Set up Address in TDI Format */
-    RemoteAddress = (PTRANSPORT_ADDRESS)TdiBuffer;
     RemoteAddress->TAAddressCount = 1;
     RemoteAddress->Address[0].AddressLength = SocketAddressLength - sizeof(SocketAddress->sa_family);
     RtlCopyMemory(&RemoteAddress->Address[0].AddressType, SocketAddress, SocketAddressLength);
@@ -585,7 +600,8 @@ WSPSendTo(SOCKET Handle,
         else
         {
             /* Using Overlapped Structure and a Completition Routine, so use an APC */
-            APCFunction = NULL; // should be a private io completition function inside us
+            /* Should be a private io completition function inside us */
+            APCFunction = NULL;
             APCContext = lpCompletionRoutine;
             SendInfo.AfdFlags |= AFD_SKIP_FIO;
         }
@@ -596,34 +612,40 @@ WSPSendTo(SOCKET Handle,
 
     /* Send IOCTL */
     Status = NtDeviceIoControlFile((HANDLE)Handle,
-             Event ? Event : SockEvent,
-             APCFunction,
-             APCContext,
-             IOSB,
-             IOCTL_AFD_SEND_DATAGRAM,
-             &SendInfo,
-             sizeof(SendInfo),
-             NULL,
-             0);
+                                   Event ? Event : SockEvent,
+                                   APCFunction,
+                                   APCContext,
+                                   IOSB,
+                                   IOCTL_AFD_SEND_DATAGRAM,
+                                   &SendInfo,
+                                   sizeof(SendInfo),
+                                   NULL,
+                                   0);
 
     /* Wait for completition of not overlapped */
     if (Status == STATUS_PENDING && lpOverlapped == NULL)
     {
-        WaitForSingleObject(SockEvent, INFINITE); // BUGBUG, shouldn wait infintely for send...
+        /* BUGBUG, shouldn't wait infintely for send... */
+        WaitForSingleObject(SockEvent, INFINITE);
         Status = IOSB->Status;
     }
 
-    NtClose( SockEvent );
+    NtClose(SockEvent);
+    HeapFree(GlobalHeap, 0, RemoteAddress);
+    if (BindAddress != NULL)
+    {
+        HeapFree(GlobalHeap, 0, BindAddress);
+    }
 
     if (Status == STATUS_PENDING)
         return WSA_IO_PENDING;
 
-
     /* Re-enable Async Event */
     SockReenableAsyncSelectEvent(Socket, FD_WRITE);
 
-    return MsafdReturnWithErrno ( Status, lpErrno, IOSB->Information, lpNumberOfBytesSent );
+    return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent);
 }
+
 INT
 WSPAPI
 WSPRecvDisconnect(IN  SOCKET s,
diff --git a/reactos/dll/win32/secur32/lsa.c b/reactos/dll/win32/secur32/lsa.c
deleted file mode 100644 (file)
index 89cd1ea..0000000
+++ /dev/null
@@ -1,390 +0,0 @@
-/* $Id$
- *
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS system libraries
- * FILE:            lib/secur32/lsa.c
- * PURPOSE:         Client-side LSA functions
- * UPDATE HISTORY:
- *                  Created 05/08/00
- */
-
-/* INCLUDES ******************************************************************/
-
-#include <precomp.h>
-
-#define NDEBUG
-#include <debug.h>
-
-/* GLOBALS *******************************************************************/
-
-extern HANDLE Secur32Heap;
-
-/* FUNCTIONS *****************************************************************/
-
-/*
- * @implemented
- */
-NTSTATUS WINAPI
-LsaDeregisterLogonProcess(HANDLE LsaHandle)
-{
-   LSASS_REQUEST Request;
-   LSASS_REPLY Reply;
-   NTSTATUS Status;
-
-   Request.Header.u1.s1.DataLength = 0;
-   Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST);
-   Request.Type = LSASS_REQUEST_DEREGISTER_LOGON_PROCESS;
-   Status = NtRequestWaitReplyPort(LsaHandle,
-                                  &Request.Header,
-                                  &Reply.Header);
-   if (!NT_SUCCESS(Status))
-     {
-       return(Status);
-     }
-
-   if (!NT_SUCCESS(Reply.Status))
-     {
-       return(Reply.Status);
-     }
-
-   return(Status);
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS WINAPI
-LsaConnectUntrusted(PHANDLE LsaHandle)
-{
-  UNIMPLEMENTED;
-  return STATUS_UNSUCCESSFUL;
-}
-
-/*
- * @implemented
- */
-NTSTATUS WINAPI
-LsaCallAuthenticationPackage(HANDLE LsaHandle,
-                            ULONG AuthenticationPackage,
-                            PVOID ProtocolSubmitBuffer,
-                            ULONG SubmitBufferLength,
-                            PVOID* ProtocolReturnBuffer,
-                            PULONG ReturnBufferLength,
-                            PNTSTATUS ProtocolStatus)
-{
-   PLSASS_REQUEST Request;
-   PLSASS_REPLY Reply;
-   LSASS_REQUEST RawRequest;
-   LSASS_REPLY RawReply;
-   NTSTATUS Status;
-   ULONG OutBufferSize;
-
-   Request = (PLSASS_REQUEST)&RawRequest;
-   Reply = (PLSASS_REPLY)&RawReply;
-
-   Request->Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) + SubmitBufferLength -
-     sizeof(PORT_MESSAGE);
-   Request->Header.u1.s1.TotalLength =
-     Request->Header.u1.s1.DataLength + sizeof(PORT_MESSAGE);
-   Request->Type = LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE;
-   Request->d.CallAuthenticationPackageRequest.AuthenticationPackage =
-     AuthenticationPackage;
-   Request->d.CallAuthenticationPackageRequest.InBufferLength =
-     SubmitBufferLength;
-   memcpy(Request->d.CallAuthenticationPackageRequest.InBuffer,
-         ProtocolSubmitBuffer,
-         SubmitBufferLength);
-
-   Status = NtRequestWaitReplyPort(LsaHandle,
-                                  &Request->Header,
-                                  &Reply->Header);
-   if (!NT_SUCCESS(Status))
-     {
-       return(Status);
-     }
-
-   if (!NT_SUCCESS(Reply->Status))
-     {
-       return(Reply->Status);
-     }
-
-   OutBufferSize = Reply->d.CallAuthenticationPackageReply.OutBufferLength;
-   *ProtocolReturnBuffer = RtlAllocateHeap(Secur32Heap,
-                                          0,
-                                          OutBufferSize);
-   *ReturnBufferLength = OutBufferSize;
-   memcpy(*ProtocolReturnBuffer,
-         Reply->d.CallAuthenticationPackageReply.OutBuffer,
-         *ReturnBufferLength);
-
-   return(Status);
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS WINAPI
-LsaFreeReturnBuffer(PVOID Buffer)
-{
-   return(RtlFreeHeap(Secur32Heap, 0, Buffer));
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS WINAPI
-LsaLookupAuthenticationPackage(HANDLE LsaHandle,
-                              PLSA_STRING PackageName,
-                              PULONG AuthenticationPackage)
-{
-   NTSTATUS Status;
-   PLSASS_REQUEST Request;
-   LSASS_REQUEST RawRequest;
-   LSASS_REPLY Reply;
-
-   Request = (PLSASS_REQUEST)&RawRequest;
-   Request->Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) + PackageName->Length -
-     sizeof(PORT_MESSAGE);
-   Request->Header.u1.s1.TotalLength = Request->Header.u1.s1.DataLength +
-     sizeof(PORT_MESSAGE);
-   Request->Type = LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE;
-
-   Status = NtRequestWaitReplyPort(LsaHandle,
-                         &Request->Header,
-                         &Reply.Header);
-   if (!NT_SUCCESS(Status))
-     {
-       return(Status);
-     }
-   if (!NT_SUCCESS(Reply.Status))
-     {
-       return(Reply.Status);
-     }
-
-   *AuthenticationPackage = Reply.d.LookupAuthenticationPackageReply.Package;
-
-   return(Reply.Status);
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS WINAPI
-LsaLogonUser(HANDLE LsaHandle,
-            PLSA_STRING OriginName,
-            SECURITY_LOGON_TYPE LogonType,
-            ULONG AuthenticationPackage,
-            PVOID AuthenticationInformation,
-            ULONG AuthenticationInformationLength,
-            PTOKEN_GROUPS LocalGroups,
-            PTOKEN_SOURCE SourceContext,
-            PVOID* ProfileBuffer,
-            PULONG ProfileBufferLength,
-            PLUID LogonId,
-            PHANDLE Token,
-            PQUOTA_LIMITS Quotas,
-            PNTSTATUS SubStatus)
-{
-   ULONG RequestLength;
-   ULONG CurrentLength;
-   PLSASS_REQUEST Request;
-   LSASS_REQUEST RawMessage;
-   PLSASS_REPLY Reply;
-   LSASS_REPLY RawReply;
-   NTSTATUS Status;
-
-   RequestLength = sizeof(LSASS_REQUEST) - sizeof(PORT_MESSAGE);
-   RequestLength = RequestLength + (OriginName->Length * sizeof(WCHAR));
-   RequestLength = RequestLength + AuthenticationInformationLength;
-   RequestLength = RequestLength +
-     (LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES));
-
-   CurrentLength = 0;
-   Request = (PLSASS_REQUEST)&RawMessage;
-
-   Request->d.LogonUserRequest.OriginNameLength = OriginName->Length;
-   Request->d.LogonUserRequest.OriginName = (PWSTR)&RawMessage + CurrentLength;
-   memcpy((PWSTR)&RawMessage + CurrentLength,
-         OriginName->Buffer,
-         OriginName->Length * sizeof(WCHAR));
-   CurrentLength = CurrentLength + (OriginName->Length * sizeof(WCHAR));
-
-   Request->d.LogonUserRequest.LogonType = LogonType;
-
-   Request->d.LogonUserRequest.AuthenticationPackage =
-     AuthenticationPackage;
-
-   Request->d.LogonUserRequest.AuthenticationInformation =
-     (PVOID)((ULONG_PTR)&RawMessage + CurrentLength);
-   Request->d.LogonUserRequest.AuthenticationInformationLength =
-     AuthenticationInformationLength;
-   memcpy((PVOID)((ULONG_PTR)&RawMessage + CurrentLength),
-         AuthenticationInformation,
-         AuthenticationInformationLength);
-   CurrentLength = CurrentLength + AuthenticationInformationLength;
-
-   Request->d.LogonUserRequest.LocalGroupsCount = LocalGroups->GroupCount;
-   Request->d.LogonUserRequest.LocalGroups =
-     (PSID_AND_ATTRIBUTES)&RawMessage + CurrentLength;
-   memcpy((PSID_AND_ATTRIBUTES)&RawMessage + CurrentLength,
-         LocalGroups->Groups,
-         LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES));
-
-   Request->d.LogonUserRequest.SourceContext = *SourceContext;
-
-   Request->Type = LSASS_REQUEST_LOGON_USER;
-   Request->Header.u1.s1.DataLength = RequestLength - sizeof(PORT_MESSAGE);
-   Request->Header.u1.s1.TotalLength = RequestLength + sizeof(PORT_MESSAGE);
-
-   Reply = (PLSASS_REPLY)&RawReply;
-
-   Status = NtRequestWaitReplyPort(LsaHandle,
-                                  &Request->Header,
-                                  &Reply->Header);
-   if (!NT_SUCCESS(Status))
-     {
-       return(Status);
-     }
-
-   *SubStatus = Reply->d.LogonUserReply.SubStatus;
-
-   if (!NT_SUCCESS(Reply->Status))
-     {
-       return(Status);
-     }
-
-   *ProfileBuffer = RtlAllocateHeap(Secur32Heap,
-                                   0,
-                                 Reply->d.LogonUserReply.ProfileBufferLength);
-   memcpy(*ProfileBuffer,
-         (PVOID)((ULONG_PTR)Reply->d.LogonUserReply.Data +
-                 (ULONG_PTR)Reply->d.LogonUserReply.ProfileBuffer),
-         Reply->d.LogonUserReply.ProfileBufferLength);
-   *LogonId = Reply->d.LogonUserReply.LogonId;
-   *Token = Reply->d.LogonUserReply.Token;
-   memcpy(Quotas,
-         &Reply->d.LogonUserReply.Quotas,
-         sizeof(Reply->d.LogonUserReply.Quotas));
-
-   return(Status);
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS WINAPI
-LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName,
-                       PHANDLE Handle,
-                       PLSA_OPERATIONAL_MODE OperationalMode)
-{
-   UNICODE_STRING Portname = RTL_CONSTANT_STRING(L"\\SeLsaCommandPort");
-   ULONG ConnectInfoLength;
-   NTSTATUS Status;
-   LSASS_REQUEST Request;
-   LSASS_REPLY Reply;
-
-   ConnectInfoLength = 0;
-   Status = NtConnectPort(Handle,
-                         &Portname,
-                         NULL,
-                         NULL,
-                         NULL,
-                         NULL,
-                         NULL,
-                         &ConnectInfoLength);
-   if (!NT_SUCCESS(Status))
-     {
-       return(Status);
-     }
-
-   Request.Type = LSASS_REQUEST_REGISTER_LOGON_PROCESS;
-   Request.Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) -
-     sizeof(PORT_MESSAGE);
-   Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST);
-
-   Request.d.RegisterLogonProcessRequest.Length = LsaLogonProcessName->Length;
-   memcpy(Request.d.RegisterLogonProcessRequest.LogonProcessNameBuffer,
-         LsaLogonProcessName->Buffer,
-         Request.d.RegisterLogonProcessRequest.Length);
-
-   Status = NtRequestWaitReplyPort(*Handle,
-                                  &Request.Header,
-                                  &Reply.Header);
-   if (!NT_SUCCESS(Status))
-     {
-       NtClose(*Handle);
-       *Handle = INVALID_HANDLE_VALUE;
-       return(Status);
-     }
-
-   if (!NT_SUCCESS(Reply.Status))
-     {
-       NtClose(*Handle);
-       *Handle = INVALID_HANDLE_VALUE;
-       return(Status);
-     }
-
-   *OperationalMode = Reply.d.RegisterLogonProcessReply.OperationalMode;
-
-   return(Reply.Status);
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS
-WINAPI
-LsaEnumerateLogonSessions(
-PULONG LogonSessionCount,
-PLUID * LogonSessionList
-)
-{
-  UNIMPLEMENTED;
-  return FALSE;
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS
-WINAPI
-LsaGetLogonSessionData(
-PLUID LogonId,
-PSECURITY_LOGON_SESSION_DATA * ppLogonSessionData
-)
-{
-  UNIMPLEMENTED;
-  return FALSE;
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS
-WINAPI
-LsaRegisterPolicyChangeNotification(
-POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass,
-HANDLE NotificationEventHandle
-)
-{
-  UNIMPLEMENTED;
-  return FALSE;
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS
-WINAPI
-LsaUnregisterPolicyChangeNotification(
-POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass,
-HANDLE NotificationEventHandle
-)
-{
-  UNIMPLEMENTED;
-  return FALSE;
-}
index 30002e1..d75e926 100644 (file)
@@ -3,10 +3,10 @@
        <include base="secur32">.</include>
        <include base="ReactOS">include/reactos/subsys</include>
        <define name="__SECUR32__" />
+       <library>lsalib</library>
        <library>ntdll</library>
        <library>advapi32</library>
        <file>dllmain.c</file>
-       <file>lsa.c</file>
        <file>secext.c</file>
        <file>sspi.c</file>
        <file>secur32.rc</file>
index 4e103ba..abd4bb1 100644 (file)
@@ -745,7 +745,7 @@ CONFIGRET WINAPI CM_Disable_DevNode_Ex(
     RpcTryExcept
     {
         ret = PNP_DeviceInstanceAction(BindingHandle,
-                                       5,
+                                       PNP_DEVINST_DISABLE,
                                        ulFlags,
                                        lpDevInst,
                                        NULL);
@@ -844,7 +844,7 @@ CONFIGRET WINAPI CM_Enable_DevNode_Ex(
     RpcTryExcept
     {
         ret = PNP_DeviceInstanceAction(BindingHandle,
-                                       4,
+                                       PNP_DEVINST_ENABLE,
                                        ulFlags,
                                        lpDevInst,
                                        NULL);
@@ -3044,7 +3044,7 @@ CONFIGRET WINAPI CM_Move_DevNode_Ex(
     RpcTryExcept
     {
         ret = PNP_DeviceInstanceAction(BindingHandle,
-                                       2,
+                                       PNP_DEVINST_MOVE,
                                        ulFlags,
                                        lpFromDevInst,
                                        lpToDevInst);
@@ -3301,7 +3301,7 @@ CM_Reenumerate_DevNode_Ex(
     RpcTryExcept
     {
         ret = PNP_DeviceInstanceAction(BindingHandle,
-                                       7,
+                                       PNP_DEVINST_REENUMERATE,
                                        ulFlags,
                                        lpDevInst,
                                        NULL);
@@ -3935,7 +3935,7 @@ CONFIGRET WINAPI CM_Setup_DevNode_Ex(
     RpcTryExcept
     {
         ret = PNP_DeviceInstanceAction(BindingHandle,
-                                       3,
+                                       PNP_DEVINST_SETUP,
                                        ulFlags,
                                        lpDevInst,
                                        NULL);
index 00ccb34..7f76472 100644 (file)
@@ -1758,3 +1758,177 @@ IsUserAdmin(VOID)
 
     return bResult;
 }
+
+/***********************************************************************
+ *             SetupInitializeFileLogW(SETUPAPI.@)
+ */
+HSPFILELOG WINAPI SetupInitializeFileLogW(LPCWSTR LogFileName, DWORD Flags)
+{
+    struct FileLog * Log;
+    HANDLE hLog;
+    WCHAR Windir[MAX_PATH];
+    DWORD ret;
+
+    TRACE("%s, 0x%x\n",debugstr_w(LogFileName),Flags);
+
+    if (Flags & SPFILELOG_SYSTEMLOG)
+    {
+        if (!IsUserAdmin() && !(Flags & SPFILELOG_QUERYONLY))
+        {
+            /* insufficient privileges */
+            SetLastError(ERROR_ACCESS_DENIED);
+            return INVALID_HANDLE_VALUE;
+        }
+
+        if (LogFileName || (Flags & SPFILELOG_FORCENEW))
+        {
+            /* invalid parameter */
+            SetLastError(ERROR_INVALID_PARAMETER);
+            return INVALID_HANDLE_VALUE;
+        }
+
+        ret = GetSystemWindowsDirectoryW(Windir, MAX_PATH);
+        if (!ret || ret >= MAX_PATH)
+        {
+            /* generic failure */
+            return INVALID_HANDLE_VALUE;
+        }
+
+        /* append path */
+        wcscat(Windir, L"repair\\setup.log");
+    }
+    else
+    {
+        if (!LogFileName)
+        {
+            /* invalid parameter */
+            SetLastError(ERROR_INVALID_PARAMETER);
+            return INVALID_HANDLE_VALUE;
+        }
+        /* copy filename */
+        wcsncpy(Windir, LogFileName, MAX_PATH);
+    }
+
+    if (FileExists(Windir, NULL))
+    {
+        /* take ownership */
+        ret = TakeOwnershipOfFile(Windir);
+
+        if (ret != ERROR_SUCCESS)
+        {
+            /* failed */
+            SetLastError(ret);
+            return INVALID_HANDLE_VALUE;
+        }
+
+        if (!SetFileAttributesW(Windir, FILE_ATTRIBUTE_NORMAL))
+        {
+            /* failed */
+            return INVALID_HANDLE_VALUE;
+        }
+
+        if ((Flags & SPFILELOG_FORCENEW))
+        {
+            if (!DeleteFileW(Windir))
+            {
+                /* failed */
+                return INVALID_HANDLE_VALUE;
+            }
+        }
+    }
+
+    /* open log file */
+    hLog = CreateFileW(Windir,
+                       (Flags & SPFILELOG_QUERYONLY) ? GENERIC_READ : GENERIC_WRITE,
+                       FILE_SHARE_READ | FILE_SHARE_WRITE,
+                       NULL,
+                       OPEN_ALWAYS,
+                       FILE_ATTRIBUTE_NORMAL,
+                       NULL);
+
+    if (hLog == INVALID_HANDLE_VALUE)
+    {
+        /* failed */
+        return INVALID_HANDLE_VALUE;
+    }
+
+    /* close log handle */
+    CloseHandle(hLog);
+
+    /* allocate file log struct */
+    Log = HeapAlloc(GetProcessHeap(), 0, sizeof(struct FileLog));
+    if (!Log)
+    {
+        /* not enough memory */
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return INVALID_HANDLE_VALUE;
+    }
+
+    /* initialize log */
+    Log->LogName = HeapAlloc(GetProcessHeap(), 0, (wcslen(Windir)+1) * sizeof(WCHAR));
+    if (!Log->LogName)
+    {
+        /* not enough memory */
+        HeapFree(GetProcessHeap(), 0, Log);
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return INVALID_HANDLE_VALUE;
+    }
+
+    wcscpy(Log->LogName, Windir);
+    Log->ReadOnly = (Flags & SPFILELOG_QUERYONLY);
+    Log->SystemLog = (Flags & SPFILELOG_SYSTEMLOG);
+
+    return (HSPFILELOG)Log;
+}
+
+/***********************************************************************
+ *             SetupInitializeFileLogA(SETUPAPI.@)
+ */
+HSPFILELOG WINAPI SetupInitializeFileLogA(LPCSTR LogFileName, DWORD Flags)
+{
+    HSPFILELOG hLog;
+    LPWSTR LogFileNameW = NULL;
+
+    TRACE("%s, 0x%x\n",debugstr_a(LogFileName),Flags);
+
+    if (LogFileName)
+    {
+        LogFileNameW = strdupAtoW(LogFileName);
+
+        if (!LogFileNameW)
+        {
+            /* not enough memory */
+            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+            return INVALID_HANDLE_VALUE;
+        }
+
+        hLog = SetupInitializeFileLogW(LogFileNameW, Flags);
+        HeapFree(GetProcessHeap(), 0, LogFileNameW);
+    }
+    else
+    {
+        hLog = SetupInitializeFileLogW(NULL, Flags);
+    }
+
+    return hLog;
+}
+
+/***********************************************************************
+ *             SetupTerminateFileLog(SETUPAPI.@)
+ */
+BOOL WINAPI SetupTerminateFileLog(HANDLE FileLogHandle)
+{
+    struct FileLog * Log;
+
+    TRACE ("%p\n",FileLogHandle);
+
+    Log = (struct FileLog *)FileLogHandle;
+
+    /* free file log handle */
+    HeapFree(GetProcessHeap(), 0, Log->LogName);
+    HeapFree(GetProcessHeap(), 0, Log);
+
+    SetLastError(ERROR_SUCCESS);
+
+    return TRUE;
+}
\ No newline at end of file
index 09630a6..50c2d42 100644 (file)
@@ -226,6 +226,13 @@ struct ClassImageList
     INT* IconIndexes;
 };
 
+struct FileLog /* HSPFILELOG */
+{
+    DWORD ReadOnly;
+    DWORD SystemLog;
+    LPWSTR LogName;
+};
+
 extern HINSTANCE hInstance;
 #define RC_STRING_MAX_SIZE 256
 
index b8cba38..2ea7498 100644 (file)
@@ -41,33 +41,6 @@ DWORD WINAPI suErrorToIds16( WORD w1, WORD w2 )
     return 0;
 }
 
-/***********************************************************************
- *             SetupInitializeFileLogW(SETUPAPI.@)
- */
-HSPFILELOG WINAPI SetupInitializeFileLogW(LPCWSTR LogFileName, DWORD Flags)
-{
-    FIXME("Stub %s, 0x%x\n",debugstr_w(LogFileName),Flags);
-    return INVALID_HANDLE_VALUE;
-}
-
-/***********************************************************************
- *             SetupInitializeFileLogA(SETUPAPI.@)
- */
-HSPFILELOG WINAPI SetupInitializeFileLogA(LPCSTR LogFileName, DWORD Flags)
-{
-    FIXME("Stub %s, 0x%x\n",debugstr_a(LogFileName),Flags);
-    return INVALID_HANDLE_VALUE;
-}
-
-/***********************************************************************
- *             SetupTerminateFileLog(SETUPAPI.@)
- */
-BOOL WINAPI SetupTerminateFileLog(HANDLE FileLogHandle)
-{
-    FIXME ("Stub %p\n",FileLogHandle);
-    return TRUE;
-}
-
 /***********************************************************************
  *             RegistryDelnode(SETUPAPI.@)
  */
index 81670e5..242f54e 100644 (file)
@@ -210,7 +210,7 @@ BEGIN
     IDS_CMT_MSCONFIG    "\83V\83X\83e\83\80\82Ì\8d\\\90¬\83v\83\8d\83O\83\89\83\80\82ð\8aJ\82«\82Ü\82·"
     IDS_CMT_NOTEPAD     "\83e\83L\83X\83g\83G\83f\83B\83^\82ð\8bN\93®\82µ\82Ü\82·"
     IDS_CMT_RDESKTOP    "\83\8a\83\82\81[\83\83f\83X\83N\83g\83b\83v\82ð\8bN\93®\82µ\82Ü\82·"
-    IDS_CMT_REGEDIT     "\83\8c\83W\83X\83g\83\8a\83G\83f\83B\83^\82ð\8bN\93®\82µ\82Ü\82·"
+    IDS_CMT_REGEDIT     "\83\8c\83W\83X\83g\83\8a \83G\83f\83B\83^\82ð\8bN\93®\82µ\82Ü\82·"
     IDS_CMT_SCREENSHOT  "\83X\83N\83\8a\81[\83\93\83V\83\87\83b\83g\82ð\8eB\82è\82Ü\82·"
     IDS_CMT_SERVMAN     "\83T\81[\83r\83\83}\83l\81[\83W\83\83\82ð\8bN\93®\82µ\82Ü\82·"
     IDS_CMT_WORDPAD     "\83h\83L\83\85\83\81\83\93\83g\83G\83f\83B\83^\82ð\8bN\93®\82µ\82Ü\82·"
@@ -228,24 +228,23 @@ END
 STRINGTABLE
 BEGIN
     IDS_SYS_TOOLS       "\83V\83X\83e\83\80\83c\81[\83\8b"
-    IDS_CMT_CHARMAP     "\83L\83\83\83\89\83N\83^\81[\83}\83b\83v"
-    IDS_CMT_DXDIAG      "ReactX\90f\92\83v\83\8d\83O\83\89\83\80\82ð\8bN\93®\82µ\82Ü\82·"
+    IDS_CMT_CHARMAP     "\95\8e\9a\83R\81[\83h\95\\"
+    IDS_CMT_DXDIAG      "ReactX \90f\92\83v\83\8d\83O\83\89\83\80\82ð\8bN\93®\82µ\82Ü\82·"
     IDS_CMT_KBSWITCH    "\83L\81[\83{\81[\83h\83\8c\83C\83A\83E\83g\90Ø\91Ö\8aí"
 END
 
 STRINGTABLE
 BEGIN
-    IDS_SYS_ACCESSIBILITY   "\83A\83N\83Z\83V\83r\83\8a\83e\83B"
-    IDS_CMT_MAGNIFY         "\8ag\91å\8b¾"
+    IDS_SYS_ACCESSIBILITY       "\83A\83N\83Z\83V\83r\83\8a\83e\83B"
+    IDS_CMT_MAGNIFY             "\8ag\91å\8b¾"
 END
 
 STRINGTABLE
 BEGIN
-    IDS_SYS_ENTERTAINMENT   "\83G\83\93\83^\81[\83e\83C\83\81\83\93\83g"
-    IDS_CMT_MPLAY32         "\83}\83\8b\83`\83\81\83f\83B\83\83v\83\8c\81[\83\84\81[\82ð\8bN\93®\82µ\82Ü\82·"
-    IDS_CMT_SNDVOL32        "\83{\83\8a\83\85\81[\83\80 \83R\83\93\83g\83\8d\81[\83\8b\82ð\8bN\93®\82µ\82Ü\82·"
-    IDS_CMT_SNDREC32            "Launch Sound Recorder"
-
+    IDS_SYS_ENTERTAINMENT       "\83G\83\93\83^\81[\83e\83C\83\81\83\93\83g"
+    IDS_CMT_MPLAY32             "\83}\83\8b\83`\83\81\83f\83B\83\83v\83\8c\81[\83\84\81[\82ð\8bN\93®\82µ\82Ü\82·"
+    IDS_CMT_SNDVOL32            "\83{\83\8a\83\85\81[\83\80 \83R\83\93\83g\83\8d\81[\83\8b\82ð\8bN\93®\82µ\82Ü\82·"
+    IDS_CMT_SNDREC32            "\83T\83E\83\93\83\83\8c\83R\81[\83_\82ð\8bN\93®\82µ\82Ü\82·"
 END
 
 STRINGTABLE
@@ -264,10 +263,10 @@ END
 STRINGTABLE
 BEGIN
     IDS_SHORT_CALC       "\93d\91ì.lnk"
-    IDS_SHORT_CHARMAP    "\83L\83\83\83\89\83N\83^\81\83}\83b\83v.lnk"
+    IDS_SHORT_CHARMAP    "\95\8e\9a\83R\81[\83h\95\\.lnk"
     IDS_SHORT_CMD        "\83R\83}\83\93\83\83v\83\8d\83\93\83v\83g.lnk"
     IDS_SHORT_DEVICE     "\83f\83o\83C\83\83}\83l\81[\83W\83\83.lnk"
-    IDS_SHORT_DOWNLOADER "ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83\81[.lnk"
+    IDS_SHORT_DOWNLOADER "ReactOS \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83}\83l\81[\83W\83\83.lnk"
     IDS_SHORT_DXDIAG     "ReactX \90f\92f.lnk"
     IDS_SHORT_EVENTVIEW  "\83C\83x\83\93\83\83r\83\85\81[\83A.lnk"
     IDS_SHORT_EXPLORER   "ReactOS Explorer.lnk"
@@ -281,7 +280,7 @@ BEGIN
     IDS_SHORT_SERVICE    "\83T\81[\83r\83\83}\83l\81[\83W\83\83.lnk"
     IDS_SHORT_SNAP       "\83X\83i\83b\83v\83V\83\87\83b\83g.lnk"
     IDS_SHORT_SNDVOL32   "\83{\83\8a\83\85\81[\83\80 \83R\83\93\83g\83\8d\81[\83\8b.lnk"
-    IDS_SHORT_SNDREC32   "Audiorecorder.lnk"
+    IDS_SHORT_SNDREC32   "\83I\81[\83f\83B\83I\83\8c\83R\81[\83_.lnk"
     IDS_SHORT_SOLITAIRE  "\83\\\83\8a\83e\83B\83A.lnk"
     IDS_SHORT_WINEMINE   "WineMine.lnk"
     IDS_SHORT_WORDPAD    "\83\8f\81[\83h\83p\83b\83h.lnk"
index 8d3ef33..4ebbb03 100644 (file)
@@ -1998,12 +1998,7 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                        COMBO_FlipListbox( lphc, FALSE, FALSE );
                 return  0;
 
-       case WM_CHAR:
-       case WM_IME_CHAR:
        case WM_KEYDOWN:
-       {
-               HWND hwndTarget;
-
                if ((wParam == VK_RETURN || wParam == VK_ESCAPE) &&
                     (lphc->wState & CBF_DROPPED))
                {
@@ -2015,6 +2010,11 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                   COMBO_FlipListbox( lphc, FALSE, FALSE );
                   return TRUE;
                }
+               /* fall through */
+       case WM_CHAR:
+       case WM_IME_CHAR:
+        {
+               HWND hwndTarget;
 
                if( lphc->wState & CBF_EDIT )
                    hwndTarget = lphc->hWndEdit;
index a3c6cf0..41486c5 100644 (file)
@@ -57,7 +57,7 @@ typedef struct
 #include "poppack.h"
 
 /* forward declarations... actually in user32\windows\icon.c but useful here */
-HICON ICON_CreateIconFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDesired, int cyDesired, int xHotspot, int yHotspot);
+HICON CreateCursorIconFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDesired, int cyDesired, int xHotspot, int yHotspot, BOOL fIcon);
 CURSORICONDIRENTRY *CURSORICON_FindBestIcon( CURSORICONDIR *dir, int width, int height, int colors);
 CURSORICONDIRENTRY *CURSORICON_FindBestCursor( CURSORICONDIR *dir, int width, int height, int colors);
 
@@ -328,12 +328,6 @@ LoadCursorIconImage(
    else
    {
       ColorBits = GetDeviceCaps(hScreenDc, BITSPIXEL);
-      /*
-       * FIXME:
-       * Remove this after proper support for alpha icons will be finished.
-       */
-      if (ColorBits > 8)
-         ColorBits = 8;
    }
 
    /* Pick the best size. */
@@ -390,7 +384,7 @@ LoadCursorIconImage(
    /* Make data point to the start of the XOR image data. */
    Data = (PBYTE)SafeIconImage + HeaderSize;
 
-   hIcon = ICON_CreateIconFromData(hScreenDc, Data, SafeIconImage, width, height, width/2, height/2);
+   hIcon = CreateCursorIconFromData(hScreenDc, Data, SafeIconImage, width, height, width/2, height/2, Icon);
    RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
    DeleteDC(hScreenDc);
 
index bbf90d7..28cdee6 100644 (file)
@@ -37,121 +37,72 @@ WINE_DEFAULT_DEBUG_CHANNEL(user32);
 
 
 HICON
-ICON_CreateIconFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDesired, int cyDesired, int xHotspot, int yHotspot)
+CreateCursorIconFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDesired, int cyDesired, int xHotspot, int yHotspot, BOOL fIcon)
 {
    BYTE BitmapInfoBuffer[sizeof(BITMAPINFOHEADER) + 2 * sizeof(RGBQUAD)];
    BITMAPINFO *bwBIH = (BITMAPINFO *)BitmapInfoBuffer;
    ICONINFO IconInfo;
 
-   IconInfo.fIcon = TRUE;
+   IconInfo.fIcon = fIcon;
    IconInfo.xHotspot = xHotspot;
    IconInfo.yHotspot = yHotspot;
 
-   /* Load the XOR bitmap */
-   IconInfo.hbmColor = CreateDIBitmap(hDC, &IconImage->icHeader, CBM_INIT,
-                                      ImageData, (BITMAPINFO*)IconImage,
-                                      DIB_RGB_COLORS);
-
-   /* Make ImageData point to the start of the AND image data. */
-   ImageData = ((PBYTE)ImageData) + (((IconImage->icHeader.biWidth *
-                                      IconImage->icHeader.biBitCount + 31) & ~31) >> 3) *
-                                      (IconImage->icHeader.biHeight );
-
-   /* Create a BITMAPINFO header for the monocrome part of the icon. */
-   bwBIH->bmiHeader.biBitCount = 1;
-   bwBIH->bmiHeader.biWidth = IconImage->icHeader.biWidth;
-   bwBIH->bmiHeader.biHeight = IconImage->icHeader.biHeight;
-   bwBIH->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-   bwBIH->bmiHeader.biPlanes = 1;
-   bwBIH->bmiHeader.biSizeImage = 0;
-   bwBIH->bmiHeader.biCompression = BI_RGB;
-   bwBIH->bmiHeader.biClrImportant = 0;
-   bwBIH->bmiHeader.biClrUsed = 0;
-   bwBIH->bmiHeader.biXPelsPerMeter = 0;
-   bwBIH->bmiHeader.biYPelsPerMeter = 0;
-
-   bwBIH->bmiColors[0].rgbBlue = 0;
-   bwBIH->bmiColors[0].rgbGreen = 0;
-   bwBIH->bmiColors[0].rgbRed = 0;
-   bwBIH->bmiColors[0].rgbReserved = 0;
-
-   bwBIH->bmiColors[1].rgbBlue = 0xff;
-   bwBIH->bmiColors[1].rgbGreen = 0xff;
-   bwBIH->bmiColors[1].rgbRed = 0xff;
-   bwBIH->bmiColors[1].rgbReserved = 0;
-
-   /* Load the AND bitmap. */
-   IconInfo.hbmMask = CreateDIBitmap(hDC, &bwBIH->bmiHeader, 0,
-                                     ImageData, bwBIH, DIB_RGB_COLORS);
-
-   SetDIBits(hDC, IconInfo.hbmMask, 0, IconImage->icHeader.biHeight,
-             ImageData, bwBIH, DIB_RGB_COLORS);
-
-   /* Create the icon based on everything we have so far */
-   return NtUserCreateCursorIconHandle(&IconInfo, FALSE);
-}
-
-HICON
-ICON_CreateCursorFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDesired, int cyDesired, int xHotspot, int yHotspot)
-{
-   BYTE BitmapInfoBuffer[sizeof(BITMAPINFOHEADER) + 2 * sizeof(RGBQUAD)];
-   BITMAPINFO *bwBIH = (BITMAPINFO *)BitmapInfoBuffer;
-   BITMAPINFO *orgBIH = (BITMAPINFO *)IconImage;
-   ICONINFO IconInfo;
-
-   IconInfo.fIcon = FALSE;
-   IconInfo.xHotspot = xHotspot;
-   IconInfo.yHotspot = yHotspot;
-
-   /* Handle the color part of the cursor */
    if (IconImage->icHeader.biBitCount == 1)
    {
-      IconInfo.hbmColor = (HBITMAP)0;
+       IconInfo.hbmColor = (HBITMAP)0;
+       IconImage->icHeader.biHeight *= 2;
+       IconInfo.hbmMask = CreateDIBitmap(hDC, &IconImage->icHeader, CBM_INIT,
+                                  ImageData, (BITMAPINFO*)IconImage,
+                                  DIB_RGB_COLORS);
    }
    else
    {
+       /* Create the XOR bitmap */
        IconInfo.hbmColor = CreateDIBitmap(hDC, &IconImage->icHeader, CBM_INIT,
                                           ImageData, (BITMAPINFO*)IconImage,
                                           DIB_RGB_COLORS);
-   }
 
-   /* Create a BITMAPINFO header for the monochrome part of the cursor */
-   bwBIH->bmiHeader.biBitCount = 1;
-   bwBIH->bmiHeader.biWidth = IconImage->icHeader.biWidth;
-   bwBIH->bmiHeader.biHeight = IconImage->icHeader.biHeight;
-   bwBIH->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-   bwBIH->bmiHeader.biPlanes = 1;
-   bwBIH->bmiHeader.biSizeImage = 0;
-   bwBIH->bmiHeader.biCompression = BI_RGB;
-   bwBIH->bmiHeader.biClrImportant = 0;
-   bwBIH->bmiHeader.biClrUsed = 0;
-   bwBIH->bmiHeader.biXPelsPerMeter = 0;
-   bwBIH->bmiHeader.biYPelsPerMeter = 0;
-
-   bwBIH->bmiColors[0].rgbBlue = 0;
-   bwBIH->bmiColors[0].rgbGreen = 0;
-   bwBIH->bmiColors[0].rgbRed = 0;
-   bwBIH->bmiColors[0].rgbReserved = 0;
-
-   bwBIH->bmiColors[1].rgbBlue = 0xff;
-   bwBIH->bmiColors[1].rgbGreen = 0xff;
-   bwBIH->bmiColors[1].rgbRed = 0xff;
-   bwBIH->bmiColors[1].rgbReserved = 0;
-
-   /* Load the monochrome bitmap */
-   IconInfo.hbmMask = CreateDIBitmap(hDC, &bwBIH->bmiHeader, 0,
-                                     ImageData, bwBIH, DIB_RGB_COLORS);
-   if (IconInfo.hbmMask)
-   {
-      SetDIBits(hDC, IconInfo.hbmMask, 0, IconImage->icHeader.biHeight,
-                ImageData, orgBIH, DIB_RGB_COLORS);
+       /* Make ImageData point to the start of the AND image data. */
+       ImageData = ((PBYTE)ImageData) + (((IconImage->icHeader.biWidth *
+                                          IconImage->icHeader.biBitCount + 31) & ~31) >> 3) *
+                                          (IconImage->icHeader.biHeight );
+
+       /* Create a BITMAPINFO header for the monochrome part of the icon. */
+       bwBIH->bmiHeader.biBitCount = 1;
+       bwBIH->bmiHeader.biWidth = IconImage->icHeader.biWidth;
+       bwBIH->bmiHeader.biHeight = IconImage->icHeader.biHeight;
+       bwBIH->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+       bwBIH->bmiHeader.biPlanes = 1;
+       bwBIH->bmiHeader.biSizeImage = 0;
+       bwBIH->bmiHeader.biCompression = BI_RGB;
+       bwBIH->bmiHeader.biClrImportant = 2;
+       bwBIH->bmiHeader.biClrUsed = 2;
+       bwBIH->bmiHeader.biXPelsPerMeter = 0;
+       bwBIH->bmiHeader.biYPelsPerMeter = 0;
+
+       bwBIH->bmiColors[0].rgbBlue = 0;
+       bwBIH->bmiColors[0].rgbGreen = 0;
+       bwBIH->bmiColors[0].rgbRed = 0;
+       bwBIH->bmiColors[0].rgbReserved = 0;
+
+       bwBIH->bmiColors[1].rgbBlue = 0xff;
+       bwBIH->bmiColors[1].rgbGreen = 0xff;
+       bwBIH->bmiColors[1].rgbRed = 0xff;
+       bwBIH->bmiColors[1].rgbReserved = 0;
+
+       /* Create the AND bitmap. */
+       IconInfo.hbmMask = CreateDIBitmap(hDC, &bwBIH->bmiHeader, 0,
+                                         ImageData, bwBIH, DIB_RGB_COLORS);
+
+       SetDIBits(hDC, IconInfo.hbmMask, 0, IconImage->icHeader.biHeight,
+                 ImageData, bwBIH, DIB_RGB_COLORS);
    }
 
+
    /* Create the icon based on everything we have so far */
    return NtUserCreateCursorIconHandle(&IconInfo, FALSE);
 }
 
-
 /*
  * @implemented
  */
@@ -290,8 +241,7 @@ CreateIconFromResourceEx(
     }
   memcpy(SafeIconImage, pbIconBits, cbIconBits);
 
-  /* take into acount the original height was for both the AND and XOR images */
-  if(fIcon)
+  /* Take into acount the original height was for both the AND and XOR images */
     SafeIconImage->icHeader.biHeight /= 2;
 
   if (SafeIconImage->icHeader.biSize == sizeof(BITMAPCOREHEADER))
@@ -320,10 +270,7 @@ CreateIconFromResourceEx(
       return(NULL);
     }
 
-  if(fIcon)
-    hIcon = ICON_CreateIconFromData(hScreenDc, Data, SafeIconImage, cxDesired, cyDesired, wXHotspot, wYHotspot);
-  else
-    hIcon = ICON_CreateCursorFromData(hScreenDc, Data, SafeIconImage, cxDesired, cyDesired, wXHotspot, wYHotspot);
+  hIcon = CreateCursorIconFromData(hScreenDc, Data, SafeIconImage, cxDesired, cyDesired, wXHotspot, wYHotspot, fIcon);
   RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
   DeleteDC(hScreenDc);
 
index 68486dd..45d3ed5 100644 (file)
@@ -17,7 +17,7 @@
 
 #define KERNEL_DEVICE_NAME      L"\\\\.\\wdmaud"
 extern HANDLE KernelHandle;
-DWORD OpenCount = 0;
+extern DWORD OpenCount;
 
 DWORD
 WINAPI
@@ -561,6 +561,7 @@ WriteFileEx_Committer2(
 }
 
 
+
 MMRESULT
 WdmAudSetWaveStateByLegacy(
     IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
index bdf5875..ab1ba6f 100644 (file)
@@ -20,6 +20,8 @@ MIXER_STATUS Enum(IN  PVOID EnumContext, IN  ULONG DeviceIndex, OUT LPWSTR * Dev
 MIXER_STATUS OpenKey(IN HANDLE hKey, IN LPWSTR SubKey, IN ULONG DesiredAccess, OUT PHANDLE OutKey);
 MIXER_STATUS CloseKey(IN HANDLE hKey);
 MIXER_STATUS QueryKeyValue(IN HANDLE hKey, IN LPWSTR KeyName, OUT PVOID * ResultBuffer, OUT PULONG ResultLength, OUT PULONG KeyType);
+PVOID AllocEventData(IN ULONG ExtraSize);
+VOID FreeEventData(IN PVOID EventData);
 
 MIXER_CONTEXT MixerContext =
 {
@@ -33,7 +35,9 @@ MIXER_CONTEXT MixerContext =
     Copy,
     OpenKey,
     QueryKeyValue,
-    CloseKey
+    CloseKey,
+    AllocEventData,
+    FreeEventData
 };
 
 GUID CategoryGuid = {STATIC_KSCATEGORY_AUDIO};
@@ -285,6 +289,35 @@ Enum(
     return Status;
 }
 
+PVOID
+AllocEventData(
+    IN ULONG ExtraSize)
+{
+    PKSEVENTDATA Data = (PKSEVENTDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(KSEVENTDATA) + ExtraSize);
+    if (!Data)
+        return NULL;
+
+    Data->EventHandle.Event = CreateEventW(NULL, FALSE, FALSE, NULL);
+    if (!Data->EventHandle.Event)
+    {
+        HeapFree(GetProcessHeap(), 0, Data);
+        return NULL;
+    }
+
+    Data->NotificationType = KSEVENTF_EVENT_HANDLE;
+    return Data;
+}
+
+VOID
+FreeEventData(IN PVOID EventData)
+{
+    PKSEVENTDATA Data = (PKSEVENTDATA)EventData;
+
+    CloseHandle(Data->EventHandle.Event);
+    HeapFree(GetProcessHeap(), 0, Data);
+}
+
+
 BOOL
 WdmAudInitUserModeMixer()
 {
index 2cf107b..2db6c0e 100644 (file)
 
 #include "wdmaud.h"
 
+
+#define KERNEL_DEVICE_NAME      L"\\\\.\\wdmaud"
+
+PWSTR UnknownWaveIn = L"Wave Input";
+PWSTR UnknownWaveOut = L"Wave Output";
+PWSTR UnknownMidiIn = L"Midi Input";
+PWSTR UnknownMidiOut = L"Midi Output";
+
+
 HANDLE KernelHandle = INVALID_HANDLE_VALUE;
+DWORD OpenCount = 0;
+
+MMRESULT
+WriteFileEx_Remixer(
+    IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
+    IN  PVOID OffsetPtr,
+    IN  DWORD Length,
+    IN  PSOUND_OVERLAPPED Overlap,
+    IN  LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine);
+
+
+
+MMRESULT
+GetNumWdmDevs(
+    IN  HANDLE Handle,
+    IN  MMDEVICE_TYPE DeviceType,
+    OUT DWORD* DeviceCount)
+{
+#ifdef USE_MMIXER_LIB
+
+    switch(DeviceType)
+    {
+        case MIXER_DEVICE_TYPE:
+            *DeviceCount = WdmAudGetMixerCount();
+            break;
+        case WAVE_OUT_DEVICE_TYPE:
+            *DeviceCount = WdmAudGetWaveOutCount();
+            break;
+        case WAVE_IN_DEVICE_TYPE:
+            *DeviceCount = WdmAudGetWaveInCount();
+            break;
+        default:
+            *DeviceCount = 0;
+    }
+    return MMSYSERR_NOERROR;
+#else
+
+    MMRESULT Result;
+    WDMAUD_DEVICE_INFO DeviceInfo;
+
+    VALIDATE_MMSYS_PARAMETER( Handle != INVALID_HANDLE_VALUE );
+    VALIDATE_MMSYS_PARAMETER( IS_VALID_SOUND_DEVICE_TYPE(DeviceType) );
+    VALIDATE_MMSYS_PARAMETER( DeviceCount );
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.DeviceType = DeviceType;
+
+    Result = SyncOverlappedDeviceIoControl(Handle,
+                                           IOCTL_GETNUMDEVS_TYPE,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    if ( ! MMSUCCESS( Result ) )
+    {
+        SND_ERR(L"Call to IOCTL_GETNUMDEVS_TYPE failed\n");
+        *DeviceCount = 0;
+        return TranslateInternalMmResult(Result);
+    }
+
+    *DeviceCount = DeviceInfo.DeviceCount;
+
+    return MMSYSERR_NOERROR;
+#endif
+}
+
+MMRESULT
+GetWdmDeviceCapabilities(
+    IN  PSOUND_DEVICE SoundDevice,
+    IN  DWORD DeviceId,
+    OUT PVOID Capabilities,
+    IN  DWORD CapabilitiesSize)
+{
+    /* NOTE - At this time, WDMAUD does not support this properly */
+
+    MMRESULT Result;
+    MMDEVICE_TYPE DeviceType;
+    WDMAUD_DEVICE_INFO DeviceInfo;
+
+    SND_ASSERT( SoundDevice );
+    SND_ASSERT( Capabilities );
+
+    Result = GetSoundDeviceType(SoundDevice, &DeviceType);
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    if ( ! MMSUCCESS(Result) )
+        return Result;
+
+    SND_TRACE(L"WDMAUD - GetWdmDeviceCapabilities DeviceType %u DeviceId %u\n", DeviceType, DeviceId);
+
+#ifdef USE_MMIXER_LIB
+    if (DeviceType == MIXER_DEVICE_TYPE)
+    {
+        return WdmAudGetMixerCapabilities(DeviceId, (LPMIXERCAPSW)Capabilities);
+    }
+    else if (DeviceType == WAVE_OUT_DEVICE_TYPE)
+    {
+        return WdmAudGetWaveOutCapabilities(DeviceId, (LPWAVEOUTCAPSW)Capabilities);
+    }
+    else if (DeviceType == WAVE_IN_DEVICE_TYPE)
+    {
+        return WdmAudGetWaveInCapabilities(DeviceId, (LPWAVEINCAPSW)Capabilities);
+    }
+
+#endif
+
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.DeviceType = DeviceType;
+    DeviceInfo.DeviceIndex = DeviceId;
+
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_GETCAPABILITIES,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return TranslateInternalMmResult(Result);
+    }
+
+    /* This is pretty much a big hack right now */
+    switch ( DeviceType )
+    {
+        case MIXER_DEVICE_TYPE:
+        {
+            LPMIXERCAPS MixerCaps = (LPMIXERCAPS) Capabilities;
+
+            DeviceInfo.u.MixCaps.szPname[MAXPNAMELEN-1] = L'\0';
+            CopyWideString(MixerCaps->szPname, DeviceInfo.u.MixCaps.szPname);
+
+            MixerCaps->cDestinations = DeviceInfo.u.MixCaps.cDestinations;
+            MixerCaps->fdwSupport = DeviceInfo.u.MixCaps.fdwSupport;
+            MixerCaps->vDriverVersion = DeviceInfo.u.MixCaps.vDriverVersion;
+            MixerCaps->wMid = DeviceInfo.u.MixCaps.wMid;
+            MixerCaps->wPid = DeviceInfo.u.MixCaps.wPid;
+            break;
+        }
+        case WAVE_OUT_DEVICE_TYPE :
+        {
+            LPWAVEOUTCAPS WaveOutCaps = (LPWAVEOUTCAPS) Capabilities;
+
+            DeviceInfo.u.WaveOutCaps.szPname[MAXPNAMELEN-1] = L'\0';
+            WaveOutCaps->wMid = DeviceInfo.u.WaveOutCaps.wMid;
+            WaveOutCaps->wPid = DeviceInfo.u.WaveOutCaps.wPid;
+
+            WaveOutCaps->vDriverVersion = 0x0001;
+            CopyWideString(WaveOutCaps->szPname, DeviceInfo.u.WaveOutCaps.szPname);
+
+            WaveOutCaps->dwFormats = DeviceInfo.u.WaveOutCaps.dwFormats;
+            WaveOutCaps->wChannels = DeviceInfo.u.WaveOutCaps.wChannels;
+            WaveOutCaps->dwSupport = DeviceInfo.u.WaveOutCaps.dwSupport;
+            break;
+        }
+        case WAVE_IN_DEVICE_TYPE :
+        {
+            LPWAVEINCAPSW WaveInCaps = (LPWAVEINCAPSW) Capabilities;
+
+            DeviceInfo.u.WaveInCaps.szPname[MAXPNAMELEN-1] = L'\0';
+
+            WaveInCaps->wMid = DeviceInfo.u.WaveInCaps.wMid;
+            WaveInCaps->wPid = DeviceInfo.u.WaveInCaps.wPid;
+
+            WaveInCaps->vDriverVersion = 0x0001;
+            CopyWideString(WaveInCaps->szPname, DeviceInfo.u.WaveInCaps.szPname);
+
+            WaveInCaps->dwFormats = DeviceInfo.u.WaveInCaps.dwFormats;
+            WaveInCaps->wChannels = DeviceInfo.u.WaveInCaps.wChannels;
+            WaveInCaps->wReserved1 = 0;
+            break;
+        }
+    }
+
+    return MMSYSERR_NOERROR;
+}
+
+
+MMRESULT
+OpenWdmSoundDevice(
+    IN  struct _SOUND_DEVICE* SoundDevice,  /* NOT USED */
+    OUT PVOID* Handle)
+{
+    /* Only open this if it's not already open */
+    if ( KernelHandle == INVALID_HANDLE_VALUE )
+    {
+        SND_TRACE(L"Opening wdmaud device\n");
+        KernelHandle = CreateFileW(KERNEL_DEVICE_NAME,
+                                  GENERIC_READ | GENERIC_WRITE,
+                                  0,
+                                  NULL,
+                                  OPEN_EXISTING,
+                                  FILE_FLAG_OVERLAPPED,
+                                  NULL);
+    }
+
+    if ( KernelHandle == INVALID_HANDLE_VALUE )
+        return MMSYSERR_ERROR;
+
+    SND_ASSERT( Handle );
+
+    *Handle = KernelHandle;
+    ++ OpenCount;
+
+    return MMSYSERR_NOERROR;
+}
+
+MMRESULT
+CloseWdmSoundDevice(
+    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+    IN  PVOID Handle)
+{
+    WDMAUD_DEVICE_INFO DeviceInfo;
+    MMRESULT Result;
+    MMDEVICE_TYPE DeviceType;
+    PSOUND_DEVICE SoundDevice;
+
+    Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return TranslateInternalMmResult(Result);
+    }
+
+    if ( OpenCount == 0 )
+    {
+        return MMSYSERR_NOERROR;
+    }
+
+    SND_ASSERT( KernelHandle != INVALID_HANDLE_VALUE );
+
+    Result = GetSoundDeviceType(SoundDevice, &DeviceType);
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    if (SoundDeviceInstance->Handle != (PVOID)KernelHandle)
+    {
+        ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+
+        DeviceInfo.DeviceType = DeviceType;
+        DeviceInfo.hDevice = SoundDeviceInstance->Handle;
+
+         /* First stop the stream */
+         if (DeviceType != MIXER_DEVICE_TYPE)
+         {
+             DeviceInfo.u.State = KSSTATE_STOP;
+             SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_SETDEVICE_STATE,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                            sizeof(WDMAUD_DEVICE_INFO),
+                                            NULL);
+        }
+#ifdef USE_MMIXER_LIB
+    if (DeviceType == MIXER_DEVICE_TYPE)
+    {
+        return WdmAudCloseMixer(SoundDeviceInstance->Handle, SoundDeviceInstance->hNotifyEvent);
+    }
+#endif
+
+        SyncOverlappedDeviceIoControl(KernelHandle,
+                                      IOCTL_CLOSE_WDMAUD,
+                                      (LPVOID) &DeviceInfo,
+                                      sizeof(WDMAUD_DEVICE_INFO),
+                                      (LPVOID) &DeviceInfo,
+                                      sizeof(WDMAUD_DEVICE_INFO),
+                                      NULL);
+    }
+
+    if (DeviceType == MIXER_DEVICE_TYPE)
+    {
+        SetEvent(SoundDeviceInstance->hStopEvent);
+        CloseHandle(SoundDeviceInstance->hStopEvent);
+        CloseHandle(SoundDeviceInstance->hNotifyEvent);
+    }
+
+    --OpenCount;
+
+    if ( OpenCount < 1 )
+    {
+        CloseHandle(KernelHandle);
+        KernelHandle = INVALID_HANDLE_VALUE;
+    }
+
+    return MMSYSERR_NOERROR;
+}
+
 
 MMRESULT
 QueryWdmWaveDeviceFormatSupport(
@@ -27,8 +327,483 @@ QueryWdmWaveDeviceFormatSupport(
 }
 
 
+
+
+
+MMRESULT
+SetWdmMixerDeviceFormat(
+    IN  PSOUND_DEVICE_INSTANCE Instance,
+    IN  DWORD DeviceId,
+    IN  PWAVEFORMATEX WaveFormat,
+    IN  DWORD WaveFormatSize)
+{
+    MMRESULT Result;
+    WDMAUD_DEVICE_INFO DeviceInfo;
+    HANDLE hThread;
+
+
+    Instance->hNotifyEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+    if ( ! Instance->hNotifyEvent )
+        return MMSYSERR_NOMEM;
+
+#ifdef USE_MMIXER_LIB
+    return WdmAudOpenMixer(&Instance->Handle, DeviceId, Instance->hNotifyEvent);
+#endif
+
+    if (Instance->Handle != KernelHandle)
+    {
+        /* device is already open */
+        return MMSYSERR_NOERROR;
+    }
+
+    Instance->hStopEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+    if ( ! Instance->hStopEvent )
+        return MMSYSERR_NOMEM;
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.DeviceType = MIXER_DEVICE_TYPE;
+    DeviceInfo.DeviceIndex = DeviceId;
+    DeviceInfo.u.hNotifyEvent = Instance->hNotifyEvent;
+
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_OPEN_WDMAUD,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        CloseHandle(Instance->hNotifyEvent);
+        CloseHandle(Instance->hStopEvent);
+        return TranslateInternalMmResult(Result);
+    }
+
+    hThread = CreateThread(NULL, 0, MixerEventThreadRoutine, (LPVOID)Instance, 0, NULL);
+    if (  hThread )
+    {
+        CloseHandle(hThread);
+    }
+
+    /* Store sound device handle instance handle */
+    Instance->Handle = (PVOID)DeviceInfo.hDevice;
+
+    return MMSYSERR_NOERROR;
+}
+
+MMRESULT
+SetWdmWaveDeviceFormat(
+    IN  PSOUND_DEVICE_INSTANCE Instance,
+    IN  DWORD DeviceId,
+    IN  PWAVEFORMATEX WaveFormat,
+    IN  DWORD WaveFormatSize)
+{
+    MMRESULT Result;
+    PSOUND_DEVICE SoundDevice;
+    PVOID Identifier;
+    WDMAUD_DEVICE_INFO DeviceInfo;
+    MMDEVICE_TYPE DeviceType;
+
+    Result = GetSoundDeviceFromInstance(Instance, &SoundDevice);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return TranslateInternalMmResult(Result);
+    }
+
+    Result = GetSoundDeviceIdentifier(SoundDevice, &Identifier);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return TranslateInternalMmResult(Result);
+    }
+
+    if (Instance->Handle != KernelHandle)
+    {
+        /* device is already open */
+        return MMSYSERR_NOERROR;
+    }
+
+    Result = GetSoundDeviceType(SoundDevice, &DeviceType);
+
+#ifdef USE_MMIXER_LIB
+    return WdmAudOpenWavePin(Instance, DeviceId, WaveFormat, DeviceType);
+#endif
+
+
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.DeviceType = DeviceType;
+    DeviceInfo.DeviceIndex = DeviceId;
+    DeviceInfo.u.WaveFormatEx.cbSize = sizeof(WAVEFORMATEX); //WaveFormat->cbSize;
+    DeviceInfo.u.WaveFormatEx.wFormatTag = WaveFormat->wFormatTag;
+#ifdef USERMODE_MIXER
+    DeviceInfo.u.WaveFormatEx.nChannels = 2;
+    DeviceInfo.u.WaveFormatEx.nSamplesPerSec = 44100;
+    DeviceInfo.u.WaveFormatEx.nBlockAlign = 4;
+    DeviceInfo.u.WaveFormatEx.nAvgBytesPerSec = 176400;
+    DeviceInfo.u.WaveFormatEx.wBitsPerSample = 16;
+#else
+    DeviceInfo.u.WaveFormatEx.nChannels = WaveFormat->nChannels;
+    DeviceInfo.u.WaveFormatEx.nSamplesPerSec = WaveFormat->nSamplesPerSec;
+    DeviceInfo.u.WaveFormatEx.nBlockAlign = WaveFormat->nBlockAlign;
+    DeviceInfo.u.WaveFormatEx.nAvgBytesPerSec = WaveFormat->nAvgBytesPerSec;
+    DeviceInfo.u.WaveFormatEx.wBitsPerSample = WaveFormat->wBitsPerSample;
+#endif
+
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_OPEN_WDMAUD,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return TranslateInternalMmResult(Result);
+    }
+
+    /* Store format */
+    Instance->WaveFormatEx.cbSize = WaveFormat->cbSize;
+    Instance->WaveFormatEx.wFormatTag = WaveFormat->wFormatTag;
+    Instance->WaveFormatEx.nChannels = WaveFormat->nChannels;
+    Instance->WaveFormatEx.nSamplesPerSec = WaveFormat->nSamplesPerSec;
+    Instance->WaveFormatEx.nBlockAlign = WaveFormat->nBlockAlign;
+    Instance->WaveFormatEx.nAvgBytesPerSec = WaveFormat->nAvgBytesPerSec;
+    Instance->WaveFormatEx.wBitsPerSample = WaveFormat->wBitsPerSample;
+
+    /* Store sound device handle instance handle */
+    Instance->Handle = (PVOID)DeviceInfo.hDevice;
+
+    /* Now determine framing requirements */
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_GETFRAMESIZE,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    if ( MMSUCCESS(Result) )
+    {
+        if (DeviceInfo.u.FrameSize)
+        {
+            Instance->FrameSize = DeviceInfo.u.FrameSize * 2;
+            Instance->BufferCount = WaveFormat->nAvgBytesPerSec / Instance->FrameSize;
+            SND_TRACE(L"FrameSize %u BufferCount %u\n", Instance->FrameSize, Instance->BufferCount);
+        }
+    }
+    else
+    {
+        // use a default of 100 buffers
+        Instance->BufferCount = 100;
+    }
+
+    if (DeviceType == WAVE_OUT_DEVICE_TYPE)
+    {
+        /* Now start the stream */
+        DeviceInfo.u.State = KSSTATE_RUN;
+        SyncOverlappedDeviceIoControl(KernelHandle,
+                                      IOCTL_SETDEVICE_STATE,
+                                      (LPVOID) &DeviceInfo,
+                                      sizeof(WDMAUD_DEVICE_INFO),
+                                      (LPVOID) &DeviceInfo,
+                                      sizeof(WDMAUD_DEVICE_INFO),
+                                      NULL);
+    }
+
+    return MMSYSERR_NOERROR;
+}
+
+
+MMRESULT
+SetWdmWaveState(
+    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+    IN BOOL bStart)
+{
+    MMRESULT Result;
+    PSOUND_DEVICE SoundDevice;
+    WDMAUD_DEVICE_INFO DeviceInfo;
+    MMDEVICE_TYPE DeviceType;
+    HANDLE Handle;
+
+    Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return TranslateInternalMmResult(Result);
+    }
+
+    Result = GetSoundDeviceType(SoundDevice, &DeviceType);
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    Result = GetSoundDeviceInstanceHandle(SoundDeviceInstance, &Handle);
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.hDevice = Handle;
+    DeviceInfo.DeviceType = DeviceType;
+
+    if (bStart)
+        DeviceInfo.u.State = KSSTATE_RUN;
+    else
+        DeviceInfo.u.State = KSSTATE_PAUSE;
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_SETDEVICE_STATE,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    return Result;
+}
+
+MMRESULT
+GetDeviceInterfaceString(
+    IN  MMDEVICE_TYPE DeviceType,
+    IN  DWORD DeviceId,
+    IN  LPWSTR Interface,
+    IN  DWORD  InterfaceLength,
+    OUT  DWORD * InterfaceSize)
+{
+    WDMAUD_DEVICE_INFO DeviceInfo;
+    MMRESULT Result;
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.DeviceType = DeviceType;
+    DeviceInfo.DeviceIndex = DeviceId;
+
+
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_QUERYDEVICEINTERFACESTRING,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return TranslateInternalMmResult(Result);
+    }
+
+
+    if (!Interface)
+    {
+        SND_ASSERT(InterfaceSize);
+
+        *InterfaceSize = DeviceInfo.u.Interface.DeviceInterfaceStringSize;
+        return MMSYSERR_NOERROR;
+    }
+
+    if (InterfaceLength < DeviceInfo.u.Interface.DeviceInterfaceStringSize)
+    {
+        /* buffer is too small */
+        return MMSYSERR_MOREDATA;
+    }
+
+    DeviceInfo.u.Interface.DeviceInterfaceStringSize = InterfaceLength;
+    DeviceInfo.u.Interface.DeviceInterfaceString = Interface;
+
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_QUERYDEVICEINTERFACESTRING,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    if (  MMSUCCESS(Result) && InterfaceLength > 2)
+    {
+        Interface[1] = L'\\';
+        Interface[InterfaceLength-1] = L'\0';
+    }
+
+    return Result;
+}
+
+MMRESULT
+GetWdmPosition(
+    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+    IN  MMTIME* Time)
+{
+    MMRESULT Result;
+    PSOUND_DEVICE SoundDevice;
+    WDMAUD_DEVICE_INFO DeviceInfo;
+    MMDEVICE_TYPE DeviceType;
+    HANDLE Handle;
+
+    Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return TranslateInternalMmResult(Result);
+    }
+
+    Result = GetSoundDeviceType(SoundDevice, &DeviceType);
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    Result = GetSoundDeviceInstanceHandle(SoundDeviceInstance, &Handle);
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.hDevice = Handle;
+    DeviceInfo.DeviceType = DeviceType;
+
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_OPEN_WDMAUD,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return TranslateInternalMmResult(Result);
+    }
+
+    Time->wType = TIME_BYTES;
+    Time->u.cb = (DWORD)DeviceInfo.u.Position;
+
+    return MMSYSERR_NOERROR;
+}
+
+MMRESULT
+ResetStream(
+    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+    IN  MMDEVICE_TYPE DeviceType,
+    IN  BOOLEAN bStartReset)
+{
+    MMRESULT Result;
+    HANDLE Handle;
+    WDMAUD_DEVICE_INFO DeviceInfo;
+
+    Result = GetSoundDeviceInstanceHandle(SoundDeviceInstance, &Handle);
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.hDevice = Handle;
+    DeviceInfo.DeviceType = DeviceType;
+    DeviceInfo.u.ResetStream = (bStartReset ? KSRESET_BEGIN : KSRESET_END);
+
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IOCTL_RESET_STREAM,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+    return Result;
+}
+
+
+MMRESULT
+QueryMixerInfo(
+    IN  struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
+    IN UINT uMsg,
+    IN LPVOID Parameter,
+    IN DWORD Flags)
+{
+    MMRESULT Result;
+    WDMAUD_DEVICE_INFO DeviceInfo;
+    HANDLE Handle;
+    DWORD IoControlCode;
+    LPMIXERLINEW MixLine;
+    LPMIXERLINECONTROLSW MixControls;
+    LPMIXERCONTROLDETAILS MixDetails;
+
+    SND_TRACE(L"uMsg %x Flags %x\n", uMsg, Flags);
+
+    Result = GetSoundDeviceInstanceHandle(SoundDeviceInstance, &Handle);
+    SND_ASSERT( Result == MMSYSERR_NOERROR );
+
+    ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+    DeviceInfo.hDevice = Handle;
+    DeviceInfo.DeviceType = MIXER_DEVICE_TYPE;
+    DeviceInfo.Flags = Flags;
+
+    MixLine = (LPMIXERLINEW)Parameter;
+    MixControls = (LPMIXERLINECONTROLSW)Parameter;
+    MixDetails = (LPMIXERCONTROLDETAILS)Parameter;
+
+#ifdef USE_MMIXER_LIB
+    switch(uMsg)
+    {
+        case MXDM_GETLINEINFO:
+            return WdmAudGetLineInfo(SoundDeviceInstance->Handle, MixLine, Flags);
+        case MXDM_GETLINECONTROLS:
+            return WdmAudGetLineControls(SoundDeviceInstance->Handle, MixControls, Flags);
+       case MXDM_SETCONTROLDETAILS:
+            return WdmAudSetControlDetails(SoundDeviceInstance->Handle, MixDetails, Flags);
+            break;
+       case MXDM_GETCONTROLDETAILS:
+            return WdmAudGetControlDetails(SoundDeviceInstance->Handle, MixDetails, Flags);
+            break;
+       default:
+           SND_ASSERT(0);
+           return MMSYSERR_NOTSUPPORTED;
+    }
+#endif
+
+
+    switch(uMsg)
+    {
+        case MXDM_GETLINEINFO:
+            RtlCopyMemory(&DeviceInfo.u.MixLine, MixLine, sizeof(MIXERLINEW));
+            IoControlCode = IOCTL_GETLINEINFO;
+            break;
+        case MXDM_GETLINECONTROLS:
+            RtlCopyMemory(&DeviceInfo.u.MixControls, MixControls, sizeof(MIXERLINECONTROLSW));
+            IoControlCode = IOCTL_GETLINECONTROLS;
+            break;
+       case MXDM_SETCONTROLDETAILS:
+            RtlCopyMemory(&DeviceInfo.u.MixDetails, MixDetails, sizeof(MIXERCONTROLDETAILS));
+            IoControlCode = IOCTL_SETCONTROLDETAILS;
+            break;
+       case MXDM_GETCONTROLDETAILS:
+            RtlCopyMemory(&DeviceInfo.u.MixDetails, MixDetails, sizeof(MIXERCONTROLDETAILS));
+            IoControlCode = IOCTL_GETCONTROLDETAILS;
+            break;
+       default:
+           SND_ASSERT(0);
+           return MMSYSERR_NOTSUPPORTED;
+    }
+
+    Result = SyncOverlappedDeviceIoControl(KernelHandle,
+                                           IoControlCode,
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           (LPVOID) &DeviceInfo,
+                                           sizeof(WDMAUD_DEVICE_INFO),
+                                           NULL);
+
+    if ( ! MMSUCCESS(Result) )
+    {
+        return Result;
+    }
+
+    switch(uMsg)
+    {
+        case MXDM_GETLINEINFO:
+        {
+            RtlCopyMemory(MixLine, &DeviceInfo.u.MixLine, sizeof(MIXERLINEW));
+            break;
+        }
+    }
+
+    return Result;
+}
+
+
 MMRESULT
 PopulateWdmDeviceList(
+    HANDLE Handle,
     MMDEVICE_TYPE DeviceType)
 {
     MMRESULT Result;
@@ -37,13 +812,10 @@ PopulateWdmDeviceList(
     MMFUNCTION_TABLE FuncTable;
     DWORD i;
 
+    VALIDATE_MMSYS_PARAMETER( Handle != INVALID_HANDLE_VALUE );
     VALIDATE_MMSYS_PARAMETER( IS_VALID_SOUND_DEVICE_TYPE(DeviceType) );
 
-#ifdef USE_MMIXER_LIB
-    Result = WdmAudGetNumDevsByMMixer(DeviceType, &DeviceCount);
-#else
-    Result = WdmAudGetNumWdmDevsByLegacy(DeviceType, &DeviceCount);
-#endif
+    Result = GetNumWdmDevs(Handle, DeviceType, &DeviceCount);
 
     if ( ! MMSUCCESS(Result) )
     {
@@ -66,52 +838,33 @@ PopulateWdmDeviceList(
 
         /* Set up our function table */
         ZeroMemory(&FuncTable, sizeof(MMFUNCTION_TABLE));
-#ifdef USE_MMIXER_LIB
-        FuncTable.GetCapabilities = WdmAudGetCapabilitiesByMMixer;
-        FuncTable.Open = WdmAudOpenSoundDeviceByMMixer;
-        FuncTable.Close = WdmAudCloseSoundDeviceByMMixer;
-        FuncTable.GetDeviceInterfaceString = WdmAudGetDeviceInterfaceStringByMMixer;
-#else
-        FuncTable.GetCapabilities = WdmAudGetCapabilitiesByLegacy;
-        FuncTable.Open = WdmAudOpenSoundDeviceByLegacy;
-        FuncTable.Close = WdmAudCloseSoundDeviceByLegacy;
-        FuncTable.GetDeviceInterfaceString = WdmAudGetDeviceInterfaceStringByLegacy;
-#endif
-
+        FuncTable.GetCapabilities = GetWdmDeviceCapabilities;
         FuncTable.QueryWaveFormatSupport = QueryWdmWaveDeviceFormatSupport;
         if (DeviceType == MIXER_DEVICE_TYPE)
         {
-#ifdef USE_MMIXER_LIB
-            FuncTable.SetWaveFormat = WdmAudSetMixerDeviceFormatByMMixer;
-            FuncTable.QueryMixerInfo = WdmAudQueryMixerInfoByMMixer;
-#else
-            FuncTable.SetWaveFormat = WdmAudSetMixerDeviceFormatByLegacy;
-            FuncTable.QueryMixerInfo = WdmAudQueryMixerInfoByLegacy;
-#endif
+            FuncTable.SetWaveFormat = SetWdmMixerDeviceFormat;
+            FuncTable.QueryMixerInfo = QueryMixerInfo;
+        }
+        else
+        {
+            FuncTable.SetWaveFormat = SetWdmWaveDeviceFormat;
         }
 
         if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
         {
-#ifdef USE_MMIXER_LIB
-            FuncTable.SetWaveFormat = WdmAudSetWdmWaveDeviceFormatByMMixer;
-            FuncTable.SetState = WdmAudSetWdmWaveStateByMMixer;
-            FuncTable.ResetStream = WdmAudResetStreamByMMixer;
-            FuncTable.GetPos = WdmAudGetWdmPositionByMMixer;
-#else
-            FuncTable.SetWaveFormat = WdmAudSetWaveDeviceFormatByLegacy;
-            FuncTable.SetState = WdmAudSetWaveStateByLegacy;
-            FuncTable.ResetStream = WdmAudResetStreamByLegacy;
-            FuncTable.GetPos = WdmAudGetWavePositionByLegacy;
-#endif
+            FuncTable.SetState = SetWdmWaveState;
+            FuncTable.ResetStream = ResetStream;
+        }
 
-#ifdef USE_MMIXER_LIB
-            FuncTable.CommitWaveBuffer = WdmAudCommitWaveBufferByMMixer;
-#elif defined (USERMODE_MIXER)
-            FuncTable.CommitWaveBuffer = WriteFileEx_Remixer;
+        FuncTable.Open = OpenWdmSoundDevice;
+        FuncTable.Close = CloseWdmSoundDevice;
+        FuncTable.GetDeviceInterfaceString = GetDeviceInterfaceString;
+#ifndef USERMODE_MIXER
+        FuncTable.CommitWaveBuffer = WriteFileEx_Committer2;
 #else
-            FuncTable.CommitWaveBuffer = WriteFileEx_Committer2;
+        FuncTable.CommitWaveBuffer = WriteFileEx_Remixer;
 #endif
-        }
+        FuncTable.GetPos = GetWdmPosition;
 
         SetSoundDeviceFunctionTable(SoundDevice, &FuncTable);
     }
@@ -119,6 +872,8 @@ PopulateWdmDeviceList(
     return MMSYSERR_NOERROR;
 }
 
+
+
 LONG
 APIENTRY
 DriverProc(
@@ -134,6 +889,7 @@ DriverProc(
     {
         case DRV_LOAD :
         {
+            HANDLE Handle;
             SND_TRACE(L"DRV_LOAD\n");
 
             Result = InitEntrypointMutexes();
@@ -141,14 +897,9 @@ DriverProc(
             if ( ! MMSUCCESS(Result) )
                 return 0L;
 
-#ifdef USE_MMIXER_LIB
-            if (!WdmAudInitUserModeMixer())
-            {
-                SND_ERR(L"Failed to initialize mmixer lib\n");
-                return 0;
-            }
-#else
-            if (WdmAudOpenSoundDeviceByLegacy() != MMSYSERR_NOERROR)
+            OpenWdmSoundDevice(NULL, &Handle);
+
+            if ( Handle == INVALID_HANDLE_VALUE )
             {
                 SND_ERR(L"Failed to open \\\\.\\wdmaud\n");
                 CleanupEntrypointMutexes();
@@ -157,16 +908,15 @@ DriverProc(
 
                 return 0L;
             }
-#endif
 
             /* Populate the device lists */
             SND_TRACE(L"Populating device lists\n");
-            PopulateWdmDeviceList(WAVE_OUT_DEVICE_TYPE);
-            PopulateWdmDeviceList(WAVE_IN_DEVICE_TYPE);
-            PopulateWdmDeviceList(MIDI_OUT_DEVICE_TYPE);
-            PopulateWdmDeviceList(MIDI_IN_DEVICE_TYPE);
-            PopulateWdmDeviceList(AUX_DEVICE_TYPE);
-            PopulateWdmDeviceList(MIXER_DEVICE_TYPE);
+            PopulateWdmDeviceList(KernelHandle, WAVE_OUT_DEVICE_TYPE);
+            PopulateWdmDeviceList(KernelHandle, WAVE_IN_DEVICE_TYPE);
+            PopulateWdmDeviceList(KernelHandle, MIDI_OUT_DEVICE_TYPE);
+            PopulateWdmDeviceList(KernelHandle, MIDI_IN_DEVICE_TYPE);
+            PopulateWdmDeviceList(KernelHandle, AUX_DEVICE_TYPE);
+            PopulateWdmDeviceList(KernelHandle, MIXER_DEVICE_TYPE);
 
             SND_TRACE(L"Initialisation complete\n");
 
@@ -177,11 +927,11 @@ DriverProc(
         {
             SND_TRACE(L"DRV_FREE\n");
 
-#ifdef USE_MMIXER_LIB
-            WdmAudCleanupMMixer();
-#else
-            WdmAudCleanupLegacy();
-#endif
+            if ( KernelHandle != INVALID_HANDLE_VALUE )
+            {
+                CloseHandle(KernelHandle);
+                KernelHandle = INVALID_HANDLE_VALUE;
+            }
 
             /* TODO: Clean up the path names! */
             UnlistAllSoundDevices();
@@ -235,6 +985,9 @@ BOOL WINAPI DllMain(
     switch ( fdwReason )
     {
         case DLL_PROCESS_ATTACH :
+#ifdef USE_MMIXER_LIB
+            WdmAudInitUserModeMixer();
+#endif
             SND_TRACE(L"WDMAUD.DRV - Process attached\n");
             break;
         case DLL_PROCESS_DETACH :
index e02425c..697234e 100644 (file)
@@ -20,4 +20,7 @@
 <directory name="null">
        <xi:include href="null/null.rbuild" />
 </directory>
+<directory name="nmidebug">
+       <xi:include href="nmidebug/nmidebug.rbuild" />
+</directory>
 </group>
diff --git a/reactos/drivers/base/nmidebug/nmidebug.c b/reactos/drivers/base/nmidebug/nmidebug.c
new file mode 100644 (file)
index 0000000..875b92c
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * PROJECT:         ReactOS NMI Debug Driver
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            drivers/base/nmidebug/nmidebug.c
+ * PURPOSE:         Driver Code
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <ntddk.h>
+
+/* FUNCTIONS ******************************************************************/
+
+BOOLEAN
+NTAPI
+NmiDbgCallback(IN PVOID Context,
+               IN BOOLEAN Handled)
+{
+    //
+    // Let the user know we are alive
+    //         
+    DbgPrint("NMI Callback entered! Letting the system crash...\n");
+
+    //
+    // Do not handle the NMI
+    //
+    return FALSE;
+}
+     
+NTSTATUS
+NTAPI
+DriverEntry(IN PDRIVER_OBJECT DriverObject,
+            IN PUNICODE_STRING RegistryPath)
+{
+    PAGED_CODE();
+
+    //
+    // Register NMI callback
+    //
+    KeRegisterNmiCallback(&NmiDbgCallback, NULL);
+
+    //
+    // Return success
+    //
+    return STATUS_SUCCESS;
+}
+
+/* EOF */
diff --git a/reactos/drivers/base/nmidebug/nmidebug.rbuild b/reactos/drivers/base/nmidebug/nmidebug.rbuild
new file mode 100644 (file)
index 0000000..5447a4a
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<module name="nmidebug" type="kernelmodedriver" installbase="system32/drivers" installname="nmidebug.sys">
+       <include base="null">.</include>
+       <library>ntoskrnl</library>
+       <library>hal</library>
+       <file>nmidebug.c</file>
+       <file>nmidebug.rc</file>
+</module>
diff --git a/reactos/drivers/base/nmidebug/nmidebug.rc b/reactos/drivers/base/nmidebug/nmidebug.rc
new file mode 100644 (file)
index 0000000..f77708f
--- /dev/null
@@ -0,0 +1,11 @@
+#include <winver.h>
+#include <ntverp.h>
+
+#define        VER_FILETYPE                VFT_DRV
+#define        VER_FILESUBTYPE             VFT2_DRV_SYSTEM
+#define VER_FILEDESCRIPTION_STR     "NMI debug driver"
+#define VER_INTERNALNAME_STR        "NMIDEBUG.SYS"
+#define VER_ORIGINALFILENAME_STR    "NMIDEBUG.SYS"
+#define VER_LANGNEUTRAL
+
+#include "common.ver"
index 4b47ece..1d96051 100644 (file)
 
 NTSTATUS NTAPI
 MupCreate(PDEVICE_OBJECT DeviceObject,
-         PIRP Irp)
+          PIRP Irp)
 {
-  PDEVICE_EXTENSION DeviceExt;
-  PIO_STACK_LOCATION Stack;
-  PFILE_OBJECT FileObject;
-  NTSTATUS Status;
+    PDEVICE_EXTENSION DeviceExt;
+    PIO_STACK_LOCATION Stack;
+    PFILE_OBJECT FileObject;
+    NTSTATUS Status;
 
-  DPRINT("MupCreate() called\n");
+    DPRINT("MupCreate() called\n");
 
-  DeviceExt = DeviceObject->DeviceExtension;
-  ASSERT(DeviceExt);
-  Stack = IoGetCurrentIrpStackLocation (Irp);
-  ASSERT(Stack);
+    DeviceExt = DeviceObject->DeviceExtension;
+    ASSERT(DeviceExt);
+    Stack = IoGetCurrentIrpStackLocation (Irp);
+    ASSERT(Stack);
 
-  FileObject = Stack->FileObject;
+    FileObject = Stack->FileObject;
 
-  DPRINT("FileName: '%wZ'\n", &FileObject->FileName);
+    DPRINT("FileName: '%wZ'\n", &FileObject->FileName);
 
-  Status = STATUS_ACCESS_DENIED;
+    Status = STATUS_ACCESS_DENIED;
 
-  Irp->IoStatus.Information = (NT_SUCCESS(Status)) ? FILE_OPENED : 0;
-  Irp->IoStatus.Status = Status;
+    Irp->IoStatus.Information = (NT_SUCCESS(Status)) ? FILE_OPENED : 0;
+    Irp->IoStatus.Status = Status;
 
-  IoCompleteRequest(Irp,
-                   IO_NO_INCREMENT);
+    IoCompleteRequest(Irp,
+                      IO_NO_INCREMENT);
 
-  return(Status);
+    return Status;
 }
 
 /* EOF */
index 2763417..cf75de6 100644 (file)
@@ -40,9 +40,6 @@
 
 /* FUNCTIONS ****************************************************************/
 
-NTSTATUS NTAPI
-DriverEntry(PDRIVER_OBJECT DriverObject,
-           PUNICODE_STRING RegistryPath)
 /*
  * FUNCTION: Called by the system to initalize the driver
  * ARGUMENTS:
@@ -50,56 +47,59 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
  *           RegistryPath = path to our configuration entries
  * RETURNS: Success or failure
  */
+NTSTATUS NTAPI
+DriverEntry(PDRIVER_OBJECT DriverObject,
+            PUNICODE_STRING RegistryPath)
 {
-  PDEVICE_OBJECT DeviceObject;
-  NTSTATUS Status;
-  UNICODE_STRING DeviceName;
-
-  DPRINT("MUP 0.0.1\n");
-
-  RtlInitUnicodeString(&DeviceName,
-                      L"\\Device\\Mup");
-  Status = IoCreateDevice(DriverObject,
-                         sizeof(DEVICE_EXTENSION),
-                         &DeviceName,
-                         FILE_DEVICE_MULTI_UNC_PROVIDER,
-                         0,
-                         FALSE,
-                         &DeviceObject);
-  if (!NT_SUCCESS(Status))
+    PDEVICE_OBJECT DeviceObject;
+    NTSTATUS Status;
+    UNICODE_STRING DeviceName;
+
+    DPRINT("MUP 0.0.1\n");
+
+    RtlInitUnicodeString(&DeviceName,
+                         L"\\Device\\Mup");
+    Status = IoCreateDevice(DriverObject,
+                            sizeof(DEVICE_EXTENSION),
+                            &DeviceName,
+                            FILE_DEVICE_MULTI_UNC_PROVIDER,
+                            0,
+                            FALSE,
+                            &DeviceObject);
+    if (!NT_SUCCESS(Status))
     {
-      return(Status);
+        return Status;
     }
 
-  /* Initialize driver data */
-  DeviceObject->Flags |= DO_DIRECT_IO;
-//  DriverObject->MajorFunction[IRP_MJ_CLOSE] = NtfsClose;
-  DriverObject->MajorFunction[IRP_MJ_CREATE] = MupCreate;
-  DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = MupCreate;
-  DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = MupCreate;
-//  DriverObject->MajorFunction[IRP_MJ_READ] = NtfsRead;
-//  DriverObject->MajorFunction[IRP_MJ_WRITE] = NtfsWrite;
-//  DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
-//    NtfsFileSystemControl;
-//  DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
-//    NtfsDirectoryControl;
-//  DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =
-//    NtfsQueryInformation;
-//  DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] =
-//    NtfsQueryVolumeInformation;
-//  DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] =
-//    NtfsSetVolumeInformation;
-
-  DriverObject->DriverUnload = NULL;
-
-
-  /* Initialize global data */
-//  DeviceExtensionNtfsGlobalData = DeviceObject->DeviceExtension;
-//  RtlZeroMemory(NtfsGlobalData,
-//             sizeof(NTFS_GLOBAL_DATA));
-//  NtfsGlobalData->DriverObject = DriverObject;
-//  NtfsGlobalData->DeviceObject = DeviceObject;
-
-  return(STATUS_SUCCESS);
+    /* Initialize driver data */
+    DeviceObject->Flags |= DO_DIRECT_IO;
+//    DriverObject->MajorFunction[IRP_MJ_CLOSE] = NtfsClose;
+    DriverObject->MajorFunction[IRP_MJ_CREATE] = MupCreate;
+    DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = MupCreate;
+    DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = MupCreate;
+//    DriverObject->MajorFunction[IRP_MJ_READ] = NtfsRead;
+//    DriverObject->MajorFunction[IRP_MJ_WRITE] = NtfsWrite;
+//    DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
+//        NtfsFileSystemControl;
+//    DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
+//        NtfsDirectoryControl;
+//    DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =
+//        NtfsQueryInformation;
+//    DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] =
+//        NtfsQueryVolumeInformation;
+//    DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] =
+//        NtfsSetVolumeInformation;
+
+    DriverObject->DriverUnload = NULL;
+
+
+    /* Initialize global data */
+//    DeviceExtensionNtfsGlobalData = DeviceObject->DeviceExtension;
+//    RtlZeroMemory(NtfsGlobalData,
+//                  sizeof(NTFS_GLOBAL_DATA));
+//    NtfsGlobalData->DriverObject = DriverObject;
+//    NtfsGlobalData->DeviceObject = DeviceObject;
+
+    return STATUS_SUCCESS;
 }
 
index 3e1e296..ae9200b 100644 (file)
@@ -511,19 +511,18 @@ KsPinPropertyHandler(
                 break;
             }
 
-            Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR);
 
+            Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR);
 
             if (KeyInfo->DataLength + sizeof(WCHAR) > IoStack->Parameters.DeviceIoControl.OutputBufferLength)
             {
-                Status = STATUS_MORE_ENTRIES;
+                Status = STATUS_BUFFER_OVERFLOW;
                 ExFreePool(KeyInfo);
                 break;
             }
 
             RtlMoveMemory(Irp->UserBuffer, &KeyInfo->Data, KeyInfo->DataLength);
             ((LPWSTR)Irp->UserBuffer)[KeyInfo->DataLength / sizeof(WCHAR)] = L'\0';
-            Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR);
             ExFreePool(KeyInfo);
             break;
         case KSPROPERTY_PIN_PROPOSEDATAFORMAT:
index 00bcbda..19106dc 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * PROJECT:         ReactOS HAL
- * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            hal/halx86/generic/bios.c
+ * PROJECT:         ReactOS Hardware Abstraction Layer (HAL)
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            halx86/generic/bios.c
  * PURPOSE:         BIOS Access Routines
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ * PROGRAMMERS:     ReactOS Portable Systems Group
  */
 
 /* INCLUDES *******************************************************************/
 
 /* GLOBALS ********************************************************************/
 
-UCHAR HalpIopmSaveBuffer[0x2000];
+//
+// PTE Data
+//
 ULONG HalpSavedPfn;
 HARDWARE_PTE HalpSavedPte;
-ULONG HalpGpfHandler;
-ULONG HalpBopHandler;
-USHORT HalpSavedIopmBase;
-PUCHAR HalpSavedIoMap;
+
+//
+// IDT Data
+//
+PVOID HalpGpfHandler;
+PVOID HalpBopHandler;
+
+//
+// TSS Data
+//
 ULONG HalpSavedEsp0;
+USHORT HalpSavedTss;
 
-#define GetPdeAddress(x) (PHARDWARE_PTE)(((((ULONG_PTR)(x)) >> 22) << 2) + 0xC0300000)
-#define GetPteAddress(x) (PHARDWARE_PTE)(((((ULONG_PTR)(x)) >> 12) << 2) + 0xC0000000)
+//
+// IOPM Data
+//
+USHORT HalpSavedIopmBase;
+PUSHORT HalpSavedIoMap;
+USHORT HalpSavedIoMapData[32][2];
+ULONG HalpSavedIoMapEntries;
 
 /* FUNCTIONS ******************************************************************/
 
 VOID
 NTAPI
-HalpStoreAndClearIopm(IN PUCHAR IoMap)
+HalpBorrowTss(VOID)
 {
-    ULONG i;
+    USHORT Tss;
+    PKGDTENTRY TssGdt;
+    ULONG_PTR TssLimit;
+    PKTSS TssBase;
+
+    //
+    // Get the current TSS and its GDT entry
+    //
+    Tss = Ke386GetTr();
+    TssGdt = &((PKIPCR)KeGetPcr())->GDT[Tss / sizeof(KGDTENTRY)];
+
+    //
+    // Get the KTSS limit and check if it has IOPM space
+    //
+    TssLimit = TssGdt->LimitLow | TssGdt->HighWord.Bits.LimitHi << 16;
+
+    //
+    // If the KTSS doesn't have enough space this is probably an NMI or DF
+    //
+    if (TssLimit > IOPM_SIZE)
+    {
+        //
+        // We are good to go
+        //
+        HalpSavedTss = 0;
+        return;
+    }
+
+    //
+    // Get the "real" TSS
+    //
+    TssGdt = &((PKIPCR)KeGetPcr())->GDT[KGDT_TSS / sizeof(KGDTENTRY)];
+    TssBase = (PKTSS)(ULONG_PTR)(TssGdt->BaseLow |
+                                 TssGdt->HighWord.Bytes.BaseMid << 16 |
+                                 TssGdt->HighWord.Bytes.BaseHi << 24);
+
+    //
+    // Switch to it
+    //
+    KeGetPcr()->TSS = TssBase;
+
+    //
+    // Set it up
+    //
+    TssGdt->HighWord.Bits.Type = I386_TSS;
+    TssGdt->HighWord.Bits.Pres = 1;
+    TssGdt->HighWord.Bits.Dpl = 0;
+    
+    //
+    // Load new TSS and return old one
+    //
+    Ke386SetTr(KGDT_TSS);
+    HalpSavedTss = Tss;
+}
+
+VOID
+NTAPI
+HalpReturnTss(VOID)
+{
+    PKGDTENTRY TssGdt;
+    PKTSS TssBase;
     
-    /* Backup the old I/O Map */
-    RtlCopyMemory(HalpIopmSaveBuffer, IoMap, 0x2000);
+    //
+    // Get the original TSS
+    //
+    TssGdt = &((PKIPCR)KeGetPcr())->GDT[HalpSavedTss / sizeof(KGDTENTRY)];
+    TssBase = (PKTSS)(ULONG_PTR)(TssGdt->BaseLow |
+                                 TssGdt->HighWord.Bytes.BaseMid << 16 |
+                                 TssGdt->HighWord.Bytes.BaseHi << 24);
+
+    //
+    // Switch to it
+    //
+    KeGetPcr()->TSS = TssBase;
 
-    /* Erase the current one */
-    for (i = 0; i < 0x2000; i++) IoMap[i] = 0;
-    for (i = 0x2000; i < 0x2004; i++) IoMap[i] = 0xFF;
+    //
+    // Set it up
+    //
+    TssGdt->HighWord.Bits.Type = I386_TSS;
+    TssGdt->HighWord.Bits.Pres = 1;
+    TssGdt->HighWord.Bits.Dpl = 0;
+
+    //
+    // Load old TSS
+    //
+    Ke386SetTr(HalpSavedTss);
 }
 
 VOID
 NTAPI
-HalpRestoreIopm(IN PUCHAR IoMap)
+HalpStoreAndClearIopm(VOID)
 {
-    ULONG i;
+    ULONG i, j;
+    PUSHORT Entry = HalpSavedIoMap;
+
+    //
+    // Loop the I/O Map
+    //
+    for (i = j = 0; i < (IOPM_SIZE) / 2; i++)
+    {
+        //
+        // Check for non-FFFF entry
+        //
+        if (*Entry != 0xFFFF)
+        {
+            //
+            // Save it
+            //
+            ASSERT(j < 32);
+            HalpSavedIoMapData[j][0] = i;
+            HalpSavedIoMapData[j][1] = *Entry;
+        }
+
+        //
+        // Clear it
+        //
+        *Entry++ = 0;
+    }
 
-    /* Restore the backed up copy, and initialize it */
-    RtlCopyMemory(IoMap, HalpIopmSaveBuffer, 0x2000);
-    for (i = 0x2000; i < 0x2004; i++) IoMap[i] = 0xFF;
+    //
+    // Terminate it
+    //
+    while (i++ < (IOPM_FULL_SIZE / 2)) *Entry++ = 0xFFFF;
+
+    //
+    // Return the entries we saved
+    //
+    HalpSavedIoMapEntries = j;
+}
+
+VOID
+NTAPI
+HalpRestoreIopm(VOID)
+{
+    ULONG i = HalpSavedIoMapEntries;
+
+    //
+    // Set default state
+    //
+    RtlFillMemory(HalpSavedIoMap, 0xFF, IOPM_FULL_SIZE);
+
+    //
+    // Restore the backed up copy, and initialize it
+    //
+    while (i--) HalpSavedIoMap[HalpSavedIoMapData[i][0]] = HalpSavedIoMapData[i][1];
 }
 
 VOID
@@ -59,89 +199,112 @@ HalpMapRealModeMemory(VOID)
 {
     PHARDWARE_PTE Pte, V86Pte;
     ULONG i;
-    
-    /* Get the page table directory for the lowest meg of memory */
-    Pte = GetPdeAddress(0);
+
+    //
+    // Get the page table directory for the lowest meg of memory
+    //
+    Pte = HalAddressToPde(0);
     HalpSavedPfn = Pte->PageFrameNumber;
     HalpSavedPte = *Pte;
-    
-    /* Map it to the HAL reserved region and make it valid */ 
+
+    //
+    // Map it to the HAL reserved region and make it valid
+    //
     Pte->Valid = 1;
     Pte->Write = 1;
     Pte->Owner = 1;
-    Pte->PageFrameNumber = (GetPdeAddress(0xFFC00000))->PageFrameNumber;
-    
-    /* Flush the TLB by resetting CR3 */
-    __writecr3(__readcr3());
-    
-    /* Now loop the first meg of memory */
+    Pte->PageFrameNumber = (HalAddressToPde(0xFFC00000))->PageFrameNumber;
+
+    //
+    // Flush the TLB
+    //
+    HalpFlushTLB();
+
+    //
+    // Now loop the first meg of memory
+    //
     for (i = 0; i < 0x100000; i += PAGE_SIZE)
     {
-        /* Identity map it */
-        Pte = GetPteAddress((PVOID)i);
+        //
+        // Identity map it
+        //
+        Pte = HalAddressToPte(i);
         Pte->PageFrameNumber = i >> PAGE_SHIFT;
         Pte->Valid = 1;
         Pte->Write = 1;
         Pte->Owner = 1;
     }
-    
-    /* Now get the entry for our real mode V86 code and the target */
-    Pte = GetPteAddress(0x20000);
-    V86Pte = GetPteAddress(&HalpRealModeStart);
+
+    //
+    // Now get the entry for our real mode V86 code and the target
+    //
+    Pte = HalAddressToPte(0x20000);
+    V86Pte = HalAddressToPte(&HalpRealModeStart);
     do
     {
-        /* Map the physical address into our real-mode region */
+        //
+        // Map the physical address into our real-mode region
+        //
         Pte->PageFrameNumber = V86Pte->PageFrameNumber;
         
-        /* Keep going until we've reached the end of our region */
+        //
+        // Keep going until we've reached the end of our region
+        //
         Pte++;
         V86Pte++;
-    } while (V86Pte <= GetPteAddress(&HalpRealModeEnd));
-    
-    /* Flush the TLB by resetting CR3 */
-    __writecr3(__readcr3());
+    } while (V86Pte <= HalAddressToPte(&HalpRealModeEnd));
+
+    //
+    // Flush the TLB
+    //
+    HalpFlushTLB();
 }
 
 VOID
 NTAPI
 HalpSwitchToRealModeTrapHandlers(VOID)
 {
-    ULONG Handler;
-
-    /* Save the current Invalid Opcode and General Protection Fault Handlers */
-    HalpGpfHandler = ((((PKIPCR)KeGetPcr())->IDT[13].ExtendedOffset << 16) &
-                       0xFFFF0000) |
-        (((PKIPCR)KeGetPcr())->IDT[13].Offset & 0xFFFF);
-    HalpBopHandler = ((((PKIPCR)KeGetPcr())->IDT[6].ExtendedOffset << 16) &
-                       0xFFFF0000) |
-        (((PKIPCR)KeGetPcr())->IDT[6].Offset & 0xFFFF);
-    
-    /* Now set our own GPF handler to handle exceptions while in real mode */
-    Handler = (ULONG_PTR)HalpTrap0D;
-    ((PKIPCR)KeGetPcr())->IDT[13].ExtendedOffset =
-        (USHORT)((Handler >> 16) & 0xFFFF);
-    ((PKIPCR)KeGetPcr())->IDT[13].Offset = (USHORT)Handler;
-    
-    /* And our own invalid opcode handler to detect the BOP to get us out */
-    Handler = (ULONG_PTR)HalpTrap06;
-    ((PKIPCR)KeGetPcr())->IDT[6].ExtendedOffset =
-        (USHORT)((Handler >> 16) & 0xFFFF);
-    ((PKIPCR)KeGetPcr())->IDT[6].Offset = (USHORT)Handler;
+    //
+    // Save the current Invalid Opcode and General Protection Fault Handlers
+    //
+    HalpGpfHandler = KeQueryInterruptHandler(13);
+    HalpBopHandler = KeQueryInterruptHandler(6);
+
+    //
+    // Now set our own GPF handler to handle exceptions while in real mode
+    //
+    KeRegisterInterruptHandler(13, HalpTrap0D);
+
+    //
+    // And our own invalid opcode handler to detect the BOP to get us out
+    //
+    KeRegisterInterruptHandler(6, HalpTrap06);
 }
 
 VOID
 NTAPI
 HalpSetupRealModeIoPermissionsAndTask(VOID)
 {
-    /* Save a copy of the I/O Map and delete it */
-    HalpSavedIoMap = (PUCHAR)&(KeGetPcr()->TSS->IoMaps[0]);
-    HalpStoreAndClearIopm(HalpSavedIoMap);
-    
-    /* Save the IOPM and switch to the real-mode one */
+    //
+    // Switch to valid TSS
+    //
+    HalpBorrowTss();
+
+    //
+    // Save a copy of the I/O Map and delete it
+    //
+    HalpSavedIoMap = (PUSHORT)&(KeGetPcr()->TSS->IoMaps[0]);
+    HalpStoreAndClearIopm();
+
+    //
+    // Save the IOPM and switch to the real-mode one
+    //
     HalpSavedIopmBase = KeGetPcr()->TSS->IoMapBase;
     KeGetPcr()->TSS->IoMapBase = KiComputeIopmOffset(1);
-    
-    /* Save our stack pointer */
+
+    //
+    // Save our stack pointer
+    //
     HalpSavedEsp0 = KeGetPcr()->TSS->Esp0; 
 }
 
@@ -149,27 +312,46 @@ VOID
 NTAPI
 HalpRestoreTrapHandlers(VOID)
 {
-    /* We're back, restore the handlers we over-wrote */
-    ((PKIPCR)KeGetPcr())->IDT[13].ExtendedOffset =
-    (USHORT)((HalpGpfHandler >> 16) & 0xFFFF);
-    ((PKIPCR)KeGetPcr())->IDT[13].Offset = (USHORT)HalpGpfHandler;    
-    ((PKIPCR)KeGetPcr())->IDT[6].ExtendedOffset =
-        (USHORT)((HalpBopHandler >> 16) & 0xFFFF);
-    ((PKIPCR)KeGetPcr())->IDT[6].Offset = (USHORT)HalpBopHandler;
+    //
+    // Keep dummy GPF handler in case we get an NMI during V8086
+    //
+    if (!HalpNMIInProgress)
+    {
+        //
+        // Not an NMI -- put back the original handler
+        //
+        KeRegisterInterruptHandler(13, HalpGpfHandler);
+    }
+
+    //
+    // Restore invalid opcode handler
+    //
+    KeRegisterInterruptHandler(6, HalpBopHandler);
 }
 
 VOID
 NTAPI
 HalpRestoreIoPermissionsAndTask(VOID)
 {
-    /* Restore the stack pointer */
+    //
+    // Restore the stack pointer
+    //
     KeGetPcr()->TSS->Esp0 = HalpSavedEsp0;
-    
-    /* Restore the I/O Map */
-    HalpRestoreIopm(HalpSavedIoMap);
-    
-    /* Restore the IOPM */
-    KeGetPcr()->TSS->IoMapBase = HalpSavedIopmBase;    
+
+    //
+    // Restore the I/O Map
+    //
+    HalpRestoreIopm();
+
+    //
+    // Restore the IOPM
+    //
+    KeGetPcr()->TSS->IoMapBase = HalpSavedIopmBase;
+
+    //
+    // Restore the TSS
+    //
+    if (HalpSavedTss) HalpReturnTss();
 }
 
 VOID
@@ -179,24 +361,32 @@ HalpUnmapRealModeMemory(VOID)
     ULONG i;
     PHARDWARE_PTE Pte;
 
-    /* Loop the first meg of memory */
+    //
+    // Loop the first meg of memory
+    //
     for (i = 0; i < 0x100000; i += PAGE_SIZE)
     {
-        /* Invalidate each PTE */
-        Pte = GetPteAddress((PVOID)i);
+        //
+        // Invalidate each PTE
+        //
+        Pte = HalAddressToPte(i);
         Pte->Valid = 0;
         Pte->Write = 0;
         Pte->Owner = 0;
         Pte->PageFrameNumber = 0;
     }
-    
-    /* Restore the PDE for the lowest megabyte of memory */
-    Pte = GetPdeAddress(0);
+
+    //
+    // Restore the PDE for the lowest megabyte of memory
+    //
+    Pte = HalAddressToPde(0);
     *Pte = HalpSavedPte;
     Pte->PageFrameNumber = HalpSavedPfn;
-    
-    /* Flush the TLB by resetting CR3 */
-    __writecr3(__readcr3());
+
+    //
+    // Flush the TLB
+    //
+    HalpFlushTLB();
 }
 
 BOOLEAN
@@ -207,59 +397,64 @@ HalpBiosDisplayReset(VOID)
     PHARDWARE_PTE IdtPte;
     BOOLEAN RestoreWriteProtection = FALSE;
 
-    /* Disable interrupts */
+    //
+    // Disable interrupts
+    //
     Flags = __readeflags();
     _disable();
 
-    /* Map memory available to the V8086 real-mode code */
+    //
+    // Map memory available to the V8086 real-mode code
+    //
     HalpMapRealModeMemory();
 
-    /* 
-     * On P5, the first 7 entries of the IDT are write protected to work around
-     * the cmpxchg8b lock errata. Unprotect them here so we can set our custom
-     * invalid op-code handler.
-     */
-    if (KeGetCurrentPrcb()->CpuType == 5)
-    {
-        /* Get the PTE and check if it is has been write protected yet  */
-        IdtPte = GetPteAddress(((PKIPCR)KeGetPcr())->IDT);
-        if (IdtPte->Write == 0)
-        {
-            /* Remove the protection and flush the TLB */
-            IdtPte->Write = 1;
-            __writecr3(__readcr3());
-            RestoreWriteProtection = TRUE;
-        }
-    }
+    // 
+    // On P5, the first 7 entries of the IDT are write protected to work around
+    // the cmpxchg8b lock errata. Unprotect them here so we can set our custom
+    // invalid op-code handler.
+    //
+    IdtPte = HalAddressToPte(((PKIPCR)KeGetPcr())->IDT);
+    RestoreWriteProtection = IdtPte->Write;
+    IdtPte->Write = 1;
 
-    /* Use special invalid opcode and GPF trap handlers */
+    //
+    // Use special invalid opcode and GPF trap handlers
+    //
     HalpSwitchToRealModeTrapHandlers();
 
-    /* Configure the IOPM and TSS */
+    //
+    // Configure the IOPM and TSS
+    //
     HalpSetupRealModeIoPermissionsAndTask();
 
-    /* Now jump to real mode */
+    //
+    // Now jump to real mode
+    //
     HalpBiosCall();
 
-    /* Restore kernel trap handlers */
+    //
+    // Restore kernel trap handlers
+    //
     HalpRestoreTrapHandlers();
 
-    /* Check if we removed the write protection before */
-    if (RestoreWriteProtection)
-    {
-        /* Get the PTE, restore the write protection and flush the TLB */
-        IdtPte = GetPteAddress(((PKIPCR)KeGetPcr())->IDT);
-        IdtPte->Write = 0;
-        __writecr3(__readcr3());
-    }
-    
-    /* Restore TSS and IOPM */
+    //
+    // Restore write permission
+    //
+    IdtPte->Write = RestoreWriteProtection;
+
+    //
+    // Restore TSS and IOPM
+    //
     HalpRestoreIoPermissionsAndTask();
     
-    /* Restore low memory mapping */
+    //
+    // Restore low memory mapping
+    //
     HalpUnmapRealModeMemory();
 
-    /* Restore interrupts if they were previously enabled */
+    //
+    // Restore interrupts if they were previously enabled
+    //
     __writeeflags(Flags);
     return TRUE;
 }
index 5dc6d80..55d5f0a 100644 (file)
 _HalpSavedEsp:
     .long 0
 
+_InvalidMsg:
+    .asciz "HAL: An invalid V86 opcode was encountered at address %x:%x\n"
+    
+_InvalidGpfMsg:
+    .asciz "HAL: Trap0D while not in V86 mode\n"
+    
 _UnhandledMsg:
-    .asciz "\n\x7\x7!!! Unhandled or Unexpected Code at line: %lx!!!\n"
+    .asciz "\n\x7\x7!!! Unhandled or Unexpected Code at line: %lx [%s]!!!\n"
 
 /* FUNCTIONS *****************************************************************/
 
@@ -143,8 +149,15 @@ _HalpRealModeEnd:
 .func HalpOpcodeInvalid@0
 _HalpOpcodeInvalid@0:
 
-    /* Unhandled */
-    UNHANDLED_PATH
+    /* This should never happen -- is the IOPM damaged? */
+    push [esi+HALP_BIOS_FRAME_EIP]
+    push [esi+HALP_BIOS_FRAME_CS]
+    push offset _InvalidMsg
+    call _DbgPrint
+    add esp, 12
+    
+    /* Break */
+    int 3
 
     /* Nothing to return */
     xor eax, eax
@@ -376,7 +389,7 @@ _Ki16BitStackException:
     add esp, [eax+KTHREAD_INITIAL_STACK]
 
     /* Switch to good stack segment */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "16-Bit Stack"
 .endfunc
 
 .globl _HalpTrap0D@0
@@ -391,8 +404,13 @@ _HalpTrap0D@0:
     test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
     jnz DoDispatch
 
-    /* Unhandled */
-    UNHANDLED_PATH
+    /* This is weird -- but might happen during an NMI */
+    push offset _InvalidGpfMsg
+    call _DbgPrint
+    add esp, 4
+    
+    /* Loop forever */
+    jmp $
 
 DoDispatch:
     /* Handle the opcode */
index 2f884f2..b949fe2 100644 (file)
@@ -1,25 +1,30 @@
 /*
- * PROJECT:         ReactOS HAL
- * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            hal/halx86/generic/misc.c
- * PURPOSE:         Miscellanous Routines
- * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
- *                  Eric Kohl (ekohl@abo.rhein-zeitung.de)
+ * PROJECT:         ReactOS Hardware Abstraction Layer (HAL)
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            halx86/generic/misc.c
+ * PURPOSE:         NMI, I/O Mapping and x86 Subs
+ * PROGRAMMERS:     ReactOS Portable Systems Group
  */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *******************************************************************/
 
 #include <hal.h>
 #define NDEBUG
 #include <debug.h>
 
-/* PRIVATE FUNCTIONS *********************************************************/
+/* GLOBALS  *******************************************************************/
+
+BOOLEAN HalpNMIInProgress;
+
+/* PRIVATE FUNCTIONS **********************************************************/
 
 VOID
 NTAPI
 HalpCheckPowerButton(VOID)
 {
-    /* Nothing to do on non-ACPI */
+    //
+    // Nothing to do on non-ACPI
+    //
     return;
 }
 
@@ -28,7 +33,9 @@ NTAPI
 HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress,
                         IN ULONG NumberPage)
 {
-    /* Use kernel memory manager I/O map facilities */
+    //
+    // Use kernel memory manager I/O map facilities
+    //
     return MmMapIoSpace(PhysicalAddress,
                         NumberPage << PAGE_SHIFT,
                         MmNonCached);
@@ -39,10 +46,72 @@ NTAPI
 HalpUnmapVirtualAddress(IN PVOID VirtualAddress,
                         IN ULONG NumberPages)
 {
-    /* Use kernel memory manager I/O map facilities */
+    //
+    // Use kernel memory manager I/O map facilities
+    //
     MmUnmapIoSpace(VirtualAddress, NumberPages << PAGE_SHIFT);
 }
 
+VOID
+NTAPI
+HalpFlushTLB(VOID)
+{
+    ULONG Flags, Cr4;
+    INT CpuInfo[4];
+    ULONG_PTR PageDirectory;
+
+    //
+    // Disable interrupts
+    //
+    Flags = __readeflags();
+    _disable();
+
+    //
+    // Get page table directory base
+    //
+    PageDirectory = __readcr3();
+
+    //
+    // Check for CPUID support
+    //
+    if (KeGetCurrentPrcb()->CpuID)
+    {
+        //
+        // Check for global bit in CPU features
+        //
+        __cpuid(CpuInfo, 1);
+        if (CpuInfo[3] & 0x2000)
+        {
+            //
+            // Get current CR4 value
+            //
+            Cr4 = __readcr4();
+
+            //
+            // Disable global pit
+            //
+            __writecr4(Cr4 & ~CR4_PGE);
+
+            //
+            // Flush TLB and re-enable global bit
+            //
+            __writecr3(PageDirectory);
+            __writecr4(Cr4);
+
+            //
+            // Restore interrupts
+            //
+            __writeeflags(Flags);
+        }
+    }
+
+    //
+    // Legacy: just flush TLB
+    //
+    __writecr3(PageDirectory);
+    __writeeflags(Flags);
+}
+
 VOID
 NTAPI
 HalpSetInterruptGate(ULONG index, PVOID address)
@@ -73,32 +142,96 @@ VOID
 NTAPI
 HalHandleNMI(IN PVOID NmiInfo)
 {
-    UCHAR ucStatus;
+    UCHAR NmiStatus;
 
-    /* Get the NMI Flag */
-    ucStatus = READ_PORT_UCHAR((PUCHAR)0x61);
+    //
+    // Don't recurse
+    //
+    if (HalpNMIInProgress++) while (TRUE);
 
-    /* Display NMI failure string */
-    HalDisplayString ("\n*** Hardware Malfunction\n\n");
-    HalDisplayString ("Call your hardware vendor for support\n\n");
+    //
+    // Get the NMI Flag
+    //
+    NmiStatus = READ_PORT_UCHAR((PUCHAR)0x61);
 
-    /* Check for parity error */
-    if (ucStatus & 0x80)
+    //
+    // Switch to boot vieo
+    //
+    if (InbvIsBootDriverInstalled())
     {
-        /* Display message */
-        HalDisplayString ("NMI: Parity Check / Memory Parity Error\n");
+        //
+        // Acquire ownership
+        //
+        InbvAcquireDisplayOwnership();
+        InbvResetDisplay();
+
+        //
+        // Fill the screen
+        //
+        InbvSolidColorFill(0, 0, 639, 479, 1);       
+        InbvSetScrollRegion(0, 0, 639, 479);
+
+        //
+        // Enable text
+        //
+        InbvSetTextColor(15);
+        InbvInstallDisplayStringFilter(NULL);
+        InbvEnableDisplayString(TRUE);
     }
 
-    /* Check for I/O failure */
-    if (ucStatus & 0x40)
+    //
+    // Display NMI failure string
+    //
+    HalDisplayString("\n*** Hardware Malfunction\n\n");
+    HalDisplayString("Call your hardware vendor for support\n\n");
+
+    //
+    // Check for parity error
+    //
+    if (NmiStatus & 0x80)
     {
-        /* Display message */
-        HalDisplayString ("NMI: Channel Check / IOCHK\n");
+        //
+        // Display message
+        //
+        HalDisplayString("NMI: Parity Check / Memory Parity Error\n");
     }
 
-    /* Halt the system */
+    //
+    // Check for I/O failure
+    //
+    if (NmiStatus & 0x40)
+    {
+        //
+        // Display message
+        //
+        HalDisplayString("NMI: Channel Check / IOCHK\n");
+    }
+
+    //
+    // Check for EISA systems
+    //
+    if (HalpBusType == MACHINE_TYPE_EISA)
+    {
+        //
+        // FIXME: Not supported
+        //
+        UNIMPLEMENTED;
+    }
+
+    //
+    // Halt the system
+    //
     HalDisplayString("\n*** The system has halted ***\n");
-    //KeEnterKernelDebugger();
+
+    //
+    // Enter the debugger if possible
+    //
+    //if (!KdDebuggerNotPresent && KdDebuggerEnabled) KeEnterKernelDebugger();
+
+    //
+    // Freeze the system
+    //
+    while (TRUE);
 }
 
 /*
@@ -110,7 +243,9 @@ HalSystemVectorDispatchEntry(IN ULONG Vector,
                              OUT PKINTERRUPT_ROUTINE **FlatDispatch,
                              OUT PKINTERRUPT_ROUTINE *NoConnection)
 {
-    /* Not implemented on x86 */
+    //
+    // Not implemented on x86
+    //
     return 0;
 }
 
@@ -121,7 +256,9 @@ VOID
 NTAPI
 KeFlushWriteBuffer(VOID)
 {
-    /* Not implemented on x86 */
+    //
+    // Not implemented on x86
+    //
     return;
 }
 
index 4b136cb..3cd6fcb 100644 (file)
@@ -29,6 +29,9 @@
 
 /* Internal kernel headers */
 #include "internal/pci.h"
+#define KeGetCurrentThread _KeGetCurrentThread
+#include <internal/i386/ke.h>
+#include <internal/i386/mm.h>
 #ifdef _M_AMD64
 #include "internal/amd64/intrin_i.h"
 #else
index cd6a7c0..69ab046 100644 (file)
     (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
 #define INT_BCD(int)            \
     (UCHAR)(((int / 10) << 4) + (int % 10))
-
+    
+//
+// Mm PTE/PDE to Hal PTE/PDE
+//
+#define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)
+#define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
+    
 typedef struct _IDTUsageFlags
 {
     UCHAR Flags;
@@ -100,6 +106,10 @@ VOID HalpInitPhase1(VOID);
 VOID NTAPI HalpClockInterrupt(VOID);
 VOID NTAPI HalpProfileInterrupt(VOID);
 
+VOID
+NTAPI
+HalpFlushTLB(VOID);
+
 //
 // KD Support
 //
@@ -172,18 +182,6 @@ HalpBiosDisplayReset(
     VOID
 );
 
-ULONG
-NTAPI
-HalpBorrowTss(
-    VOID
-);
-
-ULONG
-NTAPI
-HalpReturnTss(
-    ULONG SavedTss
-);
-
 VOID
 NTAPI
 HalpBiosCall(
@@ -250,6 +248,8 @@ HalpSetInterruptGate(ULONG Index, PVOID Address);
 #endif // !CONFIG_SMP
 #endif // _M_AMD64
 
+extern BOOLEAN HalpNMIInProgress;
+
 extern PVOID HalpRealModeStart;
 extern PVOID HalpRealModeEnd;
 
index 136aaab..c941eae 100644 (file)
 
 /** Deprecated ***************************************************************/
 
-#define _CRT_DEPRECATE_TEXT(_Text) __declspec(deprecated)
+#ifdef __GNUC__
+#define _CRT_DEPRECATE_TEXT(_Text) __attribute__ ((deprecated))
+#elif defined(_MSC_VER)
+#define _CRT_DEPRECATE_TEXT(_Text) __declspec(deprecated(_Text))
+#else
+#define _CRT_DEPRECATE_TEXT(_Text)
+#endif
+
+#ifndef __STDC_WANT_SECURE_LIB__
+#define __STDC_WANT_SECURE_LIB__ 1
+#endif
 
 #ifndef _CRT_INSECURE_DEPRECATE
 # ifdef _CRT_SECURE_NO_DEPRECATE
index c69a48f..0ecde8b 100644 (file)
@@ -101,16 +101,28 @@ extern "C" {
 #define _WSTRING_DEFINED
 
   _CRTIMP wchar_t *__cdecl _wcsdup(const wchar_t *_Str);
-  _CRTIMP wchar_t *__cdecl wcscat(wchar_t *_Dest,const wchar_t *_Source);
+  _CRTIMP _CRT_INSECURE_DEPRECATE(wcsat_s) wchar_t *__cdecl wcscat(wchar_t *_Dest,const wchar_t *_Source);
+#if __STDC_WANT_SECURE_LIB__
+  _CRTIMP errno_t __cdecl wcsat_s(wchar_t * Dest, size_t SizeInWords, const wchar_t * _Source);
+#endif
   _CRTIMP _CONST_RETURN wchar_t *__cdecl wcschr(const wchar_t *_Str,wchar_t _Ch);
   _CRTIMP int __cdecl wcscmp(const wchar_t *_Str1,const wchar_t *_Str2);
-  _CRTIMP wchar_t *__cdecl wcscpy(wchar_t *_Dest,const wchar_t *_Source);
+  _CRTIMP _CRT_INSECURE_DEPRECATE(wcscpy_s) wchar_t *__cdecl wcscpy(wchar_t *_Dest,const wchar_t *_Source);
+#if __STDC_WANT_SECURE_LIB__
+  _CRTIMP errno_t __cdecl wcscpy_s(wchar_t * Dest, size_t SizeInWords, const wchar_t * _Source);
+#endif
   _CRTIMP size_t __cdecl wcscspn(const wchar_t *_Str,const wchar_t *_Control);
-  _CRTIMP size_t __cdecl wcslen(const wchar_t *_Str);
-  _CRTIMP size_t __cdecl wcsnlen(const wchar_t *_Src,size_t _MaxCount);
   _CRTIMP wchar_t *wcsncat(wchar_t *_Dest,const wchar_t *_Source,size_t _Count);
+  _CRTIMP size_t __cdecl wcslen(const wchar_t *_Str);
+  _CRTIMP _CRT_INSECURE_DEPRECATE(wcsnlen_s) size_t __cdecl wcsnlen(const wchar_t *_Src,size_t _MaxCount);
+#if __STDC_WANT_SECURE_LIB__
+  _CRTIMP errno_t __cdecl wcsnlen_s(wchar_t **_Src, size_t _MaxCount);
+#endif
   _CRTIMP int __cdecl wcsncmp(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);
-  _CRTIMP wchar_t *wcsncpy(wchar_t *_Dest,const wchar_t *_Source,size_t _Count);
+  _CRTIMP _CRT_INSECURE_DEPRECATE(wcsncpy_s) wchar_t *wcsncpy(wchar_t *_Dest,const wchar_t *_Source,size_t _Count);
+#if __STDC_WANT_SECURE_LIB__
+  _CRTIMP errno_t __cdecl wcsncpy_s(wchar_t *_Dest, size_t SizeInWords, const wchar_t *_Source ,size_t _Count);
+#endif
   _CRTIMP _CONST_RETURN wchar_t *__cdecl wcspbrk(const wchar_t *_Str,const wchar_t *_Control);
   _CRTIMP _CONST_RETURN wchar_t *__cdecl wcsrchr(const wchar_t *_Str,wchar_t _Ch);
   _CRTIMP size_t __cdecl wcsspn(const wchar_t *_Str,const wchar_t *_Control);
index d356be8..d9a4802 100644 (file)
@@ -101,19 +101,38 @@ extern "C" {
 #define DN_STARTED          0x00000008 /* Is currently configured */
 #define DN_MANUAL           0x00000010 /* Manually installed */
 #define DN_NEED_TO_ENUM     0x00000020 /* May need reenumeration */
-#define DN_NOT_FIRST_TIME   0x00000040 /* Has received a config */
+#define DN_NOT_FIRST_TIME   0x00000040 /* Has received a config (Win9x only) */
 #define DN_HARDWARE_ENUM    0x00000080 /* Enum generates hardware ID */
-#define DN_LIAR             0x00000100 /* Lied about can reconfig once */
-#define DN_HAS_MARK         0x00000200 /* Not CM_Create_DevNode lately */
+#define DN_LIAR             0x00000100 /* Lied about can reconfig once (Win9x only) */
+#define DN_HAS_MARK         0x00000200 /* Not CM_Create_DevNode lately (Win9x only) */
 #define DN_HAS_PROBLEM      0x00000400 /* Need device installer */
 #define DN_FILTERED         0x00000800 /* Is filtered */
-#define DN_MOVED            0x00001000 /* Has been moved */
+#define DN_MOVED            0x00001000 /* Has been moved (Win9x only) */
 #define DN_DISABLEABLE      0x00002000 /* Can be rebalanced */
 #define DN_REMOVABLE        0x00004000 /* Can be removed */
 #define DN_PRIVATE_PROBLEM  0x00008000 /* Has a private problem */
 #define DN_MF_PARENT        0x00010000 /* Multi function parent */
 #define DN_MF_CHILD         0x00020000 /* Multi function child */
-#define DN_WILL_BE_REMOVED  0x00040000 /* Devnode is being removed */
+#define DN_WILL_BE_REMOVED  0x00040000
+#define DN_NOT_FIRST_TIMEE  0x00080000
+#define DN_STOP_FREE_RES    0x00100000
+#define DN_REBAL_CANDIDATE  0x00200000
+#define DN_BAD_PARTIAL      0x00400000
+#define DN_NT_ENUMERATOR    0x00800000
+#define DN_NT_DRIVER        0x01000000
+#define DN_NEEDS_LOCKING    0x02000000
+#define DN_ARM_WAKEUP       0x04000000
+#define DN_APM_ENUMERATOR   0x08000000
+#define DN_APM_DRIVER       0x10000000
+#define DN_SILENT_INSTALL   0x20000000
+#define DN_NO_SHOW_IN_DM    0x40000000
+#define DN_BOOT_LOG_PROB    0x80000000
+
+#define DN_NEED_RESTART          DN_LIAR
+#define DN_DRIVER_BLOCKED        DN_NOT_FIRST_TIME
+#define DN_LEGACY_DRIVER         DN_MOVED
+#define DN_CHILD_WITH_INVALID_ID DN_HAS_MARK
+
 
 typedef enum _PNP_VETO_TYPE {
   PNP_VetoTypeUnknown,
index 5c5d196..5413346 100644 (file)
@@ -230,6 +230,16 @@ typedef RESOURCEID *PRESOURCEID;
 #define CM_REGISTRY_CONFIG                 0x00000200
 #define CM_REGISTRY_BITS                   0x00000301
 
+#define CM_DEVCAP_LOCKSUPPORTED            0x00000001
+#define CM_DEVCAP_EJECTSUPPORTED           0x00000002
+#define CM_DEVCAP_REMOVABLE                0x00000004
+#define CM_DEVCAP_DOCKDEVICE               0x00000008
+#define CM_DEVCAP_UNIQUEID                 0x00000010
+#define CM_DEVCAP_SILENTINSTALL            0x00000020
+#define CM_DEVCAP_RAWDEVICEOK              0x00000040
+#define CM_DEVCAP_SURPRISEREMOVALOK        0x00000080
+#define CM_DEVCAP_HARDWAREDISABLED         0x00000100
+#define CM_DEVCAP_NONDYNAMIC               0x00000200
 
 typedef struct BusNumber_Des_s {
   DWORD  BUSD_Count;
index 7c4027c..b19b31d 100644 (file)
@@ -8578,6 +8578,21 @@ KeRegisterBugCheckCallback(
   IN ULONG  Length,
   IN PUCHAR  Component);
 
+NTKERNELAPI
+PVOID
+NTAPI
+KeRegisterNmiCallback(
+  IN PNMI_CALLBACK CallbackRoutine,
+  IN PVOID Context
+);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeDeregisterNmiCallback(
+  IN PVOID Handle
+);
+
 NTKERNELAPI
 VOID
 FASTCALL
index 6176842..1b351f4 100644 (file)
@@ -274,6 +274,13 @@ HalSetRealTimeClock(
     IN PTIME_FIELDS RtcTime
 );
 
+NTHALAPI
+ULONG
+NTAPI
+HalSetTimeIncrement(
+    IN ULONG Increment
+);
+
 // x86 BIOS emulator
 #ifdef _X86BIOS_
 NTSTATUS
index f0e1be8..e2dbeb6 100644 (file)
@@ -95,7 +95,23 @@ Author:
 //
 #define KTSS_ESP0                               0x4
 #define KTSS_CR3                                0x1C
+#define KTSS_EIP                                0x20
 #define KTSS_EFLAGS                             0x24
+#define KTSS_EAX                                0x28
+#define KTSS_ECX                                0x2C
+#define KTSS_EDX                                0x30
+#define KTSS_EBX                                0x34
+#define KTSS_ESP                                0x38
+#define KTSS_EBP                                0x3C
+#define KTSS_ESI                                0x40
+#define KTSS_EDI                                0x44
+#define KTSS_ES                                 0x48
+#define KTSS_CS                                 0x4C
+#define KTSS_SS                                 0x50
+#define KTSS_DS                                 0x54
+#define KTSS_FS                                 0x58
+#define KTSS_GS                                 0x5C
+#define KTSS_LDT                                0x60
 #define KTSS_IOMAPBASE                          0x66
 #define KTSS_IO_MAPS                            0x68
 
@@ -625,6 +641,26 @@ Author:
 #define SERVICE_DESCRIPTOR_NUMBER               0x000C
 #define SERVICE_DESCRIPTOR_LENGTH               0x0010
 
+//
+// Exception codes
+//
+#define EXCEPTION_DIVIDED_BY_ZERO               0
+#define EXCEPTION_DEBUG                         1
+#define EXCEPTION_NMI                           2
+#define EXCEPTION_INT3                          3
+#define EXCEPTION_BOUND_CHECK                   5
+#define EXCEPTION_INVALID_OPCODE                6
+#define EXCEPTION_NPX_NOT_AVAILABLE             7
+#define EXCEPTION_DOUBLE_FAULT                  8
+#define EXCEPTION_NPX_OVERRUN                   9
+#define EXCEPTION_INVALID_TSS                   0x0A
+#define EXCEPTION_SEGMENT_NOT_PRESENT           0x0B
+#define EXCEPTION_STACK_FAULT                   0x0C
+#define EXCEPTION_GP_FAULT                      0x0D
+#define EXCEPTION_RESERVED_TRAP                 0x0F
+#define EXCEPTION_NPX_ERROR                     0x010
+#define EXCEPTION_ALIGNMENT_CHECK               0x011
+
 //
 // VDM State Pointer
 //
index 5f18370..f88b065 100644 (file)
@@ -129,7 +129,11 @@ Author:
 //
 // IOPM Definitions
 //
+#define IOPM_COUNT              1
+#define IOPM_SIZE               8192
+#define IOPM_FULL_SIZE          8196
 #define IO_ACCESS_MAP_NONE      0
+#define IOPM_DIRECTION_MAP_SIZE 32
 #define IOPM_OFFSET             FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
 #define KiComputeIopmOffset(MapNumber)              \
     (MapNumber == IO_ACCESS_MAP_NONE) ?             \
@@ -708,8 +712,8 @@ typedef struct _KIPCR
 //
 typedef struct _KiIoAccessMap
 {
-    UCHAR DirectionMap[32];
-    UCHAR IoMap[8196];
+    UCHAR DirectionMap[IOPM_DIRECTION_MAP_SIZE];
+    UCHAR IoMap[IOPM_FULL_SIZE];
 } KIIO_ACCESS_MAP;
 
 typedef struct _KTSS
@@ -747,8 +751,8 @@ typedef struct _KTSS
     USHORT Reserved8;
     USHORT Flags;
     USHORT IoMapBase;
-    KIIO_ACCESS_MAP IoMaps[1];
-    UCHAR IntDirectionMap[32];
+    KIIO_ACCESS_MAP IoMaps[IOPM_COUNT];
+    UCHAR IntDirectionMap[IOPM_DIRECTION_MAP_SIZE];
 } KTSS, *PKTSS;
 
 //
index 9997bf1..d472fd8 100644 (file)
@@ -291,6 +291,13 @@ enum HotkeyPrefix
     HotkeyPrefixHide   = 2
 };
 
+enum PaletteFlags
+{
+    PaletteFlagsHasAlpha        = 1,
+    PaletteFlagsGrayScale       = 2,
+    PaletteFlagsHalftone        = 4
+};
+
 enum ImageCodecFlags
 {
     ImageCodecFlagsEncoder          = 1,
@@ -455,6 +462,7 @@ typedef enum FontStyle FontStyle;
 typedef enum StringFormatFlags StringFormatFlags;
 typedef enum HotkeyPrefix HotkeyPrefix;
 typedef enum PenAlignment GpPenAlignment;
+typedef enum PaletteFlags PaletteFlags;
 typedef enum ImageCodecFlags ImageCodecFlags;
 typedef enum CombineMode CombineMode;
 typedef enum FlushIntention FlushIntention;
index c06d951..cd97a70 100644 (file)
@@ -45,6 +45,7 @@ GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap*,INT,INT,ARGB*);
 GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap*,GDIPCONST GpRect*,UINT,
     PixelFormat,BitmapData*);
 GpStatus WINGDIPAPI GdipBitmapSetPixel(GpBitmap*,INT,INT,ARGB);
+GpStatus WINGDIPAPI GdipBitmapSetResolution(GpBitmap*,REAL,REAL);
 GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap*,BitmapData*);
 GpStatus WINGDIPAPI GdipCloneBitmapArea(REAL,REAL,REAL,REAL,PixelFormat,GpBitmap*,GpBitmap**);
 GpStatus WINGDIPAPI GdipCloneBitmapAreaI(INT,INT,INT,INT,PixelFormat,GpBitmap*,GpBitmap**);
@@ -62,24 +63,35 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromStreamICM(IStream*,GpBitmap**);
 GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap*,HBITMAP*,ARGB);
 GpStatus WINGDIPAPI GdipCreateHICONFromBitmap(GpBitmap*,HICON*);
 GpStatus WINGDIPAPI GdipDeleteEffect(CGpEffect*);
+GpStatus WINGDIPAPI GdipSetEffectParameters(CGpEffect*,const VOID*,const UINT);
 
 /* Brush */
 GpStatus WINGDIPAPI GdipCloneBrush(GpBrush*,GpBrush**);
 GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush*);
 GpStatus WINGDIPAPI GdipGetBrushType(GpBrush*,GpBrushType*);
 
+/* CachedBitmap */
+GpStatus WINGDIPAPI GdipCreateCachedBitmap(GpBitmap*,GpGraphics*,
+    GpCachedBitmap**);
+GpStatus WINGDIPAPI GdipDeleteCachedBitmap(GpCachedBitmap*);
+GpStatus WINGDIPAPI GdipDrawCachedBitmap(GpGraphics*,GpCachedBitmap*,INT,INT);
+
 /* CustomLineCap */
 GpStatus WINGDIPAPI GdipCloneCustomLineCap(GpCustomLineCap*,GpCustomLineCap**);
 GpStatus WINGDIPAPI GdipCreateCustomLineCap(GpPath*,GpPath*,GpLineCap,REAL,
     GpCustomLineCap**);
 GpStatus WINGDIPAPI GdipDeleteCustomLineCap(GpCustomLineCap*);
 GpStatus WINGDIPAPI GdipGetCustomLineCapBaseCap(GpCustomLineCap*,GpLineCap*);
+GpStatus WINGDIPAPI GdipSetCustomLineCapBaseCap(GpCustomLineCap*,GpLineCap);
 GpStatus WINGDIPAPI GdipGetCustomLineCapBaseInset(GpCustomLineCap*,REAL*);
+GpStatus WINGDIPAPI GdipSetCustomLineCapBaseInset(GpCustomLineCap*,REAL);
 GpStatus WINGDIPAPI GdipSetCustomLineCapStrokeCaps(GpCustomLineCap*,GpLineCap,
     GpLineCap);
 GpStatus WINGDIPAPI GdipGetCustomLineCapStrokeJoin(GpCustomLineCap*,GpLineJoin*);
 GpStatus WINGDIPAPI GdipSetCustomLineCapStrokeJoin(GpCustomLineCap*,GpLineJoin);
 GpStatus WINGDIPAPI GdipGetCustomLineCapWidthScale(GpCustomLineCap*,REAL*);
+GpStatus WINGDIPAPI GdipSetCustomLineCapWidthScale(GpCustomLineCap*,REAL);
+GpStatus WINGDIPAPI GdipSetCustomLineCapBaseInset(GpCustomLineCap*,REAL);
 
 /* Font */
 GpStatus WINGDIPAPI GdipCloneFont(GpFont*,GpFont**);
@@ -104,6 +116,8 @@ GpStatus WINGDIPAPI GdipNewInstalledFontCollection(GpFontCollection**);
 GpStatus WINGDIPAPI GdipNewPrivateFontCollection(GpFontCollection**);
 GpStatus WINGDIPAPI GdipDeletePrivateFontCollection(GpFontCollection**);
 GpStatus WINGDIPAPI GdipPrivateAddFontFile(GpFontCollection*, GDIPCONST WCHAR*);
+GpStatus WINGDIPAPI GdipPrivateAddMemoryFont(GpFontCollection*,
+        GDIPCONST void*,INT);
 GpStatus WINGDIPAPI GdipGetFontCollectionFamilyCount(GpFontCollection*, INT*);
 GpStatus WINGDIPAPI GdipGetFontCollectionFamilyList(GpFontCollection*, INT,
         GpFontFamily*[], INT*);
@@ -134,6 +148,7 @@ GpStatus WINGDIPAPI GdipCreateFromHDC(HDC,GpGraphics**);
 GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC,HANDLE,GpGraphics**);
 GpStatus WINGDIPAPI GdipCreateFromHWND(HWND,GpGraphics**);
 GpStatus WINGDIPAPI GdipCreateFromHWNDICM(HWND,GpGraphics**);
+HPALETTE WINGDIPAPI GdipCreateHalftonePalette(void);
 GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *);
 GpStatus WINGDIPAPI GdipDrawArc(GpGraphics*,GpPen*,REAL,REAL,REAL,REAL,REAL,REAL);
 GpStatus WINGDIPAPI GdipDrawArcI(GpGraphics*,GpPen*,INT,INT,INT,INT,REAL,REAL);
@@ -151,6 +166,8 @@ GpStatus WINGDIPAPI GdipDrawCurve2(GpGraphics*,GpPen*,GDIPCONST GpPointF*,INT,RE
 GpStatus WINGDIPAPI GdipDrawCurve2I(GpGraphics*,GpPen*,GDIPCONST GpPoint*,INT,REAL);
 GpStatus WINGDIPAPI GdipDrawCurve3(GpGraphics*,GpPen*,GDIPCONST GpPointF*,INT,INT,INT,REAL);
 GpStatus WINGDIPAPI GdipDrawCurve3I(GpGraphics*,GpPen*,GDIPCONST GpPoint*,INT,INT,INT,REAL);
+GpStatus WINGDIPAPI GdipDrawDriverString(GpGraphics*,GDIPCONST UINT16*,INT,
+    GDIPCONST GpFont*,GDIPCONST GpBrush*,GDIPCONST PointF*,INT,GDIPCONST GpMatrix*);
 GpStatus WINGDIPAPI GdipDrawEllipse(GpGraphics*,GpPen*,REAL,REAL,REAL,REAL);
 GpStatus WINGDIPAPI GdipDrawEllipseI(GpGraphics*,GpPen*,INT,INT,INT,INT);
 GpStatus WINGDIPAPI GdipDrawImage(GpGraphics*,GpImage*,REAL,REAL);
@@ -217,6 +234,8 @@ GpStatus WINGDIPAPI GdipGetCompositingQuality(GpGraphics*,CompositingQuality*);
 GpStatus WINGDIPAPI GdipGetDC(GpGraphics*,HDC*);
 GpStatus WINGDIPAPI GdipGetDpiX(GpGraphics*,REAL*);
 GpStatus WINGDIPAPI GdipGetDpiY(GpGraphics*,REAL*);
+GpStatus WINGDIPAPI GdipGetImageDecoders(UINT,UINT,ImageCodecInfo*);
+GpStatus WINGDIPAPI GdipGetImageDecodersSize(UINT*,UINT*);
 GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage*,GpGraphics**);
 GpStatus WINGDIPAPI GdipGetInterpolationMode(GpGraphics*,InterpolationMode*);
 GpStatus WINGDIPAPI GdipGetNearestColor(GpGraphics*,ARGB*);
@@ -238,9 +257,17 @@ GpStatus WINGDIPAPI GdipIsVisibleRectI(GpGraphics*,INT,INT,INT,INT,BOOL*);
 GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics*, GDIPCONST WCHAR*,
     INT, GDIPCONST GpFont*, GDIPCONST RectF*, GDIPCONST GpStringFormat*, INT,
     GpRegion**);
+GpStatus WINGDIPAPI GdipMeasureDriverString(GpGraphics*,GDIPCONST UINT16*,INT,
+    GDIPCONST GpFont*,GDIPCONST PointF*,INT,GDIPCONST GpMatrix*,RectF*);
 GpStatus WINGDIPAPI GdipMeasureString(GpGraphics*,GDIPCONST WCHAR*,INT,
     GDIPCONST GpFont*,GDIPCONST RectF*,GDIPCONST GpStringFormat*,RectF*,INT*,INT*);
 GpStatus WINGDIPAPI GdipMultiplyWorldTransform(GpGraphics*,GDIPCONST GpMatrix*,GpMatrixOrder);
+GpStatus WINGDIPAPI GdipRecordMetafileFileName(GDIPCONST WCHAR*,HDC,EmfType,
+    GDIPCONST GpRectF*,MetafileFrameUnit,GDIPCONST WCHAR*,GpMetafile**);
+GpStatus WINGDIPAPI GdipRecordMetafileFileNameI(GDIPCONST WCHAR*,HDC,EmfType,
+    GDIPCONST GpRect*,MetafileFrameUnit,GDIPCONST WCHAR*,GpMetafile**);
+GpStatus WINGDIPAPI GdipRecordMetafileI(HDC,EmfType,GDIPCONST GpRect*,
+    MetafileFrameUnit,GDIPCONST WCHAR*,GpMetafile**);
 GpStatus WINGDIPAPI GdipReleaseDC(GpGraphics*,HDC);
 GpStatus WINGDIPAPI GdipResetClip(GpGraphics*);
 GpStatus WINGDIPAPI GdipResetWorldTransform(GpGraphics*);
@@ -249,6 +276,7 @@ GpStatus WINGDIPAPI GdipRotateWorldTransform(GpGraphics*,REAL,GpMatrixOrder);
 GpStatus WINGDIPAPI GdipSaveGraphics(GpGraphics*,GraphicsState*);
 GpStatus WINGDIPAPI GdipScaleWorldTransform(GpGraphics*,REAL,REAL,GpMatrixOrder);
 GpStatus WINGDIPAPI GdipSetClipHrgn(GpGraphics*,HRGN,CombineMode);
+GpStatus WINGDIPAPI GdipSetClipGraphics(GpGraphics*,GpGraphics*,CombineMode);
 GpStatus WINGDIPAPI GdipSetClipPath(GpGraphics*,GpPath*,CombineMode);
 GpStatus WINGDIPAPI GdipSetClipRect(GpGraphics*,REAL,REAL,REAL,REAL,CombineMode);
 GpStatus WINGDIPAPI GdipSetClipRectI(GpGraphics*,INT,INT,INT,INT,CombineMode);
@@ -259,6 +287,7 @@ GpStatus WINGDIPAPI GdipSetInterpolationMode(GpGraphics*,InterpolationMode);
 GpStatus WINGDIPAPI GdipSetPageScale(GpGraphics*,REAL);
 GpStatus WINGDIPAPI GdipSetPageUnit(GpGraphics*,GpUnit);
 GpStatus WINGDIPAPI GdipSetPixelOffsetMode(GpGraphics*,PixelOffsetMode);
+GpStatus WINGDIPAPI GdipSetRenderingOrigin(GpGraphics*,INT,INT);
 GpStatus WINGDIPAPI GdipSetSmoothingMode(GpGraphics*,SmoothingMode);
 GpStatus WINGDIPAPI GdipSetTextContrast(GpGraphics*,UINT);
 GpStatus WINGDIPAPI GdipSetTextRenderingHint(GpGraphics*,TextRenderingHint);
@@ -336,6 +365,15 @@ GpStatus WINGDIPAPI GdipSetPathFillMode(GpPath*,GpFillMode);
 GpStatus WINGDIPAPI GdipSetPathMarker(GpPath*);
 GpStatus WINGDIPAPI GdipStartPathFigure(GpPath*);
 GpStatus WINGDIPAPI GdipTransformPath(GpPath*,GpMatrix*);
+GpStatus WINGDIPAPI GdipWarpPath(GpPath*,GpMatrix*,GDIPCONST GpPointF*,INT,REAL,
+    REAL,REAL,REAL,WarpMode,REAL);
+GpStatus WINGDIPAPI GdipWidenPath(GpPath*,GpPen*,GpMatrix*,REAL);
+
+/* HatchBrush */
+GpStatus WINGDIPAPI GdipCreateHatchBrush(HatchStyle,ARGB,ARGB,GpHatch**);
+GpStatus WINGDIPAPI GdipGetHatchBackgroundColor(GpHatch*,ARGB*);
+GpStatus WINGDIPAPI GdipGetHatchForegroundColor(GpHatch*,ARGB*);
+GpStatus WINGDIPAPI GdipGetHatchStyle(GpHatch*,HatchStyle*);
 
 /* Image */
 GpStatus WINGDIPAPI GdipCloneImage(GpImage*, GpImage**);
@@ -352,6 +390,7 @@ GpStatus WINGDIPAPI GdipGetImageHeight(GpImage*,UINT*);
 GpStatus WINGDIPAPI GdipGetImageHorizontalResolution(GpImage*,REAL*);
 GpStatus WINGDIPAPI GdipGetImageItemData(GpImage*,ImageItemData*);
 GpStatus WINGDIPAPI GdipGetImagePalette(GpImage*,ColorPalette*,INT);
+GpStatus WINGDIPAPI GdipGetImagePaletteSize(GpImage*,INT*);
 GpStatus WINGDIPAPI GdipGetImagePixelFormat(GpImage*,PixelFormat*);
 GpStatus WINGDIPAPI GdipGetImageRawFormat(GpImage*,GUID*);
 GpStatus WINGDIPAPI GdipGetImageThumbnail(GpImage*,UINT,UINT,GpImage**,GetThumbnailImageAbort,VOID*);
@@ -363,6 +402,7 @@ GpStatus WINGDIPAPI GdipGetPropertyIdList(GpImage*,UINT,PROPID*);
 GpStatus WINGDIPAPI GdipGetPropertyItem(GpImage*,PROPID,UINT,PropertyItem*);
 GpStatus WINGDIPAPI GdipGetPropertyItemSize(GpImage*,PROPID,UINT*);
 GpStatus WINGDIPAPI GdipGetPropertySize(GpImage*,UINT*,UINT*);
+GpStatus WINGDIPAPI GdipImageForceValidation(GpImage*);
 GpStatus WINGDIPAPI GdipImageGetFrameCount(GpImage*,GDIPCONST GUID*,UINT*);
 GpStatus WINGDIPAPI GdipImageGetFrameDimensionsCount(GpImage*,UINT*);
 GpStatus WINGDIPAPI GdipImageGetFrameDimensionsList(GpImage*,GUID*,UINT);
@@ -382,11 +422,27 @@ GpStatus WINGDIPAPI GdipSetPropertyItem(GpImage*,GDIPCONST PropertyItem*);
 /* ImageAttributes */
 GpStatus WINGDIPAPI GdipCreateImageAttributes(GpImageAttributes**);
 GpStatus WINGDIPAPI GdipDisposeImageAttributes(GpImageAttributes*);
+GpStatus WINGDIPAPI GdipSetImageAttributesCachedBackground(GpImageAttributes*,
+    BOOL);
 GpStatus WINGDIPAPI GdipSetImageAttributesColorKeys(GpImageAttributes*,
     ColorAdjustType,BOOL,ARGB,ARGB);
 GpStatus WINGDIPAPI GdipSetImageAttributesColorMatrix(GpImageAttributes*,
     ColorAdjustType,BOOL,GDIPCONST ColorMatrix*,GDIPCONST ColorMatrix*,
     ColorMatrixFlags);
+GpStatus WINGDIPAPI GdipSetImageAttributesGamma(GpImageAttributes*,
+    ColorAdjustType,BOOL,REAL);
+GpStatus WINGDIPAPI GdipSetImageAttributesNoOp(GpImageAttributes*,
+    ColorAdjustType,BOOL);
+GpStatus WINGDIPAPI GdipSetImageAttributesOutputChannel(GpImageAttributes*,
+    ColorAdjustType,BOOL,ColorChannelFlags);
+GpStatus WINGDIPAPI GdipSetImageAttributesOutputChannelColorProfile(
+    GpImageAttributes*,ColorAdjustType,BOOL,GDIPCONST WCHAR*);
+GpStatus WINGDIPAPI GdipSetImageAttributesRemapTable(GpImageAttributes*,
+    ColorAdjustType,BOOL,UINT,GDIPCONST ColorMap*);
+GpStatus WINGDIPAPI GdipSetImageAttributesThreshold(GpImageAttributes*,
+    ColorAdjustType,BOOL,REAL);
+GpStatus WINGDIPAPI GdipSetImageAttributesToIdentity(GpImageAttributes*,
+    ColorAdjustType);
 GpStatus WINGDIPAPI GdipSetImageAttributesWrapMode(GpImageAttributes*,WrapMode,
     ARGB,BOOL);
 
@@ -412,11 +468,22 @@ GpStatus WINGDIPAPI GdipSetLineBlend(GpLineGradient*,GDIPCONST REAL*,
     GDIPCONST REAL*,INT);
 GpStatus WINGDIPAPI GdipGetLineBlend(GpLineGradient*,REAL*,REAL*,INT);
 GpStatus WINGDIPAPI GdipGetLineBlendCount(GpLineGradient*,INT*);
+GpStatus WINGDIPAPI GdipSetLinePresetBlend(GpLineGradient*,GDIPCONST ARGB*,
+    GDIPCONST REAL*,INT);
+GpStatus WINGDIPAPI GdipGetLinePresetBlend(GpLineGradient*,ARGB*,REAL*,INT);
+GpStatus WINGDIPAPI GdipGetLinePresetBlendCount(GpLineGradient*,INT*);
+GpStatus WINGDIPAPI GdipResetLineTransform(GpLineGradient*);
+GpStatus WINGDIPAPI GdipRotateLineTransform(GpLineGradient*,REAL,GpMatrixOrder);
+GpStatus WINGDIPAPI GdipScaleLineTransform(GpLineGradient*,REAL,REAL,
+    GpMatrixOrder);
 GpStatus WINGDIPAPI GdipSetLineColors(GpLineGradient*,ARGB,ARGB);
 GpStatus WINGDIPAPI GdipSetLineGammaCorrection(GpLineGradient*,BOOL);
 GpStatus WINGDIPAPI GdipSetLineSigmaBlend(GpLineGradient*,REAL,REAL);
+GpStatus WINGDIPAPI GdipSetLineTransform(GpLineGradient*,GDIPCONST GpMatrix*);
 GpStatus WINGDIPAPI GdipSetLineLinearBlend(GpLineGradient*,REAL,REAL);
 GpStatus WINGDIPAPI GdipSetLineWrapMode(GpLineGradient*,GpWrapMode);
+GpStatus WINGDIPAPI GdipTranslateLineTransform(GpLineGradient*,REAL,REAL,
+    GpMatrixOrder);
 
 /* Matrix */
 GpStatus WINGDIPAPI GdipCloneMatrix(GpMatrix*,GpMatrix**);
@@ -462,6 +529,10 @@ GpStatus WINGDIPAPI GdipGetMetafileHeaderFromMetafile(GpMetafile*,MetafileHeader
 GpStatus WINGDIPAPI GdipGetMetafileHeaderFromStream(IStream*,MetafileHeader*);
 GpStatus WINGDIPAPI GdipGetMetafileHeaderFromWmf(HMETAFILE,GDIPCONST WmfPlaceableFileHeader*,MetafileHeader*);
 
+/* Notification */
+GpStatus WINAPI GdiplusNotificationHook(ULONG_PTR*);
+void WINAPI GdiplusNotificationUnhook(ULONG_PTR);
+
 /* PathGradientBrush */
 GpStatus WINGDIPAPI GdipCreatePathGradient(GDIPCONST GpPointF*,INT,GpWrapMode,GpPathGradient**);
 GpStatus WINGDIPAPI GdipCreatePathGradientI(GDIPCONST GpPoint*,INT,GpWrapMode,GpPathGradient**);
@@ -475,6 +546,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientCenterPointI(GpPathGradient*,GpPoint*);
 GpStatus WINGDIPAPI GdipGetPathGradientFocusScales(GpPathGradient*,REAL*,REAL*);
 GpStatus WINGDIPAPI GdipGetPathGradientGammaCorrection(GpPathGradient*,BOOL*);
 GpStatus WINGDIPAPI GdipGetPathGradientPointCount(GpPathGradient*,INT*);
+GpStatus WINGDIPAPI GdipSetPathGradientPresetBlend(GpPathGradient*,
+    GDIPCONST ARGB*,GDIPCONST REAL*,INT);
 GpStatus WINGDIPAPI GdipGetPathGradientRect(GpPathGradient*,GpRectF*);
 GpStatus WINGDIPAPI GdipGetPathGradientRectI(GpPathGradient*,GpRect*);
 GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorsWithCount(GpPathGradient*,
@@ -522,6 +595,8 @@ GpStatus WINGDIPAPI GdipGetPenDashCount(GpPen*,INT*);
 GpStatus WINGDIPAPI GdipGetPenDashOffset(GpPen*,REAL*);
 GpStatus WINGDIPAPI GdipGetPenDashStyle(GpPen*,GpDashStyle*);
 GpStatus WINGDIPAPI GdipGetPenMode(GpPen*,GpPenAlignment*);
+GpStatus WINGDIPAPI GdipResetPenTransform(GpPen*);
+GpStatus WINGDIPAPI GdipScalePenTransform(GpPen*,REAL,REAL,GpMatrixOrder);
 GpStatus WINGDIPAPI GdipSetPenBrushFill(GpPen*,GpBrush*);
 GpStatus WINGDIPAPI GdipSetPenColor(GpPen*,ARGB);
 GpStatus WINGDIPAPI GdipSetPenCompoundArray(GpPen*,GDIPCONST REAL*,INT);
@@ -620,9 +695,15 @@ GpStatus WINGDIPAPI GdipCreateTextureIAI(GpImage*,GDIPCONST GpImageAttributes*,
     INT,INT,INT,INT,GpTexture**);
 GpStatus WINGDIPAPI GdipGetTextureTransform(GpTexture*,GpMatrix*);
 GpStatus WINGDIPAPI GdipGetTextureWrapMode(GpTexture*, GpWrapMode*);
+GpStatus WINGDIPAPI GdipMultiplyTextureTransform(GpTexture*,
+    GDIPCONST GpMatrix*,GpMatrixOrder);
 GpStatus WINGDIPAPI GdipResetTextureTransform(GpTexture*);
+GpStatus WINGDIPAPI GdipRotateTextureTransform(GpTexture*,REAL,GpMatrixOrder);
+GpStatus WINGDIPAPI GdipScaleTextureTransform(GpTexture*,REAL,REAL,GpMatrixOrder);
 GpStatus WINGDIPAPI GdipSetTextureTransform(GpTexture *,GDIPCONST GpMatrix*);
 GpStatus WINGDIPAPI GdipSetTextureWrapMode(GpTexture*, GpWrapMode);
+GpStatus WINGDIPAPI GdipTranslateTextureTransform(GpTexture*,REAL,REAL,
+    GpMatrixOrder);
 
 /* Without wrapper methods */
 GpStatus WINGDIPAPI GdipCreateStreamOnFile(GDIPCONST WCHAR*,UINT,IStream**);
index 51a60ba..42a00cb 100644 (file)
@@ -31,6 +31,10 @@ DEFINE_GUID(ImageFormatTIFF,      0xb96b3cb1, 0x728, 0x11d3, 0x9d, 0x7b, 0, 0, 0
 DEFINE_GUID(ImageFormatEXIF,      0xb96b3cb2, 0x728, 0x11d3, 0x9d, 0x7b, 0, 0, 0xf8, 0x1e, 0xf3, 0x2e);
 DEFINE_GUID(ImageFormatIcon,      0xb96b3cb5, 0x728, 0x11d3, 0x9d, 0x7b, 0, 0, 0xf8, 0x1e, 0xf3, 0x2e);
 
+DEFINE_GUID(FrameDimensionTime,       0x6aedbd6d, 0x3fb5, 0x418a, 0x83, 0xa6, 0x7f, 0x45, 0x22, 0x9d, 0xc8, 0x72);
+DEFINE_GUID(FrameDimensionPage,       0x7462dc86, 0x6180, 0x4c7e, 0x8e, 0x3f, 0xee, 0x73, 0x33, 0xa7, 0xa4, 0x83);
+DEFINE_GUID(FrameDimensionResolution, 0x84236f7b, 0x3bd3, 0x428f, 0x8d, 0xab, 0x4e, 0xa1, 0x43, 0x9c, 0xa3, 0x15);
+
 enum ImageLockMode
 {
     ImageLockModeRead           = 1,
index d483ac8..ca1549f 100644 (file)
@@ -1628,6 +1628,7 @@ BOOL WINAPI GetNamedPipeInfo(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD);
 #if (_WIN32_WINNT >= 0x0501)
 VOID WINAPI GetNativeSystemInfo(LPSYSTEM_INFO);
 #endif
+BOOL WINAPI GetEventLogInformation(HANDLE,DWORD,LPVOID,DWORD,LPDWORD);
 BOOL WINAPI GetNumberOfEventLogRecords(HANDLE,PDWORD);
 BOOL WINAPI GetOldestEventLogRecord(HANDLE,PDWORD);
 BOOL WINAPI GetOverlappedResult(HANDLE,LPOVERLAPPED,PDWORD,BOOL);
index cf3fc89..b6d03bd 100644 (file)
@@ -482,6 +482,11 @@ interface pnp
         [in] DWORD ulFlags);
 
     /* Function 29 */
+    cpp_quote("#define PNP_DEVINST_MOVE        0x2")
+    cpp_quote("#define PNP_DEVINST_SETUP       0x3")
+    cpp_quote("#define PNP_DEVINST_ENABLE      0x4")
+    cpp_quote("#define PNP_DEVINST_DISABLE     0x5")
+    cpp_quote("#define PNP_DEVINST_REENUMERATE 0x7")
     DWORD PNP_DeviceInstanceAction(
         [in] handle_t hBinding,
         [in] DWORD ulMajorAction,
index 4727272..28c4abd 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <ntsecapi.h>
 
+#define LSASS_MAX_LOGON_PROCESS_NAME_LENGTH 127
+
 #define LSASS_REQUEST_REGISTER_LOGON_PROCESS               (1)
 #define LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE          (2)
 #define LSASS_REQUEST_DEREGISTER_LOGON_PROCESS             (3)
@@ -96,6 +98,16 @@ typedef struct _LSASS_REGISTER_LOGON_PROCESS_REPLY
    LSA_OPERATIONAL_MODE OperationalMode;
 } LSASS_REGISTER_LOGON_PROCESS_REPLY, *PLSASS_REGISTER_LOGON_PROCESS_REPLY;
 
+
+typedef struct _LSASS_CONNECT_DATA
+{
+    NTSTATUS Status;
+    LSA_OPERATIONAL_MODE OperationalMode;
+    ULONG Length;
+    CHAR LogonProcessNameBuffer[LSASS_MAX_LOGON_PROCESS_NAME_LENGTH + 1];
+} LSASS_CONNECT_DATA, *PLSASS_CONNECT_DATA;
+
+
 typedef union _LSASS_REQUEST
 {
    PORT_MESSAGE Header;
index 98eab10..a6b5e11 100644 (file)
@@ -21,7 +21,7 @@
 #define KERNEL_VERSION_MINOR        4
 #define KERNEL_VERSION_PATCH_LEVEL  0
 
-#define COPYRIGHT_YEAR              "2009"
+#define COPYRIGHT_YEAR              "2010"
 
 /* KERNEL_VERSION_BUILD_TYPE is L"SVN", L"RC1", L"RC2" or L"" (for the release) */
 #define KERNEL_VERSION_BUILD_TYPE   L"SVN"
index 09477ed..0b2e499 100644 (file)
@@ -853,6 +853,7 @@ MMixerInitializeFilter(
 
     // initialize line list
     InitializeListHead(&MixerInfo->LineList);
+    InitializeListHead(&MixerInfo->EventList);
 
     // now allocate an array which will receive the indices of the pin 
     // which has a ADC / DAC nodetype in its path
@@ -1075,3 +1076,79 @@ MMixerSetupFilter(
     // done
     return Status;
 }
+
+
+MIXER_STATUS
+MMixerAddEvent(
+    IN PMIXER_CONTEXT MixerContext,
+    IN OUT LPMIXER_INFO MixerInfo,
+    IN ULONG NodeId)
+{
+    KSE_NODE Property;
+    LPEVENT_ITEM EventData;
+    ULONG BytesReturned;
+    MIXER_STATUS Status;
+
+    EventData = (LPEVENT_ITEM)MixerContext->AllocEventData(sizeof(LIST_ENTRY));
+    if (!EventData)
+    {
+        // not enough memory
+        return MM_STATUS_NO_MEMORY;
+    }
+
+    /* setup request */
+    Property.Event.Set = KSEVENTSETID_AudioControlChange;
+    Property.Event.Flags = KSEVENT_TYPE_TOPOLOGY|KSEVENT_TYPE_ENABLE;
+    Property.Event.Id = KSEVENT_CONTROL_CHANGE;
+
+    Property.NodeId = NodeId;
+    Property.Reserved = 0;
+
+    Status = MixerContext->Control(MixerInfo->hMixer, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSP_NODE), (PVOID)EventData, sizeof(KSEVENTDATA), &BytesReturned);
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // failed to add event
+        MixerContext->FreeEventData(EventData);
+        return Status;
+    }
+
+    //store event
+    InsertTailList(&MixerInfo->EventList, &EventData->Entry);
+    return Status;
+}
+
+MIXER_STATUS
+MMixerAddEvents(
+    IN PMIXER_CONTEXT MixerContext,
+    IN OUT LPMIXER_INFO MixerInfo)
+{
+    PKSMULTIPLE_ITEM NodeTypes;
+    ULONG Index;
+    MIXER_STATUS Status;
+    LPGUID Guid;
+
+    // get filter node types
+    Status = MMixerGetFilterTopologyProperty(MixerContext, MixerInfo->hMixer, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // failed
+        return Status;
+    }
+
+    for(Index = 0; Index < NodeTypes->Count; Index++)
+    {
+        Guid = MMixerGetNodeType(NodeTypes, Index);
+        if (IsEqualGUID(&KSNODETYPE_VOLUME, Guid) || IsEqualGUID(&KSNODETYPE_MUTE, Guid))
+        {
+            //add an event for volume / mute controls
+            //TODO: extra control types
+            MMixerAddEvent(MixerContext, MixerInfo, Index);
+        }
+    }
+
+    // free node types
+    MixerContext->Free(NodeTypes);
+
+    return MM_STATUS_SUCCESS;
+}
index d66116a..a05f2a7 100644 (file)
@@ -100,6 +100,9 @@ MMixerOpen(
     // FIXME
     // handle event notification
 
+    Status = MMixerAddEvents(MixerContext, MixerInfo);
+
+
     // store result
     *MixerHandle = (HANDLE)MixerInfo;
 
@@ -163,7 +166,7 @@ MMixerGetLineInfo(
             return MM_STATUS_INVALID_PARAMETER;
         }
 
-        MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwSource);
+        MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwSource * 0x10000);
         if (MixerLineSrc)
         {
             DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
@@ -422,7 +425,8 @@ MMixerInitialize(
         return MM_STATUS_INVALID_PARAMETER;
     }
 
-    if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open || 
+    if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open ||
+        !MixerContext->AllocEventData || !MixerContext->FreeEventData ||
         !MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey)
     {
         // invalid parameter
index d5c0a46..fa7183d 100644 (file)
@@ -69,6 +69,12 @@ typedef MIXER_STATUS(*PMIXER_OPEN_KEY)(
     IN ULONG DesiredAccess,
     OUT PHANDLE OutKey);
 
+typedef PVOID (*PMIXER_ALLOC_EVENT_DATA)(
+    IN ULONG ExtraBytes);
+
+typedef VOID (*PMIXER_FREE_EVENT_DATA)(
+    IN PVOID EventData);
+
 typedef struct
 {
      ULONG SizeOfStruct;
@@ -83,6 +89,8 @@ typedef struct
      PMIXER_OPEN_KEY OpenKey;
      PMIXER_QUERY_KEY_VALUE QueryKeyValue;
      PMIXER_CLOSEKEY CloseKey;
+     PMIXER_ALLOC_EVENT_DATA AllocEventData;
+     PMIXER_FREE_EVENT_DATA FreeEventData;
 }MIXER_CONTEXT, *PMIXER_CONTEXT;
 
 MIXER_STATUS
index 0cdbd8c..5b582d6 100644 (file)
 #include "mmixer.h"
 
 #include <stdio.h>
-
+#define YDEBUG
 #include <debug.h>
 
+typedef struct
+{
+    KSEVENTDATA EventData;
+    LIST_ENTRY Entry;
+}EVENT_ITEM, *LPEVENT_ITEM;
+
 typedef struct
 {
     LIST_ENTRY    Entry;
@@ -25,6 +31,7 @@ typedef struct
     HANDLE        hMixer;
     LIST_ENTRY    LineList;
     ULONG         ControlId;
+    LIST_ENTRY    EventList;
 }MIXER_INFO, *LPMIXER_INFO;
 
 typedef struct
@@ -268,4 +275,9 @@ MMixerInitializeWaveInfo(
     IN ULONG bWaveIn,
     IN ULONG PinId);
 
+MIXER_STATUS
+MMixerAddEvents(
+    IN PMIXER_CONTEXT MixerContext,
+    IN OUT LPMIXER_INFO MixerInfo);
+
 #endif
index 7bb46f3..f35d167 100644 (file)
@@ -29,6 +29,7 @@ const GUID KSPROPSETID_Audio = {0x45FFAAA0L, 0x6E1B, 0x11D0, {0xBC, 0xF2, 0x44,
 const GUID KSPROPSETID_Pin                     = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
 const GUID KSPROPSETID_General                  = {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
 const GUID KSPROPSETID_Topology                 = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+const GUID KSEVENTSETID_AudioControlChange      = {0xE85E9698L, 0xFA2F, 0x11D1, {0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}};
 
 MIXER_STATUS
 MMixerVerifyContext(
@@ -37,7 +38,8 @@ MMixerVerifyContext(
     if (MixerContext->SizeOfStruct != sizeof(MIXER_CONTEXT))
         return MM_STATUS_INVALID_PARAMETER;
 
-    if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open || 
+    if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open ||
+        !MixerContext->AllocEventData || !MixerContext->FreeEventData ||
         !MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey)
         return MM_STATUS_INVALID_PARAMETER;
 
@@ -129,7 +131,7 @@ MMixerGetSourceMixerLineByLineId(
     while(Entry != &MixerInfo->LineList)
     {
         MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry);
-        DPRINT("dwLineID %x dwLineID %x\n", MixerLineSrc->Line.dwLineID, dwLineID);
+        DPRINT("dwLineID %x dwLineID %x MixerLineSrc %p\n", MixerLineSrc->Line.dwLineID, dwLineID, MixerLineSrc);
         if (MixerLineSrc->Line.dwLineID == dwLineID)
             return MixerLineSrc;
 
index d8e3f4d..330937f 100644 (file)
@@ -34,6 +34,9 @@
        <directory name="inflib">
                <xi:include href="inflib/inflib.rbuild" />
        </directory>
+       <directory name="lsalib">
+               <xi:include href="lsalib/lsalib.rbuild" />
+       </directory>
        <directory name="nls">
                <xi:include href="nls/nls.rbuild" />
        </directory>
diff --git a/reactos/lib/lsalib/lsa.c b/reactos/lib/lsalib/lsa.c
new file mode 100644 (file)
index 0000000..94cd6af
--- /dev/null
@@ -0,0 +1,414 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS system libraries
+ * FILE:            lib/lsalib/lsa.c
+ * PURPOSE:         Client-side LSA functions
+ * UPDATE HISTORY:
+ *                  Created 05/08/00
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ndk/ntndk.h>
+#include <psdk/ntsecapi.h>
+#include <lsass/lsass.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS *******************************************************************/
+
+extern HANDLE Secur32Heap;
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @implemented
+ */
+NTSTATUS WINAPI
+LsaDeregisterLogonProcess(HANDLE LsaHandle)
+{
+    LSASS_REQUEST Request;
+    LSASS_REPLY Reply;
+    NTSTATUS Status;
+
+    Request.Header.u1.s1.DataLength = 0;
+    Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST);
+    Request.Type = LSASS_REQUEST_DEREGISTER_LOGON_PROCESS;
+    Status = ZwRequestWaitReplyPort(LsaHandle,
+                                    &Request.Header,
+                                    &Reply.Header);
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    if (!NT_SUCCESS(Reply.Status))
+    {
+        return Reply.Status;
+    }
+
+    return Status;
+}
+
+
+/*
+ * @unimplemented
+ */
+NTSTATUS WINAPI
+LsaConnectUntrusted(PHANDLE LsaHandle)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS WINAPI
+LsaCallAuthenticationPackage(HANDLE LsaHandle,
+                             ULONG AuthenticationPackage,
+                             PVOID ProtocolSubmitBuffer,
+                             ULONG SubmitBufferLength,
+                             PVOID *ProtocolReturnBuffer,
+                             PULONG ReturnBufferLength,
+                             PNTSTATUS ProtocolStatus)
+{
+    PLSASS_REQUEST Request;
+    PLSASS_REPLY Reply;
+    LSASS_REQUEST RawRequest;
+    LSASS_REPLY RawReply;
+    NTSTATUS Status;
+    ULONG OutBufferSize;
+
+    Request = (PLSASS_REQUEST)&RawRequest;
+    Reply = (PLSASS_REPLY)&RawReply;
+
+    Request->Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) + SubmitBufferLength -
+        sizeof(PORT_MESSAGE);
+    Request->Header.u1.s1.TotalLength =
+        Request->Header.u1.s1.DataLength + sizeof(PORT_MESSAGE);
+    Request->Type = LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE;
+    Request->d.CallAuthenticationPackageRequest.AuthenticationPackage =
+        AuthenticationPackage;
+    Request->d.CallAuthenticationPackageRequest.InBufferLength =
+        SubmitBufferLength;
+    memcpy(Request->d.CallAuthenticationPackageRequest.InBuffer,
+           ProtocolSubmitBuffer,
+           SubmitBufferLength);
+
+    Status = ZwRequestWaitReplyPort(LsaHandle,
+                                    &Request->Header,
+                                    &Reply->Header);
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    if (!NT_SUCCESS(Reply->Status))
+    {
+        return Reply->Status;
+    }
+
+    OutBufferSize = Reply->d.CallAuthenticationPackageReply.OutBufferLength;
+    *ProtocolReturnBuffer = RtlAllocateHeap(Secur32Heap,
+                                            0,
+                                            OutBufferSize);
+    *ReturnBufferLength = OutBufferSize;
+    memcpy(*ProtocolReturnBuffer,
+           Reply->d.CallAuthenticationPackageReply.OutBuffer,
+           *ReturnBufferLength);
+
+    return Status;
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS WINAPI
+LsaFreeReturnBuffer(PVOID Buffer)
+{
+    return RtlFreeHeap(Secur32Heap, 0, Buffer);
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS WINAPI
+LsaLookupAuthenticationPackage(HANDLE LsaHandle,
+                               PLSA_STRING PackageName,
+                               PULONG AuthenticationPackage)
+{
+    NTSTATUS Status;
+    PLSASS_REQUEST Request;
+    LSASS_REQUEST RawRequest;
+    LSASS_REPLY Reply;
+
+    Request = (PLSASS_REQUEST)&RawRequest;
+    Request->Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) + PackageName->Length -
+        sizeof(PORT_MESSAGE);
+    Request->Header.u1.s1.TotalLength = Request->Header.u1.s1.DataLength +
+        sizeof(PORT_MESSAGE);
+    Request->Type = LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE;
+
+    Status = ZwRequestWaitReplyPort(LsaHandle,
+                                    &Request->Header,
+                                    &Reply.Header);
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    if (!NT_SUCCESS(Reply.Status))
+    {
+        return Reply.Status;
+    }
+
+    *AuthenticationPackage = Reply.d.LookupAuthenticationPackageReply.Package;
+
+    return Reply.Status;
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS WINAPI
+LsaLogonUser(HANDLE LsaHandle,
+             PLSA_STRING OriginName,
+             SECURITY_LOGON_TYPE LogonType,
+             ULONG AuthenticationPackage,
+             PVOID AuthenticationInformation,
+             ULONG AuthenticationInformationLength,
+             PTOKEN_GROUPS LocalGroups,
+             PTOKEN_SOURCE SourceContext,
+             PVOID *ProfileBuffer,
+             PULONG ProfileBufferLength,
+             PLUID LogonId,
+             PHANDLE Token,
+             PQUOTA_LIMITS Quotas,
+             PNTSTATUS SubStatus)
+{
+    ULONG RequestLength;
+    ULONG CurrentLength;
+    PLSASS_REQUEST Request;
+    LSASS_REQUEST RawMessage;
+    PLSASS_REPLY Reply;
+    LSASS_REPLY RawReply;
+    NTSTATUS Status;
+
+    RequestLength = sizeof(LSASS_REQUEST) - sizeof(PORT_MESSAGE);
+    RequestLength = RequestLength + (OriginName->Length * sizeof(WCHAR));
+    RequestLength = RequestLength + AuthenticationInformationLength;
+    RequestLength = RequestLength +
+        (LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES));
+
+    CurrentLength = 0;
+    Request = (PLSASS_REQUEST)&RawMessage;
+
+    Request->d.LogonUserRequest.OriginNameLength = OriginName->Length;
+    Request->d.LogonUserRequest.OriginName = (PWSTR)&RawMessage + CurrentLength;
+    memcpy((PWSTR)&RawMessage + CurrentLength,
+           OriginName->Buffer,
+           OriginName->Length * sizeof(WCHAR));
+    CurrentLength = CurrentLength + (OriginName->Length * sizeof(WCHAR));
+
+    Request->d.LogonUserRequest.LogonType = LogonType;
+
+    Request->d.LogonUserRequest.AuthenticationPackage =
+        AuthenticationPackage;
+
+    Request->d.LogonUserRequest.AuthenticationInformation =
+        (PVOID)((ULONG_PTR)&RawMessage + CurrentLength);
+    Request->d.LogonUserRequest.AuthenticationInformationLength =
+        AuthenticationInformationLength;
+    memcpy((PVOID)((ULONG_PTR)&RawMessage + CurrentLength),
+           AuthenticationInformation,
+           AuthenticationInformationLength);
+    CurrentLength = CurrentLength + AuthenticationInformationLength;
+
+    Request->d.LogonUserRequest.LocalGroupsCount = LocalGroups->GroupCount;
+    Request->d.LogonUserRequest.LocalGroups =
+        (PSID_AND_ATTRIBUTES)&RawMessage + CurrentLength;
+    memcpy((PSID_AND_ATTRIBUTES)&RawMessage + CurrentLength,
+           LocalGroups->Groups,
+           LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES));
+
+    Request->d.LogonUserRequest.SourceContext = *SourceContext;
+
+    Request->Type = LSASS_REQUEST_LOGON_USER;
+    Request->Header.u1.s1.DataLength = RequestLength - sizeof(PORT_MESSAGE);
+    Request->Header.u1.s1.TotalLength = RequestLength + sizeof(PORT_MESSAGE);
+
+    Reply = (PLSASS_REPLY)&RawReply;
+
+    Status = ZwRequestWaitReplyPort(LsaHandle,
+                                   &Request->Header,
+                                   &Reply->Header);
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    *SubStatus = Reply->d.LogonUserReply.SubStatus;
+
+    if (!NT_SUCCESS(Reply->Status))
+    {
+        return Status;
+    }
+
+    *ProfileBuffer = RtlAllocateHeap(Secur32Heap,
+                                     0,
+                                     Reply->d.LogonUserReply.ProfileBufferLength);
+    memcpy(*ProfileBuffer,
+           (PVOID)((ULONG)Reply->d.LogonUserReply.Data +
+                   (ULONG)Reply->d.LogonUserReply.ProfileBuffer),
+           Reply->d.LogonUserReply.ProfileBufferLength);
+    *LogonId = Reply->d.LogonUserReply.LogonId;
+    *Token = Reply->d.LogonUserReply.Token;
+    memcpy(Quotas,
+           &Reply->d.LogonUserReply.Quotas,
+           sizeof(Reply->d.LogonUserReply.Quotas));
+
+    return Status;
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS WINAPI
+LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName,
+                        PHANDLE Handle,
+                        PLSA_OPERATIONAL_MODE OperationalMode)
+{
+    UNICODE_STRING PortName; // = RTL_CONSTANT_STRING(L"\\LsaAuthenticationPort");
+    SECURITY_QUALITY_OF_SERVICE SecurityQos;
+    ULONG ConnectInfoLength;
+    NTSTATUS Status;
+    LSASS_CONNECT_DATA ConnectInfo;
+//    LSASS_REQUEST Request;
+//    LSASS_REPLY Reply;
+
+    /* Check the logon process name length */
+    if (LsaLogonProcessName->Length > LSASS_MAX_LOGON_PROCESS_NAME_LENGTH)
+        return STATUS_NAME_TOO_LONG;
+
+    RtlInitUnicodeString(&PortName,
+                         L"\\LsaAuthenticationPort");
+
+    SecurityQos.Length              = sizeof (SecurityQos);
+    SecurityQos.ImpersonationLevel  = SecurityIdentification;
+    SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
+    SecurityQos.EffectiveOnly       = TRUE;
+
+    ConnectInfoLength = sizeof(LSASS_CONNECT_DATA);
+
+    strncpy(ConnectInfo.LogonProcessNameBuffer,
+            LsaLogonProcessName->Buffer,
+            LsaLogonProcessName->Length);
+    ConnectInfo.Length = LsaLogonProcessName->Length;
+    ConnectInfo.LogonProcessNameBuffer[ConnectInfo.Length] = '\0';
+
+    Status = ZwConnectPort(Handle,
+                           &PortName,
+                           &SecurityQos,
+                           NULL,
+                           NULL,
+                           NULL,
+                           &ConnectInfo,
+                           &ConnectInfoLength);
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    return Status;
+#if 0
+    Request.Type = LSASS_REQUEST_REGISTER_LOGON_PROCESS;
+    Request.Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) -
+        sizeof(PORT_MESSAGE);
+    Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST);
+
+    Request.d.RegisterLogonProcessRequest.Length = LsaLogonProcessName->Length;
+    memcpy(Request.d.RegisterLogonProcessRequest.LogonProcessNameBuffer,
+           LsaLogonProcessName->Buffer,
+           Request.d.RegisterLogonProcessRequest.Length);
+
+    Status = ZwRequestWaitReplyPort(*Handle,
+                                    &Request.Header,
+                                    &Reply.Header);
+    if (!NT_SUCCESS(Status))
+    {
+//        NtClose(*Handle);
+//        *Handle = NULL;
+        return Status;
+    }
+
+    if (!NT_SUCCESS(Reply.Status))
+    {
+//        NtClose(*Handle);
+//        *Handle = NULL;
+        return Status;
+    }
+
+    *OperationalMode = Reply.d.RegisterLogonProcessReply.OperationalMode;
+
+    return Reply.Status;
+#endif
+}
+
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+WINAPI
+LsaEnumerateLogonSessions(PULONG LogonSessionCount,
+                          PLUID *LogonSessionList)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+WINAPI
+LsaGetLogonSessionData(PLUID LogonId,
+                       PSECURITY_LOGON_SESSION_DATA *ppLogonSessionData)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+WINAPI
+LsaRegisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass,
+                                    HANDLE NotificationEventHandle)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+WINAPI
+LsaUnregisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass,
+                                      HANDLE NotificationEventHandle)
+{
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
diff --git a/reactos/lib/lsalib/lsalib.rbuild b/reactos/lib/lsalib/lsalib.rbuild
new file mode 100644 (file)
index 0000000..b917351
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
+<module name="lsalib" type="staticlibrary">
+       <include base="lsalib">.</include>
+       <include base="ReactOS">include/reactos/subsys</include>
+       <file>lsa.c</file>
+</module>
index f0bc4b0..0b15a1c 100644 (file)
@@ -27,7 +27,7 @@
                <file>rtlswap.s</file>
                <file>thread.c</file>
        </directory>
-       </if>
+       </if>
        <if property="ARCH" value="arm">
                <directory name="arm">
                        <file>debug_asm.S</file>
index 731100c..b6d1bfb 100644 (file)
@@ -8,7 +8,6 @@
 #define MINGW_HAS_SECURE_API 1
 
 #include <tchar.h>
-#define __STDC_WANT_SECURE_LIB__
 #include <time.h>
 #include "bitsfixup.h"
 
index 845b334..c5eddb5 100644 (file)
Binary files a/reactos/media/inf/machine.inf and b/reactos/media/inf/machine.inf differ
index c03b139..42d7379 100644 (file)
@@ -460,7 +460,7 @@ CmpDoCreate(IN PHHIVE Hive,
         !(ParseContext->CreateOptions & REG_OPTION_VOLATILE))
     {
         /* Children of volatile parents must also be volatile */
-        ASSERT(FALSE);
+        //ASSERT(FALSE);
         Status = STATUS_CHILD_MUST_BE_VOLATILE;
         goto Exit;
     }
index bcb8f8b..5ef7a90 100644 (file)
@@ -594,7 +594,7 @@ QSI_DEF(SystemPerformanceInformation)
     Spi->Spare3Count = 0; /* FIXME */
 
     Spi->ResidentSystemCachePage = MiMemoryConsumers[MC_CACHE].PagesUsed;
-    Spi->ResidentPagedPoolPage = MmPagedPoolSize; /* FIXME */
+    Spi->ResidentPagedPoolPage = MiMemoryConsumers[MC_PPOOL].PagesUsed; /* FIXME */
 
     Spi->ResidentSystemDriverPage = 0; /* FIXME */
     Spi->CcFastReadNoWait = 0; /* FIXME */
index cab336f..78936e0 100644 (file)
@@ -25,35 +25,197 @@ ULONG ExpAltTimeZoneBias;
 ULONG ExpTimeZoneId;
 ULONG ExpTickCountMultiplier;
 ERESOURCE ExpTimeRefreshLock;
+ULONG ExpKernelResolutionCount = 0;
+ULONG ExpTimerResolutionCount = 0;
 
 /* FUNCTIONS ****************************************************************/
 
+/*++
+ * @name ExAcquireTimeRefreshLock
+ *
+ *     The ExReleaseTimeRefreshLock routine acquires the system-wide lock used
+ *     to synchronize clock interrupt frequency changes.
+ *
+ * @param Wait
+ *        If TRUE, the system will block the caller thread waiting for the lock
+ *        to become available. If FALSE, the routine will fail if the lock has
+ *        already been acquired.
+ *
+ * @return Boolean value indicating success or failure of the lock acquisition.
+ *
+ * @remarks None.
+ *
+ *--*/
 BOOLEAN
 NTAPI
-ExAcquireTimeRefreshLock(BOOLEAN Wait)
+ExAcquireTimeRefreshLock(
+    IN BOOLEAN Wait
+    )
 {
-    /* Simply acquire the Resource */
+    /* Block APCs */
     KeEnterCriticalRegion();
+
+    /* Attempt lock acquisition */
     if (!(ExAcquireResourceExclusiveLite(&ExpTimeRefreshLock, Wait)))
     {
-        /* We failed! */
+        /* Lock was not acquired, enable APCs and fail */
         KeLeaveCriticalRegion();
         return FALSE;
     }
 
-    /* Success */
+    /* Lock has been acquired */
     return TRUE;
 }
 
+/*++
+ * @name ExReleaseTimeRefreshLock
+ *
+ *     The ExReleaseTimeRefreshLock routine releases the system-wide lock used
+ *     to synchronize clock interrupt frequency changes.
+ *
+ * @param None.
+ *
+ * @return None.
+ *
+ * @remarks None.
+ *
+ *--*/
 VOID
 NTAPI
-ExReleaseTimeRefreshLock(VOID)
+ExReleaseTimeRefreshLock(
+    VOID
+    )
 {
-    /* Simply release the Resource */
+    /* Release the lock and re-enable APCs */
     ExReleaseResourceLite(&ExpTimeRefreshLock);
     KeLeaveCriticalRegion();
 }
 
+/*++
+ * @name ExSetTimerResolution
+ * @exported
+ *
+ *     The KiInsertQueueApc routine modifies the frequency at which the system
+ *     clock interrupts.
+ *
+ * @param DesiredTime
+ *        Specifies the amount of time that should elapse between each timer
+ *        interrupt, in 100-nanosecond units.
+ *
+ *        This parameter is ignored if SetResolution is FALSE.
+ *
+ * @param SetResolution
+ *        If TRUE, the call is a request to set the clock interrupt frequency to
+ *        the value specified by DesiredTime. If FALSE, the call is a request to
+ *        restore the clock interrupt frequency to the system's default value.
+ *
+ * @return New timer resolution, in 100-nanosecond ticks.
+ *
+ * @remarks (1) The clock frequency is changed only if the DesiredTime value is
+ *              less than the current setting.
+ *
+ *          (2) The routine just returns the current setting if the DesiredTime
+ *              value is greater than what is currently set.
+ *
+ *          (3) If the DesiredTime value is less than the system clock can
+ *              support, the routine uses the smallest resolution the system can
+ *              support, and returns that value.
+ *
+ *          (4) If multiple drivers have attempted to change the clock interrupt
+ *              frequency, the system will only restore the default frequency
+ *              once ALL drivers have called the routine with SetResolution set
+ *              to FALSE.
+ *
+ *          NB. This routine synchronizes with IRP_MJ_POWER requests through the
+ *              TimeRefreshLock.
+ *
+ *--*/
+ULONG
+NTAPI
+ExSetTimerResolution(IN ULONG DesiredTime,
+                     IN BOOLEAN SetResolution)
+{
+    ULONG CurrentIncrement;
+
+    /* Wait for clock interrupt frequency and power requests to synchronize */
+    ExAcquireTimeRefreshLock(TRUE);
+
+    /* Obey remark 2*/
+    CurrentIncrement = KeTimeIncrement;
+
+    /* Check the type of operation this is */
+    if (SetResolution)
+    {
+        /*
+         * If this is the first kernel change, bump the timer resolution change
+         * count, then bump the kernel change count as well.
+         *
+         * These two variables are tracked differently since user-mode processes
+         * can also change the timer resolution through the NtSetTimerResolution
+         * system call. A per-process flag in the EPROCESS then stores the per-
+         * process change state.
+         *
+         */
+        if (!ExpKernelResolutionCount++) ExpTimerResolutionCount++;
+
+        /* Obey remark 3 */
+        if (DesiredTime < KeMinimumIncrement) DesiredTime = KeMinimumIncrement;
+
+        /* Obey remark 1 */
+        if (DesiredTime < KeTimeIncrement)
+        {
+            /* Force this thread on CPU zero, since we don't want it to drift */
+            KeSetSystemAffinityThread(1);
+
+            /* Now call the platform driver (HAL) to make the change */
+            CurrentIncrement = HalSetTimeIncrement(DesiredTime);
+
+            /* Put the thread back to its original affinity */
+            KeRevertToUserAffinityThread();
+
+            /* Finally, keep track of the new value in the kernel */
+            KeTimeIncrement = CurrentIncrement;
+        }
+    }
+    else
+    {
+        /* First, make sure that a driver has actually changed the resolution */
+        if (ExpKernelResolutionCount)
+        {
+            /* Obey remark 4 */
+            if (--ExpKernelResolutionCount)
+            {
+                /*
+                 * All kernel drivers have requested the original frequency to
+                 * be restored, but there might still be user processes with an
+                 * ongoing clock interrupt frequency change, so make sure that
+                 * this isn't the case.
+                 */
+                if (--ExpTimerResolutionCount)
+                {
+                    /* Force this thread on one CPU so that it doesn't drift */
+                    KeSetSystemAffinityThread(1);
+
+                    /* Call the HAL to restore the frequency to its default */
+                    CurrentIncrement = HalSetTimeIncrement(KeMaximumIncrement);
+
+                    /* Put the thread back to its original affinity */
+                    KeRevertToUserAffinityThread();
+
+                    /* Finally, keep track of the new value in the kernel */
+                    KeTimeIncrement = CurrentIncrement;
+                }
+            }
+        }
+    }
+
+    /* Release the clock interrupt frequency lock since changes are done */
+    ExReleaseTimeRefreshLock();
+
+    /* And return the current value -- which could reflect the new frequency */
+    return CurrentIncrement;
+}
+
 VOID
 NTAPI
 ExUpdateSystemTimeFromCmos(IN BOOLEAN UpdateInterruptTime,
@@ -305,18 +467,6 @@ ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime,
     SystemTime->QuadPart = LocalTime->QuadPart + ExpTimeZoneBias.QuadPart;
 }
 
-/*
- * @unimplemented
- */
-ULONG
-NTAPI
-ExSetTimerResolution(IN ULONG DesiredTime,
-                     IN BOOLEAN SetResolution)
-{
-    UNIMPLEMENTED;
-    return 0;
-}
-
 /*
  * @implemented
  */
index e445ca4..fff9d4b 100644 (file)
 //
 // @name UNHANDLED_PATH
 //
-// This macro TODO
+// This macro prints out that the current code path is not expected yet
 //
 // @param None
 //
 // @remark None.
 //
-.macro UNHANDLED_PATH
+.macro UNHANDLED_PATH Reason
+
+    /* Push reason */
+    push offset 1f
+
     /* Get EIP */
     call $+5
 
     /* Print debug message */
     push offset _UnhandledMsg
     call _DbgPrint
+    add esp, 12
+
+    /* Loop indefinitely */
+    jmp $
+
+1:
+    .asciz \Reason
+.endm
+
+//
+// @name UNHANDLED_V86_PATH
+//
+// This macro prints out that the current code path is for unhandled VDM support
+//
+// @param None
+//
+// @remark None.
+//
+.macro UNHANDLED_V86_PATH
+    /* Get EIP */
+    call $+5
+
+    /* Print debug message */
+    push offset _V86UnhandledMsg
+    call _DbgPrint
     add esp, 8
 
     /* Loop indefinitely */
diff --git a/reactos/ntoskrnl/include/internal/i386/callconv.s b/reactos/ntoskrnl/include/internal/i386/callconv.s
new file mode 100644 (file)
index 0000000..eb1d1a8
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * PROJECT:         ReactOS Source Development Kit (SDK)
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            include/ddk/api/callconv.s
+ * PURPOSE:         x86 Calling Convention Helpers
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+//
+// @name CountArg
+// 
+// This macro counts the number of arguments in the ArgList and returns
+// the value in cCount.
+//
+// @param cCount - Count of arguments
+// @param ArgList - Argument list
+//
+// @remark None.
+//
+.macro CountArg cCount:req,ArgList:vararg
+
+       cCount = 0
+
+       .ifnb \ArgList
+       .irp arg, \ArgList
+                       cCount = cCount+1
+               .endr
+       .endif
+.endm
+
+//
+// @name RevPush
+// 
+// This macro pushes the arguments in ArgList in the reverse order
+// and returns the number of arguments in cCount
+//
+// @param cCount - Count of arguments
+// @param ArgList - Argument list
+//
+// @remark None.
+//
+.macro RevPush cCount:req,ArgList:vararg
+       LOCAL index, x
+
+       CountArg cCount, ArgList
+
+       index = cCount
+       .rept cCount
+               x = 0
+               .irp arg,ArgList
+                       x=x+1
+                       .ifeq index-x
+                               push arg
+                               .exitm
+                       .endif
+               .endr
+
+               index = index-1
+       .endr
+.endm
+
+//
+// @name stdCallCall
+// 
+// This macro performs a function call using the STDCALL convention and applies
+// the correct name decoration required based on the stack bytes
+//
+// @param Func - Function name
+// @param N - Number of stack bytes for arguments
+//
+// @remark None.
+//
+.macro stdCallCall Func:req,N:req
+       .ifdef __imp_&Func&@&N
+       call dword ptr [__imp_&Func&@&N]
+       .else
+       call Func&@&N
+       .endif
+.endm
+
+//
+// @name stdCall
+// 
+// This macro pushes the arguments required for a function call using the
+// STDCALL convention and then issues the call
+//
+// @param Func - Function name
+// @param ArgList - Argument list
+//
+// @remark None.
+//
+.macro stdCall Func:req,ArgList:vararg
+       LOCAL Bytes
+
+       RevPush Bytes,ArgList
+       Bytes = Bytes*4
+
+       stdCallCall Func, %(Bytes)
+.endm
index d7d8b72..ba47d5d 100644 (file)
@@ -65,6 +65,53 @@ extern ULONG Ke386CacheAlignment;
 //
 #define KeGetTrapFrameInterruptState(TrapFrame) \
         BooleanFlagOn((TrapFrame)->EFlags, EFLAGS_INTERRUPT_MASK)
+        
+//
+// Registers an interrupt handler with an IDT vector
+//
+FORCEINLINE
+VOID
+KeRegisterInterruptHandler(IN ULONG Vector,
+                           IN PVOID Handler)
+{                           
+    UCHAR Entry;
+    ULONG_PTR Address;
+    PKIPCR Pcr = (PKIPCR)KeGetPcr();
+
+    //
+    // Get the entry from the HAL
+    //
+    Entry = HalVectorToIDTEntry(Vector);
+    Address = PtrToUlong(Handler);
+
+    //
+    // Now set the data
+    //
+    Pcr->IDT[Entry].ExtendedOffset = (USHORT)(Address >> 16);
+    Pcr->IDT[Entry].Offset = (USHORT)Address;
+}
+
+//
+// Returns the registered interrupt handler for a given IDT vector
+//
+FORCEINLINE
+PVOID
+KeQueryInterruptHandler(IN ULONG Vector)
+{
+    PKIPCR Pcr = (PKIPCR)KeGetPcr();
+    UCHAR Entry;
+
+    //
+    // Get the entry from the HAL
+    //
+    Entry = HalVectorToIDTEntry(Vector);
+
+    //
+    // Read the entry from the IDT
+    //
+    return (PVOID)(((Pcr->IDT[Entry].ExtendedOffset << 16) & 0xFFFF0000) |
+                    (Pcr->IDT[Entry].Offset & 0xFFFF));
+}
 
 //
 // Invalidates the TLB entry for a specified address
index b32ddd5..2e158fa 100644 (file)
@@ -64,6 +64,14 @@ typedef struct _DPC_QUEUE_ENTRY
     PVOID Context;
 } DPC_QUEUE_ENTRY, *PDPC_QUEUE_ENTRY;
 
+typedef struct _KNMI_HANDLER_CALLBACK
+{
+    struct _KNMI_HANDLER_CALLBACK* Next;
+    PNMI_CALLBACK Callback;
+    PVOID Context;
+    PVOID Handle;
+} KNMI_HANDLER_CALLBACK, *PKNMI_HANDLER_CALLBACK;
+
 typedef PCHAR
 (NTAPI *PKE_BUGCHECK_UNICODE_TO_ANSI)(
     IN PUNICODE_STRING Unicode,
@@ -71,6 +79,8 @@ typedef PCHAR
     IN ULONG Length
 );
 
+extern PKNMI_HANDLER_CALLBACK KiNmiCallbackListHead;
+extern KSPIN_LOCK KiNmiCallbackListLock;
 extern PVOID KeUserApcDispatcher;
 extern PVOID KeUserCallbackDispatcher;
 extern PVOID KeUserExceptionDispatcher;
index 36c4bd4..0c4989a 100644 (file)
@@ -1671,3 +1671,18 @@ _KeTryToAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
     GuardedMutex->SpecialApcDisable = Thread->SpecialApcDisable;
     return TRUE;
 }
+
+
+FORCEINLINE
+VOID
+KiAcquireNmiListLock(OUT PKIRQL OldIrql)
+{
+    KeAcquireSpinLock(&KiNmiCallbackListLock, OldIrql);
+}
+
+FORCEINLINE
+VOID
+KiReleaseNmiListLock(IN KIRQL OldIrql)
+{
+    KeReleaseSpinLock(&KiNmiCallbackListLock, OldIrql);
+}
index 44f537f..492d4a1 100644 (file)
@@ -18,8 +18,8 @@
 
 typedef struct _PNP_EVENT_ENTRY
 {
-  LIST_ENTRY ListEntry;
-  PLUGPLAY_EVENT_BLOCK Event;
+    LIST_ENTRY ListEntry;
+    PLUGPLAY_EVENT_BLOCK Event;
 } PNP_EVENT_ENTRY, *PPNP_EVENT_ENTRY;
 
 
@@ -95,21 +95,21 @@ IopQueueTargetDeviceEvent(const GUID *Guid,
 static NTSTATUS
 IopRemovePlugPlayEvent(VOID)
 {
-  /* Remove a pnp event entry from the tail of the queue */
-  if (!IsListEmpty(&IopPnpEventQueueHead))
-  {
-    ExFreePool(RemoveTailList(&IopPnpEventQueueHead));
-  }
-
-  /* Signal the next pnp event in the queue */
-  if (!IsListEmpty(&IopPnpEventQueueHead))
-  {
-    KeSetEvent(&IopPnpNotifyEvent,
-               0,
-               FALSE);
-  }
+    /* Remove a pnp event entry from the tail of the queue */
+    if (!IsListEmpty(&IopPnpEventQueueHead))
+    {
+        ExFreePool(RemoveTailList(&IopPnpEventQueueHead));
+    }
 
-  return STATUS_SUCCESS;
+    /* Signal the next pnp event in the queue */
+    if (!IsListEmpty(&IopPnpEventQueueHead))
+    {
+        KeSetEvent(&IopPnpNotifyEvent,
+                   0,
+                   FALSE);
+    }
+
+    return STATUS_SUCCESS;
 }
 
 static PDEVICE_OBJECT
@@ -148,8 +148,7 @@ IopGetDeviceObjectFromDeviceInstance(PUNICODE_STRING DeviceInstance)
         return NULL;
 
     if (DeviceInstance == NULL ||
-        DeviceInstance->Length == 0
-        )
+        DeviceInstance->Length == 0)
     {
         if (IopRootDeviceNode->PhysicalDeviceObject)
         {
@@ -173,35 +172,39 @@ IopCaptureUnicodeString(PUNICODE_STRING DstName, PUNICODE_STRING SrcName)
     Name.Buffer = NULL;
     _SEH2_TRY
     {
-       Name.Length = SrcName->Length;
-       Name.MaximumLength = SrcName->MaximumLength;
-       if (Name.Length > Name.MaximumLength)
-       {
-           Status = STATUS_INVALID_PARAMETER;
-           _SEH2_LEAVE;
-       }
-       if (Name.MaximumLength)
-       {
-           ProbeForRead(SrcName->Buffer,
-                        Name.MaximumLength,
-                        sizeof(WCHAR));
-           Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength);
-           if (Name.Buffer == NULL)
-           {
-               Status = STATUS_INSUFFICIENT_RESOURCES;
-               _SEH2_LEAVE;
-           }
-           memcpy(Name.Buffer, SrcName->Buffer, Name.MaximumLength);
-       }
-       *DstName = Name;
+        Name.Length = SrcName->Length;
+        Name.MaximumLength = SrcName->MaximumLength;
+        if (Name.Length > Name.MaximumLength)
+        {
+            Status = STATUS_INVALID_PARAMETER;
+            _SEH2_LEAVE;
+        }
+
+        if (Name.MaximumLength)
+        {
+            ProbeForRead(SrcName->Buffer,
+                         Name.MaximumLength,
+                         sizeof(WCHAR));
+            Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength);
+            if (Name.Buffer == NULL)
+            {
+                Status = STATUS_INSUFFICIENT_RESOURCES;
+                _SEH2_LEAVE;
+            }
+
+            memcpy(Name.Buffer, SrcName->Buffer, Name.MaximumLength);
+        }
+
+        *DstName = Name;
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
-        if (Name.Buffer) ExFreePool(Name.Buffer);
+        if (Name.Buffer)
+            ExFreePool(Name.Buffer);
         Status = _SEH2_GetExceptionCode();
     }
     _SEH2_END;
-    
+
     return Status;
 }
 
@@ -221,12 +224,12 @@ IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData)
     Status = IopCaptureUnicodeString(&DeviceInstance, &PropertyData->DeviceInstance);
     if (!NT_SUCCESS(Status))
     {
-       return Status;
+        return Status;
     }
 
     _SEH2_TRY
     {
-       Property = PropertyData->Property;
+        Property = PropertyData->Property;
         BufferSize = PropertyData->BufferSize;
         ProbeForWrite(PropertyData->Buffer,
                       BufferSize,
@@ -238,7 +241,7 @@ IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData)
         _SEH2_YIELD(return _SEH2_GetExceptionCode());
     }
     _SEH2_END;
-    
+
     /* Get the device object */
     DeviceObject = IopGetDeviceObjectFromDeviceInstance(&DeviceInstance);
     ExFreePool(DeviceInstance.Buffer);
@@ -250,10 +253,9 @@ IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData)
     Buffer = ExAllocatePool(NonPagedPool, BufferSize);
     if (Buffer == NULL)
     {
-       return STATUS_INSUFFICIENT_RESOURCES;
+        return STATUS_INSUFFICIENT_RESOURCES;
     }
 
-
     Status = IoGetDeviceProperty(DeviceObject,
                                  Property,
                                  BufferSize,
@@ -264,17 +266,18 @@ IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData)
 
     if (NT_SUCCESS(Status))
     {
-       _SEH2_TRY
-       {
-           memcpy(Buffer, PropertyData->Buffer, BufferSize);
-           PropertyData->BufferSize = BufferSize;
-       }
-       _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-       {
-           Status = _SEH2_GetExceptionCode();
-       }
-       _SEH2_END;
+        _SEH2_TRY
+        {
+            memcpy(PropertyData->Buffer, Buffer, BufferSize);
+            PropertyData->BufferSize = BufferSize;
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            Status = _SEH2_GetExceptionCode();
+        }
+        _SEH2_END;
     }
+
     ExFreePool(Buffer);
     return Status;
 }
@@ -298,16 +301,16 @@ IopGetRelatedDevice(PPLUGPLAY_CONTROL_RELATED_DEVICE_DATA RelatedDeviceData)
     Status = IopCaptureUnicodeString(&TargetDeviceInstance, &RelatedDeviceData->TargetDeviceInstance);
     if (!NT_SUCCESS(Status))
     {
-       return Status;
+        return Status;
     }
 
     _SEH2_TRY
     {
-       Relation = RelatedDeviceData->Relation;
-       MaximumLength = RelatedDeviceData->RelatedDeviceInstanceLength;
-       ProbeForWrite(RelatedDeviceData->RelatedDeviceInstance,
-                     MaximumLength,
-                     sizeof(WCHAR));
+        Relation = RelatedDeviceData->Relation;
+        MaximumLength = RelatedDeviceData->RelatedDeviceInstanceLength;
+        ProbeForWrite(RelatedDeviceData->RelatedDeviceInstance,
+                      MaximumLength,
+                      sizeof(WCHAR));
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -323,13 +326,13 @@ IopGetRelatedDevice(PPLUGPLAY_CONTROL_RELATED_DEVICE_DATA RelatedDeviceData)
                               TRUE))
     {
         DeviceNode = IopRootDeviceNode;
-       ExFreePool(TargetDeviceInstance.Buffer);
+        ExFreePool(TargetDeviceInstance.Buffer);
     }
     else
     {
         /* Get the device object */
         DeviceObject = IopGetDeviceObjectFromDeviceInstance(&TargetDeviceInstance);
-       ExFreePool(TargetDeviceInstance.Buffer);
+        ExFreePool(TargetDeviceInstance.Buffer);
         if (DeviceObject == NULL)
             return STATUS_NO_SUCH_DEVICE;
 
@@ -424,12 +427,12 @@ IopDeviceStatus(PPLUGPLAY_CONTROL_STATUS_DATA StatusData)
 
     _SEH2_TRY
     {
-       Operation = StatusData->Operation;
-       if (Operation == PNP_SET_DEVICE_STATUS)
-       {
-           DeviceStatus = StatusData->DeviceStatus;
-           DeviceProblem = StatusData->DeviceProblem;
-       }
+        Operation = StatusData->Operation;
+        if (Operation == PNP_SET_DEVICE_STATUS)
+        {
+            DeviceStatus = StatusData->DeviceStatus;
+            DeviceProblem = StatusData->DeviceProblem;
+        }
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -469,16 +472,16 @@ IopDeviceStatus(PPLUGPLAY_CONTROL_STATUS_DATA StatusData)
 
     if (Operation == PNP_GET_DEVICE_STATUS)
     {
-       _SEH2_TRY
-       {
-           StatusData->DeviceStatus = DeviceStatus;
-           StatusData->DeviceProblem = DeviceProblem;
-       }
-       _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-       {
-           Status = _SEH2_GetExceptionCode();
-       }
-       _SEH2_END;
+        _SEH2_TRY
+        {
+            StatusData->DeviceStatus = DeviceStatus;
+            StatusData->DeviceProblem = DeviceProblem;
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            Status = _SEH2_GetExceptionCode();
+        }
+        _SEH2_END;
     }
 
     return Status;
@@ -499,7 +502,7 @@ IopGetDeviceDepth(PPLUGPLAY_CONTROL_DEPTH_DATA DepthData)
     Status = IopCaptureUnicodeString(&DeviceInstance, &DepthData->DeviceInstance);
     if (!NT_SUCCESS(Status))
     {
-       return Status;
+        return Status;
     }
 
     /* Get the device object */
@@ -512,7 +515,7 @@ IopGetDeviceDepth(PPLUGPLAY_CONTROL_DEPTH_DATA DepthData)
 
     _SEH2_TRY
     {
-       DepthData->Depth = DeviceNode->Level;
+        DepthData->Depth = DeviceNode->Level;
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -630,59 +633,59 @@ NtGetPlugPlayEvent(IN ULONG Reserved1,
                    OUT PPLUGPLAY_EVENT_BLOCK Buffer,
                    IN ULONG BufferSize)
 {
-  PPNP_EVENT_ENTRY Entry;
-  NTSTATUS Status;
-
-  DPRINT("NtGetPlugPlayEvent() called\n");
-
-  /* Function can only be called from user-mode */
-  if (KeGetPreviousMode() == KernelMode)
-  {
-    DPRINT1("NtGetPlugPlayEvent cannot be called from kernel mode!\n");
-    return STATUS_ACCESS_DENIED;
-  }
-
-  /* Check for Tcb privilege */
-  if (!SeSinglePrivilegeCheck(SeTcbPrivilege,
-                              UserMode))
-  {
-    DPRINT1("NtGetPlugPlayEvent: Caller does not hold the SeTcbPrivilege privilege!\n");
-    return STATUS_PRIVILEGE_NOT_HELD;
-  }
-
-  /* Wait for a PnP event */
-  DPRINT("Waiting for pnp notification event\n");
-  Status = KeWaitForSingleObject(&IopPnpNotifyEvent,
-                                 UserRequest,
-                                 KernelMode,
-                                 FALSE,
-                                 NULL);
-  if (!NT_SUCCESS(Status))
-  {
-    DPRINT1("KeWaitForSingleObject() failed (Status %lx)\n", Status);
-    return Status;
-  }
+    PPNP_EVENT_ENTRY Entry;
+    NTSTATUS Status;
+
+    DPRINT("NtGetPlugPlayEvent() called\n");
+
+    /* Function can only be called from user-mode */
+    if (KeGetPreviousMode() == KernelMode)
+    {
+        DPRINT1("NtGetPlugPlayEvent cannot be called from kernel mode!\n");
+        return STATUS_ACCESS_DENIED;
+    }
+
+    /* Check for Tcb privilege */
+    if (!SeSinglePrivilegeCheck(SeTcbPrivilege,
+                                UserMode))
+    {
+        DPRINT1("NtGetPlugPlayEvent: Caller does not hold the SeTcbPrivilege privilege!\n");
+        return STATUS_PRIVILEGE_NOT_HELD;
+    }
+
+    /* Wait for a PnP event */
+    DPRINT("Waiting for pnp notification event\n");
+    Status = KeWaitForSingleObject(&IopPnpNotifyEvent,
+                                   UserRequest,
+                                   KernelMode,
+                                   FALSE,
+                                   NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("KeWaitForSingleObject() failed (Status %lx)\n", Status);
+        return Status;
+    }
 
-  /* Get entry from the tail of the queue */
-  Entry = CONTAINING_RECORD(IopPnpEventQueueHead.Blink,
-                            PNP_EVENT_ENTRY,
-                            ListEntry);
+    /* Get entry from the tail of the queue */
+    Entry = CONTAINING_RECORD(IopPnpEventQueueHead.Blink,
+                              PNP_EVENT_ENTRY,
+                              ListEntry);
 
-  /* Check the buffer size */
-  if (BufferSize < Entry->Event.TotalSize)
-  {
-    DPRINT1("Buffer is too small for the pnp-event\n");
-    return STATUS_BUFFER_TOO_SMALL;
-  }
+    /* Check the buffer size */
+    if (BufferSize < Entry->Event.TotalSize)
+    {
+        DPRINT1("Buffer is too small for the pnp-event\n");
+        return STATUS_BUFFER_TOO_SMALL;
+    }
 
-  /* Copy event data to the user buffer */
-  memcpy(Buffer,
-         &Entry->Event,
-         Entry->Event.TotalSize);
+    /* Copy event data to the user buffer */
+    memcpy(Buffer,
+           &Entry->Event,
+           Entry->Event.TotalSize);
 
-  DPRINT("NtGetPlugPlayEvent() done\n");
+    DPRINT("NtGetPlugPlayEvent() done\n");
 
-  return STATUS_SUCCESS;
+    return STATUS_SUCCESS;
 }
 
 /*
index fd60e95..890fd60 100644 (file)
@@ -3236,7 +3236,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject,
         * always contains the enumerator name followed by \\ */
         Ptr = wcschr(DeviceNode->InstancePath.Buffer, L'\\');
         ASSERT(Ptr);
-        Length = (Ptr - DeviceNode->InstancePath.Buffer + 1) * sizeof(WCHAR);
+        Length = (Ptr - DeviceNode->InstancePath.Buffer) * sizeof(WCHAR);
         Data = DeviceNode->InstancePath.Buffer;
         break;
 
index 0f45b6d..b5e4818 100644 (file)
@@ -530,7 +530,7 @@ KdbpCmdDisassembleX(
             return TRUE;
 
         if (Result > (ULONGLONG)(~((ULONG_PTR)0)))
-            KdbpPrint("Warning: Address %I64x is beeing truncated\n");
+            KdbpPrint("Warning: Address %I64x is beeing truncated\n",Result);
 
         Address = (ULONG_PTR)Result;
     }
@@ -829,7 +829,7 @@ KdbpCmdBackTrace(
                 return TRUE;
 
             if (Result > (ULONGLONG)(~((ULONG_PTR)0)))
-                KdbpPrint("Warning: Address %I64x is beeing truncated\n");
+                KdbpPrint("Warning: Address %I64x is beeing truncated\n",Result);
 
             Frame = (ULONG_PTR)Result;
         }
@@ -1174,7 +1174,7 @@ KdbpCmdBreakPoint(ULONG Argc, PCHAR Argv[])
     }
 
     if (Result > (ULONGLONG)(~((ULONG_PTR)0)))
-        KdbpPrint("%s: Warning: Address %I64x is beeing truncated\n", Argv[0]);
+        KdbpPrint("%s: Warning: Address %I64x is beeing truncated\n", Argv[0],Result);
 
     Address = (ULONG_PTR)Result;
 
@@ -1540,7 +1540,7 @@ KdbpCmdMod(
         }
 
         if (Result > (ULONGLONG)(~((ULONG_PTR)0)))
-            KdbpPrint("%s: Warning: Address %I64x is beeing truncated\n", Argv[0]);
+            KdbpPrint("%s: Warning: Address %I64x is beeing truncated\n", Argv[0],Result);
 
         Address = (ULONG_PTR)Result;
 
index e341d4d..6aef752 100644 (file)
@@ -28,6 +28,8 @@ ULONG KeBugCheckCount = 1;
 ULONG KiHardwareTrigger;
 PUNICODE_STRING KiBugCheckDriver;
 ULONG_PTR KiBugCheckData[5];
+PKNMI_HANDLER_CALLBACK KiNmiCallbackListHead;
+KSPIN_LOCK KiNmiCallbackListLock;
 
 /* Bugzilla Reporting */
 UNICODE_STRING KeRosProcessorName, KeRosBiosDate, KeRosBiosVersion;
@@ -1209,6 +1211,32 @@ KeBugCheckWithTf(IN ULONG BugCheckCode,
     while (TRUE);
 }
 
+BOOLEAN
+NTAPI
+KiHandleNmi(VOID)
+{
+    BOOLEAN Handled = FALSE;
+    PKNMI_HANDLER_CALLBACK NmiData;
+
+    //
+    // Parse the list of callbacks
+    //
+    NmiData = KiNmiCallbackListHead;
+    while (NmiData)
+    {
+        //
+        // Save if this callback has handled it -- all it takes is one
+        //
+        Handled |= NmiData->Callback(NmiData->Context, Handled);
+        NmiData = NmiData->Next;
+    }
+
+    //
+    // Has anyone handled this?
+    //
+    return Handled;
+}
+
 /* PUBLIC FUNCTIONS **********************************************************/
 
 /*
@@ -1281,17 +1309,6 @@ KeDeregisterBugCheckReasonCallback(
     return Status;
 }
 
-/*
- * @unimplemented
- */
-NTSTATUS
-NTAPI
-KeDeregisterNmiCallback(PVOID Handle)
-{
-    UNIMPLEMENTED;
-    return STATUS_UNSUCCESSFUL;
-}
-
 /*
  * @implemented
  */
@@ -1363,15 +1380,58 @@ KeRegisterBugCheckReasonCallback(
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 PVOID
 NTAPI
 KeRegisterNmiCallback(IN PNMI_CALLBACK CallbackRoutine,
                       IN PVOID Context)
 {
+    KIRQL OldIrql;
+    PKNMI_HANDLER_CALLBACK NmiData, Next;
+    ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
+
+    //
+    // Allocate NMI callback data
+    //
+    NmiData = ExAllocatePoolWithTag(NonPagedPool,
+                                    sizeof(KNMI_HANDLER_CALLBACK),
+                                    'IMNK');
+    if (!NmiData) return NULL;
+
+    //
+    // Fill in the information
+    //
+    NmiData->Callback = CallbackRoutine;
+    NmiData->Context = Context;
+    NmiData->Handle = NmiData;
+
+    //
+    // Insert it into NMI callback list
+    //
+    KiAcquireNmiListLock(&OldIrql);
+    NmiData->Next = KiNmiCallbackListHead;
+    Next = InterlockedCompareExchangePointer(&KiNmiCallbackListHead,
+                                             NmiData,
+                                             NmiData->Next);
+    ASSERT(Next == NmiData->Next);
+    KiReleaseNmiListLock(OldIrql);
+
+    //
+    // Return the opaque "handle"
+    //
+    return NmiData->Handle;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+KeDeregisterNmiCallback(PVOID Handle)
+{      
     UNIMPLEMENTED;
-    return NULL;
+    return STATUS_UNSUCCESSFUL;
 }
 
 /*
index 775ac85..4904363 100644 (file)
@@ -582,11 +582,12 @@ KiInitializeTSS2(IN PKTSS Tss,
     }
 
     /* Now clear the I/O Map */
-    RtlFillMemory(Tss->IoMaps[0].IoMap, 8096, -1);
+    ASSERT(IOPM_COUNT == 1);
+    RtlFillMemory(Tss->IoMaps[0].IoMap, IOPM_FULL_SIZE, 0xFF);
 
     /* Initialize Interrupt Direction Maps */
     p = (PUCHAR)(Tss->IoMaps[0].DirectionMap);
-    RtlZeroMemory(p, 32);
+    RtlZeroMemory(p, IOPM_DIRECTION_MAP_SIZE);
 
     /* Add DPMI support for interrupts */
     p[0] = 4;
@@ -595,7 +596,7 @@ KiInitializeTSS2(IN PKTSS Tss,
 
     /* Initialize the default Interrupt Direction Map */
     p = Tss->IntDirectionMap;
-    RtlZeroMemory(Tss->IntDirectionMap, 32);
+    RtlZeroMemory(Tss->IntDirectionMap, IOPM_DIRECTION_MAP_SIZE);
 
     /* Add DPMI support */
     p[0] = 4;
@@ -923,6 +924,26 @@ KeZeroPages(IN PVOID Address,
     RtlZeroMemory(Address, Size);
 }
 
+VOID
+NTAPI
+KiSaveProcessorState(IN PKTRAP_FRAME TrapFrame,
+                     IN PKEXCEPTION_FRAME ExceptionFrame)
+{
+    PKPRCB Prcb = KeGetCurrentPrcb();
+
+    //
+    // Save full context
+    //
+    Prcb->ProcessorState.ContextFrame.ContextFlags = CONTEXT_FULL |
+                                                     CONTEXT_DEBUG_REGISTERS;
+    KeTrapFrameToContext(TrapFrame, NULL, &Prcb->ProcessorState.ContextFrame);
+
+    //
+    // Save control registers
+    //
+    KiSaveProcessorControlState(&Prcb->ProcessorState);
+}
+
 /* PUBLIC FUNCTIONS **********************************************************/
 
 /*
index f3d841c..f2dafc5 100644 (file)
@@ -29,7 +29,7 @@ KiGetVectorDispatch(IN ULONG Vector,
                     IN PDISPATCH_INFO Dispatch)
 {
     PKINTERRUPT_ROUTINE Handler;
-    ULONG Current;
+    PVOID Current;
     UCHAR Type;
     UCHAR Entry;
 
@@ -54,9 +54,7 @@ KiGetVectorDispatch(IN ULONG Vector,
     Dispatch->FlatDispatch = NULL;
 
     /* Get the current handler */
-    Current = ((((PKIPCR)KeGetPcr())->IDT[Entry].ExtendedOffset << 16)
-               & 0xFFFF0000) |
-              (((PKIPCR)KeGetPcr())->IDT[Entry].Offset & 0xFFFF);
+    Current = KeQueryInterruptHandler(Vector);
 
     /* Set the interrupt */
     Dispatch->Interrupt = CONTAINING_RECORD(Current,
@@ -100,7 +98,6 @@ KiConnectVectorToInterrupt(IN PKINTERRUPT Interrupt,
     DISPATCH_INFO Dispatch;
     PKINTERRUPT_ROUTINE Handler;
     PULONG Patch = &Interrupt->DispatchCode[0];
-    UCHAR Entry;
 
     /* Get vector data */
     KiGetVectorDispatch(Interrupt->Vector, &Dispatch);
@@ -135,14 +132,8 @@ KiConnectVectorToInterrupt(IN PKINTERRUPT Interrupt,
         Handler = (PVOID)&Interrupt->DispatchCode;
     }
 
-    /* Get the IDT entry for this vector */
-    Entry = HalVectorToIDTEntry(Interrupt->Vector);
-
-    /* Set the pointer in the IDT */
-    ((PKIPCR)KeGetPcr())->IDT[Entry].ExtendedOffset =
-        (USHORT)(((ULONG_PTR)Handler >> 16) & 0xFFFF);
-    ((PKIPCR)KeGetPcr())->IDT[Entry].Offset =
-        (USHORT)PtrToUlong(Handler);
+    /* Register the interrupt */
+    KeRegisterInterruptHandler(Interrupt->Vector, Handler);
 }
 
 /* PUBLIC FUNCTIONS **********************************************************/
index df49ea0..8fe261a 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <asm.h>
 #include <internal/i386/asmmacro.S>
+#include <internal/i386/callconv.s>
 .intel_syntax noprefix
 
 #define Running 2
@@ -91,8 +92,11 @@ _KiUnexpectedEntrySize:
 _UnexpectedMsg:
     .asciz "\n\x7\x7!!! Unexpected Interrupt %02lx !!!\n"
 
+_V86UnhandledMsg:
+    .asciz "\n\x7\x7!!! Unhandled V8086 (VDM) support at line: %lx!!!\n"
+
 _UnhandledMsg:
-    .asciz "\n\x7\x7!!! Unhandled or Unexpected Code at line: %lx!!!\n"
+    .asciz "\n\x7\x7!!! Unhandled or Unexpected Code at line: %lx [%s]!!!\n"
 
 _IsrTimeoutMsg:
     .asciz "\n*** ISR at %lx took over .5 second\n"
@@ -133,7 +137,7 @@ _KiTrapIoTable:
 _KiGetTickCount:
 _KiCallbackReturn:
     /* FIXME: TODO */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "TickCount/Callback Interrupts\n"
 
 .func KiSystemService
 TRAP_FIXUPS kss_a, kss_t, DoNotFixupV86, DoNotFixupAbios
@@ -458,7 +462,7 @@ V86_Exit:
 
 AbiosExit:
     /* FIXME: TODO */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "ABIOS Exit"
 
 .func KiRaiseAssertion
 TRAP_FIXUPS kira_a, kira_t, DoFixupV86, DoFixupAbios
@@ -697,7 +701,7 @@ _DispatchTwoParam:
 _KiFixupFrame:
 
     /* TODO: Routine to fixup a KTRAP_FRAME when faulting from a syscall. */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "Trap Frame Fixup"
 .endfunc
 
 .func KiTrap0
@@ -738,7 +742,7 @@ VdmCheck:
     /* We don't support this yet! */
 V86Int0:
     /* FIXME: TODO */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 .endfunc
 
 .func KiTrap1
@@ -781,15 +785,148 @@ V86Int1:
     jz EnableInterrupts
 
     /* We don't support VDM! */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 .endfunc
 
 .globl _KiTrap2
 .func KiTrap2
 _KiTrap2:
-
-    /* FIXME: This is an NMI, nothing like a normal exception */
-    mov eax, 2
+       //
+       // Don't allow any other NMIs to come in for now
+       //
+    cli                                                                                                // Disable interrupts
+
+       //
+       // Save current state data in registers
+       //
+    mov eax, PCR[KPCR_TSS]                                                     // Save KTSS
+    mov ecx, PCR[KPCR_CURRENT_THREAD]                          // Save ETHREAD
+    mov edi, [ecx+KTHREAD_APCSTATE_PROCESS]                    // Save EPROCESS
+
+       //
+       // Migrate state data to TSS
+       //
+    mov ecx, [edi+KPROCESS_DIRECTORY_TABLE_BASE]       // Page Directory Table
+    mov [eax+KTSS_CR3], ecx                                                    // Saved in CR3
+    mov cx, [edi+KPROCESS_IOPM_OFFSET]                         // IOPM Offset
+    mov [eax+KTSS_IOMAPBASE], cx                                       // Saved in IOPM Base
+    mov ecx, [edi+KPROCESS_LDT_DESCRIPTOR0]                    // Get LDT descriptor
+    test ecx, ecx                                                                      // Check if ne
+    jz 1f                                                                                      // Doesn't exist
+    mov cx, KGDT_LDT                                                           // Load LDT descriptor
+1:
+    mov [eax+KTSS_LDT], cx                                                     // Saved in LDT
+   
+       //
+       // Migrate to NMI TSS
+       //
+    push PCR[KPCR_TSS]                                                         // Save current TSS
+    mov eax, PCR[KPCR_GDT]                                                     // Get GDT
+    mov ch, [eax+KGDT_NMI_TSS+KGDT_BASE_HI]                    // Get High KTSS Base
+    mov cl, [eax+KGDT_NMI_TSS+KGDT_BASE_MID]           // Get Mid KTSS Base
+    shl ecx, 16                                                                                // Build Top KTSS Base
+    mov cx, [eax+KGDT_NMI_TSS+KGDT_BASE_LOW]           // Add Low KTSS Base
+    mov PCR[KPCR_TSS], ecx
+
+       //
+       // Clear nested flag and activate the NMI TSS
+       //
+    pushf                                                                                      // Get EFLAGS
+    and dword ptr [esp], ~EFLAGS_NESTED_TASK           // Clear nested task
+    popf                                                                                       // Set EFLAGS
+    mov ecx, PCR[KPCR_GDT]                                                     // Get GDT
+    lea eax, [ecx+KGDT_NMI_TSS]                                                // Get NMI TSS
+    mov byte ptr [eax+5], 0x89                                         // DPL 0, Present, NonBusy
+
+       //
+       // Build the trap frame and save it into the KPRCB
+       //
+    mov eax, [esp]                                                                     // KGDT_TSS from earlier
+    push 0                                                                                     // V86 segments
+    push 0                                                                                     // V86 segments
+    push 0                                                                                     // V86 segments
+    push 0                                                                                     // V86 segments
+    push [eax+KTSS_SS]                                                         // TSS fields -> Trap Frame
+    push [eax+KTSS_ESP]                                                                // TSS fields -> Trap Frame
+    push [eax+KTSS_EFLAGS]                                                     // TSS fields -> Trap Frame
+    push [eax+KTSS_CS]                                                         // TSS fields -> Trap Frame
+    push [eax+KTSS_EIP]                                                                // TSS fields -> Trap Frame
+    push 0                                                                                     // Error Code
+    push [eax+KTSS_EBP]                                                                // TSS fields -> Trap Frame
+    push [eax+KTSS_EBX]                                                                // TSS fields -> Trap Frame
+    push [eax+KTSS_ESI]                                                                // TSS fields -> Trap Frame
+    push [eax+KTSS_EDI]                                                                // TSS fields -> Trap Frame
+    push [eax+KTSS_FS]                                                         // TSS fields -> Trap Frame
+    push PCR[KPCR_EXCEPTION_LIST]                                      // SEH Handler from KPCR
+    push -1                                                                                    // Bogus previous mode
+    push [eax+KTSS_EAX]                                                                // TSS fields -> Trap Frame
+    push [eax+KTSS_ECX]                                                                // TSS fields -> Trap Frame
+    push [eax+KTSS_EDX]                                                                // TSS fields -> Trap Frame
+    push [eax+KTSS_DS]                                                         // TSS fields -> Trap Frame
+    push [eax+KTSS_ES]                                                         // TSS fields -> Trap Frame
+    push [eax+KTSS_GS]                                                         // TSS fields -> Trap Frame
+    push 0                                                                                     // Debug registers
+    push 0                                                                                     // Debug registers
+    push 0                                                                                     // Debug registers
+    push 0                                                                                     // Debug registers
+    push 0                                                                                     // Debug registers
+    push 0                                                                                     // Debug registers
+    push 0                                                                                     // Temp
+    push 0                                                                                     // Temp
+    push 0                                                                                     // Debug Pointer
+    push 0                                                                                     // Debug Marker
+    push [eax+KTSS_EIP]                                                                // Debug EIP
+    push [eax+KTSS_EBP]                                                                // Debug EBP
+       mov ebp, esp                                                                    // Set trap frame address
+       stdCall _KiSaveProcessorState, ebp, 0                   // Save to KPRCB CONTEXT
+
+       //
+       // Call Registered NMI handlers
+       //
+       stdCall _KiHandleNmi                                                    // Call NMI handlers
+       or al, al                                                                               // Check if any handled it
+       jne 1f                                                                                  // Resume from NMI
+
+       //
+       // Call the platform driver for NMI handling (panic, etc)
+       // Do this with IRQL at HIGH
+       //
+       push PCR[KPCR_IRQL]                                                             // Save real IRQL
+       mov dword ptr PCR[KPCR_IRQL], HIGH_LEVEL                // Force HIGH
+       stdCall _HalHandleNMI, 0                                                // Call the HAL
+       pop PCR[KPCR_IRQL]                                                              // Restore real IRQL
+
+       //
+       // In certain situations, nested NMIs can corrupt the TSS, making us lose
+       // the original context. If this happens, we have no choice but to panic.
+       //
+1:
+    mov eax, PCR[KPCR_TSS]                                                     // Get current TSS
+    cmp word ptr [eax], KGDT_NMI_TSS                           // Check who its points to
+    je 2f                                                                                      // Back to the NMI TSS crash
+
+       //
+       // Otherwise, recover the original state
+       //
+    add esp, KTRAP_FRAME_LENGTH                                                // Clear the trap frame
+    pop PCR[KPCR_TSS]                                                          // Restore original TSS
+    mov ecx, PCR[KPCR_GDT]                                                     // Get GDT
+    lea eax, [ecx+KGDT_TSS]                                                    // Get KTSS
+    mov byte ptr [eax+5], 0x8B                                         // DPL 0, Present, Busy
+    pushf                                                                                      // Get EFLAGS
+    or dword ptr [esp], EFLAGS_NESTED_TASK                     // Set nested flags
+    popf                                                                                       // Set EFLAGS
+
+       //
+       // Return from NMI
+       //
+    iretd                                                                                      // Interrupt return
+       jmp _KiTrap2                                                                    // Handle recursion
+2:
+       //
+       // Crash the system
+       //
+    mov eax, EXCEPTION_NMI
     jmp _KiSystemFatalException
 .endfunc
 
@@ -847,7 +984,7 @@ V86Int3:
     jz EnableInterrupts3
 
     /* We don't support VDM! */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 .endfunc
 
 .func KiTrap4
@@ -888,7 +1025,7 @@ VdmCheck4:
 
     /* We don't support this yet! */
 V86Int4:
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 .endfunc
 
 .func KiTrap5
@@ -933,7 +1070,7 @@ VdmCheck5:
 
     /* We don't support this yet! */
 V86Int5:
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 .endfunc
 
 .func KiTrap6
@@ -949,7 +1086,7 @@ _KiTrap6:
 
 VdmOpCodeFault:
     /* Not yet supported (Invalid OPCODE from V86) */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 
 NotV86UD:
     /* Push error code */
@@ -1025,7 +1162,7 @@ LockCrash:
 IsVdmOpcode:
 
     /* Unhandled yet */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 
     /* Return to caller */
     jmp _Kei386EoiHelper@0
@@ -1332,7 +1469,7 @@ V86Npx:
     jz HandleUserNpx
 
     /* V86 NPX not handled */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 
 EmulationEnabled:
     /* Did this come from kernel-mode? */
@@ -1499,7 +1636,7 @@ RaiseIrql:
     jnz NoReflect
 
     /* FIXME: TODO */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 
 NoReflect:
 
@@ -1540,7 +1677,7 @@ NotV86:
     jae KmodeGpf
 
     /* FIXME: TODO */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "Double GPF"
 
     /* Get the opcode and trap frame */
 KmodeGpf:
@@ -1629,7 +1766,7 @@ TrapCopy:
 MsrCheck:
 
     /* FIXME: Handle RDMSR/WRMSR */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "RDMSR/WRMSR"
 
 NotIretGpf:
 
@@ -1913,7 +2050,7 @@ SetException:
 
 DispatchV86Gpf:
     /* FIXME */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 .endfunc
 
 .func KiTrap14
@@ -2003,12 +2140,12 @@ AccessFail:
     jnz CheckVdmPf
 
     /* FIXME: TODO */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "SYSENTER Fault"
     jmp _Kei386EoiHelper@0
 
 SysCallCopyFault:
     /* FIXME: TODO */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "SYSENTER Fault"
     jmp _Kei386EoiHelper@0
 
     /* Check if the fault occured in a V86 mode */
@@ -2033,7 +2170,7 @@ CheckVdmPf:
 
 VdmPF:
     /* FIXME: TODO */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 
     /* Save EIP and check what kind of status failure we got */
 CheckStatus:
@@ -2067,7 +2204,7 @@ SpecialCode:
 
 SlistFault:
     /* FIXME: TODO */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "SLIST Fault"
 
 IllegalState:
 
@@ -2083,7 +2220,7 @@ IllegalState:
 VdmAlertGpf:
 
     /* FIXME: NOT SUPPORTED */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 
 HandleLockErrata:
 
@@ -2328,7 +2465,7 @@ VdmXmmi:
 
 V86Xmmi:
     /* V86 XMMI not handled */
-    UNHANDLED_PATH
+    UNHANDLED_V86_PATH
 
 KernelXmmi:
     /* Another weird situation */
@@ -2394,7 +2531,7 @@ _Ki16BitStackException:
     add esp, [eax+KTHREAD_INITIAL_STACK]
 
     /* Switch to good stack segment */
-    UNHANDLED_PATH
+    UNHANDLED_PATH "16-Bit Stack"
 .endfunc
 
 /* UNEXPECTED INTERRUPT HANDLERS **********************************************/
index a8fe5f3..4c5f46b 100644 (file)
@@ -178,11 +178,14 @@ ExUnlockPool(IN PPOOL_DESCRIPTOR Descriptor,
 
 /* PUBLIC FUNCTIONS ***********************************************************/
 
+/*
+ * @implemented
+ */
 PVOID
 NTAPI
-ExAllocateArmPoolWithTag(IN POOL_TYPE PoolType,
-                         IN SIZE_T NumberOfBytes,
-                         IN ULONG Tag)
+ExAllocatePoolWithTag(IN POOL_TYPE PoolType,
+                      IN SIZE_T NumberOfBytes,
+                      IN ULONG Tag)
 {
     PPOOL_DESCRIPTOR PoolDesc;
     PLIST_ENTRY ListHead;
@@ -190,6 +193,11 @@ ExAllocateArmPoolWithTag(IN POOL_TYPE PoolType,
     KIRQL OldIrql;
     ULONG BlockSize, i;
     
+    //
+    // Check for paged pool
+    //
+    if (PoolType == PagedPool) return ExAllocatePagedPoolWithTag(PagedPool, NumberOfBytes, Tag);
+    
     //
     // Some sanity checks
     //
@@ -449,10 +457,13 @@ ExAllocateArmPoolWithTag(IN POOL_TYPE PoolType,
     return ++Entry;
 }
 
+/*
+ * @implemented
+ */
 PVOID
 NTAPI
-ExAllocateArmPool(POOL_TYPE PoolType,
-                  SIZE_T NumberOfBytes)
+ExAllocatePool(POOL_TYPE PoolType,
+               SIZE_T NumberOfBytes)
 {
     //
     // Use a default tag of "None"
@@ -460,10 +471,13 @@ ExAllocateArmPool(POOL_TYPE PoolType,
     return ExAllocatePoolWithTag(PoolType, NumberOfBytes, 'enoN');
 }
 
+/*
+ * @implemented
+ */
 VOID
 NTAPI
-ExFreeArmPoolWithTag(IN PVOID P,
-                     IN ULONG TagToFree)
+ExFreePoolWithTag(IN PVOID P,
+                  IN ULONG TagToFree)
 {
     PPOOL_HEADER Entry, NextEntry;
     ULONG BlockSize;
@@ -471,6 +485,19 @@ ExFreeArmPoolWithTag(IN PVOID P,
     POOL_TYPE PoolType;
     PPOOL_DESCRIPTOR PoolDesc;
     BOOLEAN Combined = FALSE;
+    
+    //
+    // Check for paged pool
+    //
+    if ((P >= MmPagedPoolBase) &&
+        (P <= (PVOID)((ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize)))
+    {
+        //
+        // Use old allocator
+        //
+        ExFreePagedPool(P);
+        return;
+    }
    
     //
     // Quickly deal with big page allocations
@@ -633,14 +660,17 @@ ExFreeArmPoolWithTag(IN PVOID P,
     ExUnlockPool(PoolDesc, OldIrql);
 }
 
+/*
+ * @implemented
+ */
 VOID
 NTAPI
-ExFreeArmPool(PVOID P)
+ExFreePool(PVOID P)
 {
     //
     // Just free without checking for the tag
     //
-    ExFreeArmPoolWithTag(P, 0);
+    ExFreePoolWithTag(P, 0);
 }
 
 /*
index f8a12f0..b446b09 100644 (file)
@@ -151,6 +151,14 @@ ULONG MmSystemViewSize;
 PFN_NUMBER MmSystemPageDirectory;
 PMMPTE MmSystemPagePtes;
 
+//
+// The system cache starts right after hyperspace. The first few pages are for
+// keeping track of the system working set list.
+//
+// This should be 0xC0C00000 -- the cache itself starts at 0xC1000000
+//
+PMMWSL MmSystemCacheWorkingSetList = MI_SYSTEM_CACHE_WS_START;
+
 //
 // Windows NT seems to choose between 7000, 11000 and 50000
 // On systems with more than 32MB, this number is then doubled, and further
@@ -223,6 +231,22 @@ PVOID MmSystemCacheStart;
 PVOID MmSystemCacheEnd;
 MMSUPPORT MmSystemCacheWs;
 
+//
+// This is where hyperspace ends (followed by the system cache working set)
+//
+PVOID MmHyperSpaceEnd;
+
+//
+// Page coloring algorithm data
+//
+ULONG MmSecondaryColors;
+ULONG MmSecondaryColorMask;
+
+//
+// Actual (registry-configurable) size of a GUI thread's stack
+//
+ULONG MmLargeStackSize;
+
 /* PRIVATE FUNCTIONS **********************************************************/
 
 //
@@ -278,6 +302,48 @@ MxGetNextPage(IN PFN_NUMBER PageCount)
     return Pfn;
 }
 
+PFN_NUMBER
+NTAPI
+MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+                     IN PBOOLEAN IncludeType)
+{
+    PLIST_ENTRY NextEntry;
+    PFN_NUMBER PageCount = 0;
+    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+    
+    //
+    // Now loop through the descriptors
+    //
+    NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+    while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+    {
+        //
+        // Grab each one, and check if it's one we should include
+        //
+        MdBlock = CONTAINING_RECORD(NextEntry,
+                                    MEMORY_ALLOCATION_DESCRIPTOR,
+                                    ListEntry);
+        if ((MdBlock->MemoryType < LoaderMaximum) &&
+            (IncludeType[MdBlock->MemoryType]))
+        {
+            //
+            // Add this to our running total
+            //
+            PageCount += MdBlock->PageCount;
+        }
+        
+        //
+        // Try the next descriptor
+        //
+        NextEntry = MdBlock->ListEntry.Flink;
+    }
+    
+    //
+    // Return the total
+    //
+    return PageCount;
+}
+
 PPHYSICAL_MEMORY_DESCRIPTOR
 NTAPI
 MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
@@ -606,17 +672,26 @@ MmArmInitSystem(IN ULONG Phase,
     PLIST_ENTRY NextEntry;
     PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
     ULONG FreePages = 0;
-    PFN_NUMBER PageFrameIndex;
+    PFN_NUMBER PageFrameIndex, PoolPages;
     PMMPTE StartPde, EndPde, PointerPte, LastPte;
     MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte;
     PVOID NonPagedPoolExpansionVa;
-    ULONG OldCount;
+    ULONG OldCount, i, L2Associativity;
     BOOLEAN IncludeType[LoaderMaximum];
-    ULONG i;
     PVOID Bitmap;
     PPHYSICAL_MEMORY_RUN Run;
     PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount;
     
+    //
+    // Instantiate memory that we don't consider RAM/usable
+    // We use the same exclusions that Windows does, in order to try to be
+    // compatible with WinLDR-style booting
+    //
+    for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE;
+    IncludeType[LoaderBad] = FALSE;
+    IncludeType[LoaderFirmwarePermanent] = FALSE;
+    IncludeType[LoaderSpecialMemory] = FALSE;
+    IncludeType[LoaderBBTMemory] = FALSE;
     if (Phase == 0)
     {
         //
@@ -698,7 +773,61 @@ MmArmInitSystem(IN ULONG Phase,
         //
         MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase -
                                     MmSystemViewSize);
+                                    
+        //
+        // Count physical pages on the system
+        //
+        PageCount = MiPagesInLoaderBlock(LoaderBlock, IncludeType);
+        
+        //
+        // Check if this is a machine with less than 19MB of RAM
+        //
+        if (PageCount < MI_MIN_PAGES_FOR_SYSPTE_TUNING)
+        {
+            //
+            // Use the very minimum of system PTEs
+            //
+            MmNumberOfSystemPtes = 7000;
+        }
+        else
+        {
+            //
+            // Use the default, but check if we have more than 32MB of RAM
+            //
+            MmNumberOfSystemPtes = 11000;
+            if (PageCount > MI_MIN_PAGES_FOR_SYSPTE_BOOST)
+            {
+                //
+                // Double the amount of system PTEs
+                //
+                MmNumberOfSystemPtes <<= 1;
+            }
+        }
+        
+        DPRINT("System PTE count has been tuned to %d (%d bytes)\n",
+               MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
+               
+        //
+        //
+        // Start of Architecture Specific Initialization Code
+        //
+        //
         
+        //
+        // The large kernel stack is cutomizable, but use default value for now
+        //
+        MmLargeStackSize = KERNEL_LARGE_STACK_SIZE;
+        
+        //
+        // Setup template
+        //
+        HyperTemplatePte.u.Long = 0;
+        HyperTemplatePte.u.Hard.Valid = 1;
+        HyperTemplatePte.u.Hard.Write = 1;
+        HyperTemplatePte.u.Hard.Dirty = 1;
+        HyperTemplatePte.u.Hard.Accessed = 1;
+        if (Ke386GlobalPagesEnabled) HyperTemplatePte.u.Hard.Global = 1;
+
         //
         // Set CR3 for the system process
         //
@@ -784,9 +913,13 @@ MmArmInitSystem(IN ULONG Phase,
                         //
                         // For now, it is
                         //
-                        FreePages = MdBlock->PageCount;
                         MxFreeDescriptor = MdBlock;
                     }
+                    
+                    //
+                    // More free pages
+                    //
+                    FreePages += MdBlock->PageCount;
                 }
             }
             
@@ -802,34 +935,6 @@ MmArmInitSystem(IN ULONG Phase,
         //
         MxOldFreeDescriptor = *MxFreeDescriptor;
         
-        //
-        // Check if this is a machine with less than 19MB of RAM
-        //
-        if (MmNumberOfPhysicalPages < MI_MIN_PAGES_FOR_SYSPTE_TUNING)
-        {
-            //
-            // Use the very minimum of system PTEs
-            //
-            MmNumberOfSystemPtes = 7000;
-        }
-        else
-        {
-            //
-            // Use the default, but check if we have more than 32MB of RAM
-            //
-            MmNumberOfSystemPtes = 11000;
-            if (MmNumberOfPhysicalPages > MI_MIN_PAGES_FOR_SYSPTE_BOOST)
-            {
-                //
-                // Double the amount of system PTEs
-                //
-                MmNumberOfSystemPtes <<= 1;
-            }
-        }
-        
-        DPRINT("System PTE count has been tuned to %d (%d bytes)\n",
-               MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
-        
         //
         // Check if this is a machine with less than 256MB of RAM, and no overide
         //
@@ -842,6 +947,11 @@ MmArmInitSystem(IN ULONG Phase,
             MmSizeOfNonPagedPoolInBytes = 2 * 1024 * 1024;
         }
         
+        //
+        // Hyperspace ends here
+        //
+        MmHyperSpaceEnd = (PVOID)((ULONG_PTR)MmSystemCacheWorkingSetList - 1);
+        
         //
         // Check if the user gave a ridicuously large nonpaged pool RAM size
         //
@@ -900,26 +1010,86 @@ MmArmInitSystem(IN ULONG Phase,
         if (!MmMaximumNonPagedPoolInBytes)
         {
             //
-            // Start with the default (1MB) and add 400 KB for each MB above 4
+            // Start with the default (1MB)
             //
             MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool;
-            MmMaximumNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) /
-                                             256 * MmMaxAdditionNonPagedPoolPerMb;
+            
+            //
+            // Add space for PFN database
+            //
+            MmMaximumNonPagedPoolInBytes += (ULONG)
+                PAGE_ALIGN((MmHighestPhysicalPage +  1) * sizeof(MMPFN));
+            
+            //
+            // Add 400KB for each MB above 4
+            //
+            MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 *
+                                            MmMaxAdditionNonPagedPoolPerMb;
         }
         
+        //
+        // Make sure there's at least 16 pages + the PFN available for expansion
+        //
+        PoolPages = MmSizeOfNonPagedPoolInBytes + (PAGE_SIZE * 16) +
+                    ((ULONG)PAGE_ALIGN(MmHighestPhysicalPage + 1) *
+                    sizeof(MMPFN));
+        if (MmMaximumNonPagedPoolInBytes < PoolPages)
+        {
+            //
+            // Set it to the minimum value for the maximum (yuck!)
+            //
+            MmMaximumNonPagedPoolInBytes = PoolPages;
+        }
+        
+        //
+        // Systems with 2GB of kernel address space get double the size
+        //
+        PoolPages = MI_MAX_NONPAGED_POOL_SIZE * 2;
+        
         //
         // Don't let the maximum go too high
         //
-        if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE)
+        if (MmMaximumNonPagedPoolInBytes > PoolPages)
         {
             //
             // Set it to the upper limit
             //
-            MmMaximumNonPagedPoolInBytes = MI_MAX_NONPAGED_POOL_SIZE;
+            MmMaximumNonPagedPoolInBytes = PoolPages;
+        }
+        
+        //
+        // Check if this is a system with > 128MB of non paged pool
+        //
+        if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE)
+        {
+            //
+            // FIXME: Unsure about additional checks needed
+            //
+            DPRINT1("Untested path\n");
         }
         
         //
-        // Calculate the number of bytes, and then convert to pages
+        // Get L2 cache information
+        //
+        L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity;
+        MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize;
+        if (L2Associativity) MmSecondaryColors /= L2Associativity;
+        
+        //
+        // Compute final color mask and count
+        //
+        MmSecondaryColors >>= PAGE_SHIFT;
+        if (!MmSecondaryColors) MmSecondaryColors = 1;
+        MmSecondaryColorMask = MmSecondaryColors - 1;
+        
+        //
+        // Store it
+        //
+        KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask;
+        
+        //
+        // Calculate the number of bytes for the PFN database
+        // and then convert to pages
         //
         MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN);
         MxPfnAllocation >>= PAGE_SHIFT;
@@ -975,6 +1145,19 @@ MmArmInitSystem(IN ULONG Phase,
             ASSERT(MmNumberOfSystemPtes > 1000);
         }
         
+        //
+        // Check if we are in a situation where the size of the paged pool
+        // is so large that it overflows into nonpaged pool
+        //
+        if (MmSizeOfPagedPoolInBytes >
+            ((ULONG_PTR)MmNonPagedSystemStart - (ULONG_PTR)MmPagedPoolStart))
+        {
+            //
+            // We need some recalculations here
+            //
+            DPRINT1("Paged pool is too big!\n");
+        }
+        
         //
         // Normally, the PFN database should start after the loader images.
         // This is already the case in ReactOS, but for now we want to co-exist
@@ -1295,18 +1478,7 @@ MmArmInitSystem(IN ULONG Phase,
         MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
         MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1));
         MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1));
-
-        //
-        // Instantiate memory that we don't consider RAM/usable
-        // We use the same exclusions that Windows does, in order to try to be
-        // compatible with WinLDR-style booting
-        //
-        for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE;
-        IncludeType[LoaderBad] = FALSE;
-        IncludeType[LoaderFirmwarePermanent] = FALSE;
-        IncludeType[LoaderSpecialMemory] = FALSE;
-        IncludeType[LoaderBBTMemory] = FALSE;
-        
+    
         //
         // Build the physical memory block
         //
index 0a0e6d3..8393724 100644 (file)
@@ -28,6 +28,7 @@
 
 #define MI_SYSTEM_VIEW_SIZE                    (16 * 1024 * 1024)
 
+#define MI_SYSTEM_CACHE_WS_START               (PVOID)0xC0C00000
 #define MI_PAGED_POOL_START                    (PVOID)0xE1000000
 #define MI_NONPAGED_POOL_END                   (PVOID)0xFFBE0000
 #define MI_DEBUG_MAPPING                       (PVOID)0xFFBFF000
@@ -196,6 +197,7 @@ extern MMSUPPORT MmSystemCacheWs;
 extern SIZE_T MmAllocatedNonPagedPool;
 extern ULONG_PTR MmSubsectionBase;
 extern ULONG MmSpecialPoolTag;
+extern PVOID MmHyperSpaceEnd;
 
 NTSTATUS
 NTAPI
index ea633a1..7fad6ea 100644 (file)
@@ -140,8 +140,8 @@ MiDispatchFault(IN BOOLEAN StoreInstruction,
     KIRQL OldIrql;
     NTSTATUS Status;
     DPRINT("ARM3 Page Fault Dispatcher for address: %p in process: %p\n",
-            Address,
-            Process);
+             Address,
+             Process);
     
     //
     // Make sure APCs are off and we're not at dispatch
@@ -297,12 +297,26 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction,
         //
         // Check for a fault on the page table or hyperspace itself
         //
-        if ((Address >= (PVOID)PTE_BASE) && (Address <= (PVOID)HYPER_SPACE_END))
+        if ((Address >= (PVOID)PTE_BASE) && (Address <= MmHyperSpaceEnd))
         {
             //
             // This might happen...not sure yet
             //
             DPRINT1("FAULT ON PAGE TABLES!\n");
+            
+            //
+            // Map in the page table
+            //
+            if (MiCheckPdeForPagedPool(Address) == STATUS_WAIT_1)
+            {
+                DPRINT1("PAGE TABLES FAULTED IN!\n");
+                return STATUS_SUCCESS;
+            }
+            
+            //
+            // Otherwise the page table doesn't actually exist
+            //
+            DPRINT1("FAILING\n");
             return STATUS_ACCESS_VIOLATION;
         }
         
index 7fddd38..bfb75df 100644 (file)
@@ -141,7 +141,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
     PMMPTE PointerPte, StartPte;
     MMPTE TempPte;
     PMMPFN Pfn1;
-    PVOID BaseVa;
+    PVOID BaseVa, BaseVaStart;
     PMMFREE_POOL_ENTRY FreeEntry;
     PKSPIN_LOCK_QUEUE LockQueue;
     
@@ -169,11 +169,133 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
         if (i == 0xFFFFFFFF)
         {
             //
-            // Out of memory!
+            // Get the page bit count
             //
-            DPRINT1("OUT OF PAGED POOL!!!\n");
-            KeReleaseGuardedMutex(&MmPagedPoolMutex);
-            return NULL;
+            i = ((SizeInPages - 1) / 1024) + 1;
+            
+            //
+            // Check if there is enougn paged pool expansion space left
+            //
+            if (MmPagedPoolInfo.NextPdeForPagedPoolExpansion >
+                MiAddressToPte(MmPagedPoolInfo.LastPteForPagedPool))
+            {
+                //
+                // Out of memory!
+                //
+                DPRINT1("OUT OF PAGED POOL!!!\n");
+                KeReleaseGuardedMutex(&MmPagedPoolMutex);
+                return NULL;
+            }
+            
+            //
+            // Check if we'll have to expand past the last PTE we have available
+            //            
+            if (((i - 1) + MmPagedPoolInfo.NextPdeForPagedPoolExpansion) >
+                 MiAddressToPte(MmPagedPoolInfo.LastPteForPagedPool))
+            {
+                //
+                // We can only support this much then
+                //
+                SizeInPages = MiAddressToPte(MmPagedPoolInfo.LastPteForPagedPool) - 
+                              MmPagedPoolInfo.NextPdeForPagedPoolExpansion +
+                              1;
+                ASSERT(SizeInPages < i);
+                i = SizeInPages;
+            }
+            else
+            {
+                //
+                // Otherwise, there is plenty of space left for this expansion
+                //
+                SizeInPages = i;
+            }
+            
+            //
+            // Get the template PTE we'll use to expand
+            //
+            TempPte = HyperTemplatePte;
+            
+            //
+            // Get the first PTE in expansion space
+            //
+            PointerPte = MmPagedPoolInfo.NextPdeForPagedPoolExpansion;
+            BaseVa = MiPteToAddress(PointerPte);
+            BaseVaStart = BaseVa;
+            
+            //
+            // Lock the PFN database and loop pages
+            //            
+            OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);          
+            do
+            {
+                //
+                // It should not already be valid
+                //
+                ASSERT(PointerPte->u.Hard.Valid == 0);
+                
+                //
+                // Request a paged pool page and write the PFN for it
+                //
+                PageFrameNumber = MmAllocPage(MC_PPOOL, 0);
+                TempPte.u.Hard.PageFrameNumber = PageFrameNumber;
+                
+                //
+                // Save it into our double-buffered system page directory
+                //
+                MmSystemPagePtes[(ULONG_PTR)PointerPte & (PAGE_SIZE - 1) /
+                                 sizeof(MMPTE)] = TempPte;
+                            
+                //
+                // Write the actual PTE now
+                //
+                *PointerPte++ = TempPte;
+                
+                //
+                // Move on to the next expansion address
+                //
+                BaseVa = (PVOID)((ULONG_PTR)BaseVa + PAGE_SIZE);
+            } while (--i > 0);
+            
+            //
+            // Release the PFN database lock
+            //            
+            KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+            
+            //
+            // These pages are now available, clear their availablity bits
+            //
+            RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap,
+                         (MmPagedPoolInfo.NextPdeForPagedPoolExpansion -
+                          MiAddressToPte(MmPagedPoolInfo.FirstPteForPagedPool)) *
+                         1024,
+                         SizeInPages * 1024);
+                        
+            //
+            // Update the next expansion location
+            //
+            MmPagedPoolInfo.NextPdeForPagedPoolExpansion += SizeInPages;
+            
+            //
+            // Zero out the newly available memory
+            //
+            RtlZeroMemory(BaseVaStart, SizeInPages * PAGE_SIZE);
+            
+            //
+            // Now try consuming the pages again
+            //
+            SizeInPages = BYTES_TO_PAGES(SizeInBytes);
+            i = RtlFindClearBitsAndSet(MmPagedPoolInfo.PagedPoolAllocationMap,
+                                       SizeInPages,
+                                       0);
+            if (i == 0xFFFFFFFF) 
+            {
+                //
+                // Out of memory!
+                //
+                DPRINT1("OUT OF PAGED POOL!!!\n");
+                KeReleaseGuardedMutex(&MmPagedPoolMutex);
+                return NULL;
+            }
         }
         
         //
index 9a5af8d..c7ddc2b 100644 (file)
@@ -166,7 +166,10 @@ MmCreateKernelStack(IN BOOLEAN GuiStack,
         //
         *PointerPte = TempPte;
     }
-    
+
+    // Bug #4835
+    (VOID)InterlockedExchangeAddUL(&MiMemoryConsumers[MC_NPPOOL].PagesUsed, StackPages);
+
     //
     // Release the PFN lock
     //
index d10bf87..88ff54f 100644 (file)
@@ -635,7 +635,7 @@ MmSecureVirtualMemory(IN PVOID Address,
                       IN ULONG Mode)
 {
     UNIMPLEMENTED;
-    return NULL;
+    return Address;
 }
 
 /*
diff --git a/reactos/ntoskrnl/mm/dbgpool.c b/reactos/ntoskrnl/mm/dbgpool.c
deleted file mode 100644 (file)
index 86f9639..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * PROJECT:         ReactOS Kernel
- * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            ntoskrnl/mm/dbgpool.c
- * PURPOSE:         Debug version of a pool allocator
- * PROGRAMMERS:     Aleksey Bragin (aleksey@reactos.org)
- */
-
-/* INCLUDES ***************************************************************/
-
-#include <ntoskrnl.h>
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS **************************************************************/
-
-typedef struct _EI_WHOLE_PAGE_HEADER {
-    PVOID ActualAddress;
-    ULONG Size;
-    ULONG Tag;
-} EI_WHOLE_PAGE_HEADER, *PEI_WHOLE_PAGE_HEADER;
-
-BOOLEAN
-NTAPI
-ExpIsPoolTagDebuggable(ULONG Tag)
-{
-#if 0
-    if (Tag == 'llaC') return FALSE;
-    if (Tag == 'virD') return FALSE;
-    if (Tag == 'iveD') return FALSE;
-    if (Tag == 'padA') return FALSE;
-
-    if (Tag == 'dSeS') return FALSE;
-    if (Tag == 'iDbO') return FALSE;
-    if (Tag == 'mNbO') return FALSE;
-    if (Tag == 'DNbO') return FALSE;
-    if (Tag == 'btbO') return FALSE;
-    if (Tag == 'cSbO') return FALSE;
-    //if (Tag == 'iSeS') return FALSE;
-    //if (Tag == 'cAeS') return FALSE;
-#endif
-
-    return TRUE;
-}
-
-
-PVOID
-NTAPI
-ExpAllocateDebugPool(POOL_TYPE Type, ULONG Size, ULONG Tag, PVOID Caller, BOOLEAN EndOfPage)
-{
-    ULONG UserSize, TotalSize, AlignedSize;
-    ULONG_PTR UserData, GuardArea;
-    PEI_WHOLE_PAGE_HEADER Header;
-    ULONG_PTR Buffer;
-
-    /* Calculate sizes */
-    AlignedSize = ROUND_UP(Size, MM_POOL_ALIGNMENT);
-    UserSize = AlignedSize + sizeof(EI_WHOLE_PAGE_HEADER);
-    TotalSize = UserSize + 2*PAGE_SIZE;
-
-    /* Right now we support only end-of-page allocations */
-    ASSERT(EndOfPage);
-
-    /* Allocate space using default routine */
-    if (Type & PAGED_POOL_MASK)
-    {
-        Buffer = (ULONG_PTR)
-            ExAllocatePagedPoolWithTag(Type, TotalSize, Tag);
-    }
-    else
-    {
-        ASSERT(FALSE);
-        return NULL;
-    }
-
-
-    /* If allocation failed - fail too */
-    if (!Buffer)
-    {
-        DPRINT1("A big problem! Pool allocation failed!\n");
-        return NULL;
-    }
-
-    /* Calculate guard area as placed on a page boundary
-     * at the end of allocated area */
-    GuardArea = PAGE_ROUND_DOWN(Buffer + TotalSize - PAGE_SIZE + 1);
-
-    /* Calculate user data and header pointers */
-    UserData = GuardArea - AlignedSize;
-    Header = (PEI_WHOLE_PAGE_HEADER)(UserData - sizeof(EI_WHOLE_PAGE_HEADER));
-
-    /* Fill out the header */
-    Header->ActualAddress = (PVOID)Buffer;
-    Header->Tag = Tag;
-    Header->Size = AlignedSize;
-
-    /* Protect the guard page */
-    MmSetPageProtect(NULL, (PVOID)GuardArea, PAGE_NOACCESS);
-
-    DPRINT("Allocating whole page block Tag %c%c%c%c, Buffer %p, Header %p, UserData %p, GuardArea %p, Size %d\n",
-        Tag & 0xFF, (Tag >> 8) & 0xFF,
-        (Tag >> 16) & 0xFF, (Tag >> 24) & 0xFF,
-        Buffer, Header, UserData, GuardArea, Size);
-
-    return (PVOID)UserData;
-}
-
-VOID
-NTAPI
-ExpFreeDebugPool(PVOID Block, BOOLEAN PagedPool)
-{
-    PEI_WHOLE_PAGE_HEADER Header;
-    PVOID ProtectedPage;
-
-    /* Get pointer to our special header */
-    Header = (PEI_WHOLE_PAGE_HEADER)
-        (((PCHAR)Block) - sizeof(EI_WHOLE_PAGE_HEADER));
-
-    DPRINT("Freeing whole page block at %08x (Tag %c%c%c%c, %x Header %x)\n", Block,
-        Header->Tag & 0xFF, (Header->Tag >> 8) & 0xFF,
-        (Header->Tag >> 16) & 0xFF, (Header->Tag >> 24) & 0xFF, Header->Tag, Header);
-
-    /* Calculate protected page adresss */
-    ProtectedPage = ((PCHAR)Block) + Header->Size;
-
-    /* Unprotect it */
-    MmSetPageProtect(NULL, ProtectedPage, PAGE_READWRITE);
-
-    /* Free storage */
-    ASSERT(PagedPool);
-    ExFreePagedPool(Header->ActualAddress);
-}
-
-/* EOF */
index 6c230cf..bba32e4 100644 (file)
@@ -1,4 +1,4 @@
-/*
+/*
  * PROJECT:         ReactOS Kernel
  * LICENSE:         GPL - See COPYING in the top level directory
  * FILE:            ntoskrnl/mm/mminit.c
@@ -413,66 +413,7 @@ MmInitSystem(IN ULONG Phase,
         
         /* Intialize system memory areas */
         MiInitSystemMemoryAreas();
-        
-        //
-        // STEP 1: Allocate and free a single page, repeatedly
-        // We should always get the same address back
-        //
-        if (1)
-        {
-            PULONG Test, OldTest;
-            ULONG i;
-        
-            OldTest = Test = MiAllocatePoolPages(PagedPool, PAGE_SIZE);
-            ASSERT(Test);
-            for (i = 0; i < 16; i++)
-            {
-                MiFreePoolPages(Test);
-                Test = MiAllocatePoolPages(PagedPool, PAGE_SIZE);
-                ASSERT(OldTest == Test);
-            }
-            MiFreePoolPages(Test);
-        }
-        
-        //
-        // STEP 2: Allocate 2048 pages without freeing them
-        // We should run out of space at 1024 pages, since we don't support
-        // expansion yet.
-        //
-        if (1)
-        {
-            PULONG Test[2048];
-            ULONG i;
-            
-            for (i = 0; i < 2048; i++)
-            {
-                Test[i] = MiAllocatePoolPages(PagedPool, PAGE_SIZE);
-                if (!Test[i]) 
-                {
-                    ASSERT(i == PTE_PER_PAGE);
-                    break;
-                }
-            }
-            
-            //
-            // Cleanup
-            //
-            while (--i) if (Test[i]) MiFreePoolPages(Test[i]);
-        }
-        
-        //
-        // STEP 3: Allocate a page and touch it.
-        // We should get an ARM3 page fault and it should handle the fault
-        //
-        if (1)
-        {
-            PULONG Test;
-            
-            Test = MiAllocatePoolPages(PagedPool, PAGE_SIZE);
-            ASSERT(*Test == 0);
-            MiFreePoolPages(Test);
-        }
-        
+
         /* Dump the address space */
         MiDbgDumpAddressSpace();
         
diff --git a/reactos/ntoskrnl/mm/pool.c b/reactos/ntoskrnl/mm/pool.c
deleted file mode 100644 (file)
index 07132e8..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS kernel
- * FILE:            ntoskrnl/mm/pool.c
- * PURPOSE:         Implements the kernel memory pool
- *
- * PROGRAMMERS:     David Welch (welch@mcmail.com)
- */
-
-/* INCLUDES ****************************************************************/
-
-#include <ntoskrnl.h>
-
-#define NDEBUG
-#include <debug.h>
-
-/* Uncomment to enable pool overruns debugging. Don't forget to increase
-   max pool sizes (MM_[NON]PAGED_POOL_SIZE) in include/internal/mm.h */
-//#define DEBUG_NPOOL
-//#define DEBUG_PPOOL
-
-extern PVOID MiNonPagedPoolStart;
-extern ULONG MiNonPagedPoolLength;
-extern ULONG MmTotalPagedPoolQuota;
-extern ULONG MmTotalNonPagedPoolQuota;
-
-/* FUNCTIONS ***************************************************************/
-
-ULONG NTAPI
-EiGetPagedPoolTag(IN PVOID Block);
-
-ULONG NTAPI
-EiGetNonPagedPoolTag(IN PVOID Block);
-
-PVOID
-NTAPI
-ExAllocateArmPoolWithTag(POOL_TYPE PoolType,
-                         SIZE_T NumberOfBytes,
-                         ULONG Tag);
-
-static PVOID NTAPI
-EiAllocatePool(POOL_TYPE PoolType,
-               ULONG NumberOfBytes,
-               ULONG Tag,
-               PVOID Caller)
-{
-   PVOID Block;
-   PCHAR TagChars = (PCHAR)&Tag;
-
-   if (Tag == 0)
-       KeBugCheckEx(BAD_POOL_CALLER, 0x9b, PoolType, NumberOfBytes, (ULONG_PTR)Caller);
-   if (Tag == ' GIB')
-       KeBugCheckEx(BAD_POOL_CALLER, 0x9c, PoolType, NumberOfBytes, (ULONG_PTR)Caller);
-
-#define IS_LETTER_OR_DIGIT(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || ((c) >= '0' && (c) <= '9'))
-   if (!IS_LETTER_OR_DIGIT(TagChars[0]) &&
-       !IS_LETTER_OR_DIGIT(TagChars[1]) &&
-       !IS_LETTER_OR_DIGIT(TagChars[2]) &&
-       !IS_LETTER_OR_DIGIT(TagChars[3]))
-       KeBugCheckEx(BAD_POOL_CALLER, 0x9d, Tag, PoolType, (ULONG_PTR)Caller);
-
-    /* FIXME: Handle SESSION_POOL_MASK, VERIFIER_POOL_MASK, QUOTA_POOL_MASK */
-    if (PoolType & PAGED_POOL_MASK)
-    {
-        if (KeGetCurrentIrql() > APC_LEVEL)
-            KeBugCheckEx(BAD_POOL_CALLER, 0x08, KeGetCurrentIrql(), PoolType, Tag);
-#ifdef DEBUG_PPOOL
-        if (ExpIsPoolTagDebuggable(Tag))
-            Block = ExpAllocateDebugPool(PoolType, NumberOfBytes, Tag, Caller, TRUE);
-        else
-#endif
-            Block = ExAllocatePagedPoolWithTag(PoolType, NumberOfBytes, Tag);
-    }
-    else
-    {
-        if (KeGetCurrentIrql() > DISPATCH_LEVEL)
-            KeBugCheckEx(BAD_POOL_CALLER, 0x08, KeGetCurrentIrql(), PoolType, Tag);
-#ifdef DEBUG_NPOOL
-        if (ExpIsPoolTagDebuggable(Tag))
-            Block = ExpAllocateDebugPool(PoolType, NumberOfBytes, Tag, Caller, TRUE);
-        else
-#endif
-            Block = ExAllocateArmPoolWithTag(PoolType, NumberOfBytes, Tag);
-    }
-
-    if ((PoolType & MUST_SUCCEED_POOL_MASK) && !Block)
-        KeBugCheckEx(BAD_POOL_CALLER, 0x9a, PoolType, NumberOfBytes, Tag);
-    return Block;
-}
-
-/*
- * @implemented
- */
-PVOID NTAPI
-ExAllocatePool (POOL_TYPE PoolType, SIZE_T NumberOfBytes)
-/*
- * FUNCTION: Allocates pool memory of a specified type and returns a pointer
- * to the allocated block. This routine is used for general purpose allocation
- * of memory
- * ARGUMENTS:
- *        PoolType
- *               Specifies the type of memory to allocate which can be one
- *               of the following:
- *
- *               NonPagedPool
- *               NonPagedPoolMustSucceed
- *               NonPagedPoolCacheAligned
- *               NonPagedPoolCacheAlignedMustS
- *               PagedPool
- *               PagedPoolCacheAligned
- *
- *        NumberOfBytes
- *               Specifies the number of bytes to allocate
- * RETURNS: The allocated block on success
- *          NULL on failure
- */
-{
-   PVOID Block;
-
-#if defined(__GNUC__)
-
-   Block = EiAllocatePool(PoolType,
-                          NumberOfBytes,
-                          TAG_NONE,
-                          (PVOID)__builtin_return_address(0));
-#elif defined(_MSC_VER)
-
-   Block = EiAllocatePool(PoolType,
-                          NumberOfBytes,
-                          TAG_NONE,
-                          &ExAllocatePool);
-#else
-#error Unknown compiler
-#endif
-
-   return(Block);
-}
-
-
-/*
- * @implemented
- */
-PVOID NTAPI
-ExAllocatePoolWithTag (POOL_TYPE PoolType, SIZE_T NumberOfBytes, ULONG Tag)
-{
-   PVOID Block;
-
-#if defined(__GNUC__)
-
-   Block = EiAllocatePool(PoolType,
-                          NumberOfBytes,
-                          Tag,
-                          (PVOID)__builtin_return_address(0));
-#elif defined(_MSC_VER)
-
-   Block = EiAllocatePool(PoolType,
-                          NumberOfBytes,
-                          Tag,
-                          &ExAllocatePoolWithTag);
-#else
-#error Unknown compiler
-#endif
-
-   return(Block);
-}
-
-/*
- * @implemented
- */
-#undef ExFreePool
-VOID NTAPI
-ExFreePool(IN PVOID Block)
-{
-    ExFreePoolWithTag(Block, 0);
-}
-
-VOID
-NTAPI
-ExFreeArmPoolWithTag(PVOID P,
-                     ULONG TagToFree);
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-ExFreePoolWithTag(
-    IN PVOID Block,
-    IN ULONG Tag)
-{
-    /* Check for paged pool */
-    if (Block >= MmPagedPoolBase && 
-        (char*)Block < ((char*)MmPagedPoolBase + MmPagedPoolSize))
-    {
-        /* Validate tag */
-#ifndef DEBUG_PPOOL
-        if (Tag != 0 && Tag != EiGetPagedPoolTag(Block))
-            KeBugCheckEx(BAD_POOL_CALLER,
-                         0x0a,
-                         (ULONG_PTR)Block,
-                         EiGetPagedPoolTag(Block),
-                         Tag);
-#endif
-        /* Validate IRQL */
-        if (KeGetCurrentIrql() > APC_LEVEL)
-            KeBugCheckEx(BAD_POOL_CALLER,
-                         0x09,
-                         KeGetCurrentIrql(),
-                         PagedPool,
-                         (ULONG_PTR)Block);
-
-        /* Free from paged pool */
-#ifdef DEBUG_PPOOL
-        if (ExpIsPoolTagDebuggable(Tag))
-            ExpFreeDebugPool(Block, TRUE);
-        else
-#endif
-            ExFreePagedPool(Block);
-    }
-    else if (Block) ExFreeArmPoolWithTag(Block, Tag);
-    else
-    {
-        /* Only warn and break for NULL pointers */
-        if (Block == NULL)
-        {
-            DPRINT1("Warning: Trying to free a NULL pointer!\n");
-            ASSERT(FALSE);
-            return;
-        }
-
-        /* Block was not inside any pool! */
-        KeBugCheckEx(BAD_POOL_CALLER, 0x42, (ULONG_PTR)Block, 0, 0);
-    }
-}
-
-/* EOF */
index 0e3850f..973736d 100644 (file)
 #define R_GET_STACK_FRAMES(ptr,cnt) RtlWalkFrameChain((PVOID*)ptr,cnt, 0)
 #endif
 
-#include "rpoolmgr.h"
+/* GLOBALS ********************************************************************/
+
+typedef unsigned long rulong;
+
+#define R_IS_POOL_PTR(pool,ptr) (((void*)(ULONG_PTR)(ptr) >= pool->UserBase) && ((ULONG_PTR)(ptr) < ((ULONG_PTR)pool->UserBase + pool->UserSize)))
+#define R_ASSERT_PTR(pool,ptr) ASSERT( R_IS_POOL_PTR(pool,ptr) )
+#define R_ASSERT_SIZE(pool,sz) ASSERT( sz > (sizeof(R_USED)+2*R_RZ) && sz >= sizeof(R_FREE) && sz < pool->UserSize )
+
+#ifndef R_ROUND_UP
+#define R_ROUND_UP(x,s)    ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
+#endif//R_ROUND_UP
+
+#ifndef R_ROUND_DOWN
+#define R_ROUND_DOWN(x,s)  ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
+#endif//R_ROUND_DOWN
+
+#ifndef R_QUEMIN
+// R_QUEMIN is the minimum number of entries to keep in a que
+#define R_QUEMIN 0
+#endif//R_QUEMIN
+
+#ifndef R_QUECOUNT
+// 16, 32, 64, 128, 256, 512
+#define R_QUECOUNT 6
+#endif//R_QUECOUNT
+
+#ifndef R_RZ
+// R_RZ is the redzone size
+#define R_RZ 4
+#endif//R_RZ
+
+#ifndef R_RZ_LOVALUE
+#define R_RZ_LOVALUE 0x87
+#endif//R_RZ_LOVALUE
+
+#ifndef R_RZ_HIVALUE
+#define R_RZ_HIVALUE 0xA5
+#endif//R_RZ_HIVALUE
+
+#ifndef R_STACK
+// R_STACK is the number of stack entries to store in blocks for debug purposes
+#define R_STACK 6
+#else // R_STACK
+#if R_STACK > 0 && R_STACK < 6
+/* Increase the frame depth to get a reasonable back trace */
+#undef R_STACK
+#define R_STACK 6
+#endif // R_STACK > 0 && R_STACK < 6
+#endif//R_STACK
+
+#ifndef R_TAG
+// R_TAG do we keep track of tags on a per-memory block basis?
+#define R_TAG 0
+#endif//R_TAG
+
+#ifdef R_MAGIC
+#      ifndef R_FREE_MAGIC
+#              define R_FREE_MAGIC (rulong)(('F'<<0) + ('r'<<8) + ('E'<<16) + ('e'<<24))
+#      endif//R_FREE_MAGIC
+#      ifndef R_USED_MAGIC
+#              define R_USED_MAGIC (rulong)(('u'<<0) + ('S'<<8) + ('e'<<16) + ('D'<<24))
+#      endif//R_USED_MAGIC
+#endif//R_MAGIC
+
+// **IMPORTANT NOTE** Magic, PrevSize, Size and Status must be at same offset
+// in both the R_FREE and R_USED structures
+
+typedef struct _R_FREE
+{
+#ifdef R_MAGIC
+       rulong FreeMagic;
+#endif//R_MAGIC
+       rulong PrevSize : 30;
+       rulong Status : 2;
+       rulong Size;
+#if R_STACK
+       ULONG_PTR LastOwnerStack[R_STACK];
+#endif//R_STACK
+       struct _R_FREE* NextFree;
+       struct _R_FREE* PrevFree;
+}
+R_FREE, *PR_FREE;
 
-/* GLOBALS *******************************************************************/
+typedef struct _R_USED
+{
+#ifdef R_MAGIC
+       rulong UsedMagic;
+#endif//R_MAGIC
+       rulong PrevSize : 30;
+       rulong Status : 2;
+       rulong Size;
+#if R_STACK
+       ULONG_PTR LastOwnerStack[R_STACK];
+#endif//R_STACK
+       struct _R_USED* NextUsed;
+#if R_RZ
+       rulong UserSize; // how many bytes the user actually asked for...
+#endif//R_RZ
+       rulong Tag;
+}
+R_USED, *PR_USED;
+
+typedef struct _R_QUE
+{
+       rulong Count;
+       PR_USED First, Last;
+}
+R_QUE, *PR_QUE;
+
+typedef struct _R_POOL
+{
+       void* PoolBase;
+       rulong PoolSize;
+       void* UserBase;
+       rulong UserSize;
+       rulong Alignments[3];
+       PR_FREE FirstFree, LastFree;
+       R_QUE Que[R_QUECOUNT][3];
+       R_MUTEX Mutex;
+}
+R_POOL, *PR_POOL;
 
 PVOID MmPagedPoolBase;
 ULONG MmPagedPoolSize;
 ULONG MmTotalPagedPoolQuota = 0; // TODO FIXME commented out until we use it
 static PR_POOL MmPagedPool = NULL;
 
-/* FUNCTIONS *****************************************************************/
+/* FUNCTIONS*******************************************************************/
 
-VOID
-INIT_FUNCTION
-NTAPI
-MmInitializePagedPool(VOID)
-{   
-       /*
-        * We are still at a high IRQL level at this point so explicitly commit
-        * the first page of the paged pool before writing the first block header.
-        */
-       MmCommitPagedPoolAddress ( (PVOID)MmPagedPoolBase, FALSE );
+#if !R_STACK
+#define RiPrintLastOwner(Block)
+#else
+static void
+RiPrintLastOwner ( PR_USED Block )
+{
+       int i;
+       for ( i = 0; i < R_STACK; i++ )
+       {
+               if ( Block->LastOwnerStack[i] != 0xDEADBEEF )
+               {
+                       R_DEBUG(" ");
+                       //if (!R_PRINT_ADDRESS ((PVOID)Block->LastOwnerStack[i]) )
+                       {
+                               R_DEBUG("<%X>", Block->LastOwnerStack[i] );
+                       }
+               }
+       }
+}
+#endif//R_STACK
 
-       MmPagedPool = RPoolInit ( MmPagedPoolBase,
-               MmPagedPoolSize,
-               MM_POOL_ALIGNMENT,
-               MM_CACHE_LINE_SIZE,
-               PAGE_SIZE );
+static int
+RQueWhich ( rulong size )
+{
+       rulong que, quesize;
+       for ( que=0, quesize=16; que < R_QUECOUNT; que++, quesize<<=1 )
+       {
+               if ( quesize >= size )
+               {
+                       return que;
+               }
+       }
+       return -1;
+}
 
-       ExInitializeFastMutex(&MmPagedPool->Mutex);
+static void
+RQueInit ( PR_QUE que )
+{
+       que->Count = 0;
+       que->First = NULL;
+       que->Last = NULL;
 }
 
-/**********************************************************************
- * NAME       INTERNAL
- * ExAllocatePagedPoolWithTag@12
- *
- * DESCRIPTION
- *
- * ARGUMENTS
- *
- * RETURN VALUE
- */
-PVOID NTAPI
-ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType,
-                            IN ULONG  NumberOfBytes,
-                            IN ULONG  Tag)
+static void
+RQueAdd ( PR_QUE que, PR_USED Item )
 {
-       int align;
+       ASSERT(Item);
+       Item->Status = 2;
+       Item->NextUsed = NULL;
+       ++que->Count;
+       if ( !que->Last )
+       {
+               que->First = que->Last = Item;
+               return;
+       }
+       ASSERT(!que->Last->NextUsed);
+       que->Last->NextUsed = Item;
+       que->Last = Item;
+}
 
-       if ( NumberOfBytes >= PAGE_SIZE )
-               align = 2;
-       else if ( PoolType & CACHE_ALIGNED_POOL_MASK )
-               align = 1;
+static PR_USED
+RQueRemove ( PR_QUE que )
+{
+       PR_USED Item;
+#if R_QUEMIN
+       if ( que->count < R_QUEMIN )
+               return NULL;
+#endif
+       if ( !que->First )
+               return NULL;
+       Item = que->First;
+       que->First = Item->NextUsed;
+       if ( !--que->Count )
+       {
+               ASSERT ( !que->First );
+               que->Last = NULL;
+       }
+       Item->Status = 0;
+       return Item;
+}
+
+static void
+RPoolAddFree ( PR_POOL pool, PR_FREE Item )
+{
+       ASSERT(pool);
+       ASSERT(Item);
+       if ( !pool->FirstFree )
+       {
+               pool->FirstFree = pool->LastFree = Item;
+               Item->NextFree = NULL;
+       }
        else
-               align = 0;
+       {
+               pool->FirstFree->PrevFree = Item;
+               Item->NextFree = pool->FirstFree;
+               pool->FirstFree = Item;
+       }
+       Item->PrevFree = NULL;
+}
 
-       ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL);
+static void
+RPoolRemoveFree ( PR_POOL pool, PR_FREE Item )
+{
+       ASSERT(pool);
+       ASSERT(Item);
+       if ( Item->NextFree )
+               Item->NextFree->PrevFree = Item->PrevFree;
+       else
+       {
+               ASSERT ( pool->LastFree == Item );
+               pool->LastFree = Item->PrevFree;
+       }
+       if ( Item->PrevFree )
+               Item->PrevFree->NextFree = Item->NextFree;
+       else
+       {
+               ASSERT ( pool->FirstFree == Item );
+               pool->FirstFree = Item->NextFree;
+       }
+#if DBG
+       Item->NextFree = Item->PrevFree = (PR_FREE)(ULONG_PTR)0xDEADBEEF;
+#endif//DBG
+}
 
-       return RPoolAlloc ( MmPagedPool, NumberOfBytes, Tag, align );
+#if !R_STACK
+#define RFreeFillStack(free)
+#define RUsedFillStack(used)
+#else
+static void
+RFreeFillStack ( PR_FREE free )
+{
+       int i;
+       ULONG stack[R_STACK+3]; // need to skip 3 known levels of stack trace
+       memset ( stack, 0xCD, sizeof(stack) );
+       R_GET_STACK_FRAMES ( stack, R_STACK+3 );
+       for ( i = 0; i < R_STACK; i++ )
+               free->LastOwnerStack[i] = stack[i+3];
 }
 
-VOID NTAPI
-ExFreePagedPool(IN PVOID Block)
+static void
+RUsedFillStack ( PR_USED used )
 {
-       ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL);
-       RPoolFree ( MmPagedPool, Block );
+       int i;
+       ULONG stack[R_STACK+2]; // need to skip 2 known levels of stack trace
+       memset ( stack, 0xCD, sizeof(stack) );
+       R_GET_STACK_FRAMES ( stack, R_STACK+2 );
+       for ( i = 0; i < R_STACK; i++ )
+               used->LastOwnerStack[i] = stack[i+2];
 }
+#endif
 
-ULONG NTAPI
-EiGetPagedPoolTag(IN PVOID Block)
+static PR_FREE
+RFreeInit ( void* memory )
 {
-    return RBodyToHdr(Block)->Tag;
+       PR_FREE block = (PR_FREE)memory;
+#if R_FREEMAGIC
+       block->FreeMagic = R_FREE_MAGIC;
+#endif//R_FREEMAGIC
+       block->Status = 0;
+       RFreeFillStack ( block );
+#if DBG
+       block->PrevFree = block->NextFree = (PR_FREE)(ULONG_PTR)0xDEADBEEF;
+#endif//DBG
+       return block;
 }
 
+PR_POOL
+RPoolInit ( void* PoolBase, rulong PoolSize, int align1, int align2, int align3 )
+{
+       int align, que;
+       PR_POOL pool = (PR_POOL)PoolBase;
+
+       pool->PoolBase = PoolBase;
+       pool->PoolSize = PoolSize;
+       pool->UserBase = (char*)pool->PoolBase + sizeof(R_POOL);
+       pool->UserSize = PoolSize - sizeof(R_POOL);
+       pool->Alignments[0] = align1;
+       pool->Alignments[1] = align2;
+       pool->Alignments[2] = align3;
+       pool->FirstFree = pool->LastFree = NULL;
 
-#ifdef PPOOL_UMODE_TEST
+       RPoolAddFree ( pool,
+               RFreeInit ( pool->UserBase ));
 
-PVOID TestAlloc ( ULONG Bytes )
+       pool->FirstFree->PrevSize = 0;
+       pool->FirstFree->Size = pool->UserSize;
+
+       for ( que = 0; que < R_QUECOUNT; que++ )
+       {
+               for ( align = 0; align < 3; align++ )
+               {
+                       RQueInit ( &pool->Que[que][align] );
+               }
+       }
+       return pool;
+}
+
+#if R_RZ
+static const char*
+RFormatTag ( rulong Tag, char* buf )
 {
-       PVOID ret;
+       int i;
+       *(rulong*)&buf[0] = Tag;
+       buf[4] = 0;
+       for ( i = 0; i < 4; i++ )
+       {
+               if ( !buf[i] )
+                       buf[i] = ' ';
+       }
+       return buf;
+}
+#endif
 
-       //printf ( "Allocating block: " ); RPoolStats ( MmPagedPool );
-       //RPoolRedZoneCheck ( MmPagedPool, __FILE__, __LINE__ );
+#if !R_RZ
+#define RUsedRedZoneCheck(pUsed,Addr,file,line, printzone)
+#else//R_RZ
+static void
+RiBadBlock ( PR_USED pUsed, char* Addr, const char* violation, const char* file, int line, int printzone )
+{
+       char tag[5];
+       unsigned int i;
+
+       R_DEBUG("%s(%i): %s detected for paged pool address 0x%x\n",
+               file, line, violation, Addr );
+
+#ifdef R_MAGIC
+       R_DEBUG ( "UsedMagic 0x%x, ", pUsed->UsedMagic );
+#endif//R_MAGIC
+       R_DEBUG ( "Tag %s(%X), Size %i, UserSize %i",
+               RFormatTag(pUsed->Tag,tag),
+               pUsed->Tag,
+               pUsed->Size,
+               pUsed->UserSize );
+
+       if ( printzone )
+       {
+               unsigned char* HiZone = (unsigned char*)Addr + pUsed->UserSize;
+               unsigned char* LoZone = (unsigned char*)Addr - R_RZ; // this is to simplify indexing below...
+               R_DEBUG ( ", LoZone " );
+               for ( i = 0; i < R_RZ; i++ )
+                       R_DEBUG ( "%02x", LoZone[i] );
+               R_DEBUG ( ", HiZone " );
+               for ( i = 0; i < R_RZ; i++ )
+                       R_DEBUG ( "%02x", HiZone[i] );
+       }
+       R_DEBUG ( "\n" );
 
-       ret = ExAllocatePagedPoolWithTag ( PagedPool, Bytes, 0 );
+       R_DEBUG ( "First few Stack Frames:" );
+       RiPrintLastOwner ( pUsed );
+       R_DEBUG ( "\n" );
 
-       //printf ( "Block %x allocated: ", ret ); RPoolStats ( MmPagedPool );
-       //RPoolRedZoneCheck ( MmPagedPool, __FILE__, __LINE__ );
+       R_DEBUG ( "Contents of Block:\n" );
+       for ( i = 0; i < 8*16 && i < pUsed->UserSize; i += 16 )
+       {
+               int j;
+               R_DEBUG ( "%04X ", i );
+               for ( j = 0; j < 16; j++ )
+               {
+                       if ( i+j < pUsed->UserSize )
+                       {
+                               R_DEBUG ( "%02X ", (unsigned)(unsigned char)Addr[i+j] );
+                       }
+                       else
+                       {
+                               R_DEBUG ( "   " );
+                       }
+               }
+               R_DEBUG(" ");
+               for ( j = 0; j < 16; j++ )
+               {
+                       if ( i+j < pUsed->UserSize )
+                       {
+                               char c = Addr[i+j];
+                               if ( c < 0x20 || c > 0x7E )
+                                       c = '.';
+                               R_DEBUG ( "%c", c );
+                       }
+                       else
+                       {
+                               R_DEBUG ( " " );
+                       }
+               }
+               R_DEBUG("\n");
+       }
+       R_PANIC();
+}
+static void
+RUsedRedZoneCheck ( PR_POOL pool, PR_USED pUsed, char* Addr, const char* file, int line )
+{
+       int i;
+       unsigned char *LoZone, *HiZone;
+       int bLow = 1;
+       int bHigh = 1;
+
+       ASSERT ( Addr >= (char*)pool->UserBase && Addr < ((char*)pool->UserBase + pool->UserSize - 16) );
+#ifdef R_MAGIC
+       if ( pUsed->UsedMagic == R_FREE_MAGIC )
+       {
+               pUsed->UserSize = 0; // just to keep from confusion, MmpBadBlock() doesn't return...
+               RiBadBlock ( pUsed, Addr, "double-free", file, line, 0 );
+       }
+       if ( pUsed->UsedMagic != R_USED_MAGIC )
+       {
+               RiBadBlock ( pUsed, Addr, "bad magic", file, line, 0 );
+       }
+#endif//R_MAGIC
+       switch ( pUsed->Status )
+       {
+       case 0: // freed into main pool
+       case 2: // in ques
+               RiBadBlock ( pUsed, Addr, "double-free", file, line, 0 );
+               // no need for break here - RiBadBlock doesn't return
+       case 1: // allocated - this is okay
+               break;
+       default:
+               RiBadBlock ( pUsed, Addr, "corrupt status", file, line, 0 );
+       }
+       if ( pUsed->Status != 1 )
+       {
+               RiBadBlock ( pUsed, Addr, "double-free", file, line, 0 );
+       }
+       if ( pUsed->Size > pool->PoolSize || pUsed->Size == 0 )
+       {
+               RiBadBlock ( pUsed, Addr, "invalid size", file, line, 0 );
+       }
+       if ( pUsed->UserSize > pool->PoolSize || pUsed->UserSize == 0 )
+       {
+               RiBadBlock ( pUsed, Addr, "invalid user size", file, line, 0 );
+       }
+       HiZone = (unsigned char*)Addr + pUsed->UserSize;
+       LoZone = (unsigned char*)Addr - R_RZ; // this is to simplify indexing below...
+       for ( i = 0; i < R_RZ && bLow && bHigh; i++ )
+       {
+               bLow = bLow && ( LoZone[i] == R_RZ_LOVALUE );
+               bHigh = bHigh && ( HiZone[i] == R_RZ_HIVALUE );
+       }
+       if ( !bLow || !bHigh )
+       {
+               const char* violation = "High and Low-side redzone overwrite";
+               if ( bHigh ) // high is okay, so it was just low failed
+                       violation = "Low-side redzone overwrite";
+               else if ( bLow ) // low side is okay, so it was just high failed
+                       violation = "High-side redzone overwrite";
+               RiBadBlock ( pUsed, Addr, violation, file, line, 1 );
+       }
+}
+#endif//R_RZ
 
-       return ret;
+PR_FREE
+RPreviousBlock ( PR_FREE Block )
+{
+       if ( Block->PrevSize > 0 )
+               return (PR_FREE)( (char*)Block - Block->PrevSize );
+       return NULL;
 }
 
-void TestFree ( PVOID ptr )
+PR_FREE
+RNextBlock ( PR_POOL pool, PR_FREE Block )
 {
-       //printf ( "Freeing block %x: ", ptr ); RPoolStats ( MmPagedPool );
-       //RPoolRedZoneCheck ( MmPagedPool, __FILE__, __LINE__ );
-       ExFreePagedPool(ptr);
-       //printf ( "Block %x freed: ", ptr ); RPoolStats ( MmPagedPool );
-       //RPoolRedZoneCheck ( MmPagedPool, __FILE__, __LINE__ );
+       PR_FREE NextBlock = (PR_FREE)( (char*)Block + Block->Size );
+       if ( (char*)NextBlock >= (char*)pool->UserBase + pool->UserSize )
+               NextBlock = NULL;
+       return NextBlock;
 }
 
-int main()
+static __inline void*
+RHdrToBody ( void* blk )
+/*
+ * FUNCTION: Translate a block header address to the corresponding block
+ * address (internal)
+ */
 {
-#define COUNT 100
-       int i, j;
-       char* keepers[COUNT];
-       char* trash[COUNT];
-       int AllocSize[] = { 15, 31, 63, 127, 255, 511, 1023, 2047 };
-       const int ALLOCS = sizeof(AllocSize) / sizeof(0[AllocSize]);
-       ULONG dwStart;
+       return ( (void *) ((char*)blk + sizeof(R_USED) + R_RZ) );
+}
 
-       MmPagedPoolSize = 1*1024*1024;
-       MmPagedPoolBase = malloc ( MmPagedPoolSize );
-       MmInitializePagedPool();
+static __inline PR_USED
+RBodyToHdr ( void* addr )
+{
+       return (PR_USED)
+              ( ((char*)addr) - sizeof(R_USED) - R_RZ );
+}
 
-       dwStart = GetTickCount();
+static int
+RiInFreeChain ( PR_POOL pool, PR_FREE Block )
+{
+       PR_FREE Free;
+       Free = pool->FirstFree;
+       if ( Free == Block )
+               return 1;
+       while ( Free != Block )
+       {
+               Free = Free->NextFree;
+               if ( !Free )
+                       return 0;
+       }
+       return 1;
+}
 
-       printf ( "test #1 phase #1\n" );
-       for ( i = 0; i < COUNT; i++ )
+static void
+RPoolRedZoneCheck ( PR_POOL pool, const char* file, int line )
+{
        {
-               //printf ( "keeper %i) ", i );
-               keepers[i] = TestAlloc ( AllocSize[i%ALLOCS] );
-               if ( !keepers[i] ) printf ( "allocation failed\n" );
-               //printf ( "trash %i) ", i );
-               trash[i] = TestAlloc ( AllocSize[i%ALLOCS] );
-               if ( !trash[i] ) printf ( "allocation failed\n" );
+               PR_USED Block = (PR_USED)pool->UserBase;
+               PR_USED NextBlock;
+
+               for ( ;; )
+               {
+                       switch ( Block->Status )
+                       {
+                       case 0: // block is in chain
+                               ASSERT ( RiInFreeChain ( pool, (PR_FREE)Block ) );
+                               break;
+                       case 1: // block is allocated
+                               RUsedRedZoneCheck ( pool, Block, RHdrToBody(Block), file, line );
+                               break;
+                       case 2: // block is in que
+                               // nothing to verify here yet
+                               break;
+                       default:
+                               ASSERT ( !"invalid status in memory block found in pool!" );
+                       }
+                       NextBlock = (PR_USED)RNextBlock(pool,(PR_FREE)Block);
+                       if ( !NextBlock )
+                               break;
+                       ASSERT ( NextBlock->PrevSize == Block->Size );
+                       Block = NextBlock;
+               }
        }
+       {
+               // now let's step through the list of free pointers and verify
+               // each one can be found by size-jumping...
+               PR_FREE Free = (PR_FREE)pool->FirstFree;
+               while ( Free )
+               {
+                       PR_FREE NextFree = (PR_FREE)pool->UserBase;
+                       if ( Free != NextFree )
+                       {
+                               while ( NextFree != Free )
+                               {
+                                       NextFree = RNextBlock ( pool, NextFree );
+                                       ASSERT(NextFree);
+                               }
+                       }
+                       Free = Free->NextFree;
+               }
+       }
+}
+
+static void
+RSetSize ( PR_POOL pool, PR_FREE Block, rulong NewSize, PR_FREE NextBlock )
+{
+       R_ASSERT_PTR(pool,Block);
+       ASSERT ( NewSize < pool->UserSize );
+       ASSERT ( NewSize >= sizeof(R_FREE) );
+       Block->Size = NewSize;
+       if ( !NextBlock )
+               NextBlock = RNextBlock ( pool, Block );
+       if ( NextBlock )
+               NextBlock->PrevSize = NewSize;
+}
+
+static PR_FREE
+RFreeSplit ( PR_POOL pool, PR_FREE Block, rulong NewSize )
+{
+       PR_FREE NewBlock = (PR_FREE)((char*)Block + NewSize);
+       RSetSize ( pool, NewBlock, Block->Size - NewSize, NULL );
+       RSetSize ( pool, Block, NewSize, NewBlock );
+       RFreeInit ( NewBlock );
+       RPoolAddFree ( pool, NewBlock );
+       return NewBlock;
+}
 
-       printf ( "test #1 phase #2\n" );
-       for ( i = 0; i < COUNT; i++ )
+static void
+RFreeMerge ( PR_POOL pool, PR_FREE First, PR_FREE Second )
+{
+       ASSERT ( RPreviousBlock(Second) == First );
+       ASSERT ( First->Size == Second->PrevSize );
+       RPoolRemoveFree ( pool, Second );
+       RSetSize ( pool, First, First->Size + Second->Size, NULL );
+}
+
+static void
+RPoolReclaim ( PR_POOL pool, PR_FREE FreeBlock )
+{
+       PR_FREE NextBlock, PreviousBlock;
+
+       RFreeInit ( FreeBlock );
+       RPoolAddFree ( pool, FreeBlock );
+
+       // TODO FIXME - don't merge and always insert freed blocks at the end for debugging purposes...
+
+       /*
+        * If the next block is immediately adjacent to the newly freed one then
+        * merge them.
+        * PLEASE DO NOT WIPE OUT 'MAGIC' OR 'LASTOWNER' DATA FOR MERGED FREE BLOCKS
+        */
+       NextBlock = RNextBlock ( pool, FreeBlock );
+       if ( NextBlock != NULL && !NextBlock->Status )
        {
-               if ( i == 6 )
-                       i = i;
-               //printf ( "%i) ", i );
-               TestFree ( trash[i] );
+               RFreeMerge ( pool, FreeBlock, NextBlock );
        }
 
-       printf ( "test #1 phase #3\n" );
-       for ( i = 0; i < 4; i++ )
+       /*
+        * If the previous block is adjacent to the newly freed one then
+        * merge them.
+        * PLEASE DO NOT WIPE OUT 'MAGIC' OR 'LASTOWNER' DATA FOR MERGED FREE BLOCKS
+        */
+       PreviousBlock = RPreviousBlock ( FreeBlock );
+       if ( PreviousBlock != NULL && !PreviousBlock->Status )
        {
-               //printf ( "%i) ", i );
-               keepers[i] = TestAlloc ( 4096 );
-               if ( !keepers[i] ) printf ( "allocation failed\n" );
+               RFreeMerge ( pool, PreviousBlock, FreeBlock );
        }
+}
 
-       printf ( "test #1 phase #4\n" );
-       for ( i = 0; i < 4; i++ )
+static void
+RiUsedInit ( PR_USED Block, rulong Tag )
+{
+       Block->Status = 1;
+       RUsedFillStack ( Block );
+#ifdef R_MAGIC
+       Block->UsedMagic = R_USED_MAGIC;
+#endif//R_MAGIC
+       //ASSERT_SIZE ( Block->Size );
+
+       // now add the block to the used block list
+#if DBG
+       Block->NextUsed = (PR_USED)(ULONG_PTR)0xDEADBEEF;
+#endif//R_USED_LIST
+
+       Block->Tag = Tag;
+}
+
+#if !R_RZ
+#define RiUsedInitRedZone(Block,UserSize)
+#else//R_RZ
+static void
+RiUsedInitRedZone ( PR_USED Block, rulong UserSize )
+{
+       // write out buffer-overrun detection bytes
+       char* Addr = (char*)RHdrToBody(Block);
+       Block->UserSize = UserSize;
+       memset ( Addr - R_RZ, R_RZ_LOVALUE, R_RZ );
+       memset ( Addr + Block->UserSize, R_RZ_HIVALUE, R_RZ );
+#if DBG
+       memset ( Addr, 0xCD, UserSize );
+#endif//DBG
+}
+#endif//R_RZ
+
+static void*
+RPoolAlloc ( PR_POOL pool, rulong NumberOfBytes, rulong Tag, rulong align )
+{
+       PR_USED NewBlock;
+       PR_FREE BestBlock,
+               NextBlock,
+               PreviousBlock,
+               BestPreviousBlock,
+               CurrentBlock;
+       void* BestAlignedAddr;
+       int que,
+               queBytes = NumberOfBytes;
+       rulong BlockSize,
+               Alignment;
+       int que_reclaimed = 0;
+
+       ASSERT ( pool );
+       ASSERT ( align < 3 );
+
+       R_ACQUIRE_MUTEX(pool);
+
+       if ( !NumberOfBytes )
        {
-               //printf ( "%i) ", i );
-               TestFree ( keepers[i] );
+               R_DEBUG("0 bytes requested - initiating pool verification\n");
+               RPoolRedZoneCheck ( pool, __FILE__, __LINE__ );
+               R_RELEASE_MUTEX(pool);
+               return NULL;
+       }
+       if ( NumberOfBytes > pool->PoolSize )
+       {
+               if ( R_IS_POOL_PTR(pool,NumberOfBytes) )
+               {
+                       R_DEBUG("red zone verification requested for block 0x%X\n", NumberOfBytes );
+                       RUsedRedZoneCheck(pool,RBodyToHdr((void*)(ULONG_PTR)NumberOfBytes), (char*)(ULONG_PTR)NumberOfBytes, __FILE__, __LINE__ );
+                       R_RELEASE_MUTEX(pool);
+                       return NULL;
+               }
+               R_DEBUG("Invalid allocation request: %i bytes\n", NumberOfBytes );
+               R_RELEASE_MUTEX(pool);
+               return NULL;
        }
 
-       printf ( "test #1 phase #5\n" );
-       srand(1);
-       for ( i = 0; i < COUNT; i++ )
+       que = RQueWhich ( NumberOfBytes );
+       if ( que >= 0 )
        {
-               //printf ( "%i) ", i );
-               trash[i] = TestAlloc ( rand()%1024+1 );
-               if ( !trash[i] ) printf ( "allocation failed\n" );
+               if ( (NewBlock = RQueRemove ( &pool->Que[que][align] )) )
+               {
+                       RiUsedInit ( NewBlock, Tag );
+                       RiUsedInitRedZone ( NewBlock, NumberOfBytes );
+                       R_RELEASE_MUTEX(pool);
+                       return RHdrToBody(NewBlock);
+               }
+               queBytes = 16 << que;
        }
-       printf ( "test #1 phase #6\n" );
-       for ( i = 0; i < 10000; i++ )
+
+       /*
+        * Calculate the total number of bytes we will need.
+        */
+       BlockSize = queBytes + sizeof(R_USED) + 2*R_RZ;
+       if (BlockSize < sizeof(R_FREE))
        {
-               TestFree ( trash[i%COUNT] );
-               trash[i%COUNT] = TestAlloc ( rand()%1024+1 );
-               if ( !trash[i%COUNT] ) printf ( "allocation failed\n" );
+               /* At least we need the size of the free block header. */
+               BlockSize = sizeof(R_FREE);
        }
-       printf ( "test #1 phase #7\n" );
-       j = 0;
-       for ( i = 0; i < COUNT; i++ )
+
+try_again:
+       /*
+        * Find the best-fitting block.
+        */
+       BestBlock = NULL;
+       Alignment = pool->Alignments[align];
+       PreviousBlock = NULL;
+       BestPreviousBlock = NULL,
+       CurrentBlock = pool->FirstFree;
+       BestAlignedAddr = NULL;
+
+       while ( CurrentBlock != NULL )
+       {
+               PVOID Addr = RHdrToBody(CurrentBlock);
+               PVOID CurrentBlockEnd = (char*)CurrentBlock + CurrentBlock->Size;
+               /* calculate last size-aligned address available within this block */
+               PVOID AlignedAddr = R_ROUND_DOWN((char*)CurrentBlockEnd-queBytes-R_RZ, Alignment);
+               ASSERT ( (char*)AlignedAddr+queBytes+R_RZ <= (char*)CurrentBlockEnd );
+
+               /* special case, this address is already size-aligned, and the right size */
+               if ( Addr == AlignedAddr )
+               {
+                       BestAlignedAddr = AlignedAddr;
+                       BestPreviousBlock = PreviousBlock;
+                       BestBlock = CurrentBlock;
+                       break;
+               }
+               // if we carve out a size-aligned block... is it still past the end of this
+               // block's free header?
+               else if ( (char*)RBodyToHdr(AlignedAddr)
+                       >= (char*)CurrentBlock+sizeof(R_FREE) )
+               {
+                       /*
+                        * there's enough room to allocate our size-aligned memory out
+                        * of this block, see if it's a better choice than any previous
+                        * finds
+                        */
+                       if ( BestBlock == NULL
+                               || BestBlock->Size > CurrentBlock->Size )
+                       {
+                               BestAlignedAddr = AlignedAddr;
+                               BestPreviousBlock = PreviousBlock;
+                               BestBlock = CurrentBlock;
+                       }
+               }
+
+               PreviousBlock = CurrentBlock;
+               CurrentBlock = CurrentBlock->NextFree;
+       }
+
+       /*
+        * We didn't find anything suitable at all.
+        */
+       if (BestBlock == NULL)
+       {
+               if ( !que_reclaimed )
+               {
+                       // reclaim que
+                       int i, j;
+                       for ( i = 0; i < R_QUECOUNT; i++ )
+                       {
+                               for ( j = 0; j < 3; j++ )
+                               {
+                                       while ( (BestBlock = (PR_FREE)RQueRemove ( &pool->Que[i][j] )) )
+                                       {
+                                               RPoolReclaim ( pool, BestBlock );
+                                       }
+                               }
+                       }
+
+                       que_reclaimed = 1;
+                       goto try_again;
+               }
+               DPRINT1("Trying to allocate %lu bytes from paged pool - nothing suitable found, returning NULL\n",
+                       queBytes );
+               R_RELEASE_MUTEX(pool);
+               return NULL;
+       }
+       /*
+        * we found a best block. If Addr isn't already aligned, we've pre-qualified that
+        * there's room at the beginning of the block for a free block...
+        */
        {
-               if ( trash[i] )
+               void* Addr = RHdrToBody(BestBlock);
+               if ( BestAlignedAddr != Addr )
                {
-                       TestFree ( trash[i] );
-                       ++j;
+                       PR_FREE NewFreeBlock = RFreeSplit (
+                               pool,
+                               BestBlock,
+                               (char*)RBodyToHdr(BestAlignedAddr) - (char*)BestBlock );
+                       ASSERT ( BestAlignedAddr > Addr );
+
+                       //DPRINT ( "breaking off preceding bytes into their own block...\n" );
+                       /*DPRINT ( "NewFreeBlock 0x%x Size %lu (Old Block's new size %lu) NextFree 0x%x\n",
+                               NewFreeBlock, NewFreeBlock->Size, BestBlock->Size, BestBlock->NextFree );*/
+
+                       /* we want the following code to use our size-aligned block */
+                       BestPreviousBlock = BestBlock;
+                       BestBlock = NewFreeBlock;
+
+                       //VerifyPagedPool();
                }
        }
-       printf ( "test #1 phase #8 ( freed %i of %i trash )\n", j, COUNT );
-       if ( !TestAlloc ( 2048 ) )
-               printf ( "Couldn't allocate 2048 bytes after freeing up a whole bunch of blocks\n" );
+       /*
+        * Is there enough space to create a second block from the unused portion.
+        */
+       if ( (BestBlock->Size - BlockSize) > sizeof(R_FREE) )
+       {
+               /*DPRINT("BestBlock 0x%x Size 0x%x BlockSize 0x%x NewSize 0x%x\n",
+                       BestBlock, BestBlock->Size, BlockSize, NewSize );*/
+
+               /*
+                * Create the new free block.
+                */
+               NextBlock = RFreeSplit ( pool, BestBlock, BlockSize );
+               //ASSERT_SIZE ( NextBlock->Size );
+       }
+       /*
+        * Remove the selected block from the list of free blocks.
+        */
+       //DPRINT ( "Removing selected block from free block list\n" );
+       RPoolRemoveFree ( pool, BestBlock );
+       /*
+        * Create the new used block header.
+        */
+       NewBlock = (PR_USED)BestBlock;
+       RiUsedInit ( NewBlock, Tag );
+
+       /*  RtlZeroMemory(RHdrToBody(NewBlock), NumberOfBytes);*/
+
+       RiUsedInitRedZone ( NewBlock, NumberOfBytes );
+       R_RELEASE_MUTEX(pool);
 
-       free ( MmPagedPoolBase );
+       return RHdrToBody(NewBlock);
+}
+
+static void
+RPoolFree ( PR_POOL pool, void* Addr )
+{
+       PR_USED UsedBlock;
+       rulong UsedSize;
+       PR_FREE FreeBlock;
+       rulong UserSize;
+       int que;
+
+       ASSERT(pool);
+       if ( !Addr )
+       {
+               R_DEBUG("Attempt to free NULL ptr, initiating Red Zone Check\n" );
+               R_ACQUIRE_MUTEX(pool);
+               RPoolRedZoneCheck ( pool, __FILE__, __LINE__ );
+               R_RELEASE_MUTEX(pool);
+               return;
+       }
+       R_ASSERT_PTR(pool,Addr);
 
-       printf ( "test time: %lu\n", GetTickCount() - dwStart );
+       UsedBlock = RBodyToHdr(Addr);
+       UsedSize = UsedBlock->Size;
+       FreeBlock = (PR_FREE)UsedBlock;
+#if R_RZ
+       UserSize = UsedBlock->UserSize;
+#else
+       UserSize = UsedSize - sizeof(R_USED) - 2*R_RZ;
+#endif//R_RZ
 
-       printf ( "test #2\n" );
+       RUsedRedZoneCheck ( pool, UsedBlock, Addr, __FILE__, __LINE__ );
 
-       MmPagedPoolSize = 1024;
-       MmPagedPoolBase = malloc ( MmPagedPoolSize );
-       MmInitializePagedPool();
+#if R_RZ
+       memset ( Addr, 0xCD, UsedBlock->UserSize );
+#endif
 
-       TestAlloc ( 512 );
-       i = RPoolLargestAllocPossible ( MmPagedPool, 0 );
-       if ( !TestAlloc ( i ) )
+       que = RQueWhich ( UserSize );
+       if ( que >= 0 )
        {
-               printf ( "allocating last available block failed\n" );
+               int queBytes = 16 << que;
+               ASSERT( (rulong)queBytes >= UserSize );
+               if ( que >= 0 )
+               {
+                       int align = 0;
+                       if ( R_ROUND_UP(Addr,pool->Alignments[2]) == Addr )
+                               align = 2;
+                       else if ( R_ROUND_UP(Addr,pool->Alignments[1]) == Addr )
+                               align = 1;
+                       R_ACQUIRE_MUTEX(pool);
+                       RQueAdd ( &pool->Que[que][align], UsedBlock );
+                       R_RELEASE_MUTEX(pool);
+                       return;
+               }
        }
 
-       free ( MmPagedPoolBase );
+       R_ACQUIRE_MUTEX(pool);
+       RPoolReclaim ( pool, FreeBlock );
+       R_RELEASE_MUTEX(pool);
+}
+
+VOID
+INIT_FUNCTION
+NTAPI
+MmInitializePagedPool(VOID)
+{   
+       /*
+        * We are still at a high IRQL level at this point so explicitly commit
+        * the first page of the paged pool before writing the first block header.
+        */
+       MmCommitPagedPoolAddress ( (PVOID)MmPagedPoolBase, FALSE );
 
-       printf ( "done!\n" );
-       return 0;
+       MmPagedPool = RPoolInit ( MmPagedPoolBase,
+               MmPagedPoolSize,
+               MM_POOL_ALIGNMENT,
+               MM_CACHE_LINE_SIZE,
+               PAGE_SIZE );
+
+       ExInitializeFastMutex(&MmPagedPool->Mutex);
+}
+
+PVOID NTAPI
+ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType,
+                            IN ULONG  NumberOfBytes,
+                            IN ULONG  Tag)
+{
+       int align;
+
+       if ( NumberOfBytes >= PAGE_SIZE )
+               align = 2;
+       else if ( PoolType & CACHE_ALIGNED_POOL_MASK )
+               align = 1;
+       else
+               align = 0;
+
+       ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL);
+
+       return RPoolAlloc ( MmPagedPool, NumberOfBytes, Tag, align );
+}
+
+VOID NTAPI
+ExFreePagedPool(IN PVOID Block)
+{
+       ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL);
+       RPoolFree ( MmPagedPool, Block );
 }
-#endif//PPOOL_UMODE_TEST
 
 /* EOF */
diff --git a/reactos/ntoskrnl/mm/rpoolmgr.h b/reactos/ntoskrnl/mm/rpoolmgr.h
deleted file mode 100644 (file)
index f72cdb3..0000000
+++ /dev/null
@@ -1,1060 +0,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS kernel
- * FILE:            ntoskrnl/mm/RPoolMgr.h
- * PURPOSE:         A semi-generic reuseable Pool implementation
- * PROGRAMMER:      Royce Mitchell III
- * UPDATE HISTORY:
- */
-
-#ifndef RPOOLMGR_H
-#define RPOOLMGR_H
-
-typedef unsigned long rulong;
-
-#define R_IS_POOL_PTR(pool,ptr) (((void*)(ULONG_PTR)(ptr) >= pool->UserBase) && ((ULONG_PTR)(ptr) < ((ULONG_PTR)pool->UserBase + pool->UserSize)))
-#define R_ASSERT_PTR(pool,ptr) ASSERT( R_IS_POOL_PTR(pool,ptr) )
-#define R_ASSERT_SIZE(pool,sz) ASSERT( sz > (sizeof(R_USED)+2*R_RZ) && sz >= sizeof(R_FREE) && sz < pool->UserSize )
-
-#ifndef R_ROUND_UP
-#define R_ROUND_UP(x,s)    ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
-#endif//R_ROUND_UP
-
-#ifndef R_ROUND_DOWN
-#define R_ROUND_DOWN(x,s)  ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
-#endif//R_ROUND_DOWN
-
-#ifndef R_QUEMIN
-// R_QUEMIN is the minimum number of entries to keep in a que
-#define R_QUEMIN 0
-#endif//R_QUEMIN
-
-#ifndef R_QUECOUNT
-// 16, 32, 64, 128, 256, 512
-#define R_QUECOUNT 6
-#endif//R_QUECOUNT
-
-#ifndef R_RZ
-// R_RZ is the redzone size
-#define R_RZ 4
-#endif//R_RZ
-
-#ifndef R_RZ_LOVALUE
-#define R_RZ_LOVALUE 0x87
-#endif//R_RZ_LOVALUE
-
-#ifndef R_RZ_HIVALUE
-#define R_RZ_HIVALUE 0xA5
-#endif//R_RZ_HIVALUE
-
-#ifndef R_STACK
-// R_STACK is the number of stack entries to store in blocks for debug purposes
-#define R_STACK 6
-#else // R_STACK
-#if R_STACK > 0 && R_STACK < 6
-/* Increase the frame depth to get a reasonable back trace */
-#undef R_STACK
-#define R_STACK 6
-#endif // R_STACK > 0 && R_STACK < 6
-#endif//R_STACK
-
-#ifndef R_TAG
-// R_TAG do we keep track of tags on a per-memory block basis?
-#define R_TAG 0
-#endif//R_TAG
-
-#ifdef R_MAGIC
-#      ifndef R_FREE_MAGIC
-#              define R_FREE_MAGIC (rulong)(('F'<<0) + ('r'<<8) + ('E'<<16) + ('e'<<24))
-#      endif//R_FREE_MAGIC
-#      ifndef R_USED_MAGIC
-#              define R_USED_MAGIC (rulong)(('u'<<0) + ('S'<<8) + ('e'<<16) + ('D'<<24))
-#      endif//R_USED_MAGIC
-#endif//R_MAGIC
-
-// **IMPORTANT NOTE** Magic, PrevSize, Size and Status must be at same offset
-// in both the R_FREE and R_USED structures
-
-typedef struct _R_FREE
-{
-#ifdef R_MAGIC
-       rulong FreeMagic;
-#endif//R_MAGIC
-       rulong PrevSize : 30;
-       rulong Status : 2;
-       rulong Size;
-#if R_STACK
-       ULONG_PTR LastOwnerStack[R_STACK];
-#endif//R_STACK
-       struct _R_FREE* NextFree;
-       struct _R_FREE* PrevFree;
-}
-R_FREE, *PR_FREE;
-
-typedef struct _R_USED
-{
-#ifdef R_MAGIC
-       rulong UsedMagic;
-#endif//R_MAGIC
-       rulong PrevSize : 30;
-       rulong Status : 2;
-       rulong Size;
-#if R_STACK
-       ULONG_PTR LastOwnerStack[R_STACK];
-#endif//R_STACK
-       struct _R_USED* NextUsed;
-#if R_RZ
-       rulong UserSize; // how many bytes the user actually asked for...
-#endif//R_RZ
-       rulong Tag;
-}
-R_USED, *PR_USED;
-
-typedef struct _R_QUE
-{
-       rulong Count;
-       PR_USED First, Last;
-}
-R_QUE, *PR_QUE;
-
-typedef struct _R_POOL
-{
-       void* PoolBase;
-       rulong PoolSize;
-       void* UserBase;
-       rulong UserSize;
-       rulong Alignments[3];
-       PR_FREE FirstFree, LastFree;
-       R_QUE Que[R_QUECOUNT][3];
-       R_MUTEX Mutex;
-}
-R_POOL, *PR_POOL;
-
-#if !R_STACK
-#define RiPrintLastOwner(Block)
-#else
-static void
-RiPrintLastOwner ( PR_USED Block )
-{
-       int i;
-       for ( i = 0; i < R_STACK; i++ )
-       {
-               if ( Block->LastOwnerStack[i] != 0xDEADBEEF )
-               {
-                       R_DEBUG(" ");
-                       //if (!R_PRINT_ADDRESS ((PVOID)Block->LastOwnerStack[i]) )
-                       {
-                               R_DEBUG("<%X>", Block->LastOwnerStack[i] );
-                       }
-               }
-       }
-}
-#endif//R_STACK
-
-static int
-RQueWhich ( rulong size )
-{
-       rulong que, quesize;
-       for ( que=0, quesize=16; que < R_QUECOUNT; que++, quesize<<=1 )
-       {
-               if ( quesize >= size )
-               {
-                       return que;
-               }
-       }
-       return -1;
-}
-
-static void
-RQueInit ( PR_QUE que )
-{
-       que->Count = 0;
-       que->First = NULL;
-       que->Last = NULL;
-}
-
-static void
-RQueAdd ( PR_QUE que, PR_USED Item )
-{
-       ASSERT(Item);
-       Item->Status = 2;
-       Item->NextUsed = NULL;
-       ++que->Count;
-       if ( !que->Last )
-       {
-               que->First = que->Last = Item;
-               return;
-       }
-       ASSERT(!que->Last->NextUsed);
-       que->Last->NextUsed = Item;
-       que->Last = Item;
-}
-
-static PR_USED
-RQueRemove ( PR_QUE que )
-{
-       PR_USED Item;
-#if R_QUEMIN
-       if ( que->count < R_QUEMIN )
-               return NULL;
-#endif
-       if ( !que->First )
-               return NULL;
-       Item = que->First;
-       que->First = Item->NextUsed;
-       if ( !--que->Count )
-       {
-               ASSERT ( !que->First );
-               que->Last = NULL;
-       }
-       Item->Status = 0;
-       return Item;
-}
-
-static void
-RPoolAddFree ( PR_POOL pool, PR_FREE Item )
-{
-       ASSERT(pool);
-       ASSERT(Item);
-       if ( !pool->FirstFree )
-       {
-               pool->FirstFree = pool->LastFree = Item;
-               Item->NextFree = NULL;
-       }
-       else
-       {
-               pool->FirstFree->PrevFree = Item;
-               Item->NextFree = pool->FirstFree;
-               pool->FirstFree = Item;
-       }
-       Item->PrevFree = NULL;
-}
-
-static void
-RPoolRemoveFree ( PR_POOL pool, PR_FREE Item )
-{
-       ASSERT(pool);
-       ASSERT(Item);
-       if ( Item->NextFree )
-               Item->NextFree->PrevFree = Item->PrevFree;
-       else
-       {
-               ASSERT ( pool->LastFree == Item );
-               pool->LastFree = Item->PrevFree;
-       }
-       if ( Item->PrevFree )
-               Item->PrevFree->NextFree = Item->NextFree;
-       else
-       {
-               ASSERT ( pool->FirstFree == Item );
-               pool->FirstFree = Item->NextFree;
-       }
-#if DBG
-       Item->NextFree = Item->PrevFree = (PR_FREE)(ULONG_PTR)0xDEADBEEF;
-#endif//DBG
-}
-
-#if !R_STACK
-#define RFreeFillStack(free)
-#define RUsedFillStack(used)
-#else
-static void
-RFreeFillStack ( PR_FREE free )
-{
-       int i;
-       ULONG stack[R_STACK+3]; // need to skip 3 known levels of stack trace
-       memset ( stack, 0xCD, sizeof(stack) );
-       R_GET_STACK_FRAMES ( stack, R_STACK+3 );
-       for ( i = 0; i < R_STACK; i++ )
-               free->LastOwnerStack[i] = stack[i+3];
-}
-
-static void
-RUsedFillStack ( PR_USED used )
-{
-       int i;
-       ULONG stack[R_STACK+2]; // need to skip 2 known levels of stack trace
-       memset ( stack, 0xCD, sizeof(stack) );
-       R_GET_STACK_FRAMES ( stack, R_STACK+2 );
-       for ( i = 0; i < R_STACK; i++ )
-               used->LastOwnerStack[i] = stack[i+2];
-}
-#endif
-
-static PR_FREE
-RFreeInit ( void* memory )
-{
-       PR_FREE block = (PR_FREE)memory;
-#if R_FREEMAGIC
-       block->FreeMagic = R_FREE_MAGIC;
-#endif//R_FREEMAGIC
-       block->Status = 0;
-       RFreeFillStack ( block );
-#if DBG
-       block->PrevFree = block->NextFree = (PR_FREE)(ULONG_PTR)0xDEADBEEF;
-#endif//DBG
-       return block;
-}
-
-PR_POOL
-RPoolInit ( void* PoolBase, rulong PoolSize, int align1, int align2, int align3 )
-{
-       int align, que;
-       PR_POOL pool = (PR_POOL)PoolBase;
-
-       pool->PoolBase = PoolBase;
-       pool->PoolSize = PoolSize;
-       pool->UserBase = (char*)pool->PoolBase + sizeof(R_POOL);
-       pool->UserSize = PoolSize - sizeof(R_POOL);
-       pool->Alignments[0] = align1;
-       pool->Alignments[1] = align2;
-       pool->Alignments[2] = align3;
-       pool->FirstFree = pool->LastFree = NULL;
-
-       RPoolAddFree ( pool,
-               RFreeInit ( pool->UserBase ));
-
-       pool->FirstFree->PrevSize = 0;
-       pool->FirstFree->Size = pool->UserSize;
-
-       for ( que = 0; que < R_QUECOUNT; que++ )
-       {
-               for ( align = 0; align < 3; align++ )
-               {
-                       RQueInit ( &pool->Que[que][align] );
-               }
-       }
-       return pool;
-}
-
-#if R_RZ
-static const char*
-RFormatTag ( rulong Tag, char* buf )
-{
-       int i;
-       *(rulong*)&buf[0] = Tag;
-       buf[4] = 0;
-       for ( i = 0; i < 4; i++ )
-       {
-               if ( !buf[i] )
-                       buf[i] = ' ';
-       }
-       return buf;
-}
-#endif
-
-#if !R_RZ
-#define RUsedRedZoneCheck(pUsed,Addr,file,line, printzone)
-#else//R_RZ
-static void
-RiBadBlock ( PR_USED pUsed, char* Addr, const char* violation, const char* file, int line, int printzone )
-{
-       char tag[5];
-       unsigned int i;
-
-       R_DEBUG("%s(%i): %s detected for paged pool address 0x%x\n",
-               file, line, violation, Addr );
-
-#ifdef R_MAGIC
-       R_DEBUG ( "UsedMagic 0x%x, ", pUsed->UsedMagic );
-#endif//R_MAGIC
-       R_DEBUG ( "Tag %s(%X), Size %i, UserSize %i",
-               RFormatTag(pUsed->Tag,tag),
-               pUsed->Tag,
-               pUsed->Size,
-               pUsed->UserSize );
-
-       if ( printzone )
-       {
-               unsigned char* HiZone = (unsigned char*)Addr + pUsed->UserSize;
-               unsigned char* LoZone = (unsigned char*)Addr - R_RZ; // this is to simplify indexing below...
-               R_DEBUG ( ", LoZone " );
-               for ( i = 0; i < R_RZ; i++ )
-                       R_DEBUG ( "%02x", LoZone[i] );
-               R_DEBUG ( ", HiZone " );
-               for ( i = 0; i < R_RZ; i++ )
-                       R_DEBUG ( "%02x", HiZone[i] );
-       }
-       R_DEBUG ( "\n" );
-
-       R_DEBUG ( "First few Stack Frames:" );
-       RiPrintLastOwner ( pUsed );
-       R_DEBUG ( "\n" );
-
-       R_DEBUG ( "Contents of Block:\n" );
-       for ( i = 0; i < 8*16 && i < pUsed->UserSize; i += 16 )
-       {
-               int j;
-               R_DEBUG ( "%04X ", i );
-               for ( j = 0; j < 16; j++ )
-               {
-                       if ( i+j < pUsed->UserSize )
-                       {
-                               R_DEBUG ( "%02X ", (unsigned)(unsigned char)Addr[i+j] );
-                       }
-                       else
-                       {
-                               R_DEBUG ( "   " );
-                       }
-               }
-               R_DEBUG(" ");
-               for ( j = 0; j < 16; j++ )
-               {
-                       if ( i+j < pUsed->UserSize )
-                       {
-                               char c = Addr[i+j];
-                               if ( c < 0x20 || c > 0x7E )
-                                       c = '.';
-                               R_DEBUG ( "%c", c );
-                       }
-                       else
-                       {
-                               R_DEBUG ( " " );
-                       }
-               }
-               R_DEBUG("\n");
-       }
-       R_PANIC();
-}
-static void
-RUsedRedZoneCheck ( PR_POOL pool, PR_USED pUsed, char* Addr, const char* file, int line )
-{
-       int i;
-       unsigned char *LoZone, *HiZone;
-       int bLow = 1;
-       int bHigh = 1;
-
-       ASSERT ( Addr >= (char*)pool->UserBase && Addr < ((char*)pool->UserBase + pool->UserSize - 16) );
-#ifdef R_MAGIC
-       if ( pUsed->UsedMagic == R_FREE_MAGIC )
-       {
-               pUsed->UserSize = 0; // just to keep from confusion, MmpBadBlock() doesn't return...
-               RiBadBlock ( pUsed, Addr, "double-free", file, line, 0 );
-       }
-       if ( pUsed->UsedMagic != R_USED_MAGIC )
-       {
-               RiBadBlock ( pUsed, Addr, "bad magic", file, line, 0 );
-       }
-#endif//R_MAGIC
-       switch ( pUsed->Status )
-       {
-       case 0: // freed into main pool
-       case 2: // in ques
-               RiBadBlock ( pUsed, Addr, "double-free", file, line, 0 );
-               // no need for break here - RiBadBlock doesn't return
-       case 1: // allocated - this is okay
-               break;
-       default:
-               RiBadBlock ( pUsed, Addr, "corrupt status", file, line, 0 );
-       }
-       if ( pUsed->Status != 1 )
-       {
-               RiBadBlock ( pUsed, Addr, "double-free", file, line, 0 );
-       }
-       if ( pUsed->Size > pool->PoolSize || pUsed->Size == 0 )
-       {
-               RiBadBlock ( pUsed, Addr, "invalid size", file, line, 0 );
-       }
-       if ( pUsed->UserSize > pool->PoolSize || pUsed->UserSize == 0 )
-       {
-               RiBadBlock ( pUsed, Addr, "invalid user size", file, line, 0 );
-       }
-       HiZone = (unsigned char*)Addr + pUsed->UserSize;
-       LoZone = (unsigned char*)Addr - R_RZ; // this is to simplify indexing below...
-       for ( i = 0; i < R_RZ && bLow && bHigh; i++ )
-       {
-               bLow = bLow && ( LoZone[i] == R_RZ_LOVALUE );
-               bHigh = bHigh && ( HiZone[i] == R_RZ_HIVALUE );
-       }
-       if ( !bLow || !bHigh )
-       {
-               const char* violation = "High and Low-side redzone overwrite";
-               if ( bHigh ) // high is okay, so it was just low failed
-                       violation = "Low-side redzone overwrite";
-               else if ( bLow ) // low side is okay, so it was just high failed
-                       violation = "High-side redzone overwrite";
-               RiBadBlock ( pUsed, Addr, violation, file, line, 1 );
-       }
-}
-#endif//R_RZ
-
-PR_FREE
-RPreviousBlock ( PR_FREE Block )
-{
-       if ( Block->PrevSize > 0 )
-               return (PR_FREE)( (char*)Block - Block->PrevSize );
-       return NULL;
-}
-
-PR_FREE
-RNextBlock ( PR_POOL pool, PR_FREE Block )
-{
-       PR_FREE NextBlock = (PR_FREE)( (char*)Block + Block->Size );
-       if ( (char*)NextBlock >= (char*)pool->UserBase + pool->UserSize )
-               NextBlock = NULL;
-       return NextBlock;
-}
-
-static __inline void*
-RHdrToBody ( void* blk )
-/*
- * FUNCTION: Translate a block header address to the corresponding block
- * address (internal)
- */
-{
-       return ( (void *) ((char*)blk + sizeof(R_USED) + R_RZ) );
-}
-
-static __inline PR_USED
-RBodyToHdr ( void* addr )
-{
-       return (PR_USED)
-              ( ((char*)addr) - sizeof(R_USED) - R_RZ );
-}
-
-static int
-RiInFreeChain ( PR_POOL pool, PR_FREE Block )
-{
-       PR_FREE Free;
-       Free = pool->FirstFree;
-       if ( Free == Block )
-               return 1;
-       while ( Free != Block )
-       {
-               Free = Free->NextFree;
-               if ( !Free )
-                       return 0;
-       }
-       return 1;
-}
-
-static void
-RPoolRedZoneCheck ( PR_POOL pool, const char* file, int line )
-{
-       {
-               PR_USED Block = (PR_USED)pool->UserBase;
-               PR_USED NextBlock;
-
-               for ( ;; )
-               {
-                       switch ( Block->Status )
-                       {
-                       case 0: // block is in chain
-                               ASSERT ( RiInFreeChain ( pool, (PR_FREE)Block ) );
-                               break;
-                       case 1: // block is allocated
-                               RUsedRedZoneCheck ( pool, Block, RHdrToBody(Block), file, line );
-                               break;
-                       case 2: // block is in que
-                               // nothing to verify here yet
-                               break;
-                       default:
-                               ASSERT ( !"invalid status in memory block found in pool!" );
-                       }
-                       NextBlock = (PR_USED)RNextBlock(pool,(PR_FREE)Block);
-                       if ( !NextBlock )
-                               break;
-                       ASSERT ( NextBlock->PrevSize == Block->Size );
-                       Block = NextBlock;
-               }
-       }
-       {
-               // now let's step through the list of free pointers and verify
-               // each one can be found by size-jumping...
-               PR_FREE Free = (PR_FREE)pool->FirstFree;
-               while ( Free )
-               {
-                       PR_FREE NextFree = (PR_FREE)pool->UserBase;
-                       if ( Free != NextFree )
-                       {
-                               while ( NextFree != Free )
-                               {
-                                       NextFree = RNextBlock ( pool, NextFree );
-                                       ASSERT(NextFree);
-                               }
-                       }
-                       Free = Free->NextFree;
-               }
-       }
-}
-
-static void
-RSetSize ( PR_POOL pool, PR_FREE Block, rulong NewSize, PR_FREE NextBlock )
-{
-       R_ASSERT_PTR(pool,Block);
-       ASSERT ( NewSize < pool->UserSize );
-       ASSERT ( NewSize >= sizeof(R_FREE) );
-       Block->Size = NewSize;
-       if ( !NextBlock )
-               NextBlock = RNextBlock ( pool, Block );
-       if ( NextBlock )
-               NextBlock->PrevSize = NewSize;
-}
-
-static PR_FREE
-RFreeSplit ( PR_POOL pool, PR_FREE Block, rulong NewSize )
-{
-       PR_FREE NewBlock = (PR_FREE)((char*)Block + NewSize);
-       RSetSize ( pool, NewBlock, Block->Size - NewSize, NULL );
-       RSetSize ( pool, Block, NewSize, NewBlock );
-       RFreeInit ( NewBlock );
-       RPoolAddFree ( pool, NewBlock );
-       return NewBlock;
-}
-
-static void
-RFreeMerge ( PR_POOL pool, PR_FREE First, PR_FREE Second )
-{
-       ASSERT ( RPreviousBlock(Second) == First );
-       ASSERT ( First->Size == Second->PrevSize );
-       RPoolRemoveFree ( pool, Second );
-       RSetSize ( pool, First, First->Size + Second->Size, NULL );
-}
-
-static void
-RPoolReclaim ( PR_POOL pool, PR_FREE FreeBlock )
-{
-       PR_FREE NextBlock, PreviousBlock;
-
-       RFreeInit ( FreeBlock );
-       RPoolAddFree ( pool, FreeBlock );
-
-       // TODO FIXME - don't merge and always insert freed blocks at the end for debugging purposes...
-
-       /*
-        * If the next block is immediately adjacent to the newly freed one then
-        * merge them.
-        * PLEASE DO NOT WIPE OUT 'MAGIC' OR 'LASTOWNER' DATA FOR MERGED FREE BLOCKS
-        */
-       NextBlock = RNextBlock ( pool, FreeBlock );
-       if ( NextBlock != NULL && !NextBlock->Status )
-       {
-               RFreeMerge ( pool, FreeBlock, NextBlock );
-       }
-
-       /*
-        * If the previous block is adjacent to the newly freed one then
-        * merge them.
-        * PLEASE DO NOT WIPE OUT 'MAGIC' OR 'LASTOWNER' DATA FOR MERGED FREE BLOCKS
-        */
-       PreviousBlock = RPreviousBlock ( FreeBlock );
-       if ( PreviousBlock != NULL && !PreviousBlock->Status )
-       {
-               RFreeMerge ( pool, PreviousBlock, FreeBlock );
-       }
-}
-
-static void
-RiUsedInit ( PR_USED Block, rulong Tag )
-{
-       Block->Status = 1;
-       RUsedFillStack ( Block );
-#ifdef R_MAGIC
-       Block->UsedMagic = R_USED_MAGIC;
-#endif//R_MAGIC
-       //ASSERT_SIZE ( Block->Size );
-
-       // now add the block to the used block list
-#if DBG
-       Block->NextUsed = (PR_USED)(ULONG_PTR)0xDEADBEEF;
-#endif//R_USED_LIST
-
-       Block->Tag = Tag;
-}
-
-#if !R_RZ
-#define RiUsedInitRedZone(Block,UserSize)
-#else//R_RZ
-static void
-RiUsedInitRedZone ( PR_USED Block, rulong UserSize )
-{
-       // write out buffer-overrun detection bytes
-       char* Addr = (char*)RHdrToBody(Block);
-       Block->UserSize = UserSize;
-       memset ( Addr - R_RZ, R_RZ_LOVALUE, R_RZ );
-       memset ( Addr + Block->UserSize, R_RZ_HIVALUE, R_RZ );
-#if DBG
-       memset ( Addr, 0xCD, UserSize );
-#endif//DBG
-}
-#endif//R_RZ
-
-static void*
-RPoolAlloc ( PR_POOL pool, rulong NumberOfBytes, rulong Tag, rulong align )
-{
-       PR_USED NewBlock;
-       PR_FREE BestBlock,
-               NextBlock,
-               PreviousBlock,
-               BestPreviousBlock,
-               CurrentBlock;
-       void* BestAlignedAddr;
-       int que,
-               queBytes = NumberOfBytes;
-       rulong BlockSize,
-               Alignment;
-       int que_reclaimed = 0;
-
-       ASSERT ( pool );
-       ASSERT ( align < 3 );
-
-       R_ACQUIRE_MUTEX(pool);
-
-       if ( !NumberOfBytes )
-       {
-               R_DEBUG("0 bytes requested - initiating pool verification\n");
-               RPoolRedZoneCheck ( pool, __FILE__, __LINE__ );
-               R_RELEASE_MUTEX(pool);
-               return NULL;
-       }
-       if ( NumberOfBytes > pool->PoolSize )
-       {
-               if ( R_IS_POOL_PTR(pool,NumberOfBytes) )
-               {
-                       R_DEBUG("red zone verification requested for block 0x%X\n", NumberOfBytes );
-                       RUsedRedZoneCheck(pool,RBodyToHdr((void*)(ULONG_PTR)NumberOfBytes), (char*)(ULONG_PTR)NumberOfBytes, __FILE__, __LINE__ );
-                       R_RELEASE_MUTEX(pool);
-                       return NULL;
-               }
-               R_DEBUG("Invalid allocation request: %i bytes\n", NumberOfBytes );
-               R_RELEASE_MUTEX(pool);
-               return NULL;
-       }
-
-       que = RQueWhich ( NumberOfBytes );
-       if ( que >= 0 )
-       {
-               if ( (NewBlock = RQueRemove ( &pool->Que[que][align] )) )
-               {
-                       RiUsedInit ( NewBlock, Tag );
-                       RiUsedInitRedZone ( NewBlock, NumberOfBytes );
-                       R_RELEASE_MUTEX(pool);
-                       return RHdrToBody(NewBlock);
-               }
-               queBytes = 16 << que;
-       }
-
-       /*
-        * Calculate the total number of bytes we will need.
-        */
-       BlockSize = queBytes + sizeof(R_USED) + 2*R_RZ;
-       if (BlockSize < sizeof(R_FREE))
-       {
-               /* At least we need the size of the free block header. */
-               BlockSize = sizeof(R_FREE);
-       }
-
-try_again:
-       /*
-        * Find the best-fitting block.
-        */
-       BestBlock = NULL;
-       Alignment = pool->Alignments[align];
-       PreviousBlock = NULL;
-       BestPreviousBlock = NULL,
-       CurrentBlock = pool->FirstFree;
-       BestAlignedAddr = NULL;
-
-       while ( CurrentBlock != NULL )
-       {
-               PVOID Addr = RHdrToBody(CurrentBlock);
-               PVOID CurrentBlockEnd = (char*)CurrentBlock + CurrentBlock->Size;
-               /* calculate last size-aligned address available within this block */
-               PVOID AlignedAddr = R_ROUND_DOWN((char*)CurrentBlockEnd-queBytes-R_RZ, Alignment);
-               ASSERT ( (char*)AlignedAddr+queBytes+R_RZ <= (char*)CurrentBlockEnd );
-
-               /* special case, this address is already size-aligned, and the right size */
-               if ( Addr == AlignedAddr )
-               {
-                       BestAlignedAddr = AlignedAddr;
-                       BestPreviousBlock = PreviousBlock;
-                       BestBlock = CurrentBlock;
-                       break;
-               }
-               // if we carve out a size-aligned block... is it still past the end of this
-               // block's free header?
-               else if ( (char*)RBodyToHdr(AlignedAddr)
-                       >= (char*)CurrentBlock+sizeof(R_FREE) )
-               {
-                       /*
-                        * there's enough room to allocate our size-aligned memory out
-                        * of this block, see if it's a better choice than any previous
-                        * finds
-                        */
-                       if ( BestBlock == NULL
-                               || BestBlock->Size > CurrentBlock->Size )
-                       {
-                               BestAlignedAddr = AlignedAddr;
-                               BestPreviousBlock = PreviousBlock;
-                               BestBlock = CurrentBlock;
-                       }
-               }
-
-               PreviousBlock = CurrentBlock;
-               CurrentBlock = CurrentBlock->NextFree;
-       }
-
-       /*
-        * We didn't find anything suitable at all.
-        */
-       if (BestBlock == NULL)
-       {
-               if ( !que_reclaimed )
-               {
-                       // reclaim que
-                       int i, j;
-                       for ( i = 0; i < R_QUECOUNT; i++ )
-                       {
-                               for ( j = 0; j < 3; j++ )
-                               {
-                                       while ( (BestBlock = (PR_FREE)RQueRemove ( &pool->Que[i][j] )) )
-                                       {
-                                               RPoolReclaim ( pool, BestBlock );
-                                       }
-                               }
-                       }
-
-                       que_reclaimed = 1;
-                       goto try_again;
-               }
-               DPRINT1("Trying to allocate %lu bytes from paged pool - nothing suitable found, returning NULL\n",
-                       queBytes );
-               R_RELEASE_MUTEX(pool);
-               return NULL;
-       }
-       /*
-        * we found a best block. If Addr isn't already aligned, we've pre-qualified that
-        * there's room at the beginning of the block for a free block...
-        */
-       {
-               void* Addr = RHdrToBody(BestBlock);
-               if ( BestAlignedAddr != Addr )
-               {
-                       PR_FREE NewFreeBlock = RFreeSplit (
-                               pool,
-                               BestBlock,
-                               (char*)RBodyToHdr(BestAlignedAddr) - (char*)BestBlock );
-                       ASSERT ( BestAlignedAddr > Addr );
-
-                       //DPRINT ( "breaking off preceding bytes into their own block...\n" );
-                       /*DPRINT ( "NewFreeBlock 0x%x Size %lu (Old Block's new size %lu) NextFree 0x%x\n",
-                               NewFreeBlock, NewFreeBlock->Size, BestBlock->Size, BestBlock->NextFree );*/
-
-                       /* we want the following code to use our size-aligned block */
-                       BestPreviousBlock = BestBlock;
-                       BestBlock = NewFreeBlock;
-
-                       //VerifyPagedPool();
-               }
-       }
-       /*
-        * Is there enough space to create a second block from the unused portion.
-        */
-       if ( (BestBlock->Size - BlockSize) > sizeof(R_FREE) )
-       {
-               /*DPRINT("BestBlock 0x%x Size 0x%x BlockSize 0x%x NewSize 0x%x\n",
-                       BestBlock, BestBlock->Size, BlockSize, NewSize );*/
-
-               /*
-                * Create the new free block.
-                */
-               NextBlock = RFreeSplit ( pool, BestBlock, BlockSize );
-               //ASSERT_SIZE ( NextBlock->Size );
-       }
-       /*
-        * Remove the selected block from the list of free blocks.
-        */
-       //DPRINT ( "Removing selected block from free block list\n" );
-       RPoolRemoveFree ( pool, BestBlock );
-       /*
-        * Create the new used block header.
-        */
-       NewBlock = (PR_USED)BestBlock;
-       RiUsedInit ( NewBlock, Tag );
-
-       /*  RtlZeroMemory(RHdrToBody(NewBlock), NumberOfBytes);*/
-
-       RiUsedInitRedZone ( NewBlock, NumberOfBytes );
-       R_RELEASE_MUTEX(pool);
-
-       return RHdrToBody(NewBlock);
-}
-
-static void
-RPoolFree ( PR_POOL pool, void* Addr )
-{
-       PR_USED UsedBlock;
-       rulong UsedSize;
-       PR_FREE FreeBlock;
-       rulong UserSize;
-       int que;
-
-       ASSERT(pool);
-       if ( !Addr )
-       {
-               R_DEBUG("Attempt to free NULL ptr, initiating Red Zone Check\n" );
-               R_ACQUIRE_MUTEX(pool);
-               RPoolRedZoneCheck ( pool, __FILE__, __LINE__ );
-               R_RELEASE_MUTEX(pool);
-               return;
-       }
-       R_ASSERT_PTR(pool,Addr);
-
-       UsedBlock = RBodyToHdr(Addr);
-       UsedSize = UsedBlock->Size;
-       FreeBlock = (PR_FREE)UsedBlock;
-#if R_RZ
-       UserSize = UsedBlock->UserSize;
-#else
-       UserSize = UsedSize - sizeof(R_USED) - 2*R_RZ;
-#endif//R_RZ
-
-       RUsedRedZoneCheck ( pool, UsedBlock, Addr, __FILE__, __LINE__ );
-
-#if R_RZ
-       memset ( Addr, 0xCD, UsedBlock->UserSize );
-#endif
-
-       que = RQueWhich ( UserSize );
-       if ( que >= 0 )
-       {
-               int queBytes = 16 << que;
-               ASSERT( (rulong)queBytes >= UserSize );
-               if ( que >= 0 )
-               {
-                       int align = 0;
-                       if ( R_ROUND_UP(Addr,pool->Alignments[2]) == Addr )
-                               align = 2;
-                       else if ( R_ROUND_UP(Addr,pool->Alignments[1]) == Addr )
-                               align = 1;
-                       R_ACQUIRE_MUTEX(pool);
-                       RQueAdd ( &pool->Que[que][align], UsedBlock );
-                       R_RELEASE_MUTEX(pool);
-                       return;
-               }
-       }
-
-       R_ACQUIRE_MUTEX(pool);
-       RPoolReclaim ( pool, FreeBlock );
-       R_RELEASE_MUTEX(pool);
-}
-
-#if 0
-static void
-RPoolDumpByTag ( PR_POOL pool, rulong Tag )
-{
-       PR_USED Block = (PR_USED)pool->UserBase;
-       PR_USED NextBlock;
-       int count = 0;
-       char tag[5];
-
-       // TODO FIXME - should we validate params or ASSERT_IRQL?
-       R_DEBUG ( "PagedPool Dump by tag '%s'\n", RFormatTag(Tag,tag) );
-       R_DEBUG ( "  -BLOCK-- --SIZE--\n" );
-
-       R_ACQUIRE_MUTEX(pool);
-       for ( ;; )
-       {
-               if ( Block->Status == 1 && Block->Tag == Tag )
-               {
-                       R_DEBUG ( "  %08X %08X\n", Block, Block->Size );
-                       ++count;
-               }
-               NextBlock = (PR_USED)RNextBlock(pool,(PR_FREE)Block);
-               if ( !NextBlock )
-                       break;
-               ASSERT ( NextBlock->PrevSize == Block->Size );
-               Block = NextBlock;
-       }
-       R_RELEASE_MUTEX(pool);
-
-       R_DEBUG ( "Entries found for tag '%s': %i\n", tag, count );
-}
-#endif
-
-rulong
-RPoolQueryTag ( void* Addr )
-{
-       PR_USED Block = RBodyToHdr(Addr);
-       // TODO FIXME - should we validate params?
-#ifdef R_MAGIC
-       if ( Block->UsedMagic != R_USED_MAGIC )
-               return 0xDEADBEEF;
-#endif//R_MAGIC
-       if ( Block->Status != 1 )
-               return 0xDEADBEEF;
-       return Block->Tag;
-}
-
-void
-RPoolStats ( PR_POOL pool )
-{
-       int free=0, used=0, qued=0;
-       PR_USED Block = (PR_USED)pool->UserBase;
-
-       R_ACQUIRE_MUTEX(pool);
-       while ( Block )
-       {
-               switch ( Block->Status )
-               {
-               case 0:
-                       ++free;
-                       break;
-               case 1:
-                       ++used;
-                       break;
-               case 2:
-                       ++qued;
-                       break;
-               default:
-                       ASSERT ( !"Invalid Status for Block in pool!" );
-               }
-               Block = (PR_USED)RNextBlock(pool,(PR_FREE)Block);
-       }
-       R_RELEASE_MUTEX(pool);
-
-       R_DEBUG ( "Pool Stats: Free=%i, Used=%i, Qued=%i, Total=%i\n", free, used, qued, (free+used+qued) );
-}
-
-#ifdef R_LARGEST_ALLOC_POSSIBLE
-static rulong
-RPoolLargestAllocPossible ( PR_POOL pool, int align )
-{
-       int Alignment = pool->Alignments[align];
-       rulong LargestUserSize = 0;
-       PR_FREE Block = (PR_FREE)pool->UserBase;
-       while ( Block )
-       {
-               if ( Block->Status != 1 )
-               {
-                       void* Addr, *AlignedAddr;
-                       rulong BlockMaxUserSize;
-                       int cue, cueBytes;
-
-                       Addr = (char*)Block + sizeof(R_USED) + R_RZ;
-                       AlignedAddr = R_ROUND_UP(Addr,Alignment);
-                       if ( Addr != AlignedAddr )
-                               Addr = R_ROUND_UP((char*)Block + sizeof(R_FREE) + sizeof(R_USED) + R_RZ, Alignment );
-                       BlockMaxUserSize = (char*)Block + Block->Size - (char*)Addr - R_RZ;
-                       cue = RQueWhich ( BlockMaxUserSize );
-                       if ( cue >= 0 )
-                       {
-                               cueBytes = 16 << cue;
-                               if ( cueBytes > BlockMaxUserSize );
-                               {
-                                       if ( !cue )
-                                               BlockMaxUserSize = 0;
-                                       else
-                                               BlockMaxUserSize = 16 << (cue-1);
-                               }
-                       }
-                       if ( BlockMaxUserSize > LargestUserSize )
-                               LargestUserSize = BlockMaxUserSize;
-               }
-               Block = RNextBlock ( pool, Block );
-       }
-       return LargestUserSize;
-}
-#endif//R_LARGEST_ALLOC_POSSIBLE
-
-#endif//RPOOLMGR_H
index c8c8611..54d9adc 100644 (file)
                </directory>
                <file>anonmem.c</file>
                <file>balance.c</file>
-               <file>dbgpool.c</file>
                <file>freelist.c</file>
                <file>marea.c</file>
                <if property="_WINKD_" value ="1">
                <file>pagefile.c</file>
                <file>pageop.c</file>
                <file>pe.c</file>
-               <file>pool.c</file>
                <file>ppool.c</file>
                <file>procsup.c</file>
                <file>region.c</file>
diff --git a/reactos/subsystems/ntvdm/lang/zh-CN.rc b/reactos/subsystems/ntvdm/lang/zh-CN.rc
new file mode 100644 (file)
index 0000000..ccf6527
--- /dev/null
@@ -0,0 +1,9 @@
+#include "resource.h"
+
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+STRINGTABLE DISCARDABLE
+BEGIN
+
+STRING_WelcomeMsg,      "ReactOS ÐéÄâ DOS »úÖ§³Ö¡£\n"
+STRING_PromptMsg,       "ÊäÈë r<cr> ÒÔ±ãÔËÐУ¬s<cr> ÒÔ±ã¹Ø±Õ»òÕß q<cr> ÒÔ±ãÁ¢¼´Í˳ö¡£"
+END
diff --git a/reactos/subsystems/ntvdm/lang/zh-TW.rc b/reactos/subsystems/ntvdm/lang/zh-TW.rc
new file mode 100644 (file)
index 0000000..a1b185a
--- /dev/null
@@ -0,0 +1,9 @@
+#include "resource.h"
+
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL
+STRINGTABLE DISCARDABLE
+BEGIN
+
+STRING_WelcomeMsg,      "ReactOS µêÀÀ DOS ¾÷¤ä´©¡C\n"
+STRING_PromptMsg,       "Áä¤J r<cr> ¥H«K¹B¦æ¡A s<cr> ¥H«KÃö³¬©ÎªÌ q<cr> ¥H«K¥ß§Y°h¥X¡C"
+END
index e5d4076..5c3792d 100644 (file)
@@ -19,3 +19,5 @@
 #include "lang/pt-BR.rc"
 #include "lang/ru-RU.rc"
 #include "lang/sk-SK.rc"
+#include "lang/zh-CN.rc"
+#include "lang/zh-TW.rc"
diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/ja-JP.rc b/reactos/subsystems/win32/csrss/win32csr/lang/ja-JP.rc
new file mode 100644 (file)
index 0000000..1e21759
--- /dev/null
@@ -0,0 +1,56 @@
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+
+IDD_END_NOW DIALOGEX DISCARDABLE  0, 0, 200, 95
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "\83v\83\8d\83O\83\89\83\80\82Ì\8fI\97¹ - "
+FONT 9, "MS UI Gothic"
+BEGIN
+    LTEXT           "\83v\83\8d\83O\83\89\83\80\82ð\8fI\97¹\82µ\82Ä\82¢\82Ü\82·... \82µ\82Î\82ç\82­\82¨\91Ò\82¿\82­\82¾\82³\82¢",IDC_STATIC,7,7,186,11
+    CONTROL         "Progress",IDC_PROGRESS,"msctls_progress32",WS_BORDER,
+                    7,20,186,13
+    LTEXT           "\83v\83\8d\83O\83\89\83\80\82ð\82·\82®\82É\8fI\97¹\82³\82¹\82é\82æ\82¤\91I\91ð\82µ\82½\8fê\8d\87\81A\95Û\91\82³\82ê\82Ä\82¢\82È\82¢\83f\81[\83^\82Í\82·\82×\82Ä\8e¸\82í\82ê\82Ü\82·\81B\83v\83\8d\83O\83\89\83\80\82ð\8fI\97¹\82·\82é\82É\82Í[\82·\82®\82É\8fI\97¹]\82ð\83N\83\8a\83b\83N\82µ\82Ä\82­\82¾\82³\82¢\81B",
+                    IDC_STATIC,7,40,186,26
+    DEFPUSHBUTTON   "\82·\82®\82É\8fI\97¹(&E)",IDC_END_NOW,150,71,43,17
+END
+
+IDD_NOT_RESPONDING DIALOGEX DISCARDABLE 0, 0, 192, 122
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "\83v\83\8d\83O\83\89\83\80\82Ì\8fI\97¹ - "
+FONT 9, "MS UI Gothic"
+BEGIN
+    DEFPUSHBUTTON   "\83L\83\83\83\93\83Z\83\8b",IDCANCEL,142,98,43,17
+    PUSHBUTTON      "\82·\82®\82É\8fI\97¹(&E)",IDC_END_NOW,78,98,43,17
+    LTEXT           "\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Í\89\9e\93\9a\82µ\82Ä\82¢\82Ü\82¹\82ñ",IDC_STATIC,7,7,178,8
+    LTEXT           "ReactOS \82É\96ß\82Á\82Ä\83v\83\8d\83O\83\89\83\80\82Ì\8fó\91Ô\82ð\8am\94F\82·\82é\82É\82Í[\83L\83\83\83\93\83Z\83\8b]\82ð\83N\83\8a\83b\83N\82µ\82Ä\82­\82¾\82³\82¢",
+                    IDC_STATIC,7,26,178,16
+    LTEXT           "\83v\83\8d\83O\83\89\83\80\82ð\82·\82®\82É\8fI\97¹\82³\82¹\82é\82æ\82¤\91I\91ð\82µ\82½\8fê\8d\87\81A\95Û\91\82³\82ê\82Ä\82¢\82È\82¢\83f\81[\83^\82Í\82·\82×\82Ä\8e¸\82í\82ê\82Ü\82·\81B\83v\83\8d\83O\83\89\83\80\82ð\92¼\82¿\82É\8fI\97¹\82·\82é\82É\82Í[\82·\82®\82É\8fI\97¹]\82ð\83N\83\8a\83b\83N\82µ\82Ä\82­\82¾\82³\82¢",
+                    IDC_STATIC,7,53,178,26
+END
+
+IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
+STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
+EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
+FONT 9, "MS UI Gothic", 400, 0, 0x1
+BEGIN
+    LTEXT           "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
+END
+
+STRINGTABLE
+BEGIN
+  IDS_EDIT "\95Ò\8fW"
+  IDS_MARK "\94Í\88Í\8ew\92è"
+  IDS_COPY "\83R\83s\81[\tEnter"
+  IDS_PASTE "\93\\\82è\95t\82¯"
+  IDS_SELECTALL "\82·\82×\82Ä\91I\91ð"
+  IDS_SCROLL "\83X\83N\83\8d\81[\83\8b"
+  IDS_FIND "\8c\9f\8dõ..."
+  IDS_DEFAULTS "\8bK\92è\92l"
+  IDS_PROPERTIES "\83v\83\8d\83p\83e\83B"
+  IDS_SCROLLHERE "\82±\82±\82É\83X\83N\83\8d\81[\83\8b"
+  IDS_SCROLLTOP "\88ê\94Ô\8fã\82É\83X\83N\83\8d\81[\83\8b"
+  IDS_SCROLLBOTTOM "\88ê\94Ô\89º\82É\83X\83N\83\8d\81[\83\8b"
+  IDS_SCROLLPAGE_UP "Page up"
+  IDS_SCROLLPAGE_DOWN "Page down"
+  IDS_SCROLLUP "\8fã\82É\83X\83N\83\8d\81[\83\8b"
+  IDS_SCROLLDOWN "\89º\82É\83X\83N\83\8d\81[\83\8b"
+END
diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/zh-CN.rc b/reactos/subsystems/win32/csrss/win32csr/lang/zh-CN.rc
new file mode 100644 (file)
index 0000000..598c5bc
--- /dev/null
@@ -0,0 +1,56 @@
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+
+IDD_END_NOW DIALOGEX DISCARDABLE  0, 0, 200, 95
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ÖÕÖ¹³ÌÐò - "
+FONT 9, "MS Shell Dlg"
+BEGIN
+    LTEXT           "ÕýÔÚÖÕÖ¹³ÌÐò... ÇëµÈ´ý",IDC_STATIC,7,7,186,11
+    CONTROL         "½ø³Ì",IDC_PROGRESS,"msctls_progress32",WS_BORDER,
+                    7,20,186,13
+    LTEXT           "Èç¹ûÄúÑ¡ÔñÁ¢¼´ÖÕÖ¹³ÌÐò£¬Äú½«Ê§È¥ËùÓÐδ±£´æµÄÊý¾Ý¡£ÈôÒªÁ¢¼´½áÊø³ÌÐò£¬µ¥»÷¡°Á¢¼´ÖÕÖ¹¡±¡£",
+                    IDC_STATIC,7,40,186,26
+    DEFPUSHBUTTON   "Á¢¼´ÖÕÖ¹(&E)",IDC_END_NOW,150,71,43,17
+END
+
+IDD_NOT_RESPONDING DIALOGEX DISCARDABLE 0, 0, 192, 122
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ÖÕÖ¹³ÌÐò - "
+FONT 9, "MS Shell Dlg"
+BEGIN
+    DEFPUSHBUTTON   "È¡Ïû",IDCANCEL,142,98,43,17
+    PUSHBUTTON      "Á¢¼´ÖÕÖ¹(&E)",IDC_END_NOW,78,98,43,17
+    LTEXT           "´Ë³ÌÐò²¢Î´ÏìÓ¦",IDC_STATIC,7,7,178,8
+    LTEXT           "ÈôÒª·µ»ØÖÁ ReactOS ²¢¼ì²é¸Ã³ÌÐòµÄ״̬£¬Çëµã»÷¡°È¡Ïû¡±¡£",
+                    IDC_STATIC,7,26,178,16
+    LTEXT           "Èç¹ûÄúÑ¡ÔñÁ¢¼´ÖÕÖ¹³ÌÐò£¬Äú½«Ê§È¥ËùÓÐδ±£´æµÄÊý¾Ý¡£ÈôÒªÁ¢¼´½áÊø³ÌÐò£¬µ¥»÷¡°Á¢¼´ÖÕÖ¹¡±¡£",
+                    IDC_STATIC,7,53,178,26
+END
+
+IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
+STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
+EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
+FONT 9, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    LTEXT           "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
+END
+
+STRINGTABLE
+BEGIN
+  IDS_EDIT "±à¼­"
+  IDS_MARK "±ê¼Ç"
+  IDS_COPY "¸´ÖÆ\tEnter"
+  IDS_PASTE "ð¤Ìù"
+  IDS_SELECTALL "È«²¿Ñ¡Ôñ"
+  IDS_SCROLL "¹ö¶¯"
+  IDS_FIND "²éÕÒ..."
+  IDS_DEFAULTS "ĬÈÏ"
+  IDS_PROPERTIES "ÊôÐÔ"
+  IDS_SCROLLHERE "¹ö¶¯µ½´Ë"
+  IDS_SCROLLTOP "¹ö¶¯ÖÁ¶¥¶Ë"
+  IDS_SCROLLBOTTOM "¹ö¶¯ÖÁÄ©¶Ë"
+  IDS_SCROLLPAGE_UP "ÉÏÒ»Ò³"
+  IDS_SCROLLPAGE_DOWN "ÏÂÒ»Ò³"
+  IDS_SCROLLUP "ÏòÉϹö¶¯"
+  IDS_SCROLLDOWN "ÏòϹö¶¯"
+END
diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/zh-TW.rc b/reactos/subsystems/win32/csrss/win32csr/lang/zh-TW.rc
new file mode 100644 (file)
index 0000000..ec5c87c
--- /dev/null
@@ -0,0 +1,56 @@
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL
+
+IDD_END_NOW DIALOGEX DISCARDABLE  0, 0, 200, 95
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "µ²§ôµ{¦¡"
+FONT 9, "MS Shell Dlg"
+BEGIN
+    LTEXT           "¥¿¦bµ²§ôµ{¦¡... ½Ðµyµ¥",IDC_STATIC,7,7,186,11
+    CONTROL         "Progress",IDC_PROGRESS,"msctls_progress32",WS_BORDER,
+                    7,20,186,13
+    LTEXT           "¦pªG±z¿ï¾Ü¥ß§Yµ²§ôµ{¦¡¡A±z±N¥¢¥h©Ò¦³¥¼Àx¦sªº¸ê®Æ¡C­Y­n¥ß§Yµ²§ôµ{¦¡¡A½Ð«ö¤U¡§¥ß§Yµ²§ô¡¨¡C",
+                    IDC_STATIC,7,40,186,26
+    DEFPUSHBUTTON   "¥ß§Yµ²§ô(&E)",IDC_END_NOW,150,71,43,17
+END
+
+IDD_NOT_RESPONDING DIALOGEX DISCARDABLE 0, 0, 192, 122
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "µ²§ôµ{¦¡ - "
+FONT 9, "MS Shell Dlg"
+BEGIN
+    DEFPUSHBUTTON   "¨ú®ø",IDCANCEL,142,98,43,17
+    PUSHBUTTON      "¥ß§Yµ²§ô(&E) ",IDC_END_NOW,78,98,43,17
+    LTEXT           "¦¹µ{¦¡¨Ã¥¼ÅTÀ³",IDC_STATIC,7,7,178,8
+    LTEXT           "­Y­nªð¦^¦Ü ReactOS ¨ÃÀ˵øµ{¦¡ªºª¬ºA¡A½Ð«ö¤U¡§¨ú®ø¡¨",
+                    IDC_STATIC,7,26,178,16
+    LTEXT           "¦pªG±z¿ï¾Ü¥ß§Yµ²§ôµ{¦¡¡A±z±N¥¢¥h©Ò¦³¥¼Àx¦sªº¸ê®Æ¡C­Y­n¥ß§Yµ²§ôµ{¦¡¡A½Ð«ö¤U¡§¥ß§Yµ²§ô¡¨¡C",
+                    IDC_STATIC,7,53,178,26
+END
+
+IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
+STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
+EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
+FONT 9, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    LTEXT           "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
+END
+
+STRINGTABLE
+BEGIN
+  IDS_EDIT "½s¿è"
+  IDS_MARK "¼Ð°O"
+  IDS_COPY "½Æ»s\tEnter"
+  IDS_PASTE "ÂH¶K"
+  IDS_SELECTALL "¥þ³¡¿ï¾Ü"
+  IDS_SCROLL "ºu°Ê"
+  IDS_FIND "´M§ä..."
+  IDS_DEFAULTS "¹w³]"
+  IDS_PROPERTIES "ÄÝ©Ê"
+  IDS_SCROLLHERE "ºu°Ê¨ì¦¹ "
+  IDS_SCROLLTOP "ºu°Ê¨ì³»¸m"
+  IDS_SCROLLBOTTOM "ºu°Ê¨ì¥½ºÝ"
+  IDS_SCROLLPAGE_UP "¤W¤@­¶"
+  IDS_SCROLLPAGE_DOWN "¤U¤@­¶"
+  IDS_SCROLLUP "¦V¤Wºu°Ê"
+  IDS_SCROLLDOWN "¦V¤Uºu°Ê"
+END
index 3ea5c5e..5a26ab8 100644 (file)
@@ -13,8 +13,12 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 #include "lang/fr-FR.rc"
 #include "lang/id-ID.rc"
 #include "lang/it-IT.rc"
+#include "lang/ja-JP.rc"
 #include "lang/no-NO.rc"
 #include "lang/pl-PL.rc"
 #include "lang/ru-RU.rc"
 #include "lang/sk-SK.rc"
 #include "lang/uk-UA.rc"
+#include "lang/zh-CN.rc"
+#include "lang/zh-TW.rc"
+
index 534f874..e2262e8 100644 (file)
@@ -89,7 +89,7 @@ IntEngWndUpdateClipObj(
   if (hVisRgn != NULL)
   {
     NtGdiOffsetRgn(hVisRgn, Window->Wnd->rcClient.left, Window->Wnd->rcClient.top);
-    visRgn = REGION_LockRgn(hVisRgn);
+    visRgn = RGNOBJAPI_Lock(hVisRgn, NULL);
     if (visRgn != NULL)
     {
       if (visRgn->rdh.nCount > 0)
@@ -110,7 +110,7 @@ IntEngWndUpdateClipObj(
           }
         }
       }
-      REGION_UnlockRgn(visRgn);
+      RGNOBJAPI_Unlock(visRgn);
     }
     else
     {
index 9973944..ee5711c 100644 (file)
@@ -389,7 +389,7 @@ IntEngStretchBlt(SURFOBJ *psoDest,
 {
     BOOLEAN ret;
     COLORADJUSTMENT ca;
-    POINT MaskOrigin;
+    POINTL MaskOrigin = {0, 0};
     SURFACE *psurfDest;
     SURFACE *psurfSource = NULL;
     RECTL InputClippedRect;
@@ -456,7 +456,8 @@ IntEngStretchBlt(SURFOBJ *psoDest,
 
     if (pMaskOrigin != NULL)
     {
-        MaskOrigin.x = pMaskOrigin->x; MaskOrigin.y = pMaskOrigin->y;
+        MaskOrigin.x = pMaskOrigin->x;
+        MaskOrigin.y = pMaskOrigin->y;
     }
 
     /* No success yet */
@@ -482,16 +483,35 @@ IntEngStretchBlt(SURFOBJ *psoDest,
     if (psurfDest->flHooks & HOOK_STRETCHBLTROP)
     {
         /* Drv->StretchBltROP (look at http://www.osronline.com/ddkx/graphics/ddifncs_0z3b.htm ) */
-        // FIXME: MaskOrigin is always NULL !
-        ret = GDIDEVFUNCS(psoDest).StretchBltROP(psoDest, (UsesSource) ? psoSource : NULL, MaskSurf, ClipRegion, ColorTranslation,
-                  &ca, BrushOrigin, &OutputRect, &InputRect, NULL, COLORONCOLOR, pbo, ROP);
+        ret = GDIDEVFUNCS(psoDest).StretchBltROP(psoDest,
+                                                 (UsesSource) ? psoSource : NULL,
+                                                 MaskSurf,
+                                                 ClipRegion,
+                                                 ColorTranslation,
+                                                 &ca, BrushOrigin,
+                                                 &OutputRect,
+                                                 &InputRect,
+                                                 &MaskOrigin,
+                                                 COLORONCOLOR,
+                                                 pbo,
+                                                 ROP);
     }
 
     if (! ret)
     {
-        // FIXME: see previous fixme
-        ret = EngStretchBltROP(psoDest, (UsesSource) ? psoSource : NULL, MaskSurf, ClipRegion, ColorTranslation,
-                            &ca, BrushOrigin, &OutputRect, &InputRect, NULL, COLORONCOLOR, pbo, ROP);
+        ret = EngStretchBltROP(psoDest,
+                               (UsesSource) ? psoSource : NULL,
+                               MaskSurf,
+                               ClipRegion,
+                               ColorTranslation,
+                               &ca,
+                               BrushOrigin,
+                               &OutputRect,
+                               &InputRect,
+                               &MaskOrigin,
+                               COLORONCOLOR,
+                               pbo,
+                               ROP);
     }
 
     if (UsesSource)
index 2541fb9..db7c5fb 100644 (file)
@@ -128,4 +128,8 @@ PVOID
 NTAPI
 EBRUSHOBJ_pvGetEngBrush(EBRUSHOBJ *pebo);
 
+PVOID FASTCALL AllocateObjectAttr(VOID);
+
+VOID FASTCALL FreeObjectAttr(PVOID);
+
 #endif
index c92ae4d..798a910 100644 (file)
@@ -144,7 +144,6 @@ PPDEVOBJ FASTCALL IntEnumHDev(VOID);
 HDC  FASTCALL DC_AllocDC(PUNICODE_STRING  Driver);
 VOID FASTCALL DC_InitDC(HDC  DCToInit);
 HDC  FASTCALL DC_FindOpenDC(PUNICODE_STRING  Driver);
-VOID FASTCALL DC_FreeDC(HDC);
 VOID FASTCALL DC_AllocateDcAttr(HDC);
 VOID FASTCALL DC_FreeDcAttr(HDC);
 BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
index 5f3612a..d5e63c9 100644 (file)
@@ -258,7 +258,9 @@ GreStretchBltMask(IN HDC hdcDst,
                   IN INT cySrc,
                   IN DWORD dwRop,
                   IN DWORD dwBackColor,
-                  IN HDC hdcMask);
+                  IN HDC hdcMask,
+                  IN INT xMask,
+                  IN INT yMask);
 
 #endif /* _WIN32K_INTGDI_H */
 
index 3cb7f43..a09537e 100644 (file)
@@ -48,6 +48,8 @@ HRGN FASTCALL IntCreatePolyPolygonRgn(PPOINT, PULONG, INT, INT);
 INT FASTCALL IntGdiCombineRgn(PROSRGNDATA, PROSRGNDATA, PROSRGNDATA, INT);
 INT FASTCALL REGION_Complexity(PROSRGNDATA);
 PROSRGNDATA FASTCALL IntGdiCreateRectRgn(INT, INT, INT, INT);
+PROSRGNDATA FASTCALL RGNOBJAPI_Lock(HRGN,PRGN_ATTR *);
+VOID FASTCALL RGNOBJAPI_Unlock(PROSRGNDATA);
 
 #define UnsafeIntCreateRectRgnIndirect(prc) \
   NtGdiCreateRectRgn((prc)->left, (prc)->top, (prc)->right, (prc)->bottom)
index febe282..496f18b 100644 (file)
@@ -114,6 +114,9 @@ Win32kProcessCallback(struct _EPROCESS *Process,
 
       InitializeListHead(&Win32Process->MenuListHead);
 
+      InitializeListHead(&Win32Process->GDIBrushAttrFreeList);
+      InitializeListHead(&Win32Process->GDIDcAttrFreeList);
+
       InitializeListHead(&Win32Process->PrivateFontListHead);
       ExInitializeFastMutex(&Win32Process->PrivateFontListLock);
 
index b937259..40b6c68 100644 (file)
@@ -1362,13 +1362,14 @@ UserDrawIconEx(
                           cyHeight,
                           hdcImage ? hdcImage : hdcMask,
                           0,
-                          ((diFlags & DI_MASK && !(diFlags & DI_IMAGE)) ||
-                           (diFlags & DI_IMAGE && hbmColor) ? 0 : IconSize.cy),
+                          0,
                           IconSize.cx,
                           IconSize.cy,
                           SRCCOPY,
                           0,
-                          hdcImage ? hdcMask : NULL);
+                          hdcMask,
+                          0,
+                          hdcImage ? 0 : IconSize.cy);
     }
 
     if (hOldMask) NtGdiSelectBitmap(hdcMask, hOldMask);
index 7e7cafc..f419e7e 100644 (file)
@@ -1006,10 +1006,10 @@ NtUserGetUpdateRect(HWND hWnd, LPRECT UnsafeRect, BOOL bErase)
       }
       else
       {
-         RgnData = REGION_LockRgn(Window->UpdateRegion);
+         RgnData = RGNOBJAPI_Lock(Window->UpdateRegion, NULL);
          ASSERT(RgnData != NULL);
          RegionType = REGION_GetRgnBox(RgnData, &Rect);
-         REGION_UnlockRgn(RgnData);
+         RGNOBJAPI_Unlock(RgnData);
 
          if (RegionType != ERROR && RegionType != NULLREGION)
             RECTL_bIntersectRect(&Rect, &Rect, &Window->Wnd->rcClient);
index ff3b89d..beded04 100644 (file)
@@ -1256,7 +1256,7 @@ IntUnlinkWnd(PWND Wnd)
    if (Wnd->spwndParent && Wnd->spwndParent->spwndChild == Wnd)
       Wnd->spwndParent->spwndChild = Wnd->spwndNext;
 
-   Wnd->spwndParent = Wnd->spwndPrev = Wnd->spwndNext = Wnd->spwndParent = NULL;
+   Wnd->spwndPrev = Wnd->spwndNext = Wnd->spwndParent = NULL;
 }
 
 
@@ -4557,10 +4557,10 @@ IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn)
    /* Copy the region into hRgn */
    NtGdiCombineRgn(hRgn, VisRgn, NULL, RGN_COPY);
 
-   if((pRgn = REGION_LockRgn(hRgn)))
+   if((pRgn = RGNOBJAPI_Lock(hRgn, NULL)))
    {
       Ret = pRgn->rdh.iType;
-      REGION_UnlockRgn(pRgn);
+      RGNOBJAPI_Unlock(pRgn);
    }
    else
       Ret = ERROR;
@@ -4596,11 +4596,11 @@ IntGetWindowRgnBox(PWINDOW_OBJECT Window, RECTL *Rect)
    if(Window->WindowRegion && !(Wnd->style & WS_MINIMIZE))
       NtGdiCombineRgn(VisRgn, VisRgn, Window->WindowRegion, RGN_AND);
 
-   if((pRgn = REGION_LockRgn(VisRgn)))
+   if((pRgn = RGNOBJAPI_Lock(VisRgn, NULL)))
    {
       Ret = pRgn->rdh.iType;
       *Rect = pRgn->rdh.rcBound;
-      REGION_UnlockRgn(pRgn);
+      RGNOBJAPI_Unlock(pRgn);
    }
    else
       Ret = ERROR;
index 8ad52c8..67d468e 100644 (file)
@@ -953,16 +953,16 @@ co_WinPosSetWindowPos(
          VisBefore = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
          VisRgn = NULL;
 
-         if (VisBefore != NULL && (VisRgn = (PROSRGNDATA)REGION_LockRgn(VisBefore)) &&
+         if (VisBefore != NULL && (VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisBefore, NULL)) &&
                REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION)
          {
-            REGION_UnlockRgn(VisRgn);
+            RGNOBJAPI_Unlock(VisRgn);
             GreDeleteObject(VisBefore);
             VisBefore = NULL;
          }
          else if(VisRgn)
          {
-            REGION_UnlockRgn(VisRgn);
+            RGNOBJAPI_Unlock(VisRgn);
             NtGdiOffsetRgn(VisBefore, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top);
          }
       }
@@ -1112,16 +1112,16 @@ co_WinPosSetWindowPos(
       VisAfter = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
       VisRgn = NULL;
 
-      if (VisAfter != NULL && (VisRgn = (PROSRGNDATA)REGION_LockRgn(VisAfter)) &&
+      if (VisAfter != NULL && (VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisAfter, NULL)) &&
             REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION)
       {
-         REGION_UnlockRgn(VisRgn);
+         RGNOBJAPI_Unlock(VisRgn);
          GreDeleteObject(VisAfter);
          VisAfter = NULL;
       }
       else if(VisRgn)
       {
-         REGION_UnlockRgn(VisRgn);
+         RGNOBJAPI_Unlock(VisRgn);
          NtGdiOffsetRgn(VisAfter, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top);
       }
 
@@ -1156,9 +1156,9 @@ co_WinPosSetWindowPos(
             RECTL_vOffsetRect(&ORect, - OldWindowRect.left, - OldWindowRect.top);
             RECTL_vOffsetRect(&NRect, - NewWindowRect.left, - NewWindowRect.top);
             RECTL_bIntersectRect(&CopyRect, &ORect, &NRect);
-            pCopyRgn = REGION_LockRgn(CopyRgn);
+            pCopyRgn = RGNOBJAPI_Lock(CopyRgn, NULL);
             REGION_CropAndOffsetRegion(pCopyRgn, pCopyRgn, &CopyRect, NULL);
-            REGION_UnlockRgn(pCopyRgn);
+            RGNOBJAPI_Unlock(pCopyRgn);
          }
 
          /* No use in copying bits which are in the update region. */
@@ -1174,11 +1174,11 @@ co_WinPosSetWindowPos(
           * there's nothing to copy. Also, it's no use copying bits onto
           * themselves.
           */
-         if ((VisRgn = (PROSRGNDATA)REGION_LockRgn(CopyRgn)) &&
+         if ((VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(CopyRgn, NULL)) &&
                REGION_GetRgnBox(VisRgn, &CopyRect) == NULLREGION)
          {
             /* Nothing to copy, clean up */
-            REGION_UnlockRgn(VisRgn);
+            RGNOBJAPI_Unlock(VisRgn);
             GreDeleteObject(CopyRgn);
             CopyRgn = NULL;
          }
@@ -1187,7 +1187,7 @@ co_WinPosSetWindowPos(
          {
             if(VisRgn)
             {
-               REGION_UnlockRgn(VisRgn);
+               RGNOBJAPI_Unlock(VisRgn);
             }
 
             /*
@@ -1214,7 +1214,7 @@ co_WinPosSetWindowPos(
          }
          else if(VisRgn)
          {
-            REGION_UnlockRgn(VisRgn);
+            RGNOBJAPI_Unlock(VisRgn);
          }
       }
       else
index 61942aa..a02d652 100644 (file)
@@ -703,7 +703,9 @@ GreStretchBltMask(
     INT HeightSrc,
     DWORD ROP,
     IN DWORD dwBackColor,
-    HDC hDCMask)
+    HDC hDCMask,
+    INT XOriginMask,
+    INT YOriginMask)
 {
     PDC DCDest;
     PDC DCSrc  = NULL;
@@ -713,6 +715,7 @@ GreStretchBltMask(
     SURFACE *BitmapMask = NULL;
     RECTL DestRect;
     RECTL SourceRect;
+    POINTL MaskPoint;
     BOOL Status = FALSE;
     EXLATEOBJ exlo;
     XLATEOBJ *XlateObj = NULL;
@@ -827,12 +830,20 @@ GreStretchBltMask(
         {
             BitmapMask = DCMask->dclevel.pSurface;
             if (BitmapMask &&
-                (BitmapMask->SurfObj.sizlBitmap.cx != WidthSrc ||
-                 BitmapMask->SurfObj.sizlBitmap.cy != HeightSrc))
+                (BitmapMask->SurfObj.sizlBitmap.cx < WidthSrc ||
+                 BitmapMask->SurfObj.sizlBitmap.cy < HeightSrc))
             {
-                DPRINT1("Mask and bitmap sizes don't match!\n");
+                DPRINT1("%dx%d mask is smaller than %dx%d bitmap\n", 
+                        BitmapMask->SurfObj.sizlBitmap.cx, BitmapMask->SurfObj.sizlBitmap.cy, 
+                        WidthSrc, HeightSrc);
                 goto failed;
             }
+            /* Create mask offset point */
+            MaskPoint.x = XOriginMask;
+            MaskPoint.y = YOriginMask;
+            IntLPtoDP(DCMask, &MaskPoint, 1);
+            MaskPoint.x += DCMask->ptlDCOrig.x;
+            MaskPoint.y += DCMask->ptlDCOrig.x;
         }
     }
 
@@ -844,7 +855,7 @@ GreStretchBltMask(
                               XlateObj,
                               &DestRect,
                               &SourceRect,
-                              NULL,
+                              BitmapMask ? &MaskPoint : NULL,
                               &DCDest->eboFill.BrushObject,
                               &BrushOrigin,
                               ROP3_TO_ROP4(ROP));
@@ -896,7 +907,9 @@ NtGdiStretchBlt(
                 HeightSrc,
                 ROP,
                 dwBackColor,
-                NULL);
+                NULL,
+                0,
+                0);
 }
 
 
index 07cb63e..6e827fa 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
+#define GDIOBJATTRFREE 170
+
+typedef struct _GDI_OBJ_ATTR_FREELIST
+{
+  LIST_ENTRY Entry;
+  DWORD nEntries;
+  PVOID AttrList[GDIOBJATTRFREE];
+} GDI_OBJ_ATTR_FREELIST, *PGDI_OBJ_ATTR_FREELIST;
+      
+typedef struct _GDI_OBJ_ATTR_ENTRY
+{
+  RGN_ATTR Attr[GDIOBJATTRFREE];
+} GDI_OBJ_ATTR_ENTRY, *PGDI_OBJ_ATTR_ENTRY;
+
 static const USHORT HatchBrushes[NB_HATCH_STYLES][8] =
 {
     {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF}, /* HS_HORIZONTAL */
@@ -21,6 +35,134 @@ static const USHORT HatchBrushes[NB_HATCH_STYLES][8] =
     {0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E}  /* HS_DIAGCROSS  */
 };
 
+
+PVOID
+FASTCALL
+AllocateObjectAttr(VOID)
+{
+  PTHREADINFO pti;
+  PPROCESSINFO ppi;
+  PVOID pAttr;
+  PGDI_OBJ_ATTR_FREELIST pGdiObjAttrFreeList;
+  PGDI_OBJ_ATTR_ENTRY pGdiObjAttrEntry;
+  int i;
+  
+  pti = PsGetCurrentThreadWin32Thread();
+  if (pti->pgdiBrushAttr)
+  {
+     pAttr = pti->pgdiBrushAttr; // Get the free one.
+     pti->pgdiBrushAttr = NULL;
+     return pAttr;
+  }
+
+  ppi = PsGetCurrentProcessWin32Process();
+
+  if (!ppi->pBrushAttrList) // If set point is null, allocate new group.
+  {
+     pGdiObjAttrEntry = EngAllocUserMem(sizeof(GDI_OBJ_ATTR_ENTRY), 0);
+
+     if (!pGdiObjAttrEntry)
+     {
+        DPRINT1("Attr Failed User Allocation!\n");
+        return NULL;
+     }
+
+     DPRINT("AllocObjectAttr User 0x%x\n",pGdiObjAttrEntry);
+
+     pGdiObjAttrFreeList = ExAllocatePoolWithTag( PagedPool,
+                                                  sizeof(GDI_OBJ_ATTR_FREELIST),
+                                                  GDITAG_BRUSH_FREELIST);
+     if ( !pGdiObjAttrFreeList )
+     {
+        EngFreeUserMem(pGdiObjAttrEntry);
+        return NULL;
+     }
+
+     RtlZeroMemory(pGdiObjAttrFreeList, sizeof(GDI_OBJ_ATTR_FREELIST));
+
+     DPRINT("AllocObjectAttr Ex 0x%x\n",pGdiObjAttrFreeList);
+
+     InsertHeadList( &ppi->GDIBrushAttrFreeList, &pGdiObjAttrFreeList->Entry);
+
+     pGdiObjAttrFreeList->nEntries = GDIOBJATTRFREE;
+     // Start at the bottom up and set end of free list point.
+     ppi->pBrushAttrList = &pGdiObjAttrEntry->Attr[GDIOBJATTRFREE-1];
+     // Build the free attr list.
+     for ( i = 0; i < GDIOBJATTRFREE; i++)
+     {
+         pGdiObjAttrFreeList->AttrList[i] = &pGdiObjAttrEntry->Attr[i];
+     }
+  }
+
+  pAttr = ppi->pBrushAttrList;
+  pGdiObjAttrFreeList = (PGDI_OBJ_ATTR_FREELIST)ppi->GDIBrushAttrFreeList.Flink;
+
+  // Free the list when it is full!
+  if ( pGdiObjAttrFreeList->nEntries-- == 1)
+  {  // No more free entries, so yank the list.
+     RemoveEntryList( &pGdiObjAttrFreeList->Entry );
+
+     ExFreePoolWithTag( pGdiObjAttrFreeList, GDITAG_BRUSH_FREELIST );
+
+     if ( IsListEmpty( &ppi->GDIBrushAttrFreeList ) )
+     {
+        ppi->pBrushAttrList = NULL;
+        return pAttr;
+     }
+
+     pGdiObjAttrFreeList = (PGDI_OBJ_ATTR_FREELIST)ppi->GDIBrushAttrFreeList.Flink;
+  }
+
+  ppi->pBrushAttrList = pGdiObjAttrFreeList->AttrList[pGdiObjAttrFreeList->nEntries-1];
+
+  return pAttr;
+}
+
+VOID
+FASTCALL
+FreeObjectAttr(PVOID pAttr)
+{
+  PTHREADINFO pti;
+  PPROCESSINFO ppi;
+  PGDI_OBJ_ATTR_FREELIST pGdiObjAttrFreeList;
+
+  pti = PsGetCurrentThreadWin32Thread();
+  
+  if (!pti) return;
+  
+  if (!pti->pgdiBrushAttr)
+  {  // If it is null, just cache it for the next time.
+     pti->pgdiBrushAttr = pAttr;
+     return;
+  }
+
+  ppi = PsGetCurrentProcessWin32Process();
+
+  pGdiObjAttrFreeList = (PGDI_OBJ_ATTR_FREELIST)ppi->GDIBrushAttrFreeList.Flink;
+
+  // We add to the list of free entries, so this will grows!
+  if ( IsListEmpty(&ppi->GDIBrushAttrFreeList) ||
+       pGdiObjAttrFreeList->nEntries == GDIOBJATTRFREE )
+  {
+     pGdiObjAttrFreeList = ExAllocatePoolWithTag( PagedPool,
+                                                  sizeof(GDI_OBJ_ATTR_FREELIST),
+                                                  GDITAG_BRUSH_FREELIST);
+     if ( !pGdiObjAttrFreeList )
+     {
+        return;
+     }
+     InsertHeadList( &ppi->GDIBrushAttrFreeList, &pGdiObjAttrFreeList->Entry);
+     pGdiObjAttrFreeList->nEntries = 0;
+  }
+  // Up count, save the entry and set end of free list point.
+  ++pGdiObjAttrFreeList->nEntries; // Top Down...
+  pGdiObjAttrFreeList->AttrList[pGdiObjAttrFreeList->nEntries-1] = pAttr;
+  ppi->pBrushAttrList = pAttr;
+
+  return;
+}
+
+
 BOOL
 INTERNAL_CALL
 BRUSH_Cleanup(PVOID ObjectBody)
index 4ece64e..92b2fcb 100644 (file)
@@ -36,7 +36,7 @@ CLIPPING_UpdateGCRegion(DC* Dc)
       NtGdiCombineRgn(Dc->rosdc.hGCClipRgn, Dc->rosdc.hClipRgn, Dc->rosdc.hVisRgn, RGN_AND);
    NtGdiOffsetRgn(Dc->rosdc.hGCClipRgn, Dc->ptlDCOrig.x, Dc->ptlDCOrig.y);
 
-   if((CombinedRegion = REGION_LockRgn(Dc->rosdc.hGCClipRgn)))
+   if((CombinedRegion = RGNOBJAPI_Lock(Dc->rosdc.hGCClipRgn, NULL)))
    {
      if (Dc->rosdc.CombinedClip != NULL)
         IntEngDeleteClipRegion(Dc->rosdc.CombinedClip);
@@ -46,7 +46,7 @@ CLIPPING_UpdateGCRegion(DC* Dc)
         CombinedRegion->Buffer,
         &CombinedRegion->rdh.rcBound);
 
-     REGION_UnlockRgn(CombinedRegion);
+     RGNOBJAPI_Unlock(CombinedRegion);
    }
 
    if ( NULL == Dc->rosdc.CombinedClip )
@@ -123,10 +123,10 @@ int FASTCALL GdiExtSelectClipRgn(PDC dc,
     {
       PROSRGNDATA Rgn;
       RECTL rect;
-      if((Rgn = REGION_LockRgn(dc->rosdc.hVisRgn)))
+      if((Rgn = RGNOBJAPI_Lock(dc->rosdc.hVisRgn, NULL)))
       {
         REGION_GetRgnBox(Rgn, &rect);
-        REGION_UnlockRgn(Rgn);
+        RGNOBJAPI_Unlock(Rgn);
         dc->rosdc.hClipRgn = UnsafeIntCreateRectRgnIndirect(&rect);
       }
       else
@@ -177,13 +177,13 @@ GdiGetClipBox(HDC hDC, PRECTL rc)
       return ERROR;
    }
 
-   if (!(Rgn = REGION_LockRgn(dc->rosdc.hGCClipRgn)))
+   if (!(Rgn = RGNOBJAPI_Lock(dc->rosdc.hGCClipRgn, NULL)))
    {
       DC_UnlockDc(dc);
       return ERROR;
    }
    retval = REGION_GetRgnBox(Rgn, rc);
-   REGION_UnlockRgn(Rgn);
+   RGNOBJAPI_Unlock(Rgn);
    IntDPtoLP(dc, (LPPOINT)rc, 2);
    DC_UnlockDc(dc);
 
@@ -407,11 +407,11 @@ BOOL APIENTRY NtGdiRectVisible(HDC  hDC,
 
    if (dc->rosdc.hGCClipRgn)
    {
-      if((Rgn = (PROSRGNDATA)REGION_LockRgn(dc->rosdc.hGCClipRgn)))
+      if((Rgn = (PROSRGNDATA)RGNOBJAPI_Lock(dc->rosdc.hGCClipRgn, NULL)))
       {
          IntLPtoDP(dc, (LPPOINT)&Rect, 2);
          Result = REGION_RectInRegion(Rgn, &Rect);
-         REGION_UnlockRgn(Rgn);
+         RGNOBJAPI_Unlock(Rgn);
       }
    }
    DC_UnlockDc(dc);
index a7e1a33..c5de942 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
+#define GDIDCATTRFREE 8
+
+typedef struct _GDI_DC_ATTR_FREELIST
+{
+  LIST_ENTRY Entry;
+  DWORD nEntries;
+  PVOID AttrList[GDIDCATTRFREE];
+} GDI_DC_ATTR_FREELIST, *PGDI_DC_ATTR_FREELIST;
+
+typedef struct _GDI_DC_ATTR_ENTRY
+{
+  DC_ATTR Attr[GDIDCATTRFREE];
+} GDI_DC_ATTR_ENTRY, *PGDI_DC_ATTR_ENTRY;
+
+
+PDC_ATTR
+FASTCALL
+AllocateDcAttr(VOID)
+{
+  PTHREADINFO pti;
+  PPROCESSINFO ppi;
+  PDC_ATTR pDc_Attr;
+  PGDI_DC_ATTR_FREELIST pGdiDcAttrFreeList;
+  PGDI_DC_ATTR_ENTRY pGdiDcAttrEntry;
+  int i;
+  
+  pti = PsGetCurrentThreadWin32Thread();
+  if (pti->pgdiDcattr)
+  {
+     pDc_Attr = pti->pgdiDcattr; // Get the free one.
+     pti->pgdiDcattr = NULL;
+     return pDc_Attr;
+  }
+
+  ppi = PsGetCurrentProcessWin32Process();
+
+  if (!ppi->pDCAttrList) // If set point is null, allocate new group.
+  {
+     pGdiDcAttrEntry = EngAllocUserMem(sizeof(GDI_DC_ATTR_ENTRY), 0);
+
+     if (!pGdiDcAttrEntry)
+     {
+        DPRINT1("DcAttr Failed User Allocation!\n");
+        return NULL;
+     }
+
+     DPRINT("AllocDcAttr User 0x%x\n",pGdiDcAttrEntry);
+
+     pGdiDcAttrFreeList = ExAllocatePoolWithTag( PagedPool,
+                                                 sizeof(GDI_DC_ATTR_FREELIST),
+                                                 GDITAG_DC_FREELIST);
+     if ( !pGdiDcAttrFreeList )
+     {
+        EngFreeUserMem(pGdiDcAttrEntry);
+        return NULL;
+     }
+
+     RtlZeroMemory(pGdiDcAttrFreeList, sizeof(GDI_DC_ATTR_FREELIST));
+
+     DPRINT("AllocDcAttr Ex 0x%x\n",pGdiDcAttrFreeList);
+
+     InsertHeadList( &ppi->GDIDcAttrFreeList, &pGdiDcAttrFreeList->Entry);
+
+     pGdiDcAttrFreeList->nEntries = GDIDCATTRFREE;
+     // Start at the bottom up and set end of free list point.
+     ppi->pDCAttrList = &pGdiDcAttrEntry->Attr[GDIDCATTRFREE-1];
+     // Build the free attr list.
+     for ( i = 0; i < GDIDCATTRFREE; i++)
+     {
+         pGdiDcAttrFreeList->AttrList[i] = &pGdiDcAttrEntry->Attr[i];
+     }
+  }
+
+  pDc_Attr = ppi->pDCAttrList;
+  pGdiDcAttrFreeList = (PGDI_DC_ATTR_FREELIST)ppi->GDIDcAttrFreeList.Flink;
+
+  // Free the list when it is full!
+  if ( pGdiDcAttrFreeList->nEntries-- == 1)
+  {  // No more free entries, so yank the list.
+     RemoveEntryList( &pGdiDcAttrFreeList->Entry );
+
+     ExFreePoolWithTag( pGdiDcAttrFreeList, GDITAG_DC_FREELIST );
+
+     if ( IsListEmpty( &ppi->GDIDcAttrFreeList ) )
+     {
+        ppi->pDCAttrList = NULL;
+        return pDc_Attr;
+     }
+
+     pGdiDcAttrFreeList = (PGDI_DC_ATTR_FREELIST)ppi->GDIDcAttrFreeList.Flink;
+  }
+
+  ppi->pDCAttrList = pGdiDcAttrFreeList->AttrList[pGdiDcAttrFreeList->nEntries-1];
+
+  return pDc_Attr;
+}
+
+VOID
+FASTCALL
+FreeDcAttr(PDC_ATTR pDc_Attr)
+{
+  PTHREADINFO pti;
+  PPROCESSINFO ppi;
+  PGDI_DC_ATTR_FREELIST pGdiDcAttrFreeList;
+
+  pti = PsGetCurrentThreadWin32Thread();
+  
+  if (!pti) return;
+  
+  if (!pti->pgdiDcattr)
+  {  // If it is null, just cache it for the next time.
+     pti->pgdiDcattr = pDc_Attr;
+     return;
+  }
+
+  ppi = PsGetCurrentProcessWin32Process();
+
+  pGdiDcAttrFreeList = (PGDI_DC_ATTR_FREELIST)ppi->GDIDcAttrFreeList.Flink;
+
+  // We add to the list of free entries, so this will grows!
+  if ( IsListEmpty(&ppi->GDIDcAttrFreeList) ||
+       pGdiDcAttrFreeList->nEntries == GDIDCATTRFREE )
+  {
+     pGdiDcAttrFreeList = ExAllocatePoolWithTag( PagedPool,
+                                                 sizeof(GDI_DC_ATTR_FREELIST),
+                                                 GDITAG_DC_FREELIST);
+     if ( !pGdiDcAttrFreeList )
+     {
+        return;
+     }
+     InsertHeadList( &ppi->GDIDcAttrFreeList, &pGdiDcAttrFreeList->Entry);
+     pGdiDcAttrFreeList->nEntries = 0;
+  }
+  // Up count, save the entry and set end of free list point.
+  ++pGdiDcAttrFreeList->nEntries; // Top Down...
+  pGdiDcAttrFreeList->AttrList[pGdiDcAttrFreeList->nEntries-1] = pDc_Attr;
+  ppi->pDCAttrList = pDc_Attr;
+
+  return;
+}
 
 VOID
 FASTCALL
@@ -18,35 +158,31 @@ DC_AllocateDcAttr(HDC hDC)
 {
   PVOID NewMem = NULL;
   PDC pDC;
-  HANDLE Pid = NtCurrentProcess();
-  ULONG MemSize = sizeof(DC_ATTR); //PAGE_SIZE it will allocate that size
-
-  NTSTATUS Status = ZwAllocateVirtualMemory(Pid,
-                                        &NewMem,
-                                              0,
-                                       &MemSize,
-                         MEM_COMMIT|MEM_RESERVE,
-                                 PAGE_READWRITE);
+
   KeEnterCriticalRegion();
   {
     INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hDC);
     PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index];
+
+    NewMem = AllocateDcAttr();
+
     // FIXME: dc could have been deleted!!! use GDIOBJ_InsertUserData
-    if (NT_SUCCESS(Status))
+
+    if (NewMem)
     {
-      RtlZeroMemory(NewMem, MemSize);
-      Entry->UserData  = NewMem;
-      DPRINT("DC_ATTR allocated! 0x%x\n",NewMem);
+       RtlZeroMemory(NewMem, sizeof(DC_ATTR));
+       Entry->UserData = NewMem;
+       DPRINT("DC_ATTR allocated! 0x%x\n",NewMem);
     }
     else
     {
-       DPRINT("DC_ATTR not allocated!\n");
+       DPRINT1("DC_ATTR not allocated!\n");
     }
   }
   KeLeaveCriticalRegion();
   pDC = DC_LockDc(hDC);
   ASSERT(pDC->pdcattr == &pDC->dcattr);
-  if(NewMem)
+  if (NewMem)
   {
      pDC->pdcattr = NewMem; // Store pointer
   }
@@ -57,7 +193,6 @@ VOID
 FASTCALL
 DC_FreeDcAttr(HDC  DCToFree )
 {
-  HANDLE Pid = NtCurrentProcess();
   PDC pDC = DC_LockDc(DCToFree);
   if (pDC->pdcattr == &pDC->dcattr) return; // Internal DC object!
   pDC->pdcattr = &pDC->dcattr;
@@ -67,18 +202,10 @@ DC_FreeDcAttr(HDC  DCToFree )
   {
     INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)DCToFree);
     PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index];
-    if(Entry->UserData)
+    if (Entry->UserData)
     {
-      ULONG MemSize = sizeof(DC_ATTR); //PAGE_SIZE;
-      NTSTATUS Status = ZwFreeVirtualMemory(Pid,
-                               &Entry->UserData,
-                                       &MemSize,
-                                   MEM_RELEASE);
-      if (NT_SUCCESS(Status))
-      {
-        DPRINT("DC_FreeDC DC_ATTR 0x%x\n", Entry->UserData);
-        Entry->UserData = NULL;
-      }
+       FreeDcAttr(Entry->UserData);
+       Entry->UserData = NULL;
     }
   }
   KeLeaveCriticalRegion();
@@ -123,7 +250,7 @@ DCU_SyncDcAttrtoUser(PDC dc)
   CopytoUserDcAttr( dc, pdcattr);
   return TRUE;
 }
-
+// LOL! DCU_ Sync hDc Attr to User,,, need it speeled out for you?
 BOOL
 FASTCALL
 DCU_SynchDcAttrtoUser(HDC hDC)
index d0f3787..72d843a 100644 (file)
@@ -135,23 +135,6 @@ DC_AllocDC(PUNICODE_STRING Driver)
     return NewDC;
 }
 
-VOID FASTCALL
-DC_FreeDC(HDC DCToFree)
-{
-    DC_FreeDcAttr(DCToFree);
-    if (!IsObjectDead(DCToFree))
-    {
-        if (!GDIOBJ_FreeObjByHandle(DCToFree, GDI_OBJECT_TYPE_DC))
-        {
-            DPRINT1("DC_FreeDC failed\n");
-        }
-    }
-    else
-    {
-        DPRINT1("Attempted to Delete 0x%x currently being destroyed!!!\n",DCToFree);
-    }
-}
-
 BOOL INTERNAL_CALL
 DC_Cleanup(PVOID ObjectBody)
 {
@@ -537,7 +520,7 @@ IntGdiDeleteDC(HDC hDC, BOOL Force)
     PATH_Delete(DCToDelete->dclevel.hPath);
 
     DC_UnlockDc(DCToDelete);
-    DC_FreeDC(hDC);
+    GreDeleteObject(hDC);
     return TRUE;
 }
 
index 05656af..44e690d 100644 (file)
@@ -180,7 +180,7 @@ NtGdiRestoreDC(
         }
 
         /* Delete the saved dc */
-        DC_FreeDC(hdcSave);
+        GreDeleteObject(hdcSave);
     }
 
     DC_UnlockDc(pdc);
index 9cde646..43ca302 100644 (file)
@@ -654,6 +654,69 @@ IsObjectDead(HGDIOBJ hObject)
 }
 
 
+BOOL
+FASTCALL
+bPEBCacheHandle(HGDIOBJ Handle, int oType, PVOID pAttr)
+{
+  PGDIHANDLECACHE GdiHandleCache;
+  HGDIOBJ *hPtr;
+  BOOL Ret = FALSE;
+  int Offset = 0, Number;
+  HANDLE Lock;
+
+  GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer;
+
+  switch (oType)
+  {
+     case hctBrushHandle:
+        Offset = 0;
+        break;
+
+     case hctPenHandle:
+        Offset = CACHE_BRUSH_ENTRIES;
+        break;
+
+     case hctRegionHandle:
+        Offset = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES;
+        break;
+
+     default:
+        return FALSE;
+  }
+
+  Lock = InterlockedCompareExchangePointer( (PVOID*)&GdiHandleCache->ulLock,
+                                             NtCurrentTeb(),
+                                             NULL );
+  if (Lock) return FALSE;
+
+  _SEH2_TRY
+  {
+     Number = GdiHandleCache->ulNumHandles[oType];
+
+     hPtr = GdiHandleCache->Handle + Offset;
+
+     if ( oType == hctRegionHandle)
+     {
+        if ( Number < CACHE_REGION_ENTRIES )
+        {
+           ((PRGN_ATTR)pAttr)->AttrFlags |= ATTR_CACHED;
+           hPtr[Number] = Handle;
+           GdiHandleCache->ulNumHandles[oType]++;
+           DPRINT("Put Handle Count %d\n", GdiHandleCache->ulNumHandles[oType]);
+           Ret = TRUE;
+        }
+     }
+  }
+  _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+  {
+     Ret = FALSE;
+  }
+  _SEH2_END;
+
+  (void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock);
+  return Ret;
+}
+
 /*!
  * Delete GDI object
  * \param      hObject object handle
@@ -663,11 +726,45 @@ BOOL
 FASTCALL
 GreDeleteObject(HGDIOBJ hObject)
 {
+    INT Index;
+    PGDI_TABLE_ENTRY Entry;
+    DWORD dwObjectType;
+    PVOID pAttr = NULL;
+
     DPRINT("NtGdiDeleteObject handle 0x%08x\n", hObject);
     if (!IsObjectDead(hObject))
     {
-        return NULL != hObject
-               ? GDIOBJ_FreeObjByHandle(hObject, GDI_OBJECT_TYPE_DONTCARE) : FALSE;
+       dwObjectType = GDIOBJ_GetObjectType(hObject);
+
+       Index = GDI_HANDLE_GET_INDEX(hObject);
+       Entry = &GdiHandleTable->Entries[Index];
+       pAttr = Entry->UserData;
+
+       switch (dwObjectType)
+       {
+          case GDI_OBJECT_TYPE_BRUSH:
+             break;
+
+          case GDI_OBJECT_TYPE_REGION:
+             if (bPEBCacheHandle(hObject, hctRegionHandle, pAttr))
+             {
+                return TRUE;
+             }
+             if (pAttr)
+             {
+                KeEnterCriticalRegion();
+                FreeObjectAttr(pAttr);
+                KeLeaveCriticalRegion();
+             }
+             break;
+
+          case GDI_OBJECT_TYPE_DC:
+             DC_FreeDcAttr(hObject);
+             break;
+       }
+
+       return NULL != hObject
+               ? GDIOBJ_FreeObjByHandle(hObject, dwObjectType) : FALSE;
     }
     else
     {
@@ -1462,58 +1559,6 @@ GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process)
 
 /** PUBLIC FUNCTIONS **********************************************************/
 
-/*
-  Since Brush/Pen and Region objects are sharable,,, we can just use
-  UserHeapAlloc to allocate the small attribute objects.
-
-   Example Allocating:
-
-    // Save Kernel Space Pointer
-    (PBRUSH)->pBrushAttr = IntGdiAllocObjAttr(GDIObjType_BRUSH_TYPE);
-
-    // Kernel Space to User Space Pointer
-    (PGDI_TABLE_ENTRY)->UserData = pBrushAttr;
-    // Gdi will adjust for heap delta.
-
-   Example Freeing:
-
-    (PGDI_TABLE_ENTRY)->UserData = NULL;      // Zero the user ptr.
-    UserHeapFree((PBRUSH)->pBrushAttr); // Free from kernel ptr.
-    (PBRUSH)->pBrushAttr = NULL;
-
-   Notes:
-    Testing with DC_ATTR works but has drawing difficulties.
-    Base on observation, (Over looking the obvious) we need to supply heap delta
-    to user space gdi. Now, with testing, looks all normal.
-
- */
-PVOID
-FASTCALL
-IntGdiAllocObjAttr(GDIOBJTYPE Type)
-{
-  PVOID pMemAttr = NULL;
-
-  switch( Type )
-  {
-     case GDIObjType_DC_TYPE:
-        pMemAttr = UserHeapAlloc(sizeof(DC_ATTR));
-        if (pMemAttr) RtlZeroMemory(pMemAttr, sizeof(DC_ATTR));
-        break;
-     case GDIObjType_RGN_TYPE:
-        pMemAttr = UserHeapAlloc(sizeof(RGN_ATTR));
-        if (pMemAttr) RtlZeroMemory(pMemAttr, sizeof(RGN_ATTR));
-        break;
-     case GDIObjType_BRUSH_TYPE:
-        pMemAttr = UserHeapAlloc(sizeof(BRUSH_ATTR));
-        if (pMemAttr) RtlZeroMemory(pMemAttr, sizeof(BRUSH_ATTR));
-        break;
-     default:
-        break;
-  }
-  return pMemAttr;
-}
-
-
 BOOL
 FASTCALL
 IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask)
index e426361..36de953 100644 (file)
@@ -467,7 +467,7 @@ IntDumpRegion(HRGN hRgn)
 {
     ROSRGNDATA *Data;
 
-    Data = REGION_LockRgn(hRgn);
+    Data = RGNOBJAPI_Lock(hRgn, NULL);
     if (Data == NULL)
     {
         DbgPrint("IntDumpRegion called with invalid region!\n");
@@ -482,7 +482,7 @@ IntDumpRegion(HRGN hRgn)
              Data->rdh.rcBound.bottom,
              Data->rdh.iType);
 
-    REGION_UnlockRgn(Data);
+    RGNOBJAPI_Unlock(Data);
 }
 #endif /* not NDEBUG */
 
@@ -1650,7 +1650,8 @@ REGION_SubtractO(
                 pNextRect++;
             }
             r1++;
-            left = r1->left;
+            if (r1 != r1End)
+                left = r1->left;
         }
     }
 
@@ -1739,7 +1740,7 @@ REGION_XorRegion(
     trb = REGION_AllocRgnWithHandle(srb->rdh.nCount + 1);
     if (!trb)
     {
-        REGION_UnlockRgn(tra);
+        RGNOBJAPI_Unlock(tra);
         GreDeleteObject(htra);
         return;
     }
@@ -1748,8 +1749,8 @@ REGION_XorRegion(
     REGION_SubtractRegion(tra, sra, srb);
     REGION_SubtractRegion(trb, srb, sra);
     REGION_UnionRegion(dr, tra, trb);
-    REGION_UnlockRgn(tra);
-    REGION_UnlockRgn(trb);
+    RGNOBJAPI_Unlock(tra);
+    RGNOBJAPI_Unlock(trb);
 
     GreDeleteObject(htra);
     GreDeleteObject(htrb);
@@ -1863,26 +1864,26 @@ REGION_CreateFrameRgn(
     PRECTL rc;
     ULONG i;
 
-    if (!(srcObj = REGION_LockRgn(hSrc)))
+    if (!(srcObj = RGNOBJAPI_Lock(hSrc, NULL)))
     {
         return FALSE;
     }
     if (!REGION_NOT_EMPTY(srcObj))
     {
-        REGION_UnlockRgn(srcObj);
+        RGNOBJAPI_Unlock(srcObj);
         return FALSE;
     }
-    if (!(destObj = REGION_LockRgn(hDest)))
+    if (!(destObj = RGNOBJAPI_Lock(hDest, NULL)))
     {
-        REGION_UnlockRgn(srcObj);
+        RGNOBJAPI_Unlock(srcObj);
         return FALSE;
     }
 
     EMPTY_REGION(destObj);
     if (!REGION_CopyRegion(destObj, srcObj))
     {
-        REGION_UnlockRgn(destObj);
-        REGION_UnlockRgn(srcObj);
+        RGNOBJAPI_Unlock(destObj);
+        RGNOBJAPI_Unlock(srcObj);
         return FALSE;
     }
 
@@ -1891,8 +1892,8 @@ REGION_CreateFrameRgn(
         if (!REGION_CreateSimpleFrameRgn(destObj, x, y))
         {
             EMPTY_REGION(destObj);
-            REGION_UnlockRgn(destObj);
-            REGION_UnlockRgn(srcObj);
+            RGNOBJAPI_Unlock(destObj);
+            RGNOBJAPI_Unlock(srcObj);
             return FALSE;
         }
     }
@@ -1951,8 +1952,8 @@ REGION_CreateFrameRgn(
         REGION_SubtractRegion(destObj, srcObj, destObj);
     }
 
-    REGION_UnlockRgn(destObj);
-    REGION_UnlockRgn(srcObj);
+    RGNOBJAPI_Unlock(destObj);
+    RGNOBJAPI_Unlock(srcObj);
     return TRUE;
 }
 
@@ -1986,11 +1987,11 @@ REGION_LPTODP(
         goto done;
     }
 
-    if ( !(srcObj = REGION_LockRgn(hSrc)) )
+    if ( !(srcObj = RGNOBJAPI_Lock(hSrc, NULL)) )
         goto done;
-    if ( !(destObj = REGION_LockRgn(hDest)) )
+    if ( !(destObj = RGNOBJAPI_Lock(hDest, NULL)) )
     {
-        REGION_UnlockRgn(srcObj);
+        RGNOBJAPI_Unlock(srcObj);
         goto done;
     }
     EMPTY_REGION(destObj);
@@ -2021,8 +2022,8 @@ REGION_LPTODP(
     }
     ret = TRUE;
 
-    REGION_UnlockRgn(srcObj);
-    REGION_UnlockRgn(destObj);
+    RGNOBJAPI_Unlock(srcObj);
+    RGNOBJAPI_Unlock(destObj);
 
 done:
     return ret;
@@ -2034,6 +2035,8 @@ REGION_AllocRgnWithHandle(INT nReg)
 {
     HRGN hReg;
     PROSRGNDATA pReg;
+    INT Index;
+    PGDI_TABLE_ENTRY Entry;
     
     pReg = (PROSRGNDATA)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_REGION);
     if(!pReg)
@@ -2054,12 +2057,18 @@ REGION_AllocRgnWithHandle(INT nReg)
         pReg->Buffer = ExAllocatePoolWithTag(PagedPool, nReg * sizeof(RECT), TAG_REGION);
         if (!pReg->Buffer)
         {
-            REGION_UnlockRgn(pReg);
+            RGNOBJAPI_Unlock(pReg);
             GDIOBJ_FreeObjByHandle(hReg, GDI_OBJECT_TYPE_REGION);
             return NULL;
         }
     }
 
+    KeEnterCriticalRegion();
+    Index = GDI_HANDLE_GET_INDEX(hReg);
+    Entry = &GdiHandleTable->Entries[Index];
+    Entry->UserData = AllocateObjectAttr();
+    KeLeaveCriticalRegion();
+
     EMPTY_REGION(pReg);
     pReg->rdh.dwSize = sizeof(RGNDATAHEADER);
     pReg->rdh.nCount = nReg;
@@ -2076,36 +2085,50 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr)
   PGDI_TABLE_ENTRY Entry;
   PROSRGNDATA pRgn;
   PRGN_ATTR pRgn_Attr;
+  BOOL Hit = FALSE;
 
   pRgn = REGION_LockRgn(hRgn);
 
   if (pRgn)
   {
+     KeEnterCriticalRegion();
      Index = GDI_HANDLE_GET_INDEX(hRgn);
      Entry = &GdiHandleTable->Entries[Index];
-
      pRgn_Attr = Entry->UserData;
+     KeLeaveCriticalRegion();
+
      if (pRgn_Attr)
      {
-        if ( pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) )
+        _SEH2_TRY
         {
-           switch (pRgn_Attr->Flags)
+           ProbeForWrite(pRgn_Attr, sizeof(RGN_ATTR), 1);
+
+           if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) &&
+                 pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) )
            {
-               case NULLREGION:
-                  EMPTY_REGION( pRgn );
-                  pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY; // Clear flag in these cases,
-                  break;
-
-               case SIMPLEREGION:
-                  REGION_SetRectRgn( pRgn,
-                                     pRgn_Attr->Rect.left,
-                                     pRgn_Attr->Rect.top,
-                                     pRgn_Attr->Rect.right,
-                                     pRgn_Attr->Rect.bottom );
-                  pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY; // just incase, force a redraw.
-                  break;
+              switch (pRgn_Attr->Flags)
+              {
+                  case NULLREGION:
+                     EMPTY_REGION( pRgn );
+                     break;
+
+                  case SIMPLEREGION:
+                     REGION_SetRectRgn( pRgn,
+                                        pRgn_Attr->Rect.left,
+                                        pRgn_Attr->Rect.top,
+                                        pRgn_Attr->Rect.right,
+                                        pRgn_Attr->Rect.bottom );
+                     break;
+              }
+              pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY;
            }
         }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+           Hit = TRUE;
+        }
+        _SEH2_END;
+
         if (ppRgn_Attr)
            *ppRgn_Attr = pRgn_Attr;
      }
@@ -2125,23 +2148,36 @@ RGNOBJAPI_Unlock(PROSRGNDATA pRgn)
   INT Index;
   PGDI_TABLE_ENTRY Entry;
   PRGN_ATTR pRgn_Attr;
+  BOOL Hit = FALSE;
 
   if (pRgn)
   {
+     KeEnterCriticalRegion();
      Index = GDI_HANDLE_GET_INDEX(pRgn->BaseObject.hHmgr);
      Entry = &GdiHandleTable->Entries[Index];
-
      pRgn_Attr = Entry->UserData;
+     KeLeaveCriticalRegion();
+
      if ( pRgn_Attr )
      {
-        if ( pRgn_Attr->AttrFlags & ATTR_RGN_VALID )
+        _SEH2_TRY
+        {
+           ProbeForWrite(pRgn_Attr, sizeof(RGN_ATTR), 1);
+
+           if ( pRgn_Attr->AttrFlags & ATTR_RGN_VALID )
+           {
+              pRgn_Attr->Flags = REGION_Complexity( pRgn );
+              pRgn_Attr->Rect.left   = pRgn->rdh.rcBound.left;
+              pRgn_Attr->Rect.top    = pRgn->rdh.rcBound.top;
+              pRgn_Attr->Rect.right  = pRgn->rdh.rcBound.right;
+              pRgn_Attr->Rect.bottom = pRgn->rdh.rcBound.bottom;
+           }
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
         {
-           pRgn_Attr->Flags = REGION_Complexity( pRgn );
-           pRgn_Attr->Rect.left   = pRgn->rdh.rcBound.left;
-           pRgn_Attr->Rect.top    = pRgn->rdh.rcBound.top;
-           pRgn_Attr->Rect.right  = pRgn->rdh.rcBound.right;
-           pRgn_Attr->Rect.bottom = pRgn->rdh.rcBound.bottom;
+           Hit = TRUE;
         }
+        _SEH2_END;
      }
   }
   REGION_UnlockRgn(pRgn);
@@ -2264,80 +2300,25 @@ IntGdiCombineRgn(PROSRGNDATA destRgn,
            }
            else if (src2Rgn == NULL)
            {
-               DPRINT1("IntGdiCombineRgn requires hSrc2 != NULL for combine mode %d!\n", CombineMode);
-               SetLastWin32Error(ERROR_INVALID_HANDLE);
+              DPRINT1("IntGdiCombineRgn requires hSrc2 != NULL for combine mode %d!\n", CombineMode);
+              SetLastWin32Error(ERROR_INVALID_HANDLE);
            }
         }
      }
+     else
+     {
+        DPRINT("IntGdiCombineRgn: hSrc1 unavailable\n");
+        SetLastWin32Error(ERROR_INVALID_HANDLE);
+     }
   }
   else
   {
      DPRINT("IntGdiCombineRgn: hDest unavailable\n");
      SetLastWin32Error(ERROR_INVALID_HANDLE);
-     result = ERROR;
-  }
-  return result;
-}
-
-
-// NtGdi Exported Functions
-INT
-APIENTRY
-NtGdiCombineRgn(HRGN  hDest,
-                HRGN  hSrc1,
-                HRGN  hSrc2,
-                INT  CombineMode)
-{
-  INT result = ERROR;
-  PROSRGNDATA destRgn, src1Rgn, src2Rgn = NULL;
-
-  if ( CombineMode > RGN_COPY && CombineMode < RGN_AND)
-  {
-     SetLastWin32Error(ERROR_INVALID_PARAMETER);
-     return ERROR;
-  }
-
-  destRgn = REGION_LockRgn(hDest);
-  if (!destRgn)
-  {
-     SetLastWin32Error(ERROR_INVALID_HANDLE);
-     return ERROR;
-  }
-
-  src1Rgn = REGION_LockRgn(hSrc1);
-  if (!src1Rgn)
-  {
-     REGION_UnlockRgn(destRgn);
-     SetLastWin32Error(ERROR_INVALID_HANDLE);
-     return ERROR;
   }
-
-  if (hSrc2)
-     src2Rgn = REGION_LockRgn(hSrc2);
-
-  result = IntGdiCombineRgn( destRgn, src1Rgn, src2Rgn, CombineMode);
-
-  if (src2Rgn)
-     REGION_UnlockRgn(src2Rgn);
-  REGION_UnlockRgn(src1Rgn);
-  REGION_UnlockRgn(destRgn);
-
   return result;
 }
 
-HRGN
-APIENTRY
-NtGdiCreateEllipticRgn(
-    INT Left,
-    INT Top,
-    INT Right,
-    INT Bottom
-)
-{
-    return NtGdiCreateRoundRectRgn(Left, Top, Right, Bottom,
-                                   Right - Left, Bottom - Top);
-}
-
 PROSRGNDATA
 FASTCALL
 IntGdiCreateRectRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
@@ -2347,1588 +2328,1647 @@ IntGdiCreateRectRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
   if (!(pRgn = REGION_AllocRgnWithHandle(1))) return NULL;
 
   REGION_SetRectRgn(pRgn, LeftRect, TopRect, RightRect, BottomRect);
-  REGION_UnlockRgn(pRgn);
+  RGNOBJAPI_Unlock(pRgn);
   // Return pointer with Share locks.
   pRgn = GDIOBJ_ShareLockObj(pRgn->BaseObject.hHmgr, GDI_OBJECT_TYPE_REGION);
 
   return pRgn;
 }
 
+INT FASTCALL
+REGION_GetRgnBox(
+    PROSRGNDATA Rgn,
+    PRECTL pRect
+)
+{
+    DWORD ret;
+
+    if (Rgn)
+    {
+        *pRect = Rgn->rdh.rcBound;
+        ret = REGION_Complexity(Rgn);
+
+        return ret;
+    }
+    return 0; //if invalid region return zero
+}
 
-HRGN APIENTRY
-NtGdiCreateRectRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
+INT APIENTRY
+IntGdiGetRgnBox(
+    HRGN hRgn,
+    PRECTL pRect
+)
 {
-    PROSRGNDATA pRgn;
-    HRGN hRgn;
+    PROSRGNDATA Rgn;
+    DWORD ret;
 
-    /* Allocate region data structure with space for 1 RECTL */
-    if (!(pRgn = REGION_AllocRgnWithHandle(1)))
+    if (!(Rgn = RGNOBJAPI_Lock(hRgn, NULL)))
     {
-        SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
-        return NULL;
+        return ERROR;
     }
-    hRgn = pRgn->BaseObject.hHmgr;
 
-    REGION_SetRectRgn(pRgn, LeftRect, TopRect, RightRect, BottomRect);
-    REGION_UnlockRgn(pRgn);
+    ret = REGION_GetRgnBox(Rgn, pRect);
+    RGNOBJAPI_Unlock(Rgn);
 
-    return hRgn;
+    return ret;
 }
 
-
-HRGN
-APIENTRY
-NtGdiCreateRoundRectRgn(
-    INT left,
-    INT top,
-    INT right,
-    INT bottom,
-    INT ellipse_width,
-    INT ellipse_height
+BOOL
+FASTCALL
+IntGdiPaintRgn(
+    PDC dc,
+    HRGN hRgn
 )
 {
-    PROSRGNDATA obj;
-    HRGN hrgn;
-    int asq, bsq, d, xd, yd;
-    RECTL rect;
+    HRGN tmpVisRgn;
+    PROSRGNDATA visrgn;
+    CLIPOBJ* ClipRegion;
+    BOOL bRet = FALSE;
+    POINTL BrushOrigin;
+    SURFACE *psurf;
+    PDC_ATTR pdcattr;
 
-    /* Make the dimensions sensible */
+    if (!dc) return FALSE;
+    pdcattr = dc->pdcattr;
 
-    if (left > right)
+    ASSERT(!(pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)));
+
+    if (!(tmpVisRgn = NtGdiCreateRectRgn(0, 0, 0, 0))) return FALSE;
+
+    // Transform region into device co-ords
+    if (!REGION_LPTODP(dc, tmpVisRgn, hRgn) || 
+         NtGdiOffsetRgn(tmpVisRgn, dc->ptlDCOrig.x, dc->ptlDCOrig.y) == ERROR)
     {
-        INT tmp = left;
-        left = right;
-        right = tmp;
+        GreDeleteObject(tmpVisRgn);
+        return FALSE;
     }
-    if (top > bottom)
+
+    NtGdiCombineRgn(tmpVisRgn, tmpVisRgn, dc->rosdc.hGCClipRgn, RGN_AND);
+
+    visrgn = RGNOBJAPI_Lock(tmpVisRgn, NULL);
+    if (visrgn == NULL)
     {
-        INT tmp = top;
-        top = bottom;
-        bottom = tmp;
+        GreDeleteObject(tmpVisRgn);
+        return FALSE;
     }
 
-    ellipse_width = abs(ellipse_width);
-    ellipse_height = abs(ellipse_height);
+    ClipRegion = IntEngCreateClipRegion(visrgn->rdh.nCount,
+                                        visrgn->Buffer,
+                                        &visrgn->rdh.rcBound );
+    ASSERT(ClipRegion);
 
-    /* Check parameters */
+    BrushOrigin.x = pdcattr->ptlBrushOrigin.x;
+    BrushOrigin.y = pdcattr->ptlBrushOrigin.y;
+    psurf = dc->dclevel.pSurface;
+    /* FIXME - Handle psurf == NULL !!!! */
 
-    if (ellipse_width > right-left) ellipse_width = right-left;
-    if (ellipse_height > bottom-top) ellipse_height = bottom-top;
+    bRet = IntEngPaint(&psurf->SurfObj,
+                       ClipRegion,
+                       &dc->eboFill.BrushObject,
+                       &BrushOrigin,
+                       0xFFFF);//FIXME:don't know what to put here
 
-    /* Check if we can do a normal rectangle instead */
+    RGNOBJAPI_Unlock(visrgn);
+    GreDeleteObject(tmpVisRgn);
 
-    if ((ellipse_width < 2) || (ellipse_height < 2))
-        return NtGdiCreateRectRgn(left, top, right, bottom);
+    // Fill the region
+    return TRUE;
+}
 
-    /* Create region */
+BOOL
+FASTCALL
+REGION_RectInRegion(
+    PROSRGNDATA Rgn,
+    const RECTL *rect
+)
+{
+    PRECTL pCurRect, pRectEnd;
+    RECT rc;
 
-    d = (ellipse_height < 128) ? ((3 * ellipse_height) >> 2) : 64;
-    if (!(obj = REGION_AllocRgnWithHandle(d))) return 0;
-    hrgn = obj->BaseObject.hHmgr;
+    /* swap the coordinates to make right >= left and bottom >= top */
+    /* (region building rectangles are normalized the same way) */
+    if( rect->top > rect->bottom) {
+        rc.top = rect->bottom;
+        rc.bottom = rect->top;
+    } else {
+        rc.top = rect->top;
+        rc.bottom = rect->bottom;
+    }
+    if( rect->right < rect->left) {
+        rc.right = rect->left;
+        rc.left = rect->right;
+    } else {
+        rc.right = rect->right;
+        rc.left = rect->left;
+    }
 
-    /* Ellipse algorithm, based on an article by K. Porter */
-    /* in DDJ Graphics Programming Column, 8/89 */
+    /* this is (just) a useful optimization */
+    if ((Rgn->rdh.nCount > 0) && EXTENTCHECK(&Rgn->rdh.rcBound, &rc))
+    {
+        for (pCurRect = Rgn->Buffer, pRectEnd = pCurRect +
+         Rgn->rdh.nCount; pCurRect < pRectEnd; pCurRect++)
+        {
+            if (pCurRect->bottom <= rc.top)
+            continue;             /* not far enough down yet */
 
-    asq = ellipse_width * ellipse_width / 4;        /* a^2 */
-    bsq = ellipse_height * ellipse_height / 4;      /* b^2 */
-    d = bsq - asq * ellipse_height / 2 + asq / 4;   /* b^2 - a^2b + a^2/4 */
-    xd = 0;
-    yd = asq * ellipse_height;                      /* 2a^2b */
+            if (pCurRect->top >= rc.bottom)
+                break;                /* too far down */
 
-    rect.left   = left + ellipse_width / 2;
-    rect.right  = right - ellipse_width / 2;
+            if (pCurRect->right <= rc.left)
+                continue;              /* not far enough over yet */
 
-    /* Loop to draw first half of quadrant */
+            if (pCurRect->left >= rc.right) {
+                continue;
+            }
 
-    while (xd < yd)
-    {
-        if (d > 0)  /* if nearest pixel is toward the center */
-        {
-            /* move toward center */
-            rect.top = top++;
-            rect.bottom = rect.top + 1;
-            REGION_UnionRectWithRgn(obj, &rect);
-            rect.top = --bottom;
-            rect.bottom = rect.top + 1;
-            REGION_UnionRectWithRgn(obj, &rect);
-            yd -= 2*asq;
-            d  -= yd;
-        }
-        rect.left--;        /* next horiz point */
-        rect.right++;
-        xd += 2*bsq;
-        d  += bsq + xd;
-    }
-    /* Loop to draw second half of quadrant */
-
-    d += (3 * (asq-bsq) / 2 - (xd+yd)) / 2;
-    while (yd >= 0)
-    {
-        /* next vertical point */
-        rect.top = top++;
-        rect.bottom = rect.top + 1;
-        REGION_UnionRectWithRgn(obj, &rect);
-        rect.top = --bottom;
-        rect.bottom = rect.top + 1;
-        REGION_UnionRectWithRgn(obj, &rect);
-        if (d < 0)   /* if nearest pixel is outside ellipse */
-        {
-            rect.left--;     /* move away from center */
-            rect.right++;
-            xd += 2*bsq;
-            d  += xd;
+            return TRUE;
         }
-        yd -= 2*asq;
-        d  += asq - yd;
-    }
-    /* Add the inside rectangle */
-
-    if (top <= bottom)
-    {
-        rect.top = top;
-        rect.bottom = bottom;
-        REGION_UnionRectWithRgn(obj, &rect);
     }
-
-    REGION_UnlockRgn(obj);
-    return hrgn;
+    return FALSE;
 }
 
-BOOL
-APIENTRY
-NtGdiEqualRgn(
-    HRGN  hSrcRgn1,
-    HRGN  hSrcRgn2
+VOID
+FASTCALL
+REGION_SetRectRgn(
+    PROSRGNDATA rgn,
+    INT LeftRect,
+    INT TopRect,
+    INT RightRect,
+    INT BottomRect
 )
 {
-    PROSRGNDATA rgn1, rgn2;
-    PRECTL tRect1, tRect2;
-    ULONG i;
-    BOOL bRet = FALSE;
-
-    if ( !(rgn1 = REGION_LockRgn(hSrcRgn1)) )
-        return ERROR;
+    PRECTL firstRect;
 
-    if ( !(rgn2 = REGION_LockRgn(hSrcRgn2)) )
+    if (LeftRect > RightRect)
     {
-        REGION_UnlockRgn(rgn1);
-        return ERROR;
+        INT tmp = LeftRect;
+        LeftRect = RightRect;
+        RightRect = tmp;
     }
-
-    if (rgn1->rdh.nCount != rgn2->rdh.nCount ||
-            rgn1->rdh.nCount == 0 ||
-            rgn1->rdh.rcBound.left   != rgn2->rdh.rcBound.left ||
-            rgn1->rdh.rcBound.right  != rgn2->rdh.rcBound.right ||
-            rgn1->rdh.rcBound.top    != rgn2->rdh.rcBound.top ||
-            rgn1->rdh.rcBound.bottom != rgn2->rdh.rcBound.bottom)
-        goto exit;
-
-    tRect1 = rgn1->Buffer;
-    tRect2 = rgn2->Buffer;
-
-    if (!tRect1 || !tRect2)
-        goto exit;
-
-    for (i=0; i < rgn1->rdh.nCount; i++)
+    if (TopRect > BottomRect)
     {
-        if (tRect1[i].left   != tRect2[i].left ||
-                tRect1[i].right  != tRect2[i].right ||
-                tRect1[i].top    != tRect2[i].top ||
-                tRect1[i].bottom != tRect2[i].bottom)
-            goto exit;
+        INT tmp = TopRect;
+        TopRect = BottomRect;
+        BottomRect = tmp;
     }
-    bRet = TRUE;
-
-exit:
-    REGION_UnlockRgn(rgn1);
-    REGION_UnlockRgn(rgn2);
-    return bRet;
-}
 
-HRGN
-APIENTRY
-NtGdiExtCreateRegion(
-    OPTIONAL LPXFORM Xform,
-    DWORD Count,
-    LPRGNDATA RgnData
-)
-{
-    HRGN hRgn;
-    PROSRGNDATA Region;
-    DWORD nCount = 0;
-    DWORD iType = 0;
-    DWORD dwSize = 0;
-    NTSTATUS Status = STATUS_SUCCESS;
-    MATRIX matrix;
-
-    DPRINT("NtGdiExtCreateRegion\n");
-    _SEH2_TRY
-    {
-        ProbeForRead(RgnData, Count, 1);
-        nCount = RgnData->rdh.nCount;
-        iType = RgnData->rdh.iType;
-        dwSize = RgnData->rdh.dwSize;
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-    {
-        Status = _SEH2_GetExceptionCode();
-    }
-    _SEH2_END;
-    if (!NT_SUCCESS(Status))
+    if ((LeftRect != RightRect) && (TopRect != BottomRect))
     {
-        SetLastNtError(Status);
-        return NULL;
+        firstRect = rgn->Buffer;
+        ASSERT(firstRect);
+        firstRect->left = rgn->rdh.rcBound.left = LeftRect;
+        firstRect->top = rgn->rdh.rcBound.top = TopRect;
+        firstRect->right = rgn->rdh.rcBound.right = RightRect;
+        firstRect->bottom = rgn->rdh.rcBound.bottom = BottomRect;
+        rgn->rdh.nCount = 1;
+        rgn->rdh.iType = RDH_RECTANGLES;
     }
-
-    /* Check parameters, but don't set last error here */
-    if (Count < sizeof(RGNDATAHEADER) + nCount * sizeof(RECT) ||
-        iType != RDH_RECTANGLES ||
-        dwSize != sizeof(RGNDATAHEADER))
+    else
     {
-        return NULL;
+        DPRINT("SetRectRgn NULL Count: %d \n", rgn->rdh.nCount);
+        EMPTY_REGION(rgn);
     }
+}
 
-    Region = REGION_AllocRgnWithHandle(nCount);
+/***********************************************************************
+ *     REGION_InsertEdgeInET
+ *
+ *     Insert the given edge into the edge table.
+ *     First we must find the correct bucket in the
+ *     Edge table, then find the right slot in the
+ *     bucket.  Finally, we can insert it.
+ *
+ */
+static void FASTCALL
+REGION_InsertEdgeInET(
+    EdgeTable *ET,
+    EdgeTableEntry *ETE,
+    INT scanline,
+    ScanLineListBlock **SLLBlock,
+    INT *iSLLBlock
+)
+{
+    EdgeTableEntry *start, *prev;
+    ScanLineList *pSLL, *pPrevSLL;
+    ScanLineListBlock *tmpSLLBlock;
 
-    if (Region == NULL)
+    /*
+     * find the right bucket to put the edge into
+     */
+    pPrevSLL = &ET->scanlines;
+    pSLL = pPrevSLL->next;
+    while (pSLL && (pSLL->scanline < scanline))
     {
-        SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
-        return FALSE;
+        pPrevSLL = pSLL;
+        pSLL = pSLL->next;
     }
-    hRgn = Region->BaseObject.hHmgr;
 
-    _SEH2_TRY
+    /*
+     * reassign pSLL (pointer to ScanLineList) if necessary
+     */
+    if ((!pSLL) || (pSLL->scanline > scanline))
     {
-        if (Xform)
+        if (*iSLLBlock > SLLSPERBLOCK-1)
         {
-            ULONG ret;
-
-            /* Init the XFORMOBJ from the Xform struct */
-            Status = STATUS_INVALID_PARAMETER;
-            ret = XFORMOBJ_iSetXform((XFORMOBJ*)&matrix, (XFORML*)Xform);
-
-            /* Check for error, also no scale and shear allowed */
-            if (ret != DDI_ERROR && ret != GX_GENERAL)
+            tmpSLLBlock = ExAllocatePoolWithTag(PagedPool, sizeof(ScanLineListBlock), TAG_REGION);
+            if (!tmpSLLBlock)
             {
-                /* Apply the coordinate transformation on the rects */
-                if (XFORMOBJ_bApplyXform((XFORMOBJ*)&matrix,
-                                         XF_LTOL,
-                                         nCount * 2,
-                                         RgnData->Buffer,
-                                         Region->Buffer))
-                {
-                    Status = STATUS_SUCCESS;
-                }
+                DPRINT1("REGION_InsertEdgeInETL(): Can't alloc SLLB\n");
+                /* FIXME - free resources? */
+                return;
             }
+            (*SLLBlock)->next = tmpSLLBlock;
+            tmpSLLBlock->next = (ScanLineListBlock *)NULL;
+            *SLLBlock = tmpSLLBlock;
+            *iSLLBlock = 0;
         }
-        else
-        {
-            /* Copy rect coordinates */
-            RtlCopyMemory(Region->Buffer,
-                          RgnData->Buffer,
-                          nCount * sizeof(RECT));
-        }
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-    {
-        Status = _SEH2_GetExceptionCode();
+        pSLL = &((*SLLBlock)->SLLs[(*iSLLBlock)++]);
+
+        pSLL->next = pPrevSLL->next;
+        pSLL->edgelist = (EdgeTableEntry *)NULL;
+        pPrevSLL->next = pSLL;
     }
-    _SEH2_END;
-    if (!NT_SUCCESS(Status))
+    pSLL->scanline = scanline;
+
+    /*
+     * now insert the edge in the right bucket
+     */
+    prev = (EdgeTableEntry *)NULL;
+    start = pSLL->edgelist;
+    while (start && (start->bres.minor_axis < ETE->bres.minor_axis))
     {
-        SetLastWin32Error(ERROR_INVALID_PARAMETER);
-        REGION_UnlockRgn(Region);
-        GreDeleteObject(hRgn);
-        return NULL;
+        prev = start;
+        start = start->next;
     }
+    ETE->next = start;
 
-    REGION_UnlockRgn(Region);
-
-    return hRgn;
+    if (prev)
+        prev->next = ETE;
+    else
+        pSLL->edgelist = ETE;
 }
 
-BOOL
-APIENTRY
-NtGdiFillRgn(
-    HDC hDC,
-    HRGN hRgn,
-    HBRUSH hBrush
+/***********************************************************************
+ *     REGION_loadAET
+ *
+ *     This routine moves EdgeTableEntries from the
+ *     EdgeTable into the Active Edge Table,
+ *     leaving them sorted by smaller x coordinate.
+ *
+ */
+static void FASTCALL
+REGION_loadAET(
+    EdgeTableEntry *AET,
+    EdgeTableEntry *ETEs
 )
 {
-    HBRUSH oldhBrush;
-    PROSRGNDATA rgn;
-    PRECTL r;
-
-    if (NULL == (rgn = REGION_LockRgn(hRgn)))
-    {
-        return FALSE;
-    }
-
-    if (NULL == (oldhBrush = NtGdiSelectBrush(hDC, hBrush)))
-    {
-        REGION_UnlockRgn(rgn);
-        return FALSE;
-    }
+    EdgeTableEntry *pPrevAET;
+    EdgeTableEntry *tmp;
 
-    for (r = rgn->Buffer; r < rgn->Buffer + rgn->rdh.nCount; r++)
+    pPrevAET = AET;
+    AET = AET->next;
+    while (ETEs)
     {
-        NtGdiPatBlt(hDC, r->left, r->top, r->right - r->left, r->bottom - r->top, PATCOPY);
-    }
-
-    REGION_UnlockRgn(rgn);
-    NtGdiSelectBrush(hDC, oldhBrush);
-
-    return TRUE;
-}
-
-BOOL
-APIENTRY
-NtGdiFrameRgn(
-    HDC hDC,
-    HRGN hRgn,
-    HBRUSH hBrush,
-    INT Width,
-    INT Height
-)
-{
-    HRGN FrameRgn;
-    BOOL Ret;
+        while (AET && (AET->bres.minor_axis < ETEs->bres.minor_axis))
+        {
+            pPrevAET = AET;
+            AET = AET->next;
+        }
+        tmp = ETEs->next;
+        ETEs->next = AET;
+        if (AET)
+            AET->back = ETEs;
+        ETEs->back = pPrevAET;
+        pPrevAET->next = ETEs;
+        pPrevAET = ETEs;
 
-    if (!(FrameRgn = NtGdiCreateRectRgn(0, 0, 0, 0)))
-    {
-        return FALSE;
-    }
-    if (!REGION_CreateFrameRgn(FrameRgn, hRgn, Width, Height))
-    {
-        GreDeleteObject(FrameRgn);
-        return FALSE;
+        ETEs = tmp;
     }
-
-    Ret = NtGdiFillRgn(hDC, FrameRgn, hBrush);
-
-    GreDeleteObject(FrameRgn);
-    return Ret;
 }
 
-INT FASTCALL
-REGION_GetRgnBox(
-    PROSRGNDATA Rgn,
-    PRECTL pRect
-)
+/***********************************************************************
+ *     REGION_computeWAET
+ *
+ *     This routine links the AET by the
+ *     nextWETE (winding EdgeTableEntry) link for
+ *     use by the winding number rule.  The final
+ *     Active Edge Table (AET) might look something
+ *     like:
+ *
+ *     AET
+ *     ----------  ---------   ---------
+ *     |ymax    |  |ymax    |  |ymax    |
+ *     | ...    |  |...     |  |...     |
+ *     |next    |->|next    |->|next    |->...
+ *     |nextWETE|  |nextWETE|  |nextWETE|
+ *     ---------   ---------   ^--------
+ *         |                   |       |
+ *         V------------------->       V---> ...
+ *
+ */
+static void FASTCALL
+REGION_computeWAET(EdgeTableEntry *AET)
 {
-    DWORD ret;
+    register EdgeTableEntry *pWETE;
+    register int inside = 1;
+    register int isInside = 0;
 
-    if (Rgn)
+    AET->nextWETE = (EdgeTableEntry *)NULL;
+    pWETE = AET;
+    AET = AET->next;
+    while (AET)
     {
-        *pRect = Rgn->rdh.rcBound;
-        ret = REGION_Complexity(Rgn);
+        if (AET->ClockWise)
+            isInside++;
+        else
+            isInside--;
 
-        return ret;
+        if ( (!inside && !isInside) ||
+             ( inside &&  isInside) )
+        {
+            pWETE->nextWETE = AET;
+            pWETE = AET;
+            inside = !inside;
+        }
+        AET = AET->next;
     }
-    return 0; //if invalid region return zero
+    pWETE->nextWETE = (EdgeTableEntry *)NULL;
 }
 
-
-/* See wine, msdn, osr and  Feng Yuan - Windows Graphics Programming Win32 Gdi And Directdraw
-
-   1st: http://www.codeproject.com/gdi/cliprgnguide.asp is wrong!
-
-   The intersection of the clip with the meta region is not Rao it's API!
-   Go back and read 7.2 Clipping pages 418-19:
-   Rao = API & Vis:
-   1) The Rao region is the intersection of the API region and the system region,
-      named after the Microsoft engineer who initially proposed it.
-   2) The Rao region can be calculated from the API region and the system region.
-
-   API:
-      API region is the intersection of the meta region and the clipping region,
-      clearly named after the fact that it is controlled by GDI API calls.
-*/
-INT APIENTRY
-NtGdiGetRandomRgn(
-    HDC hDC,
-    HRGN hDest,
-    INT iCode
-)
+/***********************************************************************
+ *     REGION_InsertionSort
+ *
+ *     Just a simple insertion sort using
+ *     pointers and back pointers to sort the Active
+ *     Edge Table.
+ *
+ */
+static BOOL FASTCALL
+REGION_InsertionSort(EdgeTableEntry *AET)
 {
-    INT ret = 0;
-    PDC pDC;
-    HRGN hSrc = NULL;
-    POINT org;
+    EdgeTableEntry *pETEchase;
+    EdgeTableEntry *pETEinsert;
+    EdgeTableEntry *pETEchaseBackTMP;
+    BOOL changed = FALSE;
 
-    pDC = DC_LockDc(hDC);
-    if (pDC == NULL)
+    AET = AET->next;
+    while (AET)
     {
-        SetLastWin32Error(ERROR_INVALID_HANDLE);
-        return -1;
-    }
+        pETEinsert = AET;
+        pETEchase = AET;
+        while (pETEchase->back->bres.minor_axis > AET->bres.minor_axis)
+            pETEchase = pETEchase->back;
 
-    switch (iCode)
-    {
-    case CLIPRGN:
-        hSrc = pDC->rosdc.hClipRgn;
-//        if (pDC->dclevel.prgnClip) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnClip)->BaseObject.hHmgr;
-        break;
-    case METARGN:
-        if (pDC->dclevel.prgnMeta) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnMeta)->BaseObject.hHmgr;
-        break;
-    case APIRGN:
-        hSrc = pDC->rosdc.hClipRgn;
-//        if (pDC->prgnAPI) hSrc = ((PROSRGNDATA)pDC->prgnAPI)->BaseObject.hHmgr;
-//        else if (pDC->dclevel.prgnClip) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnClip)->BaseObject.hHmgr;
-//        else if (pDC->dclevel.prgnMeta) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnMeta)->BaseObject.hHmgr;
-        break;
-    case SYSRGN:
-        hSrc = pDC->rosdc.hVisRgn;
-//        if (pDC->prgnVis) hSrc = ((PROSRGNDATA)pDC->prgnVis)->BaseObject.hHmgr;
-        break;
-    default:
-        hSrc = 0;
-    }
-    if (hSrc)
-    {
-        if (NtGdiCombineRgn(hDest, hSrc, 0, RGN_COPY) == ERROR)
-        {
-            ret = -1;
-        }
-        else
+        AET = AET->next;
+        if (pETEchase != pETEinsert)
         {
-            ret = 1;
+            pETEchaseBackTMP = pETEchase->back;
+            pETEinsert->back->next = AET;
+            if (AET)
+                AET->back = pETEinsert->back;
+            pETEinsert->next = pETEchase;
+            pETEchase->back->next = pETEinsert;
+            pETEchase->back = pETEinsert;
+            pETEinsert->back = pETEchaseBackTMP;
+            changed = TRUE;
         }
     }
-    if (iCode == SYSRGN)
-    {
-        IntGdiGetDCOrg(pDC, &org);
-        NtGdiOffsetRgn(hDest, org.x, org.y );
-    }
-
-    DC_UnlockDc(pDC);
-
-    return ret;
+    return changed;
 }
 
-INT APIENTRY
-IntGdiGetRgnBox(
-    HRGN hRgn,
-    PRECTL pRect
-)
+/***********************************************************************
+ *     REGION_FreeStorage
+ *
+ *     Clean up our act.
+ */
+static void FASTCALL
+REGION_FreeStorage(ScanLineListBlock *pSLLBlock)
 {
-    PROSRGNDATA Rgn;
-    DWORD ret;
+    ScanLineListBlock   *tmpSLLBlock;
 
-    if (!(Rgn = REGION_LockRgn(hRgn)))
+    while (pSLLBlock)
     {
-        return ERROR;
+        tmpSLLBlock = pSLLBlock->next;
+        ExFreePool(pSLLBlock);
+        pSLLBlock = tmpSLLBlock;
     }
-
-    ret = REGION_GetRgnBox(Rgn, pRect);
-    REGION_UnlockRgn(Rgn);
-
-    return ret;
 }
 
 
-INT APIENTRY
-NtGdiGetRgnBox(
-    HRGN hRgn,
-    PRECTL pRect
-)
+/***********************************************************************
+ *     REGION_PtsToRegion
+ *
+ *     Create an array of rectangles from a list of points.
+ */
+static int FASTCALL
+REGION_PtsToRegion(
+    int numFullPtBlocks,
+    int iCurPtBlock,
+    POINTBLOCK *FirstPtBlock,
+    ROSRGNDATA *reg)
 {
-    PROSRGNDATA  Rgn;
-    RECTL SafeRect;
-    DWORD ret;
-    NTSTATUS Status = STATUS_SUCCESS;
+    RECTL *rects;
+    POINT *pts;
+    POINTBLOCK *CurPtBlock;
+    int i;
+    RECTL *extents, *temp;
+    INT numRects;
 
-    if (!(Rgn = REGION_LockRgn(hRgn)))
-    {
-        return ERROR;
-    }
+    extents = &reg->rdh.rcBound;
 
-    ret = REGION_GetRgnBox(Rgn, &SafeRect);
-    REGION_UnlockRgn(Rgn);
-    if (ERROR == ret)
-    {
-        return ret;
-    }
+    numRects = ((numFullPtBlocks * NUMPTSTOBUFFER) + iCurPtBlock) >> 1;
 
-    _SEH2_TRY
-    {
-        ProbeForWrite(pRect, sizeof(RECT), 1);
-        *pRect = SafeRect;
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    if (!(temp = ExAllocatePoolWithTag(PagedPool, numRects * sizeof(RECT), TAG_REGION)))
     {
-        Status = _SEH2_GetExceptionCode();
+        return 0;
     }
-    _SEH2_END;
-    if (!NT_SUCCESS(Status))
+    if (reg->Buffer != NULL)
     {
-        return ERROR;
+        COPY_RECTS(temp, reg->Buffer, reg->rdh.nCount);
+        if (reg->Buffer != &reg->rdh.rcBound)
+            ExFreePoolWithTag(reg->Buffer, TAG_REGION);
     }
+    reg->Buffer = temp;
 
-    return ret;
-}
-
-BOOL
-APIENTRY
-NtGdiInvertRgn(
-    HDC hDC,
-    HRGN hRgn
-)
-{
-    PROSRGNDATA RgnData;
-    ULONG i;
-    PRECTL rc;
+    reg->rdh.nCount = numRects;
+    CurPtBlock = FirstPtBlock;
+    rects = reg->Buffer - 1;
+    numRects = 0;
+    extents->left = LARGE_COORDINATE,  extents->right = SMALL_COORDINATE;
 
-    if (!(RgnData = REGION_LockRgn(hRgn)))
+    for ( ; numFullPtBlocks >= 0; numFullPtBlocks--)
     {
-        SetLastWin32Error(ERROR_INVALID_HANDLE);
-        return FALSE;
+        /* the loop uses 2 points per iteration */
+        i = NUMPTSTOBUFFER >> 1;
+        if (!numFullPtBlocks)
+            i = iCurPtBlock >> 1;
+        for (pts = CurPtBlock->pts; i--; pts += 2)
+        {
+            if (pts->x == pts[1].x)
+                continue;
+            if (numRects && pts->x == rects->left && pts->y == rects->bottom &&
+                    pts[1].x == rects->right &&
+                    (numRects == 1 || rects[-1].top != rects->top) &&
+                    (i && pts[2].y > pts[1].y))
+            {
+                rects->bottom = pts[1].y + 1;
+                continue;
+            }
+            numRects++;
+            rects++;
+            rects->left = pts->x;
+            rects->top = pts->y;
+            rects->right = pts[1].x;
+            rects->bottom = pts[1].y + 1;
+            if (rects->left < extents->left)
+                extents->left = rects->left;
+            if (rects->right > extents->right)
+                extents->right = rects->right;
+        }
+        CurPtBlock = CurPtBlock->next;
     }
 
-    rc = RgnData->Buffer;
-    for (i = 0; i < RgnData->rdh.nCount; i++)
+    if (numRects)
     {
-
-        if (!NtGdiPatBlt(hDC, rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top, DSTINVERT))
-        {
-            REGION_UnlockRgn(RgnData);
-            return FALSE;
-        }
-        rc++;
+        extents->top = reg->Buffer->top;
+        extents->bottom = rects->bottom;
+    }
+    else
+    {
+        extents->left = 0;
+        extents->top = 0;
+        extents->right = 0;
+        extents->bottom = 0;
     }
+    reg->rdh.nCount = numRects;
 
-    REGION_UnlockRgn(RgnData);
-    return TRUE;
+    return(TRUE);
 }
 
-INT
-APIENTRY
-NtGdiOffsetRgn(
-    HRGN hRgn,
-    INT XOffset,
-    INT YOffset
+/***********************************************************************
+ *     REGION_CreateEdgeTable
+ *
+ *     This routine creates the edge table for
+ *     scan converting polygons.
+ *     The Edge Table (ET) looks like:
+ *
+ *    EdgeTable
+ *     --------
+ *    |  ymax  |        ScanLineLists
+ *    |scanline|-->------------>-------------->...
+ *     --------   |scanline|   |scanline|
+ *                |edgelist|   |edgelist|
+ *                ---------    ---------
+ *                    |             |
+ *                    |             |
+ *                    V             V
+ *              list of ETEs   list of ETEs
+ *
+ *     where ETE is an EdgeTableEntry data structure,
+ *     and there is one ScanLineList per scanline at
+ *     which an edge is initially entered.
+ *
+ */
+static void FASTCALL
+REGION_CreateETandAET(
+    const ULONG *Count,
+    INT nbpolygons,
+    const POINT *pts,
+    EdgeTable *ET,
+    EdgeTableEntry *AET,
+    EdgeTableEntry *pETEs,
+    ScanLineListBlock *pSLLBlock
 )
 {
-    PROSRGNDATA rgn = REGION_LockRgn(hRgn);
-    INT ret;
+    const POINT *top, *bottom;
+    const POINT *PrevPt, *CurrPt, *EndPt;
+    INT poly, count;
+    int iSLLBlock = 0;
+    int dy;
 
-    DPRINT("NtGdiOffsetRgn: hRgn %d Xoffs %d Yoffs %d rgn %x\n", hRgn, XOffset, YOffset, rgn );
 
-    if (!rgn)
-    {
-        DPRINT("NtGdiOffsetRgn: hRgn error\n");
-        return ERROR;
-    }
+    /*
+     *  initialize the Active Edge Table
+     */
+    AET->next = (EdgeTableEntry *)NULL;
+    AET->back = (EdgeTableEntry *)NULL;
+    AET->nextWETE = (EdgeTableEntry *)NULL;
+    AET->bres.minor_axis = SMALL_COORDINATE;
 
-    if (XOffset || YOffset)
+    /*
+     *  initialize the Edge Table.
+     */
+    ET->scanlines.next = (ScanLineList *)NULL;
+    ET->ymax = SMALL_COORDINATE;
+    ET->ymin = LARGE_COORDINATE;
+    pSLLBlock->next = (ScanLineListBlock *)NULL;
+
+    EndPt = pts - 1;
+    for (poly = 0; poly < nbpolygons; poly++)
     {
-        int nbox = rgn->rdh.nCount;
-        PRECTL pbox = rgn->Buffer;
+        count = Count[poly];
+        EndPt += count;
+        if (count < 2)
+            continue;
 
-        if (nbox && pbox)
+        PrevPt = EndPt;
+
+        /*
+         *  for each vertex in the array of points.
+         *  In this loop we are dealing with two vertices at
+         *  a time -- these make up one edge of the polygon.
+         */
+        while (count--)
         {
-            while (nbox--)
+            CurrPt = pts++;
+
+            /*
+             *  find out which point is above and which is below.
+             */
+            if (PrevPt->y > CurrPt->y)
             {
-                pbox->left += XOffset;
-                pbox->right += XOffset;
-                pbox->top += YOffset;
-                pbox->bottom += YOffset;
-                pbox++;
+                bottom = PrevPt, top = CurrPt;
+                pETEs->ClockWise = 0;
             }
-            if (rgn->Buffer != &rgn->rdh.rcBound)
+            else
             {
-                rgn->rdh.rcBound.left += XOffset;
-                rgn->rdh.rcBound.right += XOffset;
-                rgn->rdh.rcBound.top += YOffset;
-                rgn->rdh.rcBound.bottom += YOffset;
+                bottom = CurrPt, top = PrevPt;
+                pETEs->ClockWise = 1;
             }
-        }
-    }
-    ret = REGION_Complexity(rgn);
-    REGION_UnlockRgn(rgn);
-    return ret;
-}
 
-BOOL
-FASTCALL
-IntGdiPaintRgn(
-    PDC dc,
-    HRGN hRgn
-)
-{
-    HRGN tmpVisRgn;
-    PROSRGNDATA visrgn;
-    CLIPOBJ* ClipRegion;
-    BOOL bRet = FALSE;
-    POINTL BrushOrigin;
-    SURFACE *psurf;
-    PDC_ATTR pdcattr;
+            /*
+             * don't add horizontal edges to the Edge table.
+             */
+            if (bottom->y != top->y)
+            {
+                pETEs->ymax = bottom->y-1;
+                /* -1 so we don't get last scanline */
 
-    if (!dc) return FALSE;
-    pdcattr = dc->pdcattr;
-
-    ASSERT(!(pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)));
-
-    if (!(tmpVisRgn = NtGdiCreateRectRgn(0, 0, 0, 0))) return FALSE;
+                /*
+                 *  initialize integer edge algorithm
+                 */
+                dy = bottom->y - top->y;
+                BRESINITPGONSTRUCT(dy, top->x, bottom->x, pETEs->bres);
 
-    // Transform region into device co-ords
-    if (!REGION_LPTODP(dc, tmpVisRgn, hRgn) || 
-         NtGdiOffsetRgn(tmpVisRgn, dc->ptlDCOrig.x, dc->ptlDCOrig.y) == ERROR)
-    {
-        GreDeleteObject(tmpVisRgn);
-        return FALSE;
-    }
+                REGION_InsertEdgeInET(ET, pETEs, top->y, &pSLLBlock,
+                                      &iSLLBlock);
 
-    NtGdiCombineRgn(tmpVisRgn, tmpVisRgn, dc->rosdc.hGCClipRgn, RGN_AND);
+                if (PrevPt->y > ET->ymax)
+                    ET->ymax = PrevPt->y;
+                if (PrevPt->y < ET->ymin)
+                    ET->ymin = PrevPt->y;
+                pETEs++;
+            }
 
-    visrgn = REGION_LockRgn(tmpVisRgn);
-    if (visrgn == NULL)
-    {
-        GreDeleteObject(tmpVisRgn);
-        return FALSE;
+            PrevPt = CurrPt;
+        }
     }
-
-    ClipRegion = IntEngCreateClipRegion(visrgn->rdh.nCount,
-                                        visrgn->Buffer,
-                                        &visrgn->rdh.rcBound );
-    ASSERT(ClipRegion);
-
-    BrushOrigin.x = pdcattr->ptlBrushOrigin.x;
-    BrushOrigin.y = pdcattr->ptlBrushOrigin.y;
-    psurf = dc->dclevel.pSurface;
-    /* FIXME - Handle psurf == NULL !!!! */
-
-    bRet = IntEngPaint(&psurf->SurfObj,
-                       ClipRegion,
-                       &dc->eboFill.BrushObject,
-                       &BrushOrigin,
-                       0xFFFF);//FIXME:don't know what to put here
-
-    REGION_UnlockRgn(visrgn);
-    GreDeleteObject(tmpVisRgn);
-
-    // Fill the region
-    return TRUE;
 }
 
-BOOL
-APIENTRY
-NtGdiPtInRegion(
-    HRGN hRgn,
-    INT X,
-    INT Y
+HRGN FASTCALL
+IntCreatePolyPolygonRgn(
+    POINT *Pts,
+    PULONG Count,
+    INT nbpolygons,
+    INT mode
 )
 {
-    PROSRGNDATA rgn;
-    ULONG i;
-    PRECTL r;
+    HRGN hrgn;
+    ROSRGNDATA *region;
+    EdgeTableEntry *pAET;     /* Active Edge Table       */
+    INT y;                    /* current scanline        */
+    int iPts = 0;             /* number of pts in buffer */
+    EdgeTableEntry *pWETE;    /* Winding Edge Table Entry*/
+    ScanLineList *pSLL;       /* current scanLineList    */
+    POINT *pts;               /* output buffer           */
+    EdgeTableEntry *pPrevAET; /* ptr to previous AET     */
+    EdgeTable ET;             /* header node for ET      */
+    EdgeTableEntry AET;       /* header node for AET     */
+    EdgeTableEntry *pETEs;    /* EdgeTableEntries pool   */
+    ScanLineListBlock SLLBlock; /* header for scanlinelist */
+    int fixWAET = FALSE;
+    POINTBLOCK FirstPtBlock, *curPtBlock; /* PtBlock buffers    */
+    POINTBLOCK *tmpPtBlock;
+    int numFullPtBlocks = 0;
+    INT poly, total;
 
-    if (!(rgn = REGION_LockRgn(hRgn) ) )
-        return FALSE;
+    if (mode == 0 || mode > 2) return 0;
 
-    if (rgn->rdh.nCount > 0 && INRECT(rgn->rdh.rcBound, X, Y))
-    {
-        r =  rgn->Buffer;
-        for (i = 0; i < rgn->rdh.nCount; i++)
-        {
-            if (INRECT(*r, X, Y))
-            {
-                REGION_UnlockRgn(rgn);
-                return TRUE;
-            }
-            r++;
-        }
-    }
-    REGION_UnlockRgn(rgn);
-    return FALSE;
-}
+    if (!(region = REGION_AllocRgnWithHandle(nbpolygons)))
+        return 0;
+    hrgn = region->BaseObject.hHmgr;
 
-BOOL
-FASTCALL
-REGION_RectInRegion(
-    PROSRGNDATA Rgn,
-    const RECTL *rect
-)
-{
-    PRECTL pCurRect, pRectEnd;
-    RECT rc;
+    /* special case a rectangle */
 
-    /* swap the coordinates to make right >= left and bottom >= top */
-    /* (region building rectangles are normalized the same way) */
-    if( rect->top > rect->bottom) {
-        rc.top = rect->bottom;
-        rc.bottom = rect->top;
-    } else {
-        rc.top = rect->top;
-        rc.bottom = rect->bottom;
+    if (((nbpolygons == 1) && ((*Count == 4) ||
+                               ((*Count == 5) && (Pts[4].x == Pts[0].x) && (Pts[4].y == Pts[0].y)))) &&
+            (((Pts[0].y == Pts[1].y) &&
+              (Pts[1].x == Pts[2].x) &&
+              (Pts[2].y == Pts[3].y) &&
+              (Pts[3].x == Pts[0].x)) ||
+             ((Pts[0].x == Pts[1].x) &&
+              (Pts[1].y == Pts[2].y) &&
+              (Pts[2].x == Pts[3].x) &&
+              (Pts[3].y == Pts[0].y))))
+    {
+        RGNOBJAPI_Unlock(region);
+        NtGdiSetRectRgn(hrgn, min(Pts[0].x, Pts[2].x), min(Pts[0].y, Pts[2].y),
+                        max(Pts[0].x, Pts[2].x), max(Pts[0].y, Pts[2].y));
+        return hrgn;
     }
-    if( rect->right < rect->left) {
-        rc.right = rect->left;
-        rc.left = rect->right;
-    } else {
-        rc.right = rect->right;
-        rc.left = rect->left;
+
+    for (poly = total = 0; poly < nbpolygons; poly++)
+        total += Count[poly];
+    if (! (pETEs = ExAllocatePoolWithTag(PagedPool, sizeof(EdgeTableEntry) * total, TAG_REGION)) )
+    {
+        GreDeleteObject(hrgn);
+        return 0;
     }
+    pts = FirstPtBlock.pts;
+    REGION_CreateETandAET(Count, nbpolygons, Pts, &ET, &AET, pETEs, &SLLBlock);
+    pSLL = ET.scanlines.next;
+    curPtBlock = &FirstPtBlock;
 
-    /* this is (just) a useful optimization */
-    if ((Rgn->rdh.nCount > 0) && EXTENTCHECK(&Rgn->rdh.rcBound, &rc))
+    if (mode != WINDING)
     {
-        for (pCurRect = Rgn->Buffer, pRectEnd = pCurRect +
-         Rgn->rdh.nCount; pCurRect < pRectEnd; pCurRect++)
+        /*
+         *  for each scanline
+         */
+        for (y = ET.ymin; y < ET.ymax; y++)
         {
-            if (pCurRect->bottom <= rc.top)
-            continue;             /* not far enough down yet */
-
-            if (pCurRect->top >= rc.bottom)
-                break;                /* too far down */
+            /*
+             *  Add a new edge to the active edge table when we
+             *  get to the next edge.
+             */
+            if (pSLL != NULL && y == pSLL->scanline)
+            {
+                REGION_loadAET(&AET, pSLL->edgelist);
+                pSLL = pSLL->next;
+            }
+            pPrevAET = &AET;
+            pAET = AET.next;
 
-            if (pCurRect->right <= rc.left)
-                continue;              /* not far enough over yet */
+            /*
+             *  for each active edge
+             */
+            while (pAET)
+            {
+                pts->x = pAET->bres.minor_axis,  pts->y = y;
+                pts++, iPts++;
 
-            if (pCurRect->left >= rc.right) {
-                continue;
+                /*
+                 *  send out the buffer
+                 */
+                if (iPts == NUMPTSTOBUFFER)
+                {
+                    tmpPtBlock = ExAllocatePoolWithTag(PagedPool, sizeof(POINTBLOCK), TAG_REGION);
+                    if (!tmpPtBlock)
+                    {
+                        DPRINT1("Can't alloc tPB\n");
+                        ExFreePoolWithTag(pETEs, TAG_REGION);
+                        return 0;
+                    }
+                    curPtBlock->next = tmpPtBlock;
+                    curPtBlock = tmpPtBlock;
+                    pts = curPtBlock->pts;
+                    numFullPtBlocks++;
+                    iPts = 0;
+                }
+                EVALUATEEDGEEVENODD(pAET, pPrevAET, y);
             }
-
-            return TRUE;
+            REGION_InsertionSort(&AET);
         }
     }
-    return FALSE;
-}
-
-BOOL
-APIENTRY
-NtGdiRectInRegion(
-    HRGN  hRgn,
-    LPRECTL unsaferc
-)
-{
-    PROSRGNDATA Rgn;
-    RECTL rc = {0};
-    BOOL Ret;
-    NTSTATUS Status = STATUS_SUCCESS;
-
-    if (!(Rgn = REGION_LockRgn(hRgn)))
+    else
     {
-        return ERROR;
-    }
+        /*
+         *  for each scanline
+         */
+        for (y = ET.ymin; y < ET.ymax; y++)
+        {
+            /*
+             *  Add a new edge to the active edge table when we
+             *  get to the next edge.
+             */
+            if (pSLL != NULL && y == pSLL->scanline)
+            {
+                REGION_loadAET(&AET, pSLL->edgelist);
+                REGION_computeWAET(&AET);
+                pSLL = pSLL->next;
+            }
+            pPrevAET = &AET;
+            pAET = AET.next;
+            pWETE = pAET;
 
-    _SEH2_TRY
-    {
-        ProbeForRead(unsaferc, sizeof(RECT), 1);
-        rc = *unsaferc;
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-    {
-        Status = _SEH2_GetExceptionCode();
+            /*
+             *  for each active edge
+             */
+            while (pAET)
+            {
+                /*
+                 *  add to the buffer only those edges that
+                 *  are in the Winding active edge table.
+                 */
+                if (pWETE == pAET)
+                {
+                    pts->x = pAET->bres.minor_axis,  pts->y = y;
+                    pts++, iPts++;
+
+                    /*
+                     *  send out the buffer
+                     */
+                    if (iPts == NUMPTSTOBUFFER)
+                    {
+                        tmpPtBlock = ExAllocatePoolWithTag(PagedPool,
+                                                           sizeof(POINTBLOCK), TAG_REGION);
+                        if (!tmpPtBlock)
+                        {
+                            DPRINT1("Can't alloc tPB\n");
+                            ExFreePoolWithTag(pETEs, TAG_REGION);
+                            GreDeleteObject(hrgn);
+                            return 0;
+                        }
+                        curPtBlock->next = tmpPtBlock;
+                        curPtBlock = tmpPtBlock;
+                        pts = curPtBlock->pts;
+                        numFullPtBlocks++;
+                        iPts = 0;
+                    }
+                    pWETE = pWETE->nextWETE;
+                }
+                EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET);
+            }
+
+            /*
+             *  recompute the winding active edge table if
+             *  we just resorted or have exited an edge.
+             */
+            if (REGION_InsertionSort(&AET) || fixWAET)
+            {
+                REGION_computeWAET(&AET);
+                fixWAET = FALSE;
+            }
+        }
     }
-    _SEH2_END;
+    REGION_FreeStorage(SLLBlock.next);
+    REGION_PtsToRegion(numFullPtBlocks, iPts, &FirstPtBlock, region);
 
-    if (!NT_SUCCESS(Status))
+    for (curPtBlock = FirstPtBlock.next; --numFullPtBlocks >= 0;)
     {
-        REGION_UnlockRgn(Rgn);
-        SetLastNtError(Status);
-        DPRINT1("NtGdiRectInRegion: bogus rc\n");
-        return ERROR;
+        tmpPtBlock = curPtBlock->next;
+        ExFreePoolWithTag(curPtBlock, TAG_REGION);
+        curPtBlock = tmpPtBlock;
     }
-
-    Ret = REGION_RectInRegion(Rgn, &rc);
-    REGION_UnlockRgn(Rgn);
-    return Ret;
+    ExFreePoolWithTag(pETEs, TAG_REGION);
+    RGNOBJAPI_Unlock(region);
+    return hrgn;
 }
 
-VOID
-FASTCALL
-REGION_SetRectRgn(
-    PROSRGNDATA rgn,
-    INT LeftRect,
-    INT TopRect,
-    INT RightRect,
-    INT BottomRect
-)
+//
+// NtGdi Exported Functions
+//
+INT
+APIENTRY
+NtGdiCombineRgn(HRGN  hDest,
+                HRGN  hSrc1,
+                HRGN  hSrc2,
+                INT  CombineMode)
 {
-    PRECTL firstRect;
+  INT result = ERROR;
+  PROSRGNDATA destRgn, src1Rgn, src2Rgn = NULL;
 
-    if (LeftRect > RightRect)
-    {
-        INT tmp = LeftRect;
-        LeftRect = RightRect;
-        RightRect = tmp;
-    }
-    if (TopRect > BottomRect)
-    {
-        INT tmp = TopRect;
-        TopRect = BottomRect;
-        BottomRect = tmp;
-    }
+  if ( CombineMode > RGN_COPY && CombineMode < RGN_AND)
+  {
+     SetLastWin32Error(ERROR_INVALID_PARAMETER);
+     return ERROR;
+  }
 
-    if ((LeftRect != RightRect) && (TopRect != BottomRect))
-    {
-        firstRect = rgn->Buffer;
-        ASSERT(firstRect);
-        firstRect->left = rgn->rdh.rcBound.left = LeftRect;
-        firstRect->top = rgn->rdh.rcBound.top = TopRect;
-        firstRect->right = rgn->rdh.rcBound.right = RightRect;
-        firstRect->bottom = rgn->rdh.rcBound.bottom = BottomRect;
-        rgn->rdh.nCount = 1;
-        rgn->rdh.iType = RDH_RECTANGLES;
-    }
-    else
-        EMPTY_REGION(rgn);
+  destRgn = RGNOBJAPI_Lock(hDest, NULL);
+  if (!destRgn)
+  {
+     SetLastWin32Error(ERROR_INVALID_HANDLE);
+     return ERROR;
+  }
+
+  src1Rgn = RGNOBJAPI_Lock(hSrc1, NULL);
+  if (!src1Rgn)
+  {
+     RGNOBJAPI_Unlock(destRgn);
+     SetLastWin32Error(ERROR_INVALID_HANDLE);
+     return ERROR;
+  }
+
+  if (hSrc2)
+     src2Rgn = RGNOBJAPI_Lock(hSrc2, NULL);
+
+  result = IntGdiCombineRgn( destRgn, src1Rgn, src2Rgn, CombineMode);
+
+  if (src2Rgn)
+     RGNOBJAPI_Unlock(src2Rgn);
+  RGNOBJAPI_Unlock(src1Rgn);
+  RGNOBJAPI_Unlock(destRgn);
+
+  return result;
 }
 
-BOOL
+HRGN
 APIENTRY
-NtGdiSetRectRgn(
-    HRGN hRgn,
-    INT LeftRect,
-    INT TopRect,
-    INT RightRect,
-    INT BottomRect
+NtGdiCreateEllipticRgn(
+    INT Left,
+    INT Top,
+    INT Right,
+    INT Bottom
 )
 {
-    PROSRGNDATA rgn;
-
-    if ( !(rgn = REGION_LockRgn(hRgn)) )
-    {
-        return 0; //per documentation
-    }
-
-    REGION_SetRectRgn(rgn, LeftRect, TopRect, RightRect, BottomRect);
-
-    REGION_UnlockRgn(rgn);
-    return TRUE;
+    return NtGdiCreateRoundRectRgn(Left, Top, Right, Bottom,
+                                   Right - Left, Bottom - Top);
 }
 
 HRGN APIENTRY
-NtGdiUnionRectWithRgn(
-    HRGN hDest,
-    const RECTL *UnsafeRect
-)
+NtGdiCreateRectRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
 {
-    RECTL SafeRect = {0};
-    PROSRGNDATA Rgn;
-    NTSTATUS Status = STATUS_SUCCESS;
+    PROSRGNDATA pRgn;
+    HRGN hRgn;
 
-    if (!(Rgn = REGION_LockRgn(hDest)))
+    /* Allocate region data structure with space for 1 RECTL */
+    if (!(pRgn = REGION_AllocRgnWithHandle(1)))
     {
-        SetLastWin32Error(ERROR_INVALID_HANDLE);
+        SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
         return NULL;
     }
+    hRgn = pRgn->BaseObject.hHmgr;
 
-    _SEH2_TRY
-    {
-        ProbeForRead(UnsafeRect, sizeof(RECT), 1);
-        SafeRect = *UnsafeRect;
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-    {
-        Status = _SEH2_GetExceptionCode();
-    }
-    _SEH2_END;
-
-    if (! NT_SUCCESS(Status))
-    {
-        REGION_UnlockRgn(Rgn);
-        SetLastNtError(Status);
-        return NULL;
-    }
+    REGION_SetRectRgn(pRgn, LeftRect, TopRect, RightRect, BottomRect);
+    RGNOBJAPI_Unlock(pRgn);
 
-    REGION_UnionRectWithRgn(Rgn, &SafeRect);
-    REGION_UnlockRgn(Rgn);
-    return hDest;
+    return hRgn;
 }
 
-/*!
- * MSDN: GetRegionData, Return Values:
- *
- * "If the function succeeds and dwCount specifies an adequate number of bytes,
- * the return value is always dwCount. If dwCount is too small or the function
- * fails, the return value is 0. If lpRgnData is NULL, the return value is the
- * required number of bytes.
- *
- * If the function fails, the return value is zero."
- */
-DWORD APIENTRY
-NtGdiGetRegionData(
-    HRGN hrgn,
-    DWORD count,
-    LPRGNDATA rgndata
+HRGN
+APIENTRY
+NtGdiCreateRoundRectRgn(
+    INT left,
+    INT top,
+    INT right,
+    INT bottom,
+    INT ellipse_width,
+    INT ellipse_height
 )
 {
-    DWORD size;
-    PROSRGNDATA obj = REGION_LockRgn(hrgn);
-    NTSTATUS Status = STATUS_SUCCESS;
-
-    if (!obj)
-        return 0;
+    PROSRGNDATA obj;
+    HRGN hrgn;
+    int asq, bsq, d, xd, yd;
+    RECTL rect;
 
-    size = obj->rdh.nCount * sizeof(RECT);
-    if (count < (size + sizeof(RGNDATAHEADER)) || rgndata == NULL)
-    {
-        REGION_UnlockRgn(obj);
-        if (rgndata) /* buffer is too small, signal it by return 0 */
-            return 0;
-        else         /* user requested buffer size with rgndata NULL */
-            return size + sizeof(RGNDATAHEADER);
-    }
+    /* Make the dimensions sensible */
 
-    _SEH2_TRY
+    if (left > right)
     {
-        ProbeForWrite(rgndata, count, 1);
-        RtlCopyMemory(rgndata, &obj->rdh, sizeof(RGNDATAHEADER));
-        RtlCopyMemory(rgndata->Buffer, obj->Buffer, size);
+        INT tmp = left;
+        left = right;
+        right = tmp;
     }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    if (top > bottom)
     {
-        Status = _SEH2_GetExceptionCode();
+        INT tmp = top;
+        top = bottom;
+        bottom = tmp;
     }
-    _SEH2_END;
 
-    if (!NT_SUCCESS(Status))
-    {
-        SetLastNtError(Status);
-        REGION_UnlockRgn(obj);
-        return 0;
-    }
+    ellipse_width = abs(ellipse_width);
+    ellipse_height = abs(ellipse_height);
 
-    REGION_UnlockRgn(obj);
-    return size + sizeof(RGNDATAHEADER);
-}
+    /* Check parameters */
 
+    if (ellipse_width > right-left) ellipse_width = right-left;
+    if (ellipse_height > bottom-top) ellipse_height = bottom-top;
 
-/***********************************************************************
- *     REGION_InsertEdgeInET
- *
- *     Insert the given edge into the edge table.
- *     First we must find the correct bucket in the
- *     Edge table, then find the right slot in the
- *     bucket.  Finally, we can insert it.
- *
- */
-static void FASTCALL
-REGION_InsertEdgeInET(
-    EdgeTable *ET,
-    EdgeTableEntry *ETE,
-    INT scanline,
-    ScanLineListBlock **SLLBlock,
-    INT *iSLLBlock
-)
-{
-    EdgeTableEntry *start, *prev;
-    ScanLineList *pSLL, *pPrevSLL;
-    ScanLineListBlock *tmpSLLBlock;
+    /* Check if we can do a normal rectangle instead */
 
-    /*
-     * find the right bucket to put the edge into
-     */
-    pPrevSLL = &ET->scanlines;
-    pSLL = pPrevSLL->next;
-    while (pSLL && (pSLL->scanline < scanline))
+    if ((ellipse_width < 2) || (ellipse_height < 2))
+        return NtGdiCreateRectRgn(left, top, right, bottom);
+
+    /* Create region */
+
+    d = (ellipse_height < 128) ? ((3 * ellipse_height) >> 2) : 64;
+    if (!(obj = REGION_AllocRgnWithHandle(d))) return 0;
+    hrgn = obj->BaseObject.hHmgr;
+
+    /* Ellipse algorithm, based on an article by K. Porter */
+    /* in DDJ Graphics Programming Column, 8/89 */
+
+    asq = ellipse_width * ellipse_width / 4;        /* a^2 */
+    bsq = ellipse_height * ellipse_height / 4;      /* b^2 */
+    d = bsq - asq * ellipse_height / 2 + asq / 4;   /* b^2 - a^2b + a^2/4 */
+    xd = 0;
+    yd = asq * ellipse_height;                      /* 2a^2b */
+
+    rect.left   = left + ellipse_width / 2;
+    rect.right  = right - ellipse_width / 2;
+
+    /* Loop to draw first half of quadrant */
+
+    while (xd < yd)
     {
-        pPrevSLL = pSLL;
-        pSLL = pSLL->next;
+        if (d > 0)  /* if nearest pixel is toward the center */
+        {
+            /* move toward center */
+            rect.top = top++;
+            rect.bottom = rect.top + 1;
+            REGION_UnionRectWithRgn(obj, &rect);
+            rect.top = --bottom;
+            rect.bottom = rect.top + 1;
+            REGION_UnionRectWithRgn(obj, &rect);
+            yd -= 2*asq;
+            d  -= yd;
+        }
+        rect.left--;        /* next horiz point */
+        rect.right++;
+        xd += 2*bsq;
+        d  += bsq + xd;
     }
+    /* Loop to draw second half of quadrant */
 
-    /*
-     * reassign pSLL (pointer to ScanLineList) if necessary
-     */
-    if ((!pSLL) || (pSLL->scanline > scanline))
+    d += (3 * (asq-bsq) / 2 - (xd+yd)) / 2;
+    while (yd >= 0)
     {
-        if (*iSLLBlock > SLLSPERBLOCK-1)
+        /* next vertical point */
+        rect.top = top++;
+        rect.bottom = rect.top + 1;
+        REGION_UnionRectWithRgn(obj, &rect);
+        rect.top = --bottom;
+        rect.bottom = rect.top + 1;
+        REGION_UnionRectWithRgn(obj, &rect);
+        if (d < 0)   /* if nearest pixel is outside ellipse */
         {
-            tmpSLLBlock = ExAllocatePoolWithTag(PagedPool, sizeof(ScanLineListBlock), TAG_REGION);
-            if (!tmpSLLBlock)
-            {
-                DPRINT1("REGION_InsertEdgeInETL(): Can't alloc SLLB\n");
-                /* FIXME - free resources? */
-                return;
-            }
-            (*SLLBlock)->next = tmpSLLBlock;
-            tmpSLLBlock->next = (ScanLineListBlock *)NULL;
-            *SLLBlock = tmpSLLBlock;
-            *iSLLBlock = 0;
+            rect.left--;     /* move away from center */
+            rect.right++;
+            xd += 2*bsq;
+            d  += xd;
         }
-        pSLL = &((*SLLBlock)->SLLs[(*iSLLBlock)++]);
-
-        pSLL->next = pPrevSLL->next;
-        pSLL->edgelist = (EdgeTableEntry *)NULL;
-        pPrevSLL->next = pSLL;
+        yd -= 2*asq;
+        d  += asq - yd;
     }
-    pSLL->scanline = scanline;
+    /* Add the inside rectangle */
 
-    /*
-     * now insert the edge in the right bucket
-     */
-    prev = (EdgeTableEntry *)NULL;
-    start = pSLL->edgelist;
-    while (start && (start->bres.minor_axis < ETE->bres.minor_axis))
+    if (top <= bottom)
     {
-        prev = start;
-        start = start->next;
+        rect.top = top;
+        rect.bottom = bottom;
+        REGION_UnionRectWithRgn(obj, &rect);
     }
-    ETE->next = start;
 
-    if (prev)
-        prev->next = ETE;
-    else
-        pSLL->edgelist = ETE;
+    RGNOBJAPI_Unlock(obj);
+    return hrgn;
 }
 
-/***********************************************************************
- *     REGION_loadAET
- *
- *     This routine moves EdgeTableEntries from the
- *     EdgeTable into the Active Edge Table,
- *     leaving them sorted by smaller x coordinate.
- *
- */
-static void FASTCALL
-REGION_loadAET(
-    EdgeTableEntry *AET,
-    EdgeTableEntry *ETEs
+BOOL
+APIENTRY
+NtGdiEqualRgn(
+    HRGN  hSrcRgn1,
+    HRGN  hSrcRgn2
 )
 {
-    EdgeTableEntry *pPrevAET;
-    EdgeTableEntry *tmp;
+    PROSRGNDATA rgn1, rgn2;
+    PRECTL tRect1, tRect2;
+    ULONG i;
+    BOOL bRet = FALSE;
 
-    pPrevAET = AET;
-    AET = AET->next;
-    while (ETEs)
-    {
-        while (AET && (AET->bres.minor_axis < ETEs->bres.minor_axis))
-        {
-            pPrevAET = AET;
-            AET = AET->next;
-        }
-        tmp = ETEs->next;
-        ETEs->next = AET;
-        if (AET)
-            AET->back = ETEs;
-        ETEs->back = pPrevAET;
-        pPrevAET->next = ETEs;
-        pPrevAET = ETEs;
+    if ( !(rgn1 = RGNOBJAPI_Lock(hSrcRgn1, NULL)) )
+        return ERROR;
 
-        ETEs = tmp;
+    if ( !(rgn2 = RGNOBJAPI_Lock(hSrcRgn2, NULL)) )
+    {
+        RGNOBJAPI_Unlock(rgn1);
+        return ERROR;
     }
-}
 
-/***********************************************************************
- *     REGION_computeWAET
- *
- *     This routine links the AET by the
- *     nextWETE (winding EdgeTableEntry) link for
- *     use by the winding number rule.  The final
- *     Active Edge Table (AET) might look something
- *     like:
- *
- *     AET
- *     ----------  ---------   ---------
- *     |ymax    |  |ymax    |  |ymax    |
- *     | ...    |  |...     |  |...     |
- *     |next    |->|next    |->|next    |->...
- *     |nextWETE|  |nextWETE|  |nextWETE|
- *     ---------   ---------   ^--------
- *         |                   |       |
- *         V------------------->       V---> ...
- *
- */
-static void FASTCALL
-REGION_computeWAET(EdgeTableEntry *AET)
-{
-    register EdgeTableEntry *pWETE;
-    register int inside = 1;
-    register int isInside = 0;
+    if (rgn1->rdh.nCount != rgn2->rdh.nCount ||
+            rgn1->rdh.nCount == 0 ||
+            rgn1->rdh.rcBound.left   != rgn2->rdh.rcBound.left ||
+            rgn1->rdh.rcBound.right  != rgn2->rdh.rcBound.right ||
+            rgn1->rdh.rcBound.top    != rgn2->rdh.rcBound.top ||
+            rgn1->rdh.rcBound.bottom != rgn2->rdh.rcBound.bottom)
+        goto exit;
 
-    AET->nextWETE = (EdgeTableEntry *)NULL;
-    pWETE = AET;
-    AET = AET->next;
-    while (AET)
-    {
-        if (AET->ClockWise)
-            isInside++;
-        else
-            isInside--;
+    tRect1 = rgn1->Buffer;
+    tRect2 = rgn2->Buffer;
 
-        if ( (!inside && !isInside) ||
-             ( inside &&  isInside) )
-        {
-            pWETE->nextWETE = AET;
-            pWETE = AET;
-            inside = !inside;
-        }
-        AET = AET->next;
+    if (!tRect1 || !tRect2)
+        goto exit;
+
+    for (i=0; i < rgn1->rdh.nCount; i++)
+    {
+        if (tRect1[i].left   != tRect2[i].left ||
+                tRect1[i].right  != tRect2[i].right ||
+                tRect1[i].top    != tRect2[i].top ||
+                tRect1[i].bottom != tRect2[i].bottom)
+            goto exit;
     }
-    pWETE->nextWETE = (EdgeTableEntry *)NULL;
+    bRet = TRUE;
+
+exit:
+    RGNOBJAPI_Unlock(rgn1);
+    RGNOBJAPI_Unlock(rgn2);
+    return bRet;
 }
 
-/***********************************************************************
- *     REGION_InsertionSort
- *
- *     Just a simple insertion sort using
- *     pointers and back pointers to sort the Active
- *     Edge Table.
- *
- */
-static BOOL FASTCALL
-REGION_InsertionSort(EdgeTableEntry *AET)
-{
-    EdgeTableEntry *pETEchase;
-    EdgeTableEntry *pETEinsert;
-    EdgeTableEntry *pETEchaseBackTMP;
-    BOOL changed = FALSE;
+HRGN
+APIENTRY
+NtGdiExtCreateRegion(
+    OPTIONAL LPXFORM Xform,
+    DWORD Count,
+    LPRGNDATA RgnData
+)
+{
+    HRGN hRgn;
+    PROSRGNDATA Region;
+    DWORD nCount = 0;
+    DWORD iType = 0;
+    DWORD dwSize = 0;
+    NTSTATUS Status = STATUS_SUCCESS;
+    MATRIX matrix;
 
-    AET = AET->next;
-    while (AET)
+    DPRINT("NtGdiExtCreateRegion\n");
+    _SEH2_TRY
     {
-        pETEinsert = AET;
-        pETEchase = AET;
-        while (pETEchase->back->bres.minor_axis > AET->bres.minor_axis)
-            pETEchase = pETEchase->back;
-
-        AET = AET->next;
-        if (pETEchase != pETEinsert)
-        {
-            pETEchaseBackTMP = pETEchase->back;
-            pETEinsert->back->next = AET;
-            if (AET)
-                AET->back = pETEinsert->back;
-            pETEinsert->next = pETEchase;
-            pETEchase->back->next = pETEinsert;
-            pETEchase->back = pETEinsert;
-            pETEinsert->back = pETEchaseBackTMP;
-            changed = TRUE;
-        }
+        ProbeForRead(RgnData, Count, 1);
+        nCount = RgnData->rdh.nCount;
+        iType = RgnData->rdh.iType;
+        dwSize = RgnData->rdh.dwSize;
     }
-    return changed;
-}
-
-/***********************************************************************
- *     REGION_FreeStorage
- *
- *     Clean up our act.
- */
-static void FASTCALL
-REGION_FreeStorage(ScanLineListBlock *pSLLBlock)
-{
-    ScanLineListBlock   *tmpSLLBlock;
-
-    while (pSLLBlock)
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
-        tmpSLLBlock = pSLLBlock->next;
-        ExFreePool(pSLLBlock);
-        pSLLBlock = tmpSLLBlock;
+        Status = _SEH2_GetExceptionCode();
     }
-}
-
-
-/***********************************************************************
- *     REGION_PtsToRegion
- *
- *     Create an array of rectangles from a list of points.
- */
-static int FASTCALL
-REGION_PtsToRegion(
-    int numFullPtBlocks,
-    int iCurPtBlock,
-    POINTBLOCK *FirstPtBlock,
-    ROSRGNDATA *reg)
-{
-    RECTL *rects;
-    POINT *pts;
-    POINTBLOCK *CurPtBlock;
-    int i;
-    RECTL *extents, *temp;
-    INT numRects;
-
-    extents = &reg->rdh.rcBound;
-
-    numRects = ((numFullPtBlocks * NUMPTSTOBUFFER) + iCurPtBlock) >> 1;
-
-    if (!(temp = ExAllocatePoolWithTag(PagedPool, numRects * sizeof(RECT), TAG_REGION)))
+    _SEH2_END;
+    if (!NT_SUCCESS(Status))
     {
-        return 0;
+        SetLastNtError(Status);
+        return NULL;
     }
-    if (reg->Buffer != NULL)
+
+    /* Check parameters, but don't set last error here */
+    if (Count < sizeof(RGNDATAHEADER) + nCount * sizeof(RECT) ||
+        iType != RDH_RECTANGLES ||
+        dwSize != sizeof(RGNDATAHEADER))
     {
-        COPY_RECTS(temp, reg->Buffer, reg->rdh.nCount);
-        if (reg->Buffer != &reg->rdh.rcBound)
-            ExFreePoolWithTag(reg->Buffer, TAG_REGION);
+        return NULL;
     }
-    reg->Buffer = temp;
 
-    reg->rdh.nCount = numRects;
-    CurPtBlock = FirstPtBlock;
-    rects = reg->Buffer - 1;
-    numRects = 0;
-    extents->left = LARGE_COORDINATE,  extents->right = SMALL_COORDINATE;
+    Region = REGION_AllocRgnWithHandle(nCount);
 
-    for ( ; numFullPtBlocks >= 0; numFullPtBlocks--)
+    if (Region == NULL)
     {
-        /* the loop uses 2 points per iteration */
-        i = NUMPTSTOBUFFER >> 1;
-        if (!numFullPtBlocks)
-            i = iCurPtBlock >> 1;
-        for (pts = CurPtBlock->pts; i--; pts += 2)
+        SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+        return FALSE;
+    }
+    hRgn = Region->BaseObject.hHmgr;
+
+    _SEH2_TRY
+    {
+        if (Xform)
         {
-            if (pts->x == pts[1].x)
-                continue;
-            if (numRects && pts->x == rects->left && pts->y == rects->bottom &&
-                    pts[1].x == rects->right &&
-                    (numRects == 1 || rects[-1].top != rects->top) &&
-                    (i && pts[2].y > pts[1].y))
+            ULONG ret;
+
+            /* Init the XFORMOBJ from the Xform struct */
+            Status = STATUS_INVALID_PARAMETER;
+            ret = XFORMOBJ_iSetXform((XFORMOBJ*)&matrix, (XFORML*)Xform);
+
+            /* Check for error, also no scale and shear allowed */
+            if (ret != DDI_ERROR && ret != GX_GENERAL)
             {
-                rects->bottom = pts[1].y + 1;
-                continue;
+                /* Apply the coordinate transformation on the rects */
+                if (XFORMOBJ_bApplyXform((XFORMOBJ*)&matrix,
+                                         XF_LTOL,
+                                         nCount * 2,
+                                         RgnData->Buffer,
+                                         Region->Buffer))
+                {
+                    Status = STATUS_SUCCESS;
+                }
             }
-            numRects++;
-            rects++;
-            rects->left = pts->x;
-            rects->top = pts->y;
-            rects->right = pts[1].x;
-            rects->bottom = pts[1].y + 1;
-            if (rects->left < extents->left)
-                extents->left = rects->left;
-            if (rects->right > extents->right)
-                extents->right = rects->right;
         }
-        CurPtBlock = CurPtBlock->next;
+        else
+        {
+            /* Copy rect coordinates */
+            RtlCopyMemory(Region->Buffer,
+                          RgnData->Buffer,
+                          nCount * sizeof(RECT));
+        }
     }
-
-    if (numRects)
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
-        extents->top = reg->Buffer->top;
-        extents->bottom = rects->bottom;
+        Status = _SEH2_GetExceptionCode();
     }
-    else
+    _SEH2_END;
+    if (!NT_SUCCESS(Status))
     {
-        extents->left = 0;
-        extents->top = 0;
-        extents->right = 0;
-        extents->bottom = 0;
+        SetLastWin32Error(ERROR_INVALID_PARAMETER);
+        RGNOBJAPI_Unlock(Region);
+        GreDeleteObject(hRgn);
+        return NULL;
     }
-    reg->rdh.nCount = numRects;
 
-    return(TRUE);
+    RGNOBJAPI_Unlock(Region);
+
+    return hRgn;
 }
 
-/***********************************************************************
- *     REGION_CreateEdgeTable
- *
- *     This routine creates the edge table for
- *     scan converting polygons.
- *     The Edge Table (ET) looks like:
- *
- *    EdgeTable
- *     --------
- *    |  ymax  |        ScanLineLists
- *    |scanline|-->------------>-------------->...
- *     --------   |scanline|   |scanline|
- *                |edgelist|   |edgelist|
- *                ---------    ---------
- *                    |             |
- *                    |             |
- *                    V             V
- *              list of ETEs   list of ETEs
- *
- *     where ETE is an EdgeTableEntry data structure,
- *     and there is one ScanLineList per scanline at
- *     which an edge is initially entered.
- *
- */
-static void FASTCALL
-REGION_CreateETandAET(
-    const ULONG *Count,
-    INT nbpolygons,
-    const POINT *pts,
-    EdgeTable *ET,
-    EdgeTableEntry *AET,
-    EdgeTableEntry *pETEs,
-    ScanLineListBlock *pSLLBlock
+BOOL
+APIENTRY
+NtGdiFillRgn(
+    HDC hDC,
+    HRGN hRgn,
+    HBRUSH hBrush
 )
 {
-    const POINT *top, *bottom;
-    const POINT *PrevPt, *CurrPt, *EndPt;
-    INT poly, count;
-    int iSLLBlock = 0;
-    int dy;
+    HBRUSH oldhBrush;
+    PROSRGNDATA rgn;
+    PRECTL r;
 
+    if (NULL == (rgn = RGNOBJAPI_Lock(hRgn, NULL)))
+    {
+        return FALSE;
+    }
 
-    /*
-     *  initialize the Active Edge Table
-     */
-    AET->next = (EdgeTableEntry *)NULL;
-    AET->back = (EdgeTableEntry *)NULL;
-    AET->nextWETE = (EdgeTableEntry *)NULL;
-    AET->bres.minor_axis = SMALL_COORDINATE;
+    if (NULL == (oldhBrush = NtGdiSelectBrush(hDC, hBrush)))
+    {
+        RGNOBJAPI_Unlock(rgn);
+        return FALSE;
+    }
 
-    /*
-     *  initialize the Edge Table.
-     */
-    ET->scanlines.next = (ScanLineList *)NULL;
-    ET->ymax = SMALL_COORDINATE;
-    ET->ymin = LARGE_COORDINATE;
-    pSLLBlock->next = (ScanLineListBlock *)NULL;
+    for (r = rgn->Buffer; r < rgn->Buffer + rgn->rdh.nCount; r++)
+    {
+        NtGdiPatBlt(hDC, r->left, r->top, r->right - r->left, r->bottom - r->top, PATCOPY);
+    }
 
-    EndPt = pts - 1;
-    for (poly = 0; poly < nbpolygons; poly++)
+    RGNOBJAPI_Unlock(rgn);
+    NtGdiSelectBrush(hDC, oldhBrush);
+
+    return TRUE;
+}
+
+BOOL
+APIENTRY
+NtGdiFrameRgn(
+    HDC hDC,
+    HRGN hRgn,
+    HBRUSH hBrush,
+    INT Width,
+    INT Height
+)
+{
+    HRGN FrameRgn;
+    BOOL Ret;
+
+    if (!(FrameRgn = NtGdiCreateRectRgn(0, 0, 0, 0)))
     {
-        count = Count[poly];
-        EndPt += count;
-        if (count < 2)
-            continue;
+        return FALSE;
+    }
+    if (!REGION_CreateFrameRgn(FrameRgn, hRgn, Width, Height))
+    {
+        GreDeleteObject(FrameRgn);
+        return FALSE;
+    }
 
-        PrevPt = EndPt;
+    Ret = NtGdiFillRgn(hDC, FrameRgn, hBrush);
 
-        /*
-         *  for each vertex in the array of points.
-         *  In this loop we are dealing with two vertices at
-         *  a time -- these make up one edge of the polygon.
-         */
-        while (count--)
-        {
-            CurrPt = pts++;
+    GreDeleteObject(FrameRgn);
+    return Ret;
+}
 
-            /*
-             *  find out which point is above and which is below.
-             */
-            if (PrevPt->y > CurrPt->y)
-            {
-                bottom = PrevPt, top = CurrPt;
-                pETEs->ClockWise = 0;
-            }
-            else
-            {
-                bottom = CurrPt, top = PrevPt;
-                pETEs->ClockWise = 1;
-            }
 
-            /*
-             * don't add horizontal edges to the Edge table.
-             */
-            if (bottom->y != top->y)
-            {
-                pETEs->ymax = bottom->y-1;
-                /* -1 so we don't get last scanline */
+/* See wine, msdn, osr and  Feng Yuan - Windows Graphics Programming Win32 Gdi And Directdraw
 
-                /*
-                 *  initialize integer edge algorithm
-                 */
-                dy = bottom->y - top->y;
-                BRESINITPGONSTRUCT(dy, top->x, bottom->x, pETEs->bres);
+   1st: http://www.codeproject.com/gdi/cliprgnguide.asp is wrong!
 
-                REGION_InsertEdgeInET(ET, pETEs, top->y, &pSLLBlock,
-                                      &iSLLBlock);
+   The intersection of the clip with the meta region is not Rao it's API!
+   Go back and read 7.2 Clipping pages 418-19:
+   Rao = API & Vis:
+   1) The Rao region is the intersection of the API region and the system region,
+      named after the Microsoft engineer who initially proposed it.
+   2) The Rao region can be calculated from the API region and the system region.
 
-                if (PrevPt->y > ET->ymax)
-                    ET->ymax = PrevPt->y;
-                if (PrevPt->y < ET->ymin)
-                    ET->ymin = PrevPt->y;
-                pETEs++;
-            }
+   API:
+      API region is the intersection of the meta region and the clipping region,
+      clearly named after the fact that it is controlled by GDI API calls.
+*/
+INT APIENTRY
+NtGdiGetRandomRgn(
+    HDC hDC,
+    HRGN hDest,
+    INT iCode
+)
+{
+    INT ret = 0;
+    PDC pDC;
+    HRGN hSrc = NULL;
+    POINT org;
 
-            PrevPt = CurrPt;
+    pDC = DC_LockDc(hDC);
+    if (pDC == NULL)
+    {
+        SetLastWin32Error(ERROR_INVALID_HANDLE);
+        return -1;
+    }
+
+    switch (iCode)
+    {
+    case CLIPRGN:
+        hSrc = pDC->rosdc.hClipRgn;
+//        if (pDC->dclevel.prgnClip) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnClip)->BaseObject.hHmgr;
+        break;
+    case METARGN:
+        if (pDC->dclevel.prgnMeta) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnMeta)->BaseObject.hHmgr;
+        break;
+    case APIRGN:
+        hSrc = pDC->rosdc.hClipRgn;
+//        if (pDC->prgnAPI) hSrc = ((PROSRGNDATA)pDC->prgnAPI)->BaseObject.hHmgr;
+//        else if (pDC->dclevel.prgnClip) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnClip)->BaseObject.hHmgr;
+//        else if (pDC->dclevel.prgnMeta) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnMeta)->BaseObject.hHmgr;
+        break;
+    case SYSRGN:
+        hSrc = pDC->rosdc.hVisRgn;
+//        if (pDC->prgnVis) hSrc = ((PROSRGNDATA)pDC->prgnVis)->BaseObject.hHmgr;
+        break;
+    default:
+        hSrc = 0;
+    }
+    if (hSrc)
+    {
+        if (NtGdiCombineRgn(hDest, hSrc, 0, RGN_COPY) == ERROR)
+        {
+            ret = -1;
+        }
+        else
+        {
+            ret = 1;
         }
     }
+    if (iCode == SYSRGN)
+    {
+        IntGdiGetDCOrg(pDC, &org);
+        NtGdiOffsetRgn(hDest, org.x, org.y );
+    }
+
+    DC_UnlockDc(pDC);
+
+    return ret;
 }
 
-HRGN FASTCALL
-IntCreatePolyPolygonRgn(
-    POINT *Pts,
-    PULONG Count,
-    INT nbpolygons,
-    INT mode
+INT APIENTRY
+NtGdiGetRgnBox(
+    HRGN hRgn,
+    PRECTL pRect
 )
 {
-    HRGN hrgn;
-    ROSRGNDATA *region;
-    EdgeTableEntry *pAET;     /* Active Edge Table       */
-    INT y;                    /* current scanline        */
-    int iPts = 0;             /* number of pts in buffer */
-    EdgeTableEntry *pWETE;    /* Winding Edge Table Entry*/
-    ScanLineList *pSLL;       /* current scanLineList    */
-    POINT *pts;               /* output buffer           */
-    EdgeTableEntry *pPrevAET; /* ptr to previous AET     */
-    EdgeTable ET;             /* header node for ET      */
-    EdgeTableEntry AET;       /* header node for AET     */
-    EdgeTableEntry *pETEs;    /* EdgeTableEntries pool   */
-    ScanLineListBlock SLLBlock; /* header for scanlinelist */
-    int fixWAET = FALSE;
-    POINTBLOCK FirstPtBlock, *curPtBlock; /* PtBlock buffers    */
-    POINTBLOCK *tmpPtBlock;
-    int numFullPtBlocks = 0;
-    INT poly, total;
-
-    if (mode == 0 || mode > 2) return 0;
+    PROSRGNDATA  Rgn;
+    RECTL SafeRect;
+    DWORD ret;
+    NTSTATUS Status = STATUS_SUCCESS;
 
-    if (!(region = REGION_AllocRgnWithHandle(nbpolygons)))
-        return 0;
-    hrgn = region->BaseObject.hHmgr;
+    if (!(Rgn = RGNOBJAPI_Lock(hRgn, NULL)))
+    {
+        return ERROR;
+    }
 
-    /* special case a rectangle */
+    ret = REGION_GetRgnBox(Rgn, &SafeRect);
+    RGNOBJAPI_Unlock(Rgn);
+    if (ERROR == ret)
+    {
+        return ret;
+    }
 
-    if (((nbpolygons == 1) && ((*Count == 4) ||
-                               ((*Count == 5) && (Pts[4].x == Pts[0].x) && (Pts[4].y == Pts[0].y)))) &&
-            (((Pts[0].y == Pts[1].y) &&
-              (Pts[1].x == Pts[2].x) &&
-              (Pts[2].y == Pts[3].y) &&
-              (Pts[3].x == Pts[0].x)) ||
-             ((Pts[0].x == Pts[1].x) &&
-              (Pts[1].y == Pts[2].y) &&
-              (Pts[2].x == Pts[3].x) &&
-              (Pts[3].y == Pts[0].y))))
+    _SEH2_TRY
     {
-        REGION_UnlockRgn(region);
-        NtGdiSetRectRgn(hrgn, min(Pts[0].x, Pts[2].x), min(Pts[0].y, Pts[2].y),
-                        max(Pts[0].x, Pts[2].x), max(Pts[0].y, Pts[2].y));
-        return hrgn;
+        ProbeForWrite(pRect, sizeof(RECT), 1);
+        *pRect = SafeRect;
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = _SEH2_GetExceptionCode();
+    }
+    _SEH2_END;
+    if (!NT_SUCCESS(Status))
+    {
+        return ERROR;
     }
 
-    for (poly = total = 0; poly < nbpolygons; poly++)
-        total += Count[poly];
-    if (! (pETEs = ExAllocatePoolWithTag(PagedPool, sizeof(EdgeTableEntry) * total, TAG_REGION)) )
+    return ret;
+}
+
+BOOL
+APIENTRY
+NtGdiInvertRgn(
+    HDC hDC,
+    HRGN hRgn
+)
+{
+    PROSRGNDATA RgnData;
+    ULONG i;
+    PRECTL rc;
+
+    if (!(RgnData = RGNOBJAPI_Lock(hRgn, NULL)))
     {
-        GreDeleteObject(hrgn);
-        return 0;
+        SetLastWin32Error(ERROR_INVALID_HANDLE);
+        return FALSE;
     }
-    pts = FirstPtBlock.pts;
-    REGION_CreateETandAET(Count, nbpolygons, Pts, &ET, &AET, pETEs, &SLLBlock);
-    pSLL = ET.scanlines.next;
-    curPtBlock = &FirstPtBlock;
 
-    if (mode != WINDING)
+    rc = RgnData->Buffer;
+    for (i = 0; i < RgnData->rdh.nCount; i++)
     {
-        /*
-         *  for each scanline
-         */
-        for (y = ET.ymin; y < ET.ymax; y++)
+
+        if (!NtGdiPatBlt(hDC, rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top, DSTINVERT))
         {
-            /*
-             *  Add a new edge to the active edge table when we
-             *  get to the next edge.
-             */
-            if (pSLL != NULL && y == pSLL->scanline)
-            {
-                REGION_loadAET(&AET, pSLL->edgelist);
-                pSLL = pSLL->next;
-            }
-            pPrevAET = &AET;
-            pAET = AET.next;
+            RGNOBJAPI_Unlock(RgnData);
+            return FALSE;
+        }
+        rc++;
+    }
 
-            /*
-             *  for each active edge
-             */
-            while (pAET)
-            {
-                pts->x = pAET->bres.minor_axis,  pts->y = y;
-                pts++, iPts++;
+    RGNOBJAPI_Unlock(RgnData);
+    return TRUE;
+}
 
-                /*
-                 *  send out the buffer
-                 */
-                if (iPts == NUMPTSTOBUFFER)
-                {
-                    tmpPtBlock = ExAllocatePoolWithTag(PagedPool, sizeof(POINTBLOCK), TAG_REGION);
-                    if (!tmpPtBlock)
-                    {
-                        DPRINT1("Can't alloc tPB\n");
-                        ExFreePoolWithTag(pETEs, TAG_REGION);
-                        return 0;
-                    }
-                    curPtBlock->next = tmpPtBlock;
-                    curPtBlock = tmpPtBlock;
-                    pts = curPtBlock->pts;
-                    numFullPtBlocks++;
-                    iPts = 0;
-                }
-                EVALUATEEDGEEVENODD(pAET, pPrevAET, y);
-            }
-            REGION_InsertionSort(&AET);
-        }
+INT
+APIENTRY
+NtGdiOffsetRgn(
+    HRGN hRgn,
+    INT XOffset,
+    INT YOffset
+)
+{
+    PROSRGNDATA rgn = RGNOBJAPI_Lock(hRgn, NULL);
+    INT ret;
+
+    DPRINT("NtGdiOffsetRgn: hRgn %d Xoffs %d Yoffs %d rgn %x\n", hRgn, XOffset, YOffset, rgn );
+
+    if (!rgn)
+    {
+        DPRINT("NtGdiOffsetRgn: hRgn error\n");
+        return ERROR;
     }
-    else
+
+    if (XOffset || YOffset)
     {
-        /*
-         *  for each scanline
-         */
-        for (y = ET.ymin; y < ET.ymax; y++)
+        int nbox = rgn->rdh.nCount;
+        PRECTL pbox = rgn->Buffer;
+
+        if (nbox && pbox)
         {
-            /*
-             *  Add a new edge to the active edge table when we
-             *  get to the next edge.
-             */
-            if (pSLL != NULL && y == pSLL->scanline)
+            while (nbox--)
             {
-                REGION_loadAET(&AET, pSLL->edgelist);
-                REGION_computeWAET(&AET);
-                pSLL = pSLL->next;
+                pbox->left += XOffset;
+                pbox->right += XOffset;
+                pbox->top += YOffset;
+                pbox->bottom += YOffset;
+                pbox++;
             }
-            pPrevAET = &AET;
-            pAET = AET.next;
-            pWETE = pAET;
-
-            /*
-             *  for each active edge
-             */
-            while (pAET)
+            if (rgn->Buffer != &rgn->rdh.rcBound)
             {
-                /*
-                 *  add to the buffer only those edges that
-                 *  are in the Winding active edge table.
-                 */
-                if (pWETE == pAET)
-                {
-                    pts->x = pAET->bres.minor_axis,  pts->y = y;
-                    pts++, iPts++;
-
-                    /*
-                     *  send out the buffer
-                     */
-                    if (iPts == NUMPTSTOBUFFER)
-                    {
-                        tmpPtBlock = ExAllocatePoolWithTag(PagedPool,
-                                                           sizeof(POINTBLOCK), TAG_REGION);
-                        if (!tmpPtBlock)
-                        {
-                            DPRINT1("Can't alloc tPB\n");
-                            ExFreePoolWithTag(pETEs, TAG_REGION);
-                            GreDeleteObject(hrgn);
-                            return 0;
-                        }
-                        curPtBlock->next = tmpPtBlock;
-                        curPtBlock = tmpPtBlock;
-                        pts = curPtBlock->pts;
-                        numFullPtBlocks++;
-                        iPts = 0;
-                    }
-                    pWETE = pWETE->nextWETE;
-                }
-                EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET);
+                rgn->rdh.rcBound.left += XOffset;
+                rgn->rdh.rcBound.right += XOffset;
+                rgn->rdh.rcBound.top += YOffset;
+                rgn->rdh.rcBound.bottom += YOffset;
             }
+        }
+    }
+    ret = REGION_Complexity(rgn);
+    RGNOBJAPI_Unlock(rgn);
+    return ret;
+}
 
-            /*
-             *  recompute the winding active edge table if
-             *  we just resorted or have exited an edge.
-             */
-            if (REGION_InsertionSort(&AET) || fixWAET)
+BOOL
+APIENTRY
+NtGdiPtInRegion(
+    HRGN hRgn,
+    INT X,
+    INT Y
+)
+{
+    PROSRGNDATA rgn;
+    ULONG i;
+    PRECTL r;
+
+    if (!(rgn = RGNOBJAPI_Lock(hRgn, NULL) ) )
+        return FALSE;
+
+    if (rgn->rdh.nCount > 0 && INRECT(rgn->rdh.rcBound, X, Y))
+    {
+        r =  rgn->Buffer;
+        for (i = 0; i < rgn->rdh.nCount; i++)
+        {
+            if (INRECT(*r, X, Y))
             {
-                REGION_computeWAET(&AET);
-                fixWAET = FALSE;
+                RGNOBJAPI_Unlock(rgn);
+                return TRUE;
             }
+            r++;
         }
     }
-    REGION_FreeStorage(SLLBlock.next);
-    REGION_PtsToRegion(numFullPtBlocks, iPts, &FirstPtBlock, region);
+    RGNOBJAPI_Unlock(rgn);
+    return FALSE;
+}
 
-    for (curPtBlock = FirstPtBlock.next; --numFullPtBlocks >= 0;)
+BOOL
+APIENTRY
+NtGdiRectInRegion(
+    HRGN  hRgn,
+    LPRECTL unsaferc
+)
+{
+    PROSRGNDATA Rgn;
+    RECTL rc = {0};
+    BOOL Ret;
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    if (!(Rgn = RGNOBJAPI_Lock(hRgn, NULL)))
     {
-        tmpPtBlock = curPtBlock->next;
-        ExFreePoolWithTag(curPtBlock, TAG_REGION);
-        curPtBlock = tmpPtBlock;
+        return ERROR;
     }
-    ExFreePoolWithTag(pETEs, TAG_REGION);
-    REGION_UnlockRgn(region);
-    return hrgn;
+
+    _SEH2_TRY
+    {
+        ProbeForRead(unsaferc, sizeof(RECT), 1);
+        rc = *unsaferc;
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = _SEH2_GetExceptionCode();
+    }
+    _SEH2_END;
+
+    if (!NT_SUCCESS(Status))
+    {
+        RGNOBJAPI_Unlock(Rgn);
+        SetLastNtError(Status);
+        DPRINT1("NtGdiRectInRegion: bogus rc\n");
+        return ERROR;
+    }
+
+    Ret = REGION_RectInRegion(Rgn, &rc);
+    RGNOBJAPI_Unlock(Rgn);
+    return Ret;
+}
+
+BOOL
+APIENTRY
+NtGdiSetRectRgn(
+    HRGN hRgn,
+    INT LeftRect,
+    INT TopRect,
+    INT RightRect,
+    INT BottomRect
+)
+{
+    PROSRGNDATA rgn;
+
+    if ( !(rgn = RGNOBJAPI_Lock(hRgn, NULL)) )
+    {
+        return 0; //per documentation
+    }
+
+    REGION_SetRectRgn(rgn, LeftRect, TopRect, RightRect, BottomRect);
+
+    RGNOBJAPI_Unlock(rgn);
+    return TRUE;
+}
+
+HRGN APIENTRY
+NtGdiUnionRectWithRgn(
+    HRGN hDest,
+    const RECTL *UnsafeRect
+)
+{
+    RECTL SafeRect = {0};
+    PROSRGNDATA Rgn;
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    if (!(Rgn = RGNOBJAPI_Lock(hDest, NULL)))
+    {
+        SetLastWin32Error(ERROR_INVALID_HANDLE);
+        return NULL;
+    }
+
+    _SEH2_TRY
+    {
+        ProbeForRead(UnsafeRect, sizeof(RECT), 1);
+        SafeRect = *UnsafeRect;
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = _SEH2_GetExceptionCode();
+    }
+    _SEH2_END;
+
+    if (! NT_SUCCESS(Status))
+    {
+        RGNOBJAPI_Unlock(Rgn);
+        SetLastNtError(Status);
+        return NULL;
+    }
+
+    REGION_UnionRectWithRgn(Rgn, &SafeRect);
+    RGNOBJAPI_Unlock(Rgn);
+    return hDest;
+}
+
+/*!
+ * MSDN: GetRegionData, Return Values:
+ *
+ * "If the function succeeds and dwCount specifies an adequate number of bytes,
+ * the return value is always dwCount. If dwCount is too small or the function
+ * fails, the return value is 0. If lpRgnData is NULL, the return value is the
+ * required number of bytes.
+ *
+ * If the function fails, the return value is zero."
+ */
+DWORD APIENTRY
+NtGdiGetRegionData(
+    HRGN hrgn,
+    DWORD count,
+    LPRGNDATA rgndata
+)
+{
+    DWORD size;
+    PROSRGNDATA obj = RGNOBJAPI_Lock(hrgn, NULL);
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    if (!obj)
+        return 0;
+
+    size = obj->rdh.nCount * sizeof(RECT);
+    if (count < (size + sizeof(RGNDATAHEADER)) || rgndata == NULL)
+    {
+        RGNOBJAPI_Unlock(obj);
+        if (rgndata) /* buffer is too small, signal it by return 0 */
+            return 0;
+        else         /* user requested buffer size with rgndata NULL */
+            return size + sizeof(RGNDATAHEADER);
+    }
+
+    _SEH2_TRY
+    {
+        ProbeForWrite(rgndata, count, 1);
+        RtlCopyMemory(rgndata, &obj->rdh, sizeof(RGNDATAHEADER));
+        RtlCopyMemory(rgndata->Buffer, obj->Buffer, size);
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = _SEH2_GetExceptionCode();
+    }
+    _SEH2_END;
+
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastNtError(Status);
+        RGNOBJAPI_Unlock(obj);
+        return 0;
+    }
+
+    RGNOBJAPI_Unlock(obj);
+    return size + sizeof(RGNDATAHEADER);
 }
 
 /* EOF */